udp_netsetting.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. /*
  2. * udp_netsetting.c
  3. *
  4. * Created on: 22.07.2016
  5. * Author: balbekova
  6. */
  7. #include "FreeRTOS.h"
  8. #include "task.h"
  9. #include "lwip/api.h"
  10. #include "udp_netsetting.h"
  11. #include "stm32_uid.h"
  12. #include "parameters.h"
  13. #include "netconf.h"
  14. #include "web_params_api.h"
  15. #include "main.h"
  16. #include "hal.h"
  17. #include <string.h>
  18. #ifdef PRINTF_STDLIB
  19. #include <stdio.h>
  20. #endif
  21. #ifdef PRINTF_CUSTOM
  22. #include "tinystdio.h"
  23. #endif
  24. #undef DBG
  25. #define DBG if(0)
  26. #define RCV_TIMEOUT 1000
  27. #define SEND_TIMEOUT 2000
  28. #define DATA_BUF_LEN1 255
  29. #define UDP_PORT 49049
  30. char dataBuf1[DATA_BUF_LEN1];
  31. static uint8_t udp_type_message = 0; //0 - идентификационное сообщение; 1 - сообщение с настройками сети
  32. void udp_message(char *buf)
  33. {
  34. uint8_t len2 = 0;
  35. char str[97];
  36. memset(str, 0, 97);
  37. GetModelStr(str, &len2);
  38. strncat(buf, str, len2);
  39. strcat(buf, ";");
  40. GetSerialNumberStr(str, &len2);
  41. strncat(buf, str, len2);
  42. strcat(buf, ";");
  43. GetMacStr(str, &len2);
  44. strncat(buf, str, len2);
  45. strcat(buf, ";");
  46. GetVersionStr(str, &len2);
  47. strncat(buf, str, len2);
  48. strcat(buf, ";;;");
  49. memset(str, 0, 97);
  50. GetSTM32IDStr(str, &len2);
  51. strncat(buf, str, len2);
  52. strcat(buf, ";;;T2OK;;");
  53. }
  54. void udp_message_netSettings(char *buf)
  55. {
  56. char str[100];
  57. uint8_t len;
  58. /* S/N */
  59. GetSerialNumberStr(str, &len);
  60. strcat(buf, "{\"serno\":\"");
  61. strncat(buf, str, len);
  62. /* WEB */
  63. GetDhcpStateUDP(str, &len);
  64. strcat(buf, "\",\"dhcp\":\"");
  65. strncat(buf, str, len);
  66. GetIpStr(str, &len);
  67. strcat(buf, "\",\"ipaddress\":\"");
  68. strncat(buf, str, len);
  69. GetGatewayStr(str, &len);
  70. strcat(buf, "\",\"gateway\":\"");
  71. strncat(buf, str, len);
  72. GetMaskStr(str, &len);
  73. strcat(buf, "\",\"mask\":\"");
  74. strncat(buf, str, len);
  75. strncat(buf, "\"}", 2);
  76. }
  77. uint8_t GetUDPParamValue(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen)
  78. {
  79. char *beginValue = 0;
  80. char *endValue = 0;
  81. int len = 0;
  82. char *strPtr = 0;
  83. strPtr = strstr(inStr, paramName);
  84. if (strPtr != 0)
  85. {
  86. beginValue = strpbrk(strPtr,":");
  87. endValue = strpbrk(strPtr,",");
  88. if (endValue == 0)
  89. {
  90. endValue = strpbrk(strPtr,"}");
  91. if (endValue == 0)
  92. endValue = strpbrk(strPtr," ");
  93. }
  94. len = endValue - beginValue - 3;
  95. strncpy(paramValue, beginValue + 2, len);
  96. *endValue = '0';
  97. *beginValue = '0';
  98. *paramLen = len;
  99. return 1;
  100. }
  101. else
  102. {
  103. *paramLen = 0;
  104. return 0;
  105. }
  106. }
  107. void udp_recieve_parser(char *buf, u16_t rcvlen)
  108. {
  109. uint8_t valueLen = 0;
  110. uint8_t len2 = 0;
  111. const uint8_t len = 100;
  112. char value[100];
  113. char str[100];
  114. memset(str, 0, 100);
  115. // ClearParamString(buf);
  116. memset(value, 0, len);
  117. memset(str, 0, len);
  118. DBG buf[rcvlen]='\0';
  119. DBG printf("Rcvd (%d bytes): \t%s\r\n", rcvlen, buf);
  120. GetUDPParamValue(buf, "\"serno\"", value, &valueLen);
  121. if(valueLen != 0)
  122. GetSerialNumberStr(str, &len2);
  123. else
  124. return;
  125. if(strncmp(value, str, len2) == 0)
  126. {
  127. memset(str, 0, len);
  128. GetUDPParamValue(buf, "\"dhcp\"", str, &valueLen);
  129. // memset(str, 0, len);
  130. memset(value, 0, len);
  131. GetUDPParamValue(buf, "\"ipaddress\"", value, &valueLen);
  132. if(valueLen != 0)
  133. {
  134. SetUDPDhcpStateStr(str);
  135. SetIPStr(value);
  136. }
  137. else{
  138. udp_type_message = 1;
  139. return;
  140. }
  141. if (strncmp(str, "True", 4) != 0) // Если dhcp off устанавливаем параметры
  142. {
  143. memset(value, 0, len);
  144. GetUDPParamValue(buf, "\"gateway\"", value, &valueLen);
  145. if(valueLen != 0)
  146. SetGatewayStr(value);
  147. memset(value, 0, len);
  148. GetUDPParamValue(buf, "\"mask\"", value, &valueLen);
  149. if(valueLen != 0)
  150. SetMaskStr(value);
  151. memset(value, 0, len);
  152. }
  153. else
  154. SetUDPDhcpStateStr(str);
  155. // Если параметры WEB изменились выставляем флаг, сохраняем настройки и перезагружаемся
  156. if (GetStateWebReinit() == true)
  157. {
  158. // _message_add_to_log("Изменение сетевых настр", "Инфо", "ND");
  159. SetWebReinitFlag(false);
  160. SetConfirmWebParamsFlag();
  161. SaveWEBparam();
  162. HTTP_SaveSettings();
  163. Reboot();
  164. }
  165. }
  166. }
  167. bool http_server_serve(struct netconn *conn)
  168. {
  169. struct netbuf *inbuf;
  170. err_t res;
  171. char* buf;
  172. u16_t buflen;
  173. bool flag = false;
  174. netconn_set_recvtimeout(conn, RCV_TIMEOUT);
  175. res = netconn_recv(conn, &inbuf);
  176. // DBG printf("recv failed %d\n", res);
  177. if (res == ERR_OK)
  178. {
  179. netbuf_data(inbuf, (void**)&buf, &buflen);
  180. udp_recieve_parser(buf, buflen);
  181. flag = true;
  182. netbuf_delete(inbuf);
  183. }
  184. /* TODO remove if tested */
  185. /* Close the connection (server closes in HTTP) */
  186. //netconn_close(conn);
  187. /* TODO remove if tested */
  188. /* Delete the buffer (netconn_recv gives us ownership,
  189. so we have to make sure to deallocate the buffer) */
  190. //netbuf_delete(inbuf);
  191. return flag;
  192. }
  193. void udp_netsettings_task(void *arg)
  194. {
  195. struct netconn *udp_conn;
  196. struct netbuf *buf_snd;
  197. char *data_snd;
  198. err_t err;
  199. TickType_t timestamp = 0;
  200. uint32_t len;
  201. vTaskDelay(5000);
  202. udp_conn = netconn_new( NETCONN_UDP );
  203. if (udp_conn != NULL)
  204. {
  205. err = netconn_bind(udp_conn, IP_ADDR_ANY, UDP_PORT);
  206. if (err == ERR_OK)
  207. {
  208. for( ;; )
  209. {
  210. netconn_connect(udp_conn, IP_ADDR_BROADCAST, UDP_PORT);
  211. memset(dataBuf1, 0, DATA_BUF_LEN1);
  212. switch(udp_type_message)
  213. {
  214. case 0:
  215. if (timestamp + SEND_TIMEOUT < xTaskGetTickCount()) {
  216. udp_message(dataBuf1);
  217. timestamp = xTaskGetTickCount();
  218. }
  219. break;
  220. case 1:
  221. udp_message_netSettings(dataBuf1);
  222. udp_type_message = 0;
  223. break;
  224. default:
  225. break;
  226. }
  227. len = strlen(dataBuf1);
  228. if (len > 0) {
  229. buf_snd = netbuf_new();
  230. data_snd = netbuf_alloc(buf_snd,len);
  231. memcpy(data_snd, dataBuf1, len);
  232. netconn_send(udp_conn, buf_snd);
  233. netbuf_delete(buf_snd);
  234. DBG printf("\r\nSent (%u bytes): \t%s\r\n", (unsigned int)len, dataBuf1);
  235. }
  236. netconn_disconnect(udp_conn);
  237. /* TODO remove if tested */
  238. //if(http_server_serve(udp_conn))
  239. //vTaskDelay(1000);
  240. http_server_serve(udp_conn);
  241. }
  242. }
  243. else
  244. {
  245. netconn_delete(udp_conn);
  246. DBG printf("udp_netsettings_task: can't bind netconn\r\n");
  247. }
  248. }
  249. else
  250. DBG printf("udp_netsettings_task: can't create new UDP netconn\r\n");
  251. for( ;; )
  252. {
  253. vTaskDelay(10000);
  254. }
  255. }
  256. void UDP_netsetting_init() {
  257. xTaskCreate(udp_netsettings_task, ( char * ) "udp_netsettings_task", 4*configMINIMAL_STACK_SIZE , NULL, tskIDLE_PRIORITY, NULL);
  258. }