240 s reregister implmentation.txt 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. void sip_register_task(void *pvParameters)
  2. {
  3. while (1)
  4. {
  5. /* ================= CREATE SOCKET ================= */
  6. struct sockaddr_in server = {0};
  7. server.sin_family = AF_INET;
  8. server.sin_port = htons(SIP_PORT);
  9. server.sin_addr.s_addr = inet_addr(ASTERISK_IP);
  10. int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  11. if (sock < 0) {
  12. ESP_LOGE(TAG, "Socket failed");
  13. vTaskDelay(pdMS_TO_TICKS(5000));
  14. continue;
  15. }
  16. struct timeval timeout = {
  17. .tv_sec = 3,
  18. .tv_usec = 0
  19. };
  20. setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,
  21. &timeout, sizeof(timeout));
  22. /* ================= FIRST REGISTER ================= */
  23. char register_msg[512];
  24. snprintf(register_msg, sizeof(register_msg),
  25. "REGISTER sip:%s SIP/2.0\r\n"
  26. "Via: SIP/2.0/UDP 0.0.0.0:5062\r\n"
  27. "From: <sip:1001@%s>;tag=1234\r\n"
  28. "To: <sip:1001@%s>\r\n"
  29. "Call-ID: esp32-0001\r\n"
  30. "CSeq: 1 REGISTER\r\n"
  31. "Contact: <sip:1001@0.0.0.0:5062>\r\n"
  32. "Expires: 300\r\n"
  33. "Content-Length: 0\r\n"
  34. "\r\n",
  35. ASTERISK_IP,
  36. ASTERISK_IP,
  37. ASTERISK_IP);
  38. ESP_LOGI(TAG, "Sending REGISTER...");
  39. sendto(sock,
  40. register_msg,
  41. strlen(register_msg),
  42. 0,
  43. (struct sockaddr *)&server,
  44. sizeof(server));
  45. /* ================= RECEIVE 401 ================= */
  46. char response[1024];
  47. socklen_t addr_len = sizeof(server);
  48. int len = recvfrom(sock,
  49. response,
  50. sizeof(response) - 1,
  51. 0,
  52. (struct sockaddr *)&server,
  53. &addr_len);
  54. if (len <= 0) {
  55. ESP_LOGE(TAG, "No response");
  56. close(sock);
  57. vTaskDelay(pdMS_TO_TICKS(5000));
  58. continue;
  59. }
  60. response[len] = '\0';
  61. printf("401 RESPONSE:\n%s\n", response);
  62. if (!strstr(response, "401")) {
  63. ESP_LOGE(TAG, "Expected 401 Unauthorized");
  64. close(sock);
  65. vTaskDelay(pdMS_TO_TICKS(5000));
  66. continue;
  67. }
  68. /* ================= EXTRACT NONCE ================= */
  69. char sip_nonce[256] = {0};
  70. char *n = strstr(response, "nonce=\"");
  71. if (!n) {
  72. ESP_LOGE(TAG, "No nonce found");
  73. close(sock);
  74. vTaskDelay(pdMS_TO_TICKS(5000));
  75. continue;
  76. }
  77. n += 7;
  78. char *end = strchr(n, '"');
  79. if (!end) {
  80. ESP_LOGE(TAG, "Bad nonce format");
  81. close(sock);
  82. vTaskDelay(pdMS_TO_TICKS(5000));
  83. continue;
  84. }
  85. size_t nlen = end - n;
  86. if (nlen >= sizeof(sip_nonce)) {
  87. ESP_LOGE(TAG, "Nonce too long");
  88. close(sock);
  89. vTaskDelay(pdMS_TO_TICKS(5000));
  90. continue;
  91. }
  92. strncpy(sip_nonce, n, nlen);
  93. sip_nonce[nlen] = '\0';
  94. ESP_LOGI(TAG, "Nonce: %s", sip_nonce);
  95. /* ================= EXTRACT REALM ================= */
  96. char sip_realm[128] = {0};
  97. char *r = strstr(response, "realm=\"");
  98. if (!r) {
  99. ESP_LOGE(TAG, "Realm not found");
  100. close(sock);
  101. vTaskDelay(pdMS_TO_TICKS(5000));
  102. continue;
  103. }
  104. r += 7;
  105. char *rend = strchr(r, '"');
  106. if (!rend) {
  107. ESP_LOGE(TAG, "Bad realm format");
  108. close(sock);
  109. vTaskDelay(pdMS_TO_TICKS(5000));
  110. continue;
  111. }
  112. size_t rlen = rend - r;
  113. strncpy(sip_realm, r, rlen);
  114. sip_realm[rlen] = '\0';
  115. ESP_LOGI(TAG, "Realm: %s", sip_realm);
  116. /* ================= COMPUTE DIGEST ================= */
  117. char response_hash[64];
  118. sip_compute_response(
  119. "1001",
  120. sip_realm,
  121. "secret123",
  122. sip_nonce,
  123. "sip:" ASTERISK_IP,
  124. response_hash);
  125. /* ================= AUTH REGISTER ================= */
  126. char auth[1024];
  127. snprintf(auth, sizeof(auth),
  128. "REGISTER sip:%s SIP/2.0\r\n"
  129. "Via: SIP/2.0/UDP 0.0.0.0:5062\r\n"
  130. "From: <sip:1001@%s>;tag=1234\r\n"
  131. "To: <sip:1001@%s>\r\n"
  132. "Call-ID: esp32-0001\r\n"
  133. "CSeq: 2 REGISTER\r\n"
  134. "Contact: <sip:1001@0.0.0.0:5062>\r\n"
  135. "Authorization: Digest username=\"1001\", realm=\"%s\", nonce=\"%s\", uri=\"sip:%s\", response=\"%s\"\r\n"
  136. "Expires: 300\r\n"
  137. "Content-Length: 0\r\n"
  138. "\r\n",
  139. ASTERISK_IP,
  140. ASTERISK_IP,
  141. ASTERISK_IP,
  142. sip_realm,
  143. sip_nonce,
  144. ASTERISK_IP,
  145. response_hash);
  146. ESP_LOGI(TAG, "Sending AUTH REGISTER...");
  147. sendto(sock,
  148. auth,
  149. strlen(auth),
  150. 0,
  151. (struct sockaddr *)&server,
  152. sizeof(server));
  153. /* ================= FINAL RESPONSE ================= */
  154. char final_resp[1024];
  155. int len2 = recvfrom(sock,
  156. final_resp,
  157. sizeof(final_resp) - 1,
  158. 0,
  159. (struct sockaddr *)&server,
  160. &addr_len);
  161. if (len2 > 0) {
  162. final_resp[len2] = '\0';
  163. printf("FINAL RESPONSE:\n%s\n", final_resp);
  164. if (strstr(final_resp, "200 OK")) {
  165. ESP_LOGI(TAG, "🎉 SIP REGISTER SUCCESS");
  166. } else {
  167. ESP_LOGW(TAG, "REGISTER FAILED");
  168. }
  169. } else {
  170. ESP_LOGW(TAG, "No final response");
  171. }
  172. close(sock);
  173. ESP_LOGI(TAG, "Waiting 240 seconds before refreshing registration...");
  174. vTaskDelay(pdMS_TO_TICKS(240000));
  175. }
  176. }