sip.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278
  1. // in Asterisk pjsip.conf, under 1001, set direct_media=no
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <math.h>
  7. #include "freertos/FreeRTOS.h"
  8. #include "freertos/task.h"
  9. #include "esp_wifi.h"
  10. #include "esp_event.h"
  11. #include "esp_log.h"
  12. #include "nvs_flash.h"
  13. #include "lwip/sockets.h"
  14. #include <stdbool.h>
  15. #include "esp_rom_md5.h"
  16. #include "bsp_board.h"
  17. #include "tca9555_driver.h"
  18. /*
  19. #include "esp_audio_enc_default.h"
  20. #include "esp_audio_enc.h"
  21. #include "esp_audio_dec_default.h"
  22. #include "esp_audio_dec.h"
  23. #include "esp_g711_enc.h"
  24. #include "esp_g711_dec.h"*/
  25. #define ESP32_IP ""
  26. #define RTP_PORT 4000
  27. #define WIFI_SSID ""
  28. #define WIFI_PASS ""
  29. #define ASTERISK_IP ""
  30. #define SIP_PORT 5060
  31. #define SIP_LOCAL_IP "0.0.0.0"
  32. #define SIP_LOCAL_PORT 5062
  33. #define SIP_USER "1001"
  34. #define SIP_PASSWORD "secret123"
  35. #define SAMPLE_RATE 8000
  36. #define SAMPLES_PER_PACKET 160 // 20 ms
  37. #define TONE_FREQ 1000
  38. #define MIC_FRAME_SAMPLES 160
  39. static int32_t mic_buffer[320];
  40. static int16_t mic_pcm16[MIC_FRAME_SAMPLES];
  41. static uint8_t payload[MIC_FRAME_SAMPLES];
  42. static uint8_t rx_packet[172];
  43. static int16_t speaker_pcm[160];
  44. static const char *TAG = "SIP";
  45. volatile bool wifi_ready = false;
  46. static int s_rtp_sock = -1;
  47. static struct sockaddr_in s_rtp_peer = {0};
  48. static uint16_t s_rtp_peer_port = 0;
  49. static volatile bool call_active = false;
  50. static volatile bool s_audio_hw_ready = false;
  51. esp_err_t esp_get_feed_data(
  52. bool is_get_raw_channel,
  53. int16_t *buffer,
  54. int buffer_len);
  55. esp_err_t esp_audio_play(const int16_t *data,
  56. int length,
  57. uint32_t ticks_to_wait);
  58. esp_err_t sip_media_init(void);
  59. static void rtp_tx_task(void *pvParameters);
  60. static void rtp_rx_task(void *pvParameters);
  61. /* ================= WIFI ================= */
  62. static void wifi_event_handler(void *arg, esp_event_base_t event_base,
  63. int32_t event_id, void *event_data)
  64. {
  65. if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
  66. esp_wifi_connect();
  67. }
  68. else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
  69. ESP_LOGI(TAG, "WiFi disconnected, retrying...");
  70. wifi_ready = false;
  71. esp_wifi_connect();
  72. }
  73. else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
  74. ESP_LOGI(TAG, "WiFi connected!");
  75. wifi_ready = true;
  76. }
  77. esp_netif_ip_info_t ip;
  78. esp_netif_get_ip_info(esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"), &ip);
  79. ESP_LOGI(TAG, "ESP32 IP: " IPSTR, IP2STR(&ip.ip));
  80. }
  81. void wifi_init(void)
  82. {
  83. nvs_flash_init();
  84. esp_netif_init();
  85. esp_event_loop_create_default();
  86. esp_netif_create_default_wifi_sta();
  87. wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  88. esp_wifi_init(&cfg);
  89. esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL);
  90. esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL);
  91. wifi_config_t wifi_config = {
  92. .sta = {
  93. .ssid = WIFI_SSID,
  94. .password = WIFI_PASS,
  95. },
  96. };
  97. esp_wifi_set_mode(WIFI_MODE_STA);
  98. esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
  99. esp_wifi_start();
  100. }
  101. /* ================= MD5 HELPERS ================= */
  102. static void md5_calc(const unsigned char *input, size_t len, unsigned char output[16])
  103. {
  104. md5_context_t ctx;
  105. esp_rom_md5_init(&ctx);
  106. esp_rom_md5_update(&ctx, input, len);
  107. esp_rom_md5_final(output, &ctx);
  108. }
  109. static void md5_to_hex(unsigned char *md5, char *out)
  110. {
  111. for (int i = 0; i < 16; i++) {
  112. sprintf(out + i * 2, "%02x", md5[i]);
  113. }
  114. }
  115. /* ================= SIP DIGEST ================= */
  116. void sip_compute_response(
  117. const char *username,
  118. const char *realm,
  119. const char *password,
  120. const char *nonce,
  121. const char *uri,
  122. char *out_response)
  123. {
  124. unsigned char ha1_md5[16], ha2_md5[16], final_md5[16];
  125. char ha1_hex[64], ha2_hex[64], final_str[256];
  126. char ha1[128], ha2[128];
  127. snprintf(ha1, sizeof(ha1), "%s:%s:%s", username, realm, password);
  128. md5_calc((unsigned char*)ha1, strlen(ha1), ha1_md5);
  129. md5_to_hex(ha1_md5, ha1_hex);
  130. snprintf(ha2, sizeof(ha2), "REGISTER:%s", uri);
  131. md5_calc((unsigned char*)ha2, strlen(ha2), ha2_md5);
  132. md5_to_hex(ha2_md5, ha2_hex);
  133. snprintf(final_str, sizeof(final_str),
  134. "%s:%s:%s", ha1_hex, nonce, ha2_hex);
  135. md5_calc((unsigned char*)final_str, strlen(final_str), final_md5);
  136. md5_to_hex(final_md5, out_response);
  137. }
  138. /* ================= SIP HELPERS ================= */
  139. static bool sip_extract_header(const char *msg, const char *header, char *out, size_t out_len)
  140. {
  141. const char *start = strstr(msg, header);
  142. if (!start) {
  143. return false;
  144. }
  145. start += strlen(header);
  146. while (*start == ' ' || *start == '\t') {
  147. start++;
  148. }
  149. const char *end = start;
  150. while (*end != '\0' && *end != '\r' && *end != '\n') {
  151. end++;
  152. }
  153. size_t len = (size_t)(end - start);
  154. if (len >= out_len) {
  155. len = out_len - 1;
  156. }
  157. memcpy(out, start, len);
  158. out[len] = '\0';
  159. return true;
  160. }
  161. static void sip_send_200_ok(int sock, const struct sockaddr_in *remote, const char *sip_msg,
  162. const char *sdp_body, size_t sdp_len)
  163. {
  164. char via[512] = {0};
  165. char from[256] = {0};
  166. char to[256] = {0};
  167. char callid[256] = {0};
  168. char cseq[128] = {0};
  169. char response[4096];
  170. if (!sip_extract_header(sip_msg, "Via:", via, sizeof(via))) {
  171. snprintf(via, sizeof(via), "SIP/2.0/UDP %s:%d", SIP_LOCAL_IP, SIP_LOCAL_PORT);
  172. }
  173. if (!sip_extract_header(sip_msg, "From:", from, sizeof(from))) {
  174. snprintf(from, sizeof(from), "<sip:%s@%s>", SIP_USER, ASTERISK_IP);
  175. }
  176. if (!sip_extract_header(sip_msg, "To:", to, sizeof(to))) {
  177. snprintf(to, sizeof(to), "<sip:%s@%s>", SIP_USER, ASTERISK_IP);
  178. }
  179. if (!sip_extract_header(sip_msg, "Call-ID:", callid, sizeof(callid))) {
  180. snprintf(callid, sizeof(callid), "esp32-call");
  181. }
  182. if (!sip_extract_header(sip_msg, "CSeq:", cseq, sizeof(cseq))) {
  183. snprintf(cseq, sizeof(cseq), "1 REGISTER");
  184. }
  185. int body_len = sdp_body ? (int)sdp_len : 0;
  186. int written = snprintf(response, sizeof(response),
  187. "SIP/2.0 200 OK\r\n"
  188. "Via: %s\r\n"
  189. "From: %s\r\n"
  190. "To: %s;tag=esp32\r\n"
  191. "Call-ID: %s\r\n"
  192. "CSeq: %s\r\n"
  193. "Contact: <sip:%s@%s:%d>\r\n"
  194. "%s"
  195. "Content-Length: %d\r\n"
  196. "\r\n"
  197. "%s",
  198. via,
  199. from,
  200. to,
  201. callid,
  202. cseq,
  203. SIP_USER,
  204. ESP32_IP,
  205. SIP_LOCAL_PORT,
  206. sdp_body ? "Content-Type: application/sdp\r\n" : "",
  207. body_len,
  208. sdp_body ? sdp_body : "");
  209. if (written < 0 || written >= (int)sizeof(response)) {
  210. ESP_LOGW(TAG, "SIP 200 OK response too large");
  211. return;
  212. }
  213. sendto(sock, response, (size_t)written, 0,
  214. (struct sockaddr *)remote, sizeof(*remote));
  215. }
  216. static void sip_build_sdp(char *out, size_t out_len)
  217. {
  218. snprintf(out, out_len,
  219. "v=0\r\n"
  220. "o=ESP32 1234 1234 IN IP4 %s\r\n"
  221. "s=ESP32 SIP Call\r\n"
  222. "c=IN IP4 %s\r\n"
  223. "t=0 0\r\n"
  224. "m=audio %d RTP/AVP 0\r\n"
  225. "a=rtpmap:0 PCMU/8000\r\n"
  226. "a=ptime:20\r\n"
  227. "a=sendrecv\r\n",
  228. ESP32_IP,
  229. ESP32_IP,
  230. RTP_PORT);
  231. }
  232. static bool sip_extract_rtp_port(const char *msg, uint16_t *out_port)
  233. {
  234. const char *m = strstr(msg, "m=audio ");
  235. if (!m) {
  236. return false;
  237. }
  238. m += strlen("m=audio ");
  239. char port_buf[16] = {0};
  240. size_t i = 0;
  241. while (*m && *m != ' ' && *m != '\r' && *m != '\n' && i < sizeof(port_buf) - 1) {
  242. port_buf[i++] = *m++;
  243. }
  244. port_buf[i] = '\0';
  245. *out_port = (uint16_t)atoi(port_buf);
  246. return *out_port != 0;
  247. }
  248. /* ================= RTP TX ================= */
  249. static bool microphone_read(int16_t *samples, size_t count)
  250. {
  251. ESP_LOGI(TAG,
  252. "mic ptr=%p samples=%d bytes=%d",
  253. samples,
  254. count,
  255. count * sizeof(int16_t));
  256. esp_err_t ret = esp_get_feed_data(
  257. false,
  258. (int16_t *)mic_buffer,
  259. sizeof(mic_buffer));
  260. if(ret != ESP_OK)
  261. {
  262. ESP_LOGE(TAG,
  263. "esp_get_feed_data failed: %s",
  264. esp_err_to_name(ret));
  265. return false;
  266. }
  267. return true;
  268. }
  269. static uint8_t linear2ulaw(int16_t pcm)
  270. {
  271. const int16_t BIAS = 0x84;
  272. const int16_t CLIP = 32635;
  273. uint8_t mask;
  274. uint8_t seg;
  275. uint8_t uval;
  276. int16_t sample = pcm;
  277. if (sample < 0)
  278. {
  279. sample = -sample;
  280. mask = 0x7F;
  281. }
  282. else
  283. {
  284. mask = 0xFF;
  285. }
  286. if (sample > CLIP)
  287. sample = CLIP;
  288. sample += BIAS;
  289. if (sample <= 0xFF)
  290. seg = 0;
  291. else if (sample <= 0x1FF)
  292. seg = 1;
  293. else if (sample <= 0x3FF)
  294. seg = 2;
  295. else if (sample <= 0x7FF)
  296. seg = 3;
  297. else if (sample <= 0xFFF)
  298. seg = 4;
  299. else if (sample <= 0x1FFF)
  300. seg = 5;
  301. else if (sample <= 0x3FFF)
  302. seg = 6;
  303. else
  304. seg = 7;
  305. uval = (seg << 4) |
  306. ((sample >> (seg + 3)) & 0x0F);
  307. return uval ^ mask;
  308. }
  309. static int16_t ulaw2linear(uint8_t u_val)
  310. {
  311. u_val = ~u_val;
  312. int t = ((u_val & 0x0F) << 3) + 0x84;
  313. t <<= ((unsigned)u_val & 0x70) >> 4;
  314. if (u_val & 0x80)
  315. return 0x84 - t;
  316. else
  317. return t - 0x84;
  318. }
  319. static void sip_send_rtp_packet(void)
  320. {
  321. static uint32_t call_count = 0;
  322. /*
  323. ESP_LOGI(TAG,
  324. "sip_send_rtp_packet() #%lu",
  325. (unsigned long)call_count++);*/
  326. static uint16_t seq = 0;
  327. static uint32_t timestamp = 0;
  328. if(s_rtp_peer_port == 0)
  329. {
  330. ESP_LOGW(TAG,"No RTP peer");
  331. return;
  332. }
  333. if(s_rtp_peer_port == 0)
  334. {
  335. ESP_LOGW(TAG,
  336. "No RTP peer port set!");
  337. return;
  338. }
  339. if(s_rtp_sock < 0)
  340. {
  341. s_rtp_sock = socket(AF_INET,
  342. SOCK_DGRAM,
  343. IPPROTO_UDP);
  344. ESP_LOGI(TAG,
  345. "RTP socket=%d",
  346. s_rtp_sock);
  347. struct sockaddr_in local_rtp = {0};
  348. local_rtp.sin_family = AF_INET;
  349. local_rtp.sin_port = htons(RTP_PORT);
  350. local_rtp.sin_addr.s_addr = INADDR_ANY;
  351. if(bind(s_rtp_sock,
  352. (struct sockaddr *)&local_rtp,
  353. sizeof(local_rtp)) < 0)
  354. {
  355. ESP_LOGE(TAG, "RTP bind failed errno=%d", errno);
  356. }
  357. else
  358. {
  359. ESP_LOGI(TAG,
  360. "RTP listening on port %d",
  361. RTP_PORT);
  362. }
  363. if(s_rtp_sock < 0)
  364. {
  365. ESP_LOGE(TAG,
  366. "RTP socket failed");
  367. return;
  368. }
  369. }
  370. uint8_t payload[SAMPLES_PER_PACKET];
  371. // Read microphone data
  372. if(!microphone_read(
  373. (int16_t *)mic_buffer,
  374. sizeof(mic_buffer)))
  375. {
  376. return;
  377. }
  378. int16_t *mic16 = (int16_t *)mic_buffer;
  379. /*
  380. ESP_LOGI("MIC",
  381. "pcm16=%d %d %d %d",
  382. mic16[0],
  383. mic16[1],
  384. mic16[2],
  385. mic16[3]);*/
  386. // Convert 32-bit audio to PCM16
  387. for(int i = 0; i < SAMPLES_PER_PACKET; i++)
  388. {
  389. // Take microphone channel
  390. int32_t s = mic_buffer[i * 2];
  391. // Trying these one at a time
  392. //mic_pcm16[i] = s >> 16;
  393. //mic_pcm16[i] = s >> 15;
  394. mic_pcm16[i] = s >> 14;
  395. }
  396. // Debug microphone level
  397. int max = 0;
  398. for(int i = 0; i < SAMPLES_PER_PACKET; i++)
  399. {
  400. int value = abs(mic_pcm16[i]);
  401. if(value > max)
  402. max = value;
  403. }
  404. /*
  405. ESP_LOGI("MIC", "max=%d", max);*/
  406. // PCM16 -> PCMU (G711 u-law)
  407. for(int i = 0; i < SAMPLES_PER_PACKET; i++)
  408. {
  409. payload[i] = linear2ulaw(mic_pcm16[i]);
  410. }
  411. //testing multiple packets
  412. /*
  413. ESP_LOGI("MIC",
  414. "%6d %6d %6d %6d %6d %6d %6d %6d "
  415. "%6d %6d %6d %6d %6d %6d %6d %6d "
  416. "%6d %6d %6d %6d",
  417. mic_pcm16[0], mic_pcm16[1], mic_pcm16[2], mic_pcm16[3],
  418. mic_pcm16[4], mic_pcm16[5], mic_pcm16[6], mic_pcm16[7],
  419. mic_pcm16[8], mic_pcm16[9], mic_pcm16[10], mic_pcm16[11],
  420. mic_pcm16[12], mic_pcm16[13], mic_pcm16[14], mic_pcm16[15],
  421. mic_pcm16[16], mic_pcm16[17], mic_pcm16[18], mic_pcm16[19]);
  422. */
  423. uint8_t packet[12 + SAMPLES_PER_PACKET];
  424. memset(packet,0,sizeof(packet));
  425. packet[0] = 0x80; // RTP version
  426. packet[1] = 0x00; // PCMU
  427. packet[2] = seq >> 8;
  428. packet[3] = seq & 0xff;
  429. packet[4] = timestamp >> 24;
  430. packet[5] = timestamp >> 16;
  431. packet[6] = timestamp >> 8;
  432. packet[7] = timestamp;
  433. uint32_t ssrc = 0x12345678;
  434. packet[8] = (ssrc >> 24) & 0xff;
  435. packet[9] = (ssrc >> 16) & 0xff;
  436. packet[10] = (ssrc >> 8) & 0xff;
  437. packet[11] = ssrc & 0xff;
  438. memcpy(packet+12,
  439. payload,
  440. SAMPLES_PER_PACKET);
  441. struct sockaddr_in peer = s_rtp_peer;
  442. peer.sin_port = htons(s_rtp_peer_port);
  443. /*ESP_LOGI(TAG,
  444. "RTP destination IP: %s",
  445. inet_ntoa(peer.sin_addr));
  446. ESP_LOGI(TAG,
  447. "Sending RTP to %s:%d",
  448. inet_ntoa(peer.sin_addr),
  449. ntohs(peer.sin_port));*/
  450. esp_netif_ip_info_t ip;
  451. esp_netif_t *netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF");
  452. esp_netif_get_ip_info(netif, &ip);
  453. /*ESP_LOGI(TAG, "Current IP: " IPSTR, IP2STR(&ip.ip));*/
  454. int ret =
  455. sendto(
  456. s_rtp_sock,
  457. packet,
  458. sizeof(packet),
  459. 0,
  460. (struct sockaddr *)&peer,
  461. sizeof(peer));
  462. if(ret < 0)
  463. {
  464. ESP_LOGE(TAG,
  465. "RTP send failed errno=%d",
  466. errno);
  467. }
  468. else
  469. {
  470. /* ESP_LOGI(TAG,
  471. "RTP sent bytes=%d seq=%d",
  472. ret,
  473. seq);*/
  474. }
  475. /*if(ret > 0)
  476. {
  477. ESP_LOGI(TAG,
  478. "RTP sent seq=%d",
  479. seq);
  480. }*/
  481. seq++;
  482. timestamp += SAMPLES_PER_PACKET;
  483. }
  484. static void rtp_tx_task(void *pvParameters)
  485. {
  486. ESP_LOGI(TAG, "RTP TX started");
  487. TickType_t last_wake = xTaskGetTickCount();
  488. while(call_active)
  489. {/*ESP_LOGI(TAG, "RTP loop");*/
  490. sip_send_rtp_packet();
  491. vTaskDelayUntil(
  492. &last_wake,
  493. pdMS_TO_TICKS(20)
  494. );
  495. }
  496. ESP_LOGI(TAG, "RTP TX stopped");
  497. vTaskDelete(NULL);
  498. }
  499. /*static void rtp_rx_task(void *pvParameters)
  500. {
  501. ESP_LOGI(TAG, "RTP RX started");
  502. // TEMP: create RTP socket for RX-only testing
  503. if (s_rtp_sock < 0)
  504. {
  505. s_rtp_sock = socket(AF_INET,
  506. SOCK_DGRAM,
  507. IPPROTO_UDP);
  508. if (s_rtp_sock < 0)
  509. {
  510. ESP_LOGE(TAG,
  511. "RTP socket failed errno=%d",
  512. errno);
  513. vTaskDelete(NULL);
  514. return;
  515. }
  516. struct sockaddr_in local_rtp = {0};
  517. local_rtp.sin_family = AF_INET;
  518. local_rtp.sin_port = htons(RTP_PORT);
  519. local_rtp.sin_addr.s_addr = INADDR_ANY;
  520. if (bind(s_rtp_sock,
  521. (struct sockaddr *)&local_rtp,
  522. sizeof(local_rtp)) < 0)
  523. {
  524. ESP_LOGE(TAG,
  525. "RTP bind failed errno=%d",
  526. errno);
  527. close(s_rtp_sock);
  528. s_rtp_sock = -1;
  529. vTaskDelete(NULL);
  530. return;
  531. }
  532. ESP_LOGI(TAG,
  533. "RTP RX listening on port %d",
  534. RTP_PORT);
  535. }
  536. while (call_active)
  537. {
  538. struct sockaddr_in src;
  539. socklen_t len = sizeof(src);
  540. int n = recvfrom(
  541. s_rtp_sock,
  542. rx_packet,
  543. sizeof(rx_packet),
  544. 0,
  545. (struct sockaddr *)&src,
  546. &len);*/
  547. //comment this block out for testing rx only
  548. static void rtp_rx_task(void *pvParameters)
  549. {
  550. ESP_LOGI(TAG, "RTP RX started");
  551. while (call_active)
  552. {
  553. struct sockaddr_in src;
  554. socklen_t len = sizeof(src);
  555. int n = recvfrom(
  556. s_rtp_sock,
  557. rx_packet,
  558. sizeof(rx_packet),
  559. 0,
  560. (struct sockaddr *)&src,
  561. &len);//
  562. if (n < 0)
  563. {
  564. ESP_LOGE(TAG, "recvfrom failed errno=%d", errno);
  565. continue;
  566. }
  567. ESP_LOGI(TAG, "Received RTP packet (%d bytes)", n);
  568. if (n <= 12)
  569. {
  570. ESP_LOGW(TAG, "Packet too small");
  571. continue;
  572. }
  573. ESP_LOGI(TAG,
  574. "RTP Header: %02X %02X %02X %02X",
  575. rx_packet[0],
  576. rx_packet[1],
  577. rx_packet[2],
  578. rx_packet[3]);
  579. ESP_LOGI(TAG,
  580. "RTP Payload: %02X %02X %02X %02X %02X %02X %02X %02X",
  581. rx_packet[12],
  582. rx_packet[13],
  583. rx_packet[14],
  584. rx_packet[15],
  585. rx_packet[16],
  586. rx_packet[17],
  587. rx_packet[18],
  588. rx_packet[19]);
  589. int payload_size = n - 12;
  590. if (payload_size > SAMPLES_PER_PACKET)
  591. {
  592. payload_size = SAMPLES_PER_PACKET;
  593. }
  594. int16_t play_buf[640];
  595. for (int i = 0; i < payload_size; i++)
  596. {
  597. int16_t s1 = ulaw2linear(rx_packet[12+i]);
  598. int16_t s2 = s1;
  599. if (i < payload_size - 1)
  600. {
  601. int16_t next = ulaw2linear(rx_packet[12+i+1]);
  602. s2 = (s1 + next) / 2;
  603. }
  604. // sample 1
  605. play_buf[4*i + 0] = s1; // Left
  606. play_buf[4*i + 1] = s1; // Right
  607. // interpolated sample
  608. play_buf[4*i + 2] = s2; // Left
  609. play_buf[4*i + 3] = s2; // Right
  610. }
  611. esp_err_t ret = esp_audio_play(
  612. play_buf,
  613. payload_size * 4 * sizeof(int16_t),
  614. portMAX_DELAY);
  615. ESP_LOGI(TAG,
  616. "esp_audio_play() = %s",
  617. esp_err_to_name(ret));
  618. ESP_LOGI(TAG, "esp_audio_play() returned %s",
  619. esp_err_to_name(ret));
  620. }
  621. ESP_LOGI(TAG, "RTP RX stopped");
  622. vTaskDelete(NULL);
  623. }
  624. /* ================= SIP TASK ================= */
  625. void sip_register_task(void *pvParameters)
  626. {
  627. struct sockaddr_in server = {0};
  628. server.sin_family = AF_INET;
  629. server.sin_port = htons(SIP_PORT);
  630. server.sin_addr.s_addr = inet_addr(ASTERISK_IP);
  631. int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  632. struct sockaddr_in local_addr = {0};
  633. local_addr.sin_family = AF_INET;
  634. local_addr.sin_port = htons(SIP_LOCAL_PORT);
  635. local_addr.sin_addr.s_addr = INADDR_ANY;
  636. if (bind(sock,
  637. (struct sockaddr *)&local_addr,
  638. sizeof(local_addr)) < 0) {
  639. ESP_LOGE(TAG, "Failed to bind SIP port %d", SIP_LOCAL_PORT);
  640. close(sock);
  641. vTaskDelete(NULL);
  642. return;
  643. }
  644. ESP_LOGI(TAG, "SIP listening on UDP %d", SIP_LOCAL_PORT);
  645. if (sock < 0) {
  646. ESP_LOGE(TAG, "Socket failed");
  647. vTaskDelete(NULL);
  648. return;
  649. }
  650. struct timeval timeout = {
  651. .tv_sec = 300,
  652. .tv_usec = 0
  653. };
  654. setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
  655. /* ================= FIRST REGISTER ================= */
  656. char register_msg[512];
  657. snprintf(register_msg, sizeof(register_msg),
  658. "REGISTER sip:%s SIP/2.0\r\n"
  659. "Via: SIP/2.0/UDP %s:%d\r\n"
  660. "From: <sip:%s@%s>;tag=1234\r\n"
  661. "To: <sip:%s@%s>\r\n"
  662. "Call-ID: esp32-0001\r\n"
  663. "CSeq: 1 REGISTER\r\n"
  664. "Contact: <sip:%s@%s:%d>\r\n"
  665. "Expires: 300\r\n"
  666. "Content-Length: 0\r\n"
  667. "\r\n",
  668. ASTERISK_IP,
  669. SIP_LOCAL_IP,
  670. SIP_LOCAL_PORT,
  671. SIP_USER,
  672. ASTERISK_IP,
  673. SIP_USER,
  674. ASTERISK_IP,
  675. SIP_USER,
  676. SIP_LOCAL_IP,
  677. SIP_LOCAL_PORT);
  678. ESP_LOGI(TAG, "Sending REGISTER...");
  679. sendto(sock, register_msg, strlen(register_msg), 0,
  680. (struct sockaddr*)&server, sizeof(server));
  681. /* ================= RECEIVE 401 / 200 ================= */
  682. char response[1024];
  683. socklen_t addr_len = sizeof(server);
  684. bool registered = false;
  685. while (!registered) {
  686. int len = recvfrom(sock, response, sizeof(response) - 1, 0,
  687. (struct sockaddr *)&server, &addr_len);
  688. if (len <= 0) {
  689. ESP_LOGE(TAG, "No response");
  690. close(sock);
  691. vTaskDelete(NULL);
  692. return;
  693. }
  694. response[len] = '\0';
  695. // printf("SIP RESPONSE:\n%s\n", response);
  696. ESP_LOGI(TAG, "Received SIP response (%d bytes)", len);
  697. if (strstr(response, "SIP/2.0 401")) {
  698. char sip_nonce[256] = {0};
  699. char sip_realm[128] = {0};
  700. char *n = strstr(response, "nonce=\"");
  701. if (n) {
  702. n += 7;
  703. char *end = strchr(n, '"');
  704. if (end) {
  705. size_t nlen = end - n;
  706. if (nlen < sizeof(sip_nonce)) {
  707. strncpy(sip_nonce, n, nlen);
  708. sip_nonce[nlen] = '\0';
  709. }
  710. }
  711. }
  712. char *r = strstr(response, "realm=\"");
  713. if (r) {
  714. r += 7;
  715. char *rend = strchr(r, '"');
  716. if (rend) {
  717. size_t rlen = rend - r;
  718. if (rlen < sizeof(sip_realm)) {
  719. strncpy(sip_realm, r, rlen);
  720. sip_realm[rlen] = '\0';
  721. }
  722. }
  723. }
  724. if (sip_realm[0] == '\0' || sip_nonce[0] == '\0') {
  725. ESP_LOGE(TAG, "Missing realm or nonce in challenge");
  726. close(sock);
  727. vTaskDelete(NULL);
  728. return;
  729. }
  730. ESP_LOGI(TAG, "Nonce: %s", sip_nonce);
  731. ESP_LOGI(TAG, "Realm: %s", sip_realm);
  732. char response_hash[64];
  733. char sip_uri[64];
  734. snprintf(sip_uri, sizeof(sip_uri), "sip:%s", ASTERISK_IP);
  735. sip_compute_response(
  736. SIP_USER,
  737. sip_realm,
  738. SIP_PASSWORD,
  739. sip_nonce,
  740. sip_uri,
  741. response_hash
  742. );
  743. char auth[1024];
  744. snprintf(auth, sizeof(auth),
  745. "REGISTER sip:%s SIP/2.0\r\n"
  746. "Via: SIP/2.0/UDP %s:%d\r\n"
  747. "From: <sip:%s@%s>;tag=1234\r\n"
  748. "To: <sip:%s@%s>\r\n"
  749. "Call-ID: esp32-0001\r\n"
  750. "CSeq: 2 REGISTER\r\n"
  751. "Contact: <sip:%s@%s:%d>\r\n"
  752. "Authorization: Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"sip:%s\", response=\"%s\"\r\n"
  753. "Expires: 300\r\n"
  754. "Content-Length: 0\r\n"
  755. "\r\n",
  756. ASTERISK_IP,
  757. SIP_LOCAL_IP,
  758. SIP_LOCAL_PORT,
  759. SIP_USER,
  760. ASTERISK_IP,
  761. SIP_USER,
  762. ASTERISK_IP,
  763. SIP_USER,
  764. SIP_LOCAL_IP,
  765. SIP_LOCAL_PORT,
  766. SIP_USER,
  767. sip_realm,
  768. sip_nonce,
  769. ASTERISK_IP,
  770. response_hash);
  771. ESP_LOGI(TAG, "Sending AUTH REGISTER...");
  772. sendto(sock, auth, strlen(auth), 0,
  773. (struct sockaddr *)&server, sizeof(server));
  774. }
  775. else if (strstr(response, "SIP/2.0 200")) {
  776. registered = true;
  777. }
  778. else if (strstr(response, "SIP/2.0 486")) {
  779. ESP_LOGW(TAG, "Server returned 486 Busy");
  780. }
  781. else {
  782. ESP_LOGI(TAG, "Ignoring SIP response");
  783. }
  784. }
  785. if (!registered) {
  786. ESP_LOGW(TAG, "Registration was not completed");
  787. close(sock);
  788. vTaskDelete(NULL);
  789. return;
  790. }
  791. ESP_LOGI(TAG, "🎉 SIP REGISTER SUCCESS");
  792. ESP_LOGI(TAG, "stack remaining: %u",
  793. uxTaskGetStackHighWaterMark(NULL));
  794. /* =====================================================
  795. * KEEP SOCKET OPEN AND WAIT FOR SIP REQUESTS
  796. * ===================================================== */
  797. ESP_LOGI(TAG, "Waiting for incoming SIP requests...");
  798. while (1) {
  799. char rx_buf[2048];
  800. int rx_len = recvfrom(sock,
  801. rx_buf,
  802. sizeof(rx_buf) - 1,
  803. 0,
  804. (struct sockaddr *)&server,
  805. &addr_len);
  806. if (rx_len <= 0) {
  807. continue;
  808. }
  809. rx_buf[rx_len] = '\0';
  810. ESP_LOGI(TAG, "\n===== RAW INVITE =====\n%s\n=======================\n", rx_buf);
  811. // printf("\n========================================\n");
  812. // printf("SIP MESSAGE RECEIVED:\n");
  813. // printf("%s\n", rx_buf);
  814. ESP_LOGI(TAG, "Received SIP packet (%d bytes)", rx_len);
  815. // printf("========================================\n");
  816. if (strncmp(rx_buf, "REGISTER ", 9) == 0) {
  817. ESP_LOGI(TAG, "Received REGISTER; sending 200 OK");
  818. sip_send_200_ok(sock, &server, rx_buf, NULL, 0);
  819. continue;
  820. }
  821. else if (strncmp(rx_buf, "INVITE ", 7) == 0) {
  822. ESP_LOGI(TAG, "📞 Incoming INVITE");
  823. char *test = strstr(rx_buf, "m=audio");
  824. if(test)
  825. {
  826. ESP_LOGI(TAG, "Found m=audio SDP:");
  827. ESP_LOGI(TAG, "%s", test);
  828. }
  829. else
  830. {
  831. ESP_LOGE(TAG, "No m=audio found");
  832. }
  833. /* ================= EXTRACT SIP HEADERS ================= */
  834. char via[512] = {0};
  835. char from[256] = {0};
  836. char to[256] = {0};
  837. char callid[256] = {0};
  838. char cseq[128] = {0};
  839. char *header = NULL;
  840. header = strstr(rx_buf, "Via:");
  841. if (header) {
  842. sscanf(header, "Via: %511[^\r\n]", via);
  843. }
  844. header = strstr(rx_buf, "From:");
  845. if (header) {
  846. sscanf(header, "From: %255[^\r\n]", from);
  847. }
  848. header = strstr(rx_buf, "To:");
  849. if (header) {
  850. sscanf(header, "To: %255[^\r\n]", to);
  851. }
  852. header = strstr(rx_buf, "Call-ID:");
  853. if (header) {
  854. sscanf(header, "Call-ID: %255[^\r\n]", callid);
  855. }
  856. header = strstr(rx_buf, "CSeq:");
  857. if (header) {
  858. sscanf(header, "CSeq: %127[^\r\n]", cseq);
  859. }
  860. /* ================= SEND 100 TRYING ================= */
  861. char trying[4096];
  862. snprintf(trying, sizeof(trying),
  863. "SIP/2.0 100 Trying\r\n"
  864. "Via: %s\r\n"
  865. "From: %s\r\n"
  866. "To: %s\r\n"
  867. "Call-ID: %s\r\n"
  868. "CSeq: %s\r\n"
  869. "Content-Length: 0\r\n"
  870. "\r\n",
  871. via,
  872. from,
  873. to,
  874. callid,
  875. cseq);
  876. sendto(sock,
  877. trying,
  878. strlen(trying),
  879. 0,
  880. (struct sockaddr *)&server,
  881. sizeof(server));
  882. ESP_LOGI(TAG, "100 Trying sent");
  883. ESP_LOGI(TAG, "stack remaining: %u",
  884. uxTaskGetStackHighWaterMark(NULL));
  885. char ok[4096];
  886. char sdp[1024];
  887. sip_build_sdp(sdp, sizeof(sdp));
  888. if (sip_extract_rtp_port(rx_buf, &s_rtp_peer_port)) {
  889. s_rtp_peer.sin_family = AF_INET;
  890. s_rtp_peer.sin_port = htons(s_rtp_peer_port);
  891. s_rtp_peer.sin_addr.s_addr = inet_addr(ASTERISK_IP);
  892. ESP_LOGI(TAG,
  893. "RTP peer port=%d",
  894. s_rtp_peer_port);
  895. }
  896. snprintf(ok, sizeof(ok),
  897. "SIP/2.0 200 OK\r\n"
  898. "Via: %s\r\n"
  899. "From: %s\r\n"
  900. "To: %s;esp32\r\n"
  901. "Call-ID: %s\r\n"
  902. "CSeq: %s\r\n"
  903. "Contact: <sip:%s@%s:%d>\r\n"
  904. "Content-Type: application/sdp\r\n"
  905. "Content-Length: %d\r\n"
  906. "\r\n"
  907. "%s",
  908. via,
  909. from,
  910. to,
  911. callid,
  912. cseq,
  913. SIP_USER,
  914. ESP32_IP,
  915. SIP_LOCAL_PORT,
  916. strlen(sdp),
  917. sdp);
  918. ESP_LOGI(TAG, "\n========== 200 OK ==========\n%s\n============================\n", ok);
  919. sendto(sock,
  920. ok,
  921. strlen(ok),
  922. 0,
  923. (struct sockaddr *)&server,
  924. sizeof(server));
  925. ESP_LOGI(TAG, "200 OK sent");
  926. }
  927. else if (strncmp(rx_buf, "OPTIONS ", 8) == 0) {
  928. ESP_LOGI(TAG, "Received OPTIONS");
  929. }
  930. else if (strncmp(rx_buf, "ACK ", 4) == 0)
  931. {
  932. ESP_LOGI(TAG, "Received ACK");
  933. uint8_t test_values[] = {0xFF, 0x7F, 0x00, 0x80};
  934. for(int i = 0; i < 4; i++)
  935. {
  936. ESP_LOGI(TAG,
  937. "ulaw %02X -> %d",
  938. test_values[i],
  939. ulaw2linear(test_values[i]));
  940. }
  941. if (!call_active)
  942. {
  943. call_active = true;
  944. BaseType_t ret = xTaskCreate(
  945. rtp_tx_task,
  946. "rtp_tx",
  947. 16384,
  948. NULL,
  949. 5,
  950. NULL);
  951. xTaskCreate(
  952. rtp_rx_task,
  953. "rtp_rx",
  954. 16384,
  955. NULL,
  956. 5,
  957. NULL);
  958. //temp comment out
  959. //ESP_LOGI(TAG, "rtp task create result=%d", ret);
  960. }
  961. }
  962. else if (strncmp(rx_buf, "BYE ", 4) == 0)
  963. {
  964. ESP_LOGI(TAG, "Received BYE");
  965. call_active = false;
  966. sip_send_200_ok(sock, &server, rx_buf, NULL, 0);
  967. }
  968. else {
  969. ESP_LOGI(TAG, "Unknown SIP message");
  970. }
  971. }
  972. close(sock);
  973. vTaskDelete(NULL);
  974. }
  975. esp_err_t sip_media_init(void)
  976. {
  977. if (s_audio_hw_ready) {
  978. return ESP_OK;
  979. }
  980. esp_err_t ret = esp_board_init(16000, 2, 32);
  981. if (ret != ESP_OK) {
  982. ESP_LOGE(TAG, "esp_board_init failed: %s", esp_err_to_name(ret));
  983. return ret;
  984. }
  985. tca9555_driver_init();
  986. /*if (!sip_open_audio_media_codecs()) {
  987. return ESP_FAIL;
  988. }*/
  989. s_audio_hw_ready = true;
  990. ESP_LOGI(TAG, "Audio board initialized for live RTP media");
  991. return ESP_OK;
  992. }