| 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 49049char 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();	  }  }}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);}
 |