udp_netsetting.c 6.5 KB

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