sip.c 23 KB

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