udp_netsetting.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  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. char work_buf[DATA_BUF_LEN1];
  115. memset(str, 0, 100);
  116. memset(work_buf, 0, DATA_BUF_LEN1);
  117. //ClearParamString(buf);
  118. memset(value, 0, len);
  119. memset(str, 0, len);
  120. if(rcvlen < (DATA_BUF_LEN1 - 1))
  121. strncpy(work_buf, buf, rcvlen);
  122. else
  123. strncpy(work_buf, buf, (DATA_BUF_LEN1 - 1));
  124. DBG buf[rcvlen]='\0';
  125. DBG printf("Rcvd (%d bytes): \t%s\r\n", rcvlen, buf);
  126. GetUDPParamValue(work_buf, "\"serno\"", value, &valueLen);
  127. if(valueLen != 0)
  128. GetSerialNumberStr(str, &len2);
  129. else
  130. return;
  131. if(strncmp(value, str, len2) == 0)
  132. {
  133. memset(str, 0, len);
  134. GetUDPParamValue(work_buf, "\"dhcp\"", str, &valueLen);
  135. // memset(str, 0, len);
  136. memset(value, 0, len);
  137. GetUDPParamValue(work_buf, "\"ipaddress\"", value, &valueLen);
  138. if(valueLen != 0)
  139. {
  140. SetUDPDhcpStateStr(str);
  141. SetIPStr(value);
  142. }
  143. else{
  144. udp_type_message = 1;
  145. return;
  146. }
  147. if (strncmp(str, "True", 4) != 0) // Если dhcp off устанавливаем параметры
  148. {
  149. memset(value, 0, len);
  150. GetUDPParamValue(work_buf, "\"gateway\"", value, &valueLen);
  151. if(valueLen != 0)
  152. SetGatewayStr(value);
  153. memset(value, 0, len);
  154. GetUDPParamValue(work_buf, "\"mask\"", value, &valueLen);
  155. if(valueLen != 0)
  156. SetMaskStr(value);
  157. memset(value, 0, len);
  158. }
  159. //else
  160. //SetUDPDhcpStateStr(str);
  161. // Если параметры WEB изменились выставляем флаг, сохраняем настройки и перезагружаемся
  162. if (GetStateWebReinit() == true)
  163. {
  164. // _message_add_to_log("Изменение сетевых настр", "Инфо", "ND");
  165. SetWebReinitFlag(false);
  166. SetConfirmWebParamsFlag();
  167. SaveWEBparam();
  168. HTTP_SaveSettings();
  169. Reboot(OTHER_ACT);
  170. }
  171. }
  172. }
  173. bool http_server_serve(struct netconn *conn)
  174. {
  175. struct netbuf *inbuf;
  176. err_t res;
  177. char* buf;
  178. u16_t buflen;
  179. bool flag = false;
  180. netconn_set_recvtimeout(conn, RCV_TIMEOUT);
  181. res = netconn_recv(conn, &inbuf);
  182. // DBG printf("recv failed %d\n", res);
  183. if (res == ERR_OK)
  184. {
  185. netbuf_data(inbuf, (void**)&buf, &buflen);
  186. //buf[buflen] = 0;
  187. udp_recieve_parser(buf, buflen);
  188. flag = true;
  189. netbuf_delete(inbuf);
  190. }
  191. /* TODO remove if tested */
  192. /* Close the connection (server closes in HTTP) */
  193. //netconn_close(conn);
  194. /* TODO remove if tested */
  195. /* Delete the buffer (netconn_recv gives us ownership,
  196. so we have to make sure to deallocate the buffer) */
  197. //netbuf_delete(inbuf);
  198. return flag;
  199. }
  200. void udp_netsettings_task(void *arg)
  201. {
  202. struct netconn *udp_conn;
  203. struct netbuf *buf_snd;
  204. char *data_snd;
  205. err_t err;
  206. TickType_t timestamp = 0;
  207. uint32_t len;
  208. vTaskDelay(5000);
  209. udp_conn = netconn_new( NETCONN_UDP );
  210. if (udp_conn != NULL)
  211. {
  212. err = netconn_bind(udp_conn, IP_ADDR_ANY, UDP_PORT);
  213. if (err == ERR_OK)
  214. {
  215. for( ;; )
  216. {
  217. netconn_connect(udp_conn, IP_ADDR_BROADCAST, UDP_PORT);
  218. memset(dataBuf1, 0, DATA_BUF_LEN1);
  219. switch(udp_type_message)
  220. {
  221. case 0:
  222. if (timestamp + SEND_TIMEOUT < xTaskGetTickCount()) {
  223. udp_message(dataBuf1);
  224. timestamp = xTaskGetTickCount();
  225. }
  226. break;
  227. case 1:
  228. udp_message_netSettings(dataBuf1);
  229. udp_type_message = 0;
  230. break;
  231. default:
  232. break;
  233. }
  234. len = strlen(dataBuf1);
  235. if (len > 0) {
  236. buf_snd = netbuf_new();
  237. if(buf_snd != NULL){
  238. data_snd = netbuf_alloc(buf_snd,len);
  239. memcpy(data_snd, dataBuf1, len);
  240. netconn_send(udp_conn, buf_snd);
  241. netbuf_delete(buf_snd);
  242. DBG printf("\r\nSent (%u bytes): \t%s\r\n", (unsigned int)len, dataBuf1);
  243. }
  244. }
  245. netconn_disconnect(udp_conn);
  246. /* TODO remove if tested */
  247. //if(http_server_serve(udp_conn))
  248. //vTaskDelay(1000);
  249. http_server_serve(udp_conn);
  250. }
  251. }
  252. else
  253. {
  254. netconn_delete(udp_conn);
  255. DBG printf("udp_netsettings_task: can't bind netconn\r\n");
  256. }
  257. }
  258. else
  259. DBG printf("udp_netsettings_task: can't create new UDP netconn\r\n");
  260. for( ;; )
  261. {
  262. vTaskDelay(10000);
  263. }
  264. }
  265. void UDP_netsetting_init() {
  266. xTaskCreate(udp_netsettings_task, ( char * ) "udp_netsettings_task", 4*configMINIMAL_STACK_SIZE , NULL, tskIDLE_PRIORITY, NULL);
  267. }