sip.c 29 KB

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