123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 |
- /*
- * udp_netsetting.c
- *
- * Created on: 22.07.2016
- * Author: balbekova
- */
- #include "FreeRTOS.h"
- #include "task.h"
- #include "lwip/api.h"
- #include "udp_netsetting.h"
- #include "stm32_uid.h"
- #include "parameters.h"
- #include "netconf.h"
- #include "web_params_api.h"
- #include "main.h"
- #include "hal.h"
- #include <string.h>
- #ifdef PRINTF_STDLIB
- #include <stdio.h>
- #endif
- #ifdef PRINTF_CUSTOM
- #include "tinystdio.h"
- #endif
- #undef DBG
- #define DBG if(0)
- #define RCV_TIMEOUT 1000
- #define SEND_TIMEOUT 2000
- #define DATA_BUF_LEN1 255
- #define UDP_PORT 49049
- char dataBuf1[DATA_BUF_LEN1];
- static uint8_t udp_type_message = 0; //0 - идентификационное сообщение; 1 - сообщение с настройками сети
- void udp_message(char *buf)
- {
- uint8_t len2 = 0;
- char str[97];
- memset(str, 0, 97);
- GetModelStr(str, &len2);
- strncat(buf, str, len2);
- strcat(buf, ";");
- GetSerialNumberStr(str, &len2);
- strncat(buf, str, len2);
- strcat(buf, ";");
- GetMacStr(str, &len2);
- strncat(buf, str, len2);
- strcat(buf, ";");
- GetVersionStr(str, &len2);
- strncat(buf, str, len2);
- strcat(buf, ";;;");
- memset(str, 0, 97);
- GetSTM32IDStr(str, &len2);
- strncat(buf, str, len2);
- strcat(buf, ";;;T2OK;;");
- }
- void udp_message_netSettings(char *buf)
- {
- char str[100];
- uint8_t len;
- /* S/N */
- GetSerialNumberStr(str, &len);
- strcat(buf, "{\"serno\":\"");
- strncat(buf, str, len);
- /* WEB */
- GetDhcpStateUDP(str, &len);
- strcat(buf, "\",\"dhcp\":\"");
- strncat(buf, str, len);
- GetIpStr(str, &len);
- strcat(buf, "\",\"ipaddress\":\"");
- strncat(buf, str, len);
- GetGatewayStr(str, &len);
- strcat(buf, "\",\"gateway\":\"");
- strncat(buf, str, len);
- GetMaskStr(str, &len);
- strcat(buf, "\",\"mask\":\"");
- strncat(buf, str, len);
- strncat(buf, "\"}", 2);
- }
- uint8_t GetUDPParamValue(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen)
- {
- char *beginValue = 0;
- char *endValue = 0;
- int len = 0;
- char *strPtr = 0;
- strPtr = strstr(inStr, paramName);
- if (strPtr != 0)
- {
- beginValue = strpbrk(strPtr,":");
- endValue = strpbrk(strPtr,",");
- if (endValue == 0)
- {
- endValue = strpbrk(strPtr,"}");
- if (endValue == 0)
- endValue = strpbrk(strPtr," ");
- }
- len = endValue - beginValue - 3;
- strncpy(paramValue, beginValue + 2, len);
- *endValue = '0';
- *beginValue = '0';
- *paramLen = len;
- return 1;
- }
- else
- {
- *paramLen = 0;
- return 0;
- }
- }
- void udp_recieve_parser(char *buf, u16_t rcvlen)
- {
- uint8_t valueLen = 0;
- uint8_t len2 = 0;
- const uint8_t len = 100;
- char value[100];
- char str[100];
- char work_buf[DATA_BUF_LEN1];
- memset(str, 0, 100);
- memset(work_buf, 0, DATA_BUF_LEN1);
- //ClearParamString(buf);
- memset(value, 0, len);
- memset(str, 0, len);
- if(rcvlen < (DATA_BUF_LEN1 - 1))
- strncpy(work_buf, buf, rcvlen);
- else
- strncpy(work_buf, buf, (DATA_BUF_LEN1 - 1));
- DBG buf[rcvlen]='\0';
- DBG printf("Rcvd (%d bytes): \t%s\r\n", rcvlen, buf);
- GetUDPParamValue(work_buf, "\"serno\"", value, &valueLen);
- if(valueLen != 0)
- GetSerialNumberStr(str, &len2);
- else
- return;
- if(strncmp(value, str, len2) == 0)
- {
- memset(str, 0, len);
- GetUDPParamValue(work_buf, "\"dhcp\"", str, &valueLen);
- // memset(str, 0, len);
- memset(value, 0, len);
- GetUDPParamValue(work_buf, "\"ipaddress\"", value, &valueLen);
- if(valueLen != 0)
- {
- SetUDPDhcpStateStr(str);
- SetIPStr(value);
- }
- else{
- udp_type_message = 1;
- return;
- }
- if (strncmp(str, "True", 4) != 0) // Если dhcp off устанавливаем параметры
- {
- memset(value, 0, len);
- GetUDPParamValue(work_buf, "\"gateway\"", value, &valueLen);
- if(valueLen != 0)
- SetGatewayStr(value);
- memset(value, 0, len);
- GetUDPParamValue(work_buf, "\"mask\"", value, &valueLen);
- if(valueLen != 0)
- SetMaskStr(value);
- memset(value, 0, len);
- }
- //else
- //SetUDPDhcpStateStr(str);
- // Если параметры WEB изменились выставляем флаг, сохраняем настройки и перезагружаемся
- if (GetStateWebReinit() == true)
- {
- // _message_add_to_log("Изменение сетевых настр", "Инфо", "ND");
- SetWebReinitFlag(false);
- SetConfirmWebParamsFlag();
- SaveWEBparam();
- HTTP_SaveSettings();
- Reboot(OTHER_ACT);
- }
- }
- }
- bool http_server_serve(struct netconn *conn)
- {
- struct netbuf *inbuf;
- err_t res;
- char* buf;
- u16_t buflen;
- bool flag = false;
- netconn_set_recvtimeout(conn, RCV_TIMEOUT);
- res = netconn_recv(conn, &inbuf);
- // DBG printf("recv failed %d\n", res);
- if (res == ERR_OK)
- {
- netbuf_data(inbuf, (void**)&buf, &buflen);
- //buf[buflen] = 0;
- udp_recieve_parser(buf, buflen);
- flag = true;
- netbuf_delete(inbuf);
- }
- /* TODO remove if tested */
- /* Close the connection (server closes in HTTP) */
- //netconn_close(conn);
- /* TODO remove if tested */
- /* Delete the buffer (netconn_recv gives us ownership,
- so we have to make sure to deallocate the buffer) */
- //netbuf_delete(inbuf);
- return flag;
- }
- void udp_netsettings_task(void *arg)
- {
- struct netconn *udp_conn;
- struct netbuf *buf_snd;
- char *data_snd;
- err_t err;
- TickType_t timestamp = 0;
- uint32_t len;
- vTaskDelay(5000);
- udp_conn = netconn_new( NETCONN_UDP );
- if (udp_conn != NULL)
- {
- err = netconn_bind(udp_conn, IP_ADDR_ANY, UDP_PORT);
- if (err == ERR_OK)
- {
- for( ;; )
- {
- netconn_connect(udp_conn, IP_ADDR_BROADCAST, UDP_PORT);
- memset(dataBuf1, 0, DATA_BUF_LEN1);
- switch(udp_type_message)
- {
- case 0:
- if (timestamp + SEND_TIMEOUT < xTaskGetTickCount()) {
- udp_message(dataBuf1);
- timestamp = xTaskGetTickCount();
- }
- break;
- case 1:
- udp_message_netSettings(dataBuf1);
- udp_type_message = 0;
- break;
- default:
- break;
- }
- len = strlen(dataBuf1);
- if (len > 0) {
- buf_snd = netbuf_new();
- if(buf_snd != NULL){
- data_snd = netbuf_alloc(buf_snd,len);
- memcpy(data_snd, dataBuf1, len);
- netconn_send(udp_conn, buf_snd);
- netbuf_delete(buf_snd);
- DBG printf("\r\nSent (%u bytes): \t%s\r\n", (unsigned int)len, dataBuf1);
- }
- }
- netconn_disconnect(udp_conn);
- /* TODO remove if tested */
- //if(http_server_serve(udp_conn))
- //vTaskDelay(1000);
- http_server_serve(udp_conn);
- }
- }
- else
- {
- netconn_delete(udp_conn);
- DBG printf("udp_netsettings_task: can't bind netconn\r\n");
- }
- }
- else
- DBG printf("udp_netsettings_task: can't create new UDP netconn\r\n");
- for( ;; )
- {
- vTaskDelay(10000);
- }
- }
- void UDP_netsetting_init() {
- xTaskCreate(udp_netsettings_task, ( char * ) "udp_netsettings_task", 4*configMINIMAL_STACK_SIZE , NULL, tskIDLE_PRIORITY, NULL);
- }
|