sip.c 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include "freertos/FreeRTOS.h"
  7. #include "freertos/task.h"
  8. #include "esp_wifi.h"
  9. #include "esp_event.h"
  10. #include "esp_log.h"
  11. #include "nvs_flash.h"
  12. #include "lwip/sockets.h"
  13. #include <stdbool.h>
  14. #include "esp_rom_md5.h"
  15. #include "esp_err.h"
  16. #include "bsp_board.h"
  17. #include "tca9555_driver.h"
  18. #include "esp_audio_enc_default.h"
  19. #include "esp_audio_enc.h"
  20. #include "esp_audio_dec_default.h"
  21. #include "esp_audio_dec.h"
  22. #include "esp_g711_enc.h"
  23. #include "esp_g711_dec.h"
  24. #define ESP32_IP "192.168.68.79"
  25. #define RTP_PORT 4000
  26. #define WIFI_SSID "TOCHTECH"
  27. #define WIFI_PASS "Smarturns2017"
  28. #define ASTERISK_IP "192.168.68.72"
  29. #define SIP_PORT 5060
  30. #define SIP_LOCAL_IP_DEFAULT "0.0.0.0"
  31. #define SIP_LOCAL_PORT 5062
  32. #define SIP_USER "1001"
  33. #define SIP_PASSWORD "secret123"
  34. #define SAMPLE_RATE 8000
  35. #define SAMPLES_PER_PACKET 160 // 20 ms
  36. #define RTP_HEADER_SIZE 12
  37. #define RTP_PAYLOAD_PCMU 0
  38. #define MIC_CAPTURE_RATE 16000
  39. #define MIC_CAPTURE_FRAMES_20MS (MIC_CAPTURE_RATE / 50)
  40. #define RTP_PTIME_MS 20
  41. // Troubleshooting knobs for mic conversion and downsample quality.
  42. #define SIP_PCM_SHIFT_BITS 12
  43. #define SIP_DOWNSAMPLE_MODE_DROP 1
  44. #define SIP_DOWNSAMPLE_MODE_AVG2 0
  45. #define SIP_DOWNSAMPLE_MODE SIP_DOWNSAMPLE_MODE_AVG2
  46. #define SIP_CAPTURE_DIAG_EVERY_N_FRAMES 100
  47. #define SIP_RX_JITTER_BUFFER_FRAMES 4
  48. #define SIP_RX_JITTER_BUFFER_TARGET 3
  49. #define SIP_RX_ENABLE_JITTER_BUFFER 0
  50. #define SIP_RX_ENABLE_PLC 0
  51. #define SIP_SEND_RINGING 1
  52. static int32_t s_mic_raw_32[MIC_CAPTURE_FRAMES_20MS];
  53. static const char *TAG = "SIP";
  54. volatile bool wifi_ready = false;
  55. static int s_rtp_sock = -1;
  56. static struct sockaddr_in s_rtp_peer = {0};
  57. static uint16_t s_rtp_peer_port = 0;
  58. static uint16_t s_rtp_sequence = 0;
  59. static uint32_t s_rtp_timestamp = 0;
  60. static const uint32_t s_rtp_ssrc = 0x45535033;
  61. static volatile bool s_call_active = false;
  62. static volatile bool s_audio_hw_ready = false;
  63. static esp_audio_enc_handle_t s_audio_enc_handle = NULL;
  64. static esp_audio_dec_handle_t s_audio_dec_handle = NULL;
  65. static TaskHandle_t s_rtp_tx_task_handle = NULL;
  66. static TaskHandle_t s_rtp_rx_task_handle = NULL;
  67. static char s_sip_local_ip[16] = SIP_LOCAL_IP_DEFAULT;
  68. static uint32_t s_rtp_tx_packets = 0;
  69. static uint32_t s_rtp_tx_bad_payload = 0;
  70. static uint32_t s_rtp_tx_bad_ts_step = 0;
  71. static uint32_t s_rtp_tx_last_log_ms = 0;
  72. static uint32_t s_rtp_rx_packets = 0;
  73. static uint32_t s_rtp_rx_gap_packets = 0;
  74. static uint32_t s_rtp_rx_out_of_order = 0;
  75. static uint32_t s_rtp_rx_duplicates = 0;
  76. static uint32_t s_rtp_rx_non_pcmu = 0;
  77. static uint32_t s_rtp_rx_timeouts = 0;
  78. static uint32_t s_rtp_rx_plc_frames = 0;
  79. static uint32_t s_rtp_rx_last_log_ms = 0;
  80. static int sip_upsample_8k_to_16k_linear(const int16_t *in,
  81. int in_samples,
  82. int16_t *out,
  83. int out_capacity_samples)
  84. {
  85. if (in_samples <= 0 || out_capacity_samples < (in_samples * 2)) {
  86. return 0;
  87. }
  88. for (int i = 0; i < in_samples; i++) {
  89. out[i * 2] = in[i];
  90. if (i + 1 < in_samples) {
  91. int32_t a = in[i];
  92. int32_t b = in[i + 1];
  93. out[(i * 2) + 1] = (int16_t)((a + b) / 2);
  94. }
  95. else {
  96. out[(i * 2) + 1] = in[i];
  97. }
  98. }
  99. return in_samples * 2;
  100. }
  101. static void sip_rx_queue_push(int16_t queue[][SAMPLES_PER_PACKET * 2],
  102. int *bytes_queue,
  103. int *head,
  104. int *tail,
  105. int *count,
  106. const int16_t *frame,
  107. int frame_bytes)
  108. {
  109. if (frame_bytes <= 0) {
  110. return;
  111. }
  112. if (*count >= SIP_RX_JITTER_BUFFER_FRAMES) {
  113. *head = (*head + 1) % SIP_RX_JITTER_BUFFER_FRAMES;
  114. (*count)--;
  115. }
  116. memcpy(queue[*tail], frame, (size_t)frame_bytes);
  117. bytes_queue[*tail] = frame_bytes;
  118. *tail = (*tail + 1) % SIP_RX_JITTER_BUFFER_FRAMES;
  119. (*count)++;
  120. }
  121. static void sip_rx_queue_drain(int16_t queue[][SAMPLES_PER_PACKET * 2],
  122. int *bytes_queue,
  123. int *head,
  124. int *count,
  125. int target_level)
  126. {
  127. while (*count > target_level) {
  128. esp_audio_play(queue[*head], bytes_queue[*head], portMAX_DELAY);
  129. *head = (*head + 1) % SIP_RX_JITTER_BUFFER_FRAMES;
  130. (*count)--;
  131. }
  132. }
  133. static int16_t sip_pcm16_from_shifted(int32_t sample, uint32_t *clip_counter)
  134. {
  135. int32_t shifted = sample >> SIP_PCM_SHIFT_BITS;
  136. if (shifted > 32767) {
  137. (*clip_counter)++;
  138. return 32767;
  139. }
  140. if (shifted < -32768) {
  141. (*clip_counter)++;
  142. return -32768;
  143. }
  144. return (int16_t)shifted;
  145. }
  146. static bool sip_capture_pcm16_frame(int16_t *pcm_frame)
  147. {
  148. static uint32_t frame_counter = 0;
  149. // Read 20 ms of raw microphone data and downsample 16 kHz -> 8 kHz.
  150. if (esp_get_feed_data(false, (int16_t *)s_mic_raw_32, sizeof(s_mic_raw_32)) != ESP_OK) {
  151. return false;
  152. }
  153. uint32_t clip_count = 0;
  154. int16_t max_abs = 0;
  155. for (int i = 0; i < SAMPLES_PER_PACKET; i++) {
  156. int32_t sample;
  157. #if SIP_DOWNSAMPLE_MODE == SIP_DOWNSAMPLE_MODE_AVG2
  158. int32_t s0 = s_mic_raw_32[i * 2];
  159. int32_t s1 = s_mic_raw_32[(i * 2) + 1];
  160. sample = (s0 + s1) / 2;
  161. #else
  162. sample = s_mic_raw_32[i * 2];
  163. #endif
  164. pcm_frame[i] = sip_pcm16_from_shifted(sample, &clip_count);
  165. int16_t v = pcm_frame[i];
  166. int16_t abs_v = (v < 0) ? (int16_t)(-v) : v;
  167. if (abs_v > max_abs) {
  168. max_abs = abs_v;
  169. }
  170. }
  171. frame_counter++;
  172. if ((frame_counter % SIP_CAPTURE_DIAG_EVERY_N_FRAMES) == 0) {
  173. ESP_LOGI(TAG,
  174. "cap diag: shift=%d mode=%d max=%d clips=%u",
  175. SIP_PCM_SHIFT_BITS,
  176. SIP_DOWNSAMPLE_MODE,
  177. max_abs,
  178. (unsigned)clip_count);
  179. }
  180. return true;
  181. }
  182. /* ================= WIFI ================= */
  183. static void wifi_event_handler(void *arg, esp_event_base_t event_base,
  184. int32_t event_id, void *event_data)
  185. {
  186. if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
  187. esp_wifi_connect();
  188. }
  189. else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
  190. ESP_LOGI(TAG, "WiFi disconnected, retrying...");
  191. wifi_ready = false;
  192. esp_wifi_connect();
  193. }
  194. else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
  195. ip_event_got_ip_t *ip = (ip_event_got_ip_t *)event_data;
  196. snprintf(s_sip_local_ip, sizeof(s_sip_local_ip), IPSTR, IP2STR(&ip->ip_info.ip));
  197. ESP_LOGI(TAG, "ESP IP: " IPSTR, IP2STR(&ip->ip_info.ip));
  198. // ESP_LOGI(TAG, "WiFi connected!");
  199. wifi_ready = true;
  200. }
  201. }
  202. void wifi_init(void)
  203. {
  204. nvs_flash_init();
  205. esp_netif_init();
  206. esp_event_loop_create_default();
  207. esp_netif_create_default_wifi_sta();
  208. wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  209. esp_wifi_init(&cfg);
  210. esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL);
  211. esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL);
  212. wifi_config_t wifi_config = {
  213. .sta = {
  214. .ssid = WIFI_SSID,
  215. .password = WIFI_PASS,
  216. },
  217. };
  218. esp_wifi_set_mode(WIFI_MODE_STA);
  219. esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
  220. esp_wifi_start();
  221. }
  222. /* ================= MD5 HELPERS ================= */
  223. static void md5_calc(const unsigned char *input, size_t len, unsigned char output[16])
  224. {
  225. md5_context_t ctx;
  226. esp_rom_md5_init(&ctx);
  227. esp_rom_md5_update(&ctx, input, len);
  228. esp_rom_md5_final(output, &ctx);
  229. }
  230. static void md5_to_hex(unsigned char *md5, char *out)
  231. {
  232. for (int i = 0; i < 16; i++) {
  233. sprintf(out + i * 2, "%02x", md5[i]);
  234. }
  235. }
  236. /* ================= SIP DIGEST ================= */
  237. void sip_compute_response(
  238. const char *username,
  239. const char *realm,
  240. const char *password,
  241. const char *nonce,
  242. const char *uri,
  243. char *out_response)
  244. {
  245. unsigned char ha1_md5[16], ha2_md5[16], final_md5[16];
  246. char ha1_hex[64], ha2_hex[64], final_str[256];
  247. char ha1[128], ha2[128];
  248. snprintf(ha1, sizeof(ha1), "%s:%s:%s", username, realm, password);
  249. md5_calc((unsigned char*)ha1, strlen(ha1), ha1_md5);
  250. md5_to_hex(ha1_md5, ha1_hex);
  251. snprintf(ha2, sizeof(ha2), "REGISTER:%s", uri);
  252. md5_calc((unsigned char*)ha2, strlen(ha2), ha2_md5);
  253. md5_to_hex(ha2_md5, ha2_hex);
  254. snprintf(final_str, sizeof(final_str),
  255. "%s:%s:%s", ha1_hex, nonce, ha2_hex);
  256. md5_calc((unsigned char*)final_str, strlen(final_str), final_md5);
  257. md5_to_hex(final_md5, out_response);
  258. }
  259. /* ================= SIP HELPERS ================= */
  260. static bool sip_extract_header(const char *msg, const char *header, char *out, size_t out_len)
  261. {
  262. const char *start = strstr(msg, header);
  263. if (!start) {
  264. return false;
  265. }
  266. start += strlen(header);
  267. while (*start == ' ' || *start == '\t') {
  268. start++;
  269. }
  270. const char *end = start;
  271. while (*end != '\0' && *end != '\r' && *end != '\n') {
  272. end++;
  273. }
  274. size_t len = (size_t)(end - start);
  275. if (len >= out_len) {
  276. len = out_len - 1;
  277. }
  278. memcpy(out, start, len);
  279. out[len] = '\0';
  280. return true;
  281. }
  282. static void sip_send_200_ok(int sock, const struct sockaddr_in *remote, const char *sip_msg,
  283. const char *sdp_body, size_t sdp_len)
  284. {
  285. char via[512] = {0};
  286. char from[256] = {0};
  287. char to[256] = {0};
  288. char callid[256] = {0};
  289. char cseq[128] = {0};
  290. char response[4096];
  291. if (!sip_extract_header(sip_msg, "Via:", via, sizeof(via))) {
  292. snprintf(via, sizeof(via), "SIP/2.0/UDP %s:%d", s_sip_local_ip, SIP_LOCAL_PORT);
  293. }
  294. if (!sip_extract_header(sip_msg, "From:", from, sizeof(from))) {
  295. snprintf(from, sizeof(from), "<sip:%s@%s>", SIP_USER, ASTERISK_IP);
  296. }
  297. if (!sip_extract_header(sip_msg, "To:", to, sizeof(to))) {
  298. snprintf(to, sizeof(to), "<sip:%s@%s>", SIP_USER, ASTERISK_IP);
  299. }
  300. if (!sip_extract_header(sip_msg, "Call-ID:", callid, sizeof(callid))) {
  301. snprintf(callid, sizeof(callid), "esp32-call");
  302. }
  303. if (!sip_extract_header(sip_msg, "CSeq:", cseq, sizeof(cseq))) {
  304. snprintf(cseq, sizeof(cseq), "1 REGISTER");
  305. }
  306. int body_len = sdp_body ? (int)sdp_len : 0;
  307. int written = snprintf(response, sizeof(response),
  308. "SIP/2.0 200 OK\r\n"
  309. "Via: %s\r\n"
  310. "From: %s\r\n"
  311. "To: %s;tag=esp32\r\n"
  312. "Call-ID: %s\r\n"
  313. "CSeq: %s\r\n"
  314. "Contact: <sip:%s@%s:%d>\r\n"
  315. "%s"
  316. "Content-Length: %d\r\n"
  317. "\r\n"
  318. "%s",
  319. via,
  320. from,
  321. to,
  322. callid,
  323. cseq,
  324. SIP_USER,
  325. s_sip_local_ip,
  326. SIP_LOCAL_PORT,
  327. sdp_body ? "Content-Type: application/sdp\r\n" : "",
  328. body_len,
  329. sdp_body ? sdp_body : "");
  330. if (written < 0 || written >= (int)sizeof(response)) {
  331. ESP_LOGW(TAG, "SIP 200 OK response too large");
  332. return;
  333. }
  334. sendto(sock, response, (size_t)written, 0,
  335. (struct sockaddr *)remote, sizeof(*remote));
  336. }
  337. static void sip_build_sdp(char *out, size_t out_len)
  338. {
  339. snprintf(out, out_len,
  340. "v=0\r\n"
  341. "o=ESP32 1234 1234 IN IP4 %s\r\n"
  342. "s=ESP32 SIP Call\r\n"
  343. "c=IN IP4 %s\r\n"
  344. "t=0 0\r\n"
  345. "m=audio %d RTP/AVP 0\r\n"
  346. "a=rtpmap:0 PCMU/8000\r\n"
  347. "a=ptime:20\r\n"
  348. "a=sendrecv\r\n",
  349. s_sip_local_ip,
  350. s_sip_local_ip,
  351. RTP_PORT);
  352. }
  353. static bool sip_extract_rtp_port(const char *msg, uint16_t *out_port)
  354. {
  355. const char *m = strstr(msg, "m=audio ");
  356. if (!m) {
  357. return false;
  358. }
  359. m += strlen("m=audio ");
  360. char port_buf[16] = {0};
  361. size_t i = 0;
  362. while (*m && *m != ' ' && *m != '\r' && *m != '\n' && i < sizeof(port_buf) - 1) {
  363. port_buf[i++] = *m++;
  364. }
  365. port_buf[i] = '\0';
  366. *out_port = (uint16_t)atoi(port_buf);
  367. return *out_port != 0;
  368. }
  369. static bool sip_open_audio_media_codecs(void)
  370. {
  371. if (s_audio_enc_handle == NULL) {
  372. esp_audio_err_t reg_ret = esp_audio_enc_register_default();
  373. if (reg_ret != ESP_AUDIO_ERR_OK && reg_ret != ESP_AUDIO_ERR_ALREADY_EXIST) {
  374. ESP_LOGE(TAG, "Failed to register default encoders: %d", reg_ret);
  375. return false;
  376. }
  377. esp_g711_enc_config_t enc_cfg = ESP_G711_ENC_CONFIG_DEFAULT();
  378. enc_cfg.sample_rate = SAMPLE_RATE;
  379. enc_cfg.channel = 1;
  380. enc_cfg.bits_per_sample = 16;
  381. enc_cfg.frame_duration = 20;
  382. esp_audio_enc_config_t audio_enc_cfg = {
  383. .type = ESP_AUDIO_TYPE_G711U,
  384. .cfg = &enc_cfg,
  385. .cfg_sz = sizeof(enc_cfg),
  386. };
  387. esp_audio_err_t enc_ret = esp_audio_enc_open(&audio_enc_cfg, &s_audio_enc_handle);
  388. if (enc_ret != ESP_AUDIO_ERR_OK) {
  389. ESP_LOGE(TAG, "Failed to open audio encoder: %d", enc_ret);
  390. s_audio_enc_handle = NULL;
  391. return false;
  392. }
  393. }
  394. if (s_audio_dec_handle == NULL) {
  395. esp_audio_err_t reg_ret = esp_audio_dec_register_default();
  396. if (reg_ret != ESP_AUDIO_ERR_OK && reg_ret != ESP_AUDIO_ERR_ALREADY_EXIST) {
  397. ESP_LOGE(TAG, "Failed to register default decoders: %d", reg_ret);
  398. if (s_audio_enc_handle != NULL) {
  399. esp_audio_enc_close(s_audio_enc_handle);
  400. s_audio_enc_handle = NULL;
  401. }
  402. return false;
  403. }
  404. esp_g711_dec_cfg_t dec_cfg = ESP_G711_DEC_CONFIG_DEFAULT();
  405. dec_cfg.channel = 1;
  406. esp_audio_dec_cfg_t audio_dec_cfg = {
  407. .type = ESP_AUDIO_TYPE_G711U,
  408. .cfg = &dec_cfg,
  409. .cfg_sz = sizeof(dec_cfg),
  410. };
  411. esp_audio_err_t dec_ret = esp_audio_dec_open(&audio_dec_cfg, &s_audio_dec_handle);
  412. if (dec_ret != ESP_AUDIO_ERR_OK) {
  413. ESP_LOGE(TAG, "Failed to open audio decoder: %d", dec_ret);
  414. s_audio_dec_handle = NULL;
  415. if (s_audio_enc_handle != NULL) {
  416. esp_audio_enc_close(s_audio_enc_handle);
  417. s_audio_enc_handle = NULL;
  418. }
  419. return false;
  420. }
  421. }
  422. return true;
  423. }
  424. static bool sip_ensure_rtp_socket(void)
  425. {
  426. if (s_rtp_sock >= 0) {
  427. return true;
  428. }
  429. s_rtp_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  430. if (s_rtp_sock < 0) {
  431. ESP_LOGE(TAG, "Failed to create RTP socket");
  432. return false;
  433. }
  434. struct sockaddr_in local_addr = {0};
  435. local_addr.sin_family = AF_INET;
  436. local_addr.sin_port = htons(RTP_PORT);
  437. local_addr.sin_addr.s_addr = INADDR_ANY;
  438. if (bind(s_rtp_sock, (struct sockaddr *)&local_addr, sizeof(local_addr)) < 0) {
  439. ESP_LOGE(TAG, "Failed to bind RTP port %d", RTP_PORT);
  440. close(s_rtp_sock);
  441. s_rtp_sock = -1;
  442. return false;
  443. }
  444. struct timeval timeout = {
  445. .tv_sec = 0,
  446. .tv_usec = 200000,
  447. };
  448. setsockopt(s_rtp_sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
  449. ESP_LOGI(TAG, "RTP socket bound on %s:%d", s_sip_local_ip, RTP_PORT);
  450. return true;
  451. }
  452. static void sip_send_rtp_packet(const uint8_t *payload, size_t payload_len)
  453. {
  454. if (s_rtp_peer_port == 0) {
  455. return;
  456. }
  457. if (!sip_ensure_rtp_socket()) {
  458. return;
  459. }
  460. uint8_t packet[RTP_HEADER_SIZE + SAMPLES_PER_PACKET] = {0};
  461. size_t packet_len = RTP_HEADER_SIZE + payload_len;
  462. packet[0] = 0x80;
  463. packet[1] = 0x00;
  464. packet[2] = (uint8_t)(s_rtp_sequence >> 8);
  465. packet[3] = (uint8_t)(s_rtp_sequence & 0xFF);
  466. packet[4] = (uint8_t)(s_rtp_timestamp >> 24);
  467. packet[5] = (uint8_t)(s_rtp_timestamp >> 16);
  468. packet[6] = (uint8_t)(s_rtp_timestamp >> 8);
  469. packet[7] = (uint8_t)(s_rtp_timestamp & 0xFF);
  470. packet[8] = (uint8_t)(s_rtp_ssrc >> 24);
  471. packet[9] = (uint8_t)(s_rtp_ssrc >> 16);
  472. packet[10] = (uint8_t)(s_rtp_ssrc >> 8);
  473. packet[11] = (uint8_t)(s_rtp_ssrc & 0xFF);
  474. memcpy(packet + RTP_HEADER_SIZE, payload, payload_len);
  475. struct sockaddr_in peer = {0};
  476. peer.sin_family = AF_INET;
  477. peer.sin_port = htons(s_rtp_peer_port);
  478. peer.sin_addr = s_rtp_peer.sin_addr;
  479. sendto(s_rtp_sock, packet, packet_len, 0,
  480. (struct sockaddr *)&peer, sizeof(peer));
  481. s_rtp_sequence++;
  482. s_rtp_timestamp += SAMPLES_PER_PACKET;
  483. }
  484. static bool sip_extract_rtp_payload(const uint8_t *packet,
  485. int packet_len,
  486. uint8_t *payload_type,
  487. const uint8_t **payload,
  488. int *payload_len)
  489. {
  490. if (packet_len < RTP_HEADER_SIZE) {
  491. return false;
  492. }
  493. uint8_t version = (uint8_t)(packet[0] >> 6);
  494. uint8_t csrc_count = (uint8_t)(packet[0] & 0x0F);
  495. bool has_extension = (packet[0] & 0x10) != 0;
  496. if (version != 2) {
  497. return false;
  498. }
  499. int header_len = RTP_HEADER_SIZE + (csrc_count * 4);
  500. if (packet_len < header_len) {
  501. return false;
  502. }
  503. if (has_extension) {
  504. if (packet_len < header_len + 4) {
  505. return false;
  506. }
  507. int ext_len_words = (packet[header_len + 2] << 8) | packet[header_len + 3];
  508. header_len += 4 + (ext_len_words * 4);
  509. if (packet_len < header_len) {
  510. return false;
  511. }
  512. }
  513. *payload_type = (uint8_t)(packet[1] & 0x7F);
  514. *payload = packet + header_len;
  515. *payload_len = packet_len - header_len;
  516. return *payload_len > 0;
  517. }
  518. static void sip_rtp_tx_task(void *pvParameters)
  519. {
  520. (void)pvParameters;
  521. int16_t pcm_frame[SAMPLES_PER_PACKET] = {0};
  522. uint8_t payload[SAMPLES_PER_PACKET] = {0};
  523. esp_audio_enc_in_frame_t in_frame = {
  524. .buffer = (uint8_t *)pcm_frame,
  525. .len = sizeof(pcm_frame),
  526. };
  527. esp_audio_enc_out_frame_t out_frame = {
  528. .buffer = payload,
  529. .len = sizeof(payload),
  530. };
  531. TickType_t last_wake = xTaskGetTickCount();
  532. uint32_t last_ts = s_rtp_timestamp;
  533. s_rtp_tx_packets = 0;
  534. s_rtp_tx_bad_payload = 0;
  535. s_rtp_tx_bad_ts_step = 0;
  536. s_rtp_tx_last_log_ms = 0;
  537. while (s_call_active) {
  538. vTaskDelayUntil(&last_wake, pdMS_TO_TICKS(RTP_PTIME_MS));
  539. if (!sip_capture_pcm16_frame(pcm_frame)) {
  540. continue;
  541. }
  542. if (s_audio_enc_handle == NULL) {
  543. continue;
  544. }
  545. out_frame.encoded_bytes = 0;
  546. esp_audio_err_t enc_ret = esp_audio_enc_process(s_audio_enc_handle, &in_frame, &out_frame);
  547. if (enc_ret != ESP_AUDIO_ERR_OK) {
  548. ESP_LOGW(TAG, "Audio encode failed: %d", enc_ret);
  549. continue;
  550. }
  551. if (out_frame.encoded_bytes != SAMPLES_PER_PACKET) {
  552. s_rtp_tx_bad_payload++;
  553. }
  554. sip_send_rtp_packet(payload, out_frame.encoded_bytes);
  555. uint32_t ts_step = s_rtp_timestamp - last_ts;
  556. if (ts_step != SAMPLES_PER_PACKET) {
  557. s_rtp_tx_bad_ts_step++;
  558. }
  559. last_ts = s_rtp_timestamp;
  560. s_rtp_tx_packets++;
  561. uint32_t now_ms = (uint32_t)(xTaskGetTickCount() * portTICK_PERIOD_MS);
  562. if (s_rtp_tx_last_log_ms == 0) {
  563. s_rtp_tx_last_log_ms = now_ms;
  564. }
  565. else if ((now_ms - s_rtp_tx_last_log_ms) >= 1000) {
  566. ESP_LOGI(TAG,
  567. "rtp tx: pps=%u bad_payload=%u bad_ts=%u last_bytes=%u",
  568. (unsigned)s_rtp_tx_packets,
  569. (unsigned)s_rtp_tx_bad_payload,
  570. (unsigned)s_rtp_tx_bad_ts_step,
  571. (unsigned)out_frame.encoded_bytes);
  572. s_rtp_tx_packets = 0;
  573. s_rtp_tx_bad_payload = 0;
  574. s_rtp_tx_bad_ts_step = 0;
  575. s_rtp_tx_last_log_ms = now_ms;
  576. }
  577. }
  578. s_rtp_tx_task_handle = NULL;
  579. vTaskDelete(NULL);
  580. }
  581. static void sip_rtp_rx_task(void *pvParameters)
  582. {
  583. (void)pvParameters;
  584. uint8_t packet[1720] = {0};
  585. int16_t pcm[SAMPLES_PER_PACKET] = {0};
  586. int16_t pcm_16k[SAMPLES_PER_PACKET * 2] = {0};
  587. int16_t last_good_pcm_16k[SAMPLES_PER_PACKET * 2] = {0};
  588. bool have_last_good_frame = false;
  589. bool have_last_seq = false;
  590. uint16_t last_seq = 0;
  591. uint16_t last_logged_seq = 0;
  592. uint32_t ooo_streak = 0;
  593. int16_t playback_queue[SIP_RX_JITTER_BUFFER_FRAMES][SAMPLES_PER_PACKET * 2] = {0};
  594. int playback_bytes[SIP_RX_JITTER_BUFFER_FRAMES] = {0};
  595. int playback_head = 0;
  596. int playback_tail = 0;
  597. int playback_count = 0;
  598. s_rtp_rx_packets = 0;
  599. s_rtp_rx_gap_packets = 0;
  600. s_rtp_rx_out_of_order = 0;
  601. s_rtp_rx_duplicates = 0;
  602. s_rtp_rx_non_pcmu = 0;
  603. s_rtp_rx_timeouts = 0;
  604. s_rtp_rx_plc_frames = 0;
  605. s_rtp_rx_last_log_ms = 0;
  606. while (s_call_active) {
  607. struct sockaddr_in src;
  608. socklen_t srclen = sizeof(src);
  609. int len = recvfrom(s_rtp_sock,
  610. packet,
  611. sizeof(packet),
  612. 0,
  613. (struct sockaddr *)&src,
  614. &srclen);
  615. uint32_t now_ms = (uint32_t)(xTaskGetTickCount() * portTICK_PERIOD_MS);
  616. if (s_rtp_rx_last_log_ms == 0) {
  617. s_rtp_rx_last_log_ms = now_ms;
  618. }
  619. else if ((now_ms - s_rtp_rx_last_log_ms) >= 1000) {
  620. ESP_LOGI(TAG,
  621. "rtp rx: pps=%u gaps=%u ooo=%u dup=%u non_pcmu=%u to=%u plc=%u last_seq=%u",
  622. (unsigned)s_rtp_rx_packets,
  623. (unsigned)s_rtp_rx_gap_packets,
  624. (unsigned)s_rtp_rx_out_of_order,
  625. (unsigned)s_rtp_rx_duplicates,
  626. (unsigned)s_rtp_rx_non_pcmu,
  627. (unsigned)s_rtp_rx_timeouts,
  628. (unsigned)s_rtp_rx_plc_frames,
  629. (unsigned)last_logged_seq);
  630. s_rtp_rx_packets = 0;
  631. s_rtp_rx_gap_packets = 0;
  632. s_rtp_rx_out_of_order = 0;
  633. s_rtp_rx_duplicates = 0;
  634. s_rtp_rx_non_pcmu = 0;
  635. s_rtp_rx_timeouts = 0;
  636. s_rtp_rx_plc_frames = 0;
  637. s_rtp_rx_last_log_ms = now_ms;
  638. }
  639. if (len <= 0) {
  640. s_rtp_rx_timeouts++;
  641. continue;
  642. }
  643. uint8_t payload_type = 0;
  644. const uint8_t *payload = NULL;
  645. int payload_len = 0;
  646. if (!sip_extract_rtp_payload(packet, len, &payload_type, &payload, &payload_len)) {
  647. continue;
  648. }
  649. if (payload_type != RTP_PAYLOAD_PCMU) {
  650. s_rtp_rx_non_pcmu++;
  651. continue;
  652. }
  653. uint16_t seq = (uint16_t)(((uint16_t)packet[2] << 8) | (uint16_t)packet[3]);
  654. last_logged_seq = seq;
  655. if (!have_last_seq) {
  656. have_last_seq = true;
  657. last_seq = seq;
  658. }
  659. else {
  660. int16_t order_diff = (int16_t)(seq - last_seq);
  661. if (order_diff > 0) {
  662. if (order_diff > 1) {
  663. uint32_t missing = (uint32_t)(order_diff - 1);
  664. s_rtp_rx_gap_packets += missing;
  665. if (SIP_RX_ENABLE_PLC && have_last_good_frame) {
  666. uint32_t plc_to_play = missing;
  667. if (plc_to_play > 3) {
  668. plc_to_play = 3;
  669. }
  670. for (uint32_t i = 0; i < plc_to_play; i++) {
  671. sip_rx_queue_push(playback_queue,
  672. playback_bytes,
  673. &playback_head,
  674. &playback_tail,
  675. &playback_count,
  676. last_good_pcm_16k,
  677. (int)sizeof(last_good_pcm_16k));
  678. s_rtp_rx_plc_frames++;
  679. }
  680. }
  681. }
  682. last_seq = seq;
  683. ooo_streak = 0;
  684. }
  685. else if (order_diff == 0) {
  686. s_rtp_rx_duplicates++;
  687. continue;
  688. }
  689. else {
  690. s_rtp_rx_out_of_order++;
  691. ooo_streak++;
  692. if (ooo_streak >= 10) {
  693. // Recover quickly if the sender changes sequence domain.
  694. last_seq = seq;
  695. ooo_streak = 0;
  696. }
  697. continue;
  698. }
  699. }
  700. s_rtp_rx_packets++;
  701. if (s_audio_dec_handle == NULL) {
  702. continue;
  703. }
  704. esp_audio_dec_in_raw_t raw = {
  705. .buffer = (uint8_t *)payload,
  706. .len = (uint32_t)payload_len,
  707. .consumed = 0,
  708. .frame_recover = ESP_AUDIO_DEC_RECOVERY_NONE,
  709. };
  710. while (raw.len > 0) {
  711. esp_audio_dec_out_frame_t frame = {
  712. .buffer = (uint8_t *)pcm,
  713. .len = sizeof(pcm),
  714. .needed_size = 0,
  715. .decoded_size = 0,
  716. };
  717. esp_audio_err_t dec_ret = esp_audio_dec_process(s_audio_dec_handle, &raw, &frame);
  718. if (dec_ret != ESP_AUDIO_ERR_OK) {
  719. ESP_LOGW(TAG, "Audio decode failed: %d", dec_ret);
  720. break;
  721. }
  722. int decoded_samples = (int)frame.decoded_size / (int)sizeof(int16_t);
  723. int up_samples = sip_upsample_8k_to_16k_linear(
  724. pcm,
  725. decoded_samples,
  726. pcm_16k,
  727. (int)(sizeof(pcm_16k) / sizeof(pcm_16k[0])));
  728. if (up_samples > 0) {
  729. int play_bytes = up_samples * (int)sizeof(int16_t);
  730. if (play_bytes <= (int)sizeof(last_good_pcm_16k)) {
  731. memcpy(last_good_pcm_16k, pcm_16k, (size_t)play_bytes);
  732. have_last_good_frame = true;
  733. }
  734. #if SIP_RX_ENABLE_JITTER_BUFFER
  735. sip_rx_queue_push(playback_queue,
  736. playback_bytes,
  737. &playback_head,
  738. &playback_tail,
  739. &playback_count,
  740. pcm_16k,
  741. play_bytes);
  742. sip_rx_queue_drain(playback_queue,
  743. playback_bytes,
  744. &playback_head,
  745. &playback_count,
  746. SIP_RX_JITTER_BUFFER_TARGET);
  747. #else
  748. esp_audio_play(pcm_16k, play_bytes, portMAX_DELAY);
  749. #endif
  750. }
  751. if (raw.consumed == 0) {
  752. break;
  753. }
  754. raw.buffer += raw.consumed;
  755. raw.len -= raw.consumed;
  756. }
  757. }
  758. s_rtp_rx_task_handle = NULL;
  759. vTaskDelete(NULL);
  760. }
  761. static void sip_start_media_tasks(void)
  762. {
  763. if (!s_audio_hw_ready) {
  764. ESP_LOGW(TAG, "Audio hardware is not ready, media tasks not started");
  765. return;
  766. }
  767. if (s_rtp_peer_port == 0) {
  768. ESP_LOGW(TAG, "No RTP peer port, media tasks not started");
  769. return;
  770. }
  771. if (!sip_ensure_rtp_socket()) {
  772. return;
  773. }
  774. s_rtp_sequence = 0;
  775. s_rtp_timestamp = 0;
  776. ESP_LOGI(TAG,
  777. "media cfg: shift=%d downsample=%d jitter=%d plc=%d",
  778. SIP_PCM_SHIFT_BITS,
  779. SIP_DOWNSAMPLE_MODE,
  780. SIP_RX_ENABLE_JITTER_BUFFER,
  781. SIP_RX_ENABLE_PLC);
  782. ESP_LOGI(TAG,
  783. "media peer: %s:%u <- local %s:%d",
  784. inet_ntoa(s_rtp_peer.sin_addr),
  785. (unsigned)s_rtp_peer_port,
  786. s_sip_local_ip,
  787. RTP_PORT);
  788. if (s_rtp_tx_task_handle == NULL) {
  789. if (xTaskCreate(sip_rtp_tx_task, "rtp_tx", 8192, NULL, 5, &s_rtp_tx_task_handle) != pdPASS) {
  790. ESP_LOGE(TAG, "Failed to start RTP TX task");
  791. s_rtp_tx_task_handle = NULL;
  792. }
  793. }
  794. if (s_rtp_rx_task_handle == NULL) {
  795. if (xTaskCreate(sip_rtp_rx_task, "rtp_rx", 8192, NULL, 5, &s_rtp_rx_task_handle) != pdPASS) {
  796. ESP_LOGE(TAG, "Failed to start RTP RX task");
  797. s_rtp_rx_task_handle = NULL;
  798. }
  799. }
  800. }
  801. static void sip_stop_media_tasks(void)
  802. {
  803. s_call_active = false;
  804. }
  805. esp_err_t sip_media_init(void)
  806. {
  807. if (s_audio_hw_ready) {
  808. return ESP_OK;
  809. }
  810. esp_err_t ret = esp_board_init(MIC_CAPTURE_RATE, 2, 16);
  811. if (ret != ESP_OK) {
  812. ESP_LOGE(TAG, "esp_board_init failed: %s", esp_err_to_name(ret));
  813. return ret;
  814. }
  815. tca9555_driver_init();
  816. if (!sip_open_audio_media_codecs()) {
  817. return ESP_FAIL;
  818. }
  819. s_audio_hw_ready = true;
  820. ESP_LOGI(TAG, "Audio board initialized for live RTP media");
  821. return ESP_OK;
  822. }
  823. /* ================= SIP TASK ================= */
  824. void sip_register_task(void *pvParameters)
  825. {
  826. struct sockaddr_in server = {0};
  827. server.sin_family = AF_INET;
  828. server.sin_port = htons(SIP_PORT);
  829. server.sin_addr.s_addr = inet_addr(ASTERISK_IP);
  830. int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  831. if (sock < 0) {
  832. ESP_LOGE(TAG, "Socket failed");
  833. vTaskDelete(NULL);
  834. return;
  835. }
  836. struct sockaddr_in local_addr = {0};
  837. local_addr.sin_family = AF_INET;
  838. local_addr.sin_port = htons(SIP_LOCAL_PORT);
  839. local_addr.sin_addr.s_addr = INADDR_ANY;
  840. if (bind(sock,
  841. (struct sockaddr *)&local_addr,
  842. sizeof(local_addr)) < 0) {
  843. ESP_LOGE(TAG, "Failed to bind SIP port %d", SIP_LOCAL_PORT);
  844. close(sock);
  845. vTaskDelete(NULL);
  846. return;
  847. }
  848. ESP_LOGI(TAG, "SIP listening on UDP %d", SIP_LOCAL_PORT);
  849. struct timeval timeout = {
  850. .tv_sec = 300,
  851. .tv_usec = 0
  852. };
  853. setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
  854. /* ================= FIRST REGISTER ================= */
  855. char register_msg[512];
  856. snprintf(register_msg, sizeof(register_msg),
  857. "REGISTER sip:%s SIP/2.0\r\n"
  858. "Via: SIP/2.0/UDP %s:%d\r\n"
  859. "From: <sip:%s@%s>;tag=1234\r\n"
  860. "To: <sip:%s@%s>\r\n"
  861. "Call-ID: esp32-0001\r\n"
  862. "CSeq: 1 REGISTER\r\n"
  863. "Contact: <sip:%s@%s:%d>\r\n"
  864. "Expires: 300\r\n"
  865. "Content-Length: 0\r\n"
  866. "\r\n",
  867. ASTERISK_IP,
  868. s_sip_local_ip,
  869. SIP_LOCAL_PORT,
  870. SIP_USER,
  871. ASTERISK_IP,
  872. SIP_USER,
  873. ASTERISK_IP,
  874. SIP_USER,
  875. s_sip_local_ip,
  876. SIP_LOCAL_PORT);
  877. ESP_LOGI(TAG, "Sending REGISTER...");
  878. sendto(sock, register_msg, strlen(register_msg), 0,
  879. (struct sockaddr*)&server, sizeof(server));
  880. /* ================= RECEIVE 401 / 200 ================= */
  881. char response[1024];
  882. socklen_t addr_len = sizeof(server);
  883. bool registered = false;
  884. while (!registered) {
  885. int len = recvfrom(sock, response, sizeof(response) - 1, 0,
  886. (struct sockaddr *)&server, &addr_len);
  887. if (len <= 0) {
  888. ESP_LOGE(TAG, "No response");
  889. close(sock);
  890. vTaskDelete(NULL);
  891. return;
  892. }
  893. response[len] = '\0';
  894. // printf("SIP RESPONSE:\n%s\n", response);
  895. ESP_LOGI(TAG, "Received SIP response (%d bytes)", len);
  896. if (strstr(response, "SIP/2.0 401")) {
  897. char sip_nonce[256] = {0};
  898. char sip_realm[128] = {0};
  899. char *n = strstr(response, "nonce=\"");
  900. if (n) {
  901. n += 7;
  902. char *end = strchr(n, '"');
  903. if (end) {
  904. size_t nlen = end - n;
  905. if (nlen < sizeof(sip_nonce)) {
  906. strncpy(sip_nonce, n, nlen);
  907. sip_nonce[nlen] = '\0';
  908. }
  909. }
  910. }
  911. char *r = strstr(response, "realm=\"");
  912. if (r) {
  913. r += 7;
  914. char *rend = strchr(r, '"');
  915. if (rend) {
  916. size_t rlen = rend - r;
  917. if (rlen < sizeof(sip_realm)) {
  918. strncpy(sip_realm, r, rlen);
  919. sip_realm[rlen] = '\0';
  920. }
  921. }
  922. }
  923. if (sip_realm[0] == '\0' || sip_nonce[0] == '\0') {
  924. ESP_LOGE(TAG, "Missing realm or nonce in challenge");
  925. close(sock);
  926. vTaskDelete(NULL);
  927. return;
  928. }
  929. ESP_LOGI(TAG, "Nonce: %s", sip_nonce);
  930. ESP_LOGI(TAG, "Realm: %s", sip_realm);
  931. char response_hash[64];
  932. char sip_uri[64];
  933. snprintf(sip_uri, sizeof(sip_uri), "sip:%s", ASTERISK_IP);
  934. sip_compute_response(
  935. SIP_USER,
  936. sip_realm,
  937. SIP_PASSWORD,
  938. sip_nonce,
  939. sip_uri,
  940. response_hash
  941. );
  942. char auth[1024];
  943. snprintf(auth, sizeof(auth),
  944. "REGISTER sip:%s SIP/2.0\r\n"
  945. "Via: SIP/2.0/UDP %s:%d\r\n"
  946. "From: <sip:%s@%s>;tag=1234\r\n"
  947. "To: <sip:%s@%s>\r\n"
  948. "Call-ID: esp32-0001\r\n"
  949. "CSeq: 2 REGISTER\r\n"
  950. "Contact: <sip:%s@%s:%d>\r\n"
  951. "Authorization: Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"sip:%s\", response=\"%s\"\r\n"
  952. "Expires: 300\r\n"
  953. "Content-Length: 0\r\n"
  954. "\r\n",
  955. ASTERISK_IP,
  956. s_sip_local_ip,
  957. SIP_LOCAL_PORT,
  958. SIP_USER,
  959. ASTERISK_IP,
  960. SIP_USER,
  961. ASTERISK_IP,
  962. SIP_USER,
  963. s_sip_local_ip,
  964. SIP_LOCAL_PORT,
  965. SIP_USER,
  966. sip_realm,
  967. sip_nonce,
  968. ASTERISK_IP,
  969. response_hash);
  970. ESP_LOGI(TAG, "Sending AUTH REGISTER...");
  971. sendto(sock, auth, strlen(auth), 0,
  972. (struct sockaddr *)&server, sizeof(server));
  973. }
  974. else if (strstr(response, "SIP/2.0 200")) {
  975. registered = true;
  976. }
  977. else if (strstr(response, "SIP/2.0 486")) {
  978. ESP_LOGW(TAG, "Server returned 486 Busy");
  979. }
  980. else {
  981. ESP_LOGI(TAG, "Ignoring SIP response");
  982. }
  983. }
  984. if (!registered) {
  985. ESP_LOGW(TAG, "Registration was not completed");
  986. close(sock);
  987. vTaskDelete(NULL);
  988. return;
  989. }
  990. ESP_LOGI(TAG, "🎉 SIP REGISTER SUCCESS");
  991. /* =====================================================
  992. * KEEP SOCKET OPEN AND WAIT FOR SIP REQUESTS
  993. * ===================================================== */
  994. ESP_LOGI(TAG, "Waiting for incoming SIP requests...");
  995. while (1) {
  996. char rx_buf[2048];
  997. int rx_len = recvfrom(sock,
  998. rx_buf,
  999. sizeof(rx_buf) - 1,
  1000. 0,
  1001. (struct sockaddr *)&server,
  1002. &addr_len);
  1003. if (rx_len <= 0) {
  1004. continue;
  1005. }
  1006. rx_buf[rx_len] = '\0';
  1007. // printf("\n========================================\n");
  1008. // printf("SIP MESSAGE RECEIVED:\n");
  1009. // printf("%s\n", rx_buf);
  1010. ESP_LOGI(TAG, "Received SIP packet (%d bytes)", rx_len);
  1011. // printf("========================================\n");
  1012. if (strncmp(rx_buf, "REGISTER ", 9) == 0) {
  1013. ESP_LOGI(TAG, "Received REGISTER; sending 200 OK");
  1014. sip_send_200_ok(sock, &server, rx_buf, NULL, 0);
  1015. continue;
  1016. }
  1017. else if (strncmp(rx_buf, "INVITE ", 7) == 0) {
  1018. ESP_LOGI(TAG, "📞 Incoming INVITE");
  1019. /* ================= EXTRACT SIP HEADERS ================= */
  1020. char via[512] = {0};
  1021. char from[256] = {0};
  1022. char to[256] = {0};
  1023. char callid[256] = {0};
  1024. char cseq[128] = {0};
  1025. if (!sip_extract_header(rx_buf, "Via:", via, sizeof(via)) ||
  1026. !sip_extract_header(rx_buf, "From:", from, sizeof(from)) ||
  1027. !sip_extract_header(rx_buf, "To:", to, sizeof(to)) ||
  1028. !sip_extract_header(rx_buf, "Call-ID:", callid, sizeof(callid)) ||
  1029. !sip_extract_header(rx_buf, "CSeq:", cseq, sizeof(cseq))) {
  1030. ESP_LOGW(TAG, "INVITE missing required headers");
  1031. continue;
  1032. }
  1033. /* ================= SEND 100 TRYING ================= */
  1034. char trying[4096];
  1035. snprintf(trying, sizeof(trying),
  1036. "SIP/2.0 100 Trying\r\n"
  1037. "Via: %s\r\n"
  1038. "From: %s\r\n"
  1039. "To: %s\r\n"
  1040. "Call-ID: %s\r\n"
  1041. "CSeq: %s\r\n"
  1042. "Content-Length: 0\r\n"
  1043. "\r\n",
  1044. via,
  1045. from,
  1046. to,
  1047. callid,
  1048. cseq);
  1049. sendto(sock,
  1050. trying,
  1051. strlen(trying),
  1052. 0,
  1053. (struct sockaddr *)&server,
  1054. sizeof(server));
  1055. ESP_LOGI(TAG, "100 Trying sent");
  1056. #if SIP_SEND_RINGING
  1057. char ringing[2048];
  1058. snprintf(ringing, sizeof(ringing),
  1059. "SIP/2.0 180 Ringing\r\n"
  1060. "Via: %s\r\n"
  1061. "From: %s\r\n"
  1062. "To: %s;tag=esp32\r\n"
  1063. "Call-ID: %s\r\n"
  1064. "CSeq: %s\r\n"
  1065. "Contact: <sip:%s@%s:%d>\r\n"
  1066. "Content-Length: 0\r\n"
  1067. "\r\n",
  1068. via,
  1069. from,
  1070. to,
  1071. callid,
  1072. cseq,
  1073. SIP_USER,
  1074. s_sip_local_ip,
  1075. SIP_LOCAL_PORT);
  1076. sendto(sock,
  1077. ringing,
  1078. strlen(ringing),
  1079. 0,
  1080. (struct sockaddr *)&server,
  1081. sizeof(server));
  1082. ESP_LOGI(TAG, "180 Ringing sent");
  1083. #endif
  1084. char ok[4096];
  1085. char sdp[1024];
  1086. char peer_ip[32] = {0};
  1087. sip_build_sdp(sdp, sizeof(sdp));
  1088. if (sip_extract_rtp_port(rx_buf, &s_rtp_peer_port)) {
  1089. s_rtp_peer = server;
  1090. }
  1091. inet_ntop(AF_INET,
  1092. &s_rtp_peer.sin_addr,
  1093. peer_ip,
  1094. sizeof(peer_ip));
  1095. ESP_LOGI(TAG,
  1096. "INVITE SDP peer %s:%u, local SDP %s:%d",
  1097. peer_ip,
  1098. (unsigned)s_rtp_peer_port,
  1099. s_sip_local_ip,
  1100. RTP_PORT);
  1101. snprintf(ok, sizeof(ok),
  1102. "SIP/2.0 200 OK\r\n"
  1103. "Via: %s\r\n"
  1104. "From: %s\r\n"
  1105. "To: %s;tag=esp32\r\n"
  1106. "Call-ID: %s\r\n"
  1107. "CSeq: %s\r\n"
  1108. "Contact: <sip:%s@%s:%d>\r\n"
  1109. "Content-Type: application/sdp\r\n"
  1110. "Content-Length: %d\r\n"
  1111. "\r\n"
  1112. "%s",
  1113. via,
  1114. from,
  1115. to,
  1116. callid,
  1117. cseq,
  1118. SIP_USER,
  1119. s_sip_local_ip,
  1120. SIP_LOCAL_PORT,
  1121. strlen(sdp),
  1122. sdp);
  1123. sendto(sock,
  1124. ok,
  1125. strlen(ok),
  1126. 0,
  1127. (struct sockaddr *)&server,
  1128. sizeof(server));
  1129. ESP_LOGI(TAG, "200 OK sent");
  1130. }
  1131. else if (strncmp(rx_buf, "OPTIONS ", 8) == 0) {
  1132. ESP_LOGI(TAG, "Received OPTIONS");
  1133. }
  1134. else if (strncmp(rx_buf, "ACK ", 4) == 0) {
  1135. ESP_LOGI(TAG, "Received ACK");
  1136. s_call_active = true;
  1137. sip_start_media_tasks();
  1138. }
  1139. else if (strncmp(rx_buf, "BYE ", 4) == 0) {
  1140. ESP_LOGI(TAG, "Received BYE");
  1141. sip_stop_media_tasks();
  1142. sip_send_200_ok(sock, &server, rx_buf, NULL, 0);
  1143. }
  1144. else {
  1145. ESP_LOGI(TAG, "Unknown SIP message");
  1146. }
  1147. }
  1148. close(sock);
  1149. vTaskDelete(NULL);
  1150. }