Ver Fonte

add udp_netsettings

balbekova há 7 anos atrás
pai
commit
3e0d9b318b

+ 8 - 0
modules/Ethernet/netconf.c

@@ -323,6 +323,14 @@ void vTaskWebReinit(void * pvParameters)
   }	
 }	
 
+void SaveWEBparam(void)
+{
+  sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;
+  strcpy(sSettings.sWebParams.ip,   sSettings.sWebTempParams.ip);
+  strcpy(sSettings.sWebParams.gate, sSettings.sWebTempParams.gate);
+  strcpy(sSettings.sWebParams.mask, sSettings.sWebTempParams.mask);
+}
+
 /**
   * @brief  Возвращает true если сетевые параметры изменились
   */

+ 2 - 0
modules/Ethernet/netconf.h

@@ -62,6 +62,8 @@ void WEB_StartReinitTask(void);
   */
 void vTaskWebReinit(void * pvParameters);
 
+void SaveWEBparam(void);
+
 /**
   * @brief  Возвращает true если сетевые параметры изменились
   */

+ 325 - 0
modules/Ethernet/udp_netsetting.c

@@ -0,0 +1,325 @@
+/*
+ * 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 <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];
+
+  memset(str, 0, 100);
+
+ // ClearParamString(buf);
+
+  memset(value, 0, len);
+  memset(str, 0, len);
+
+  DBG buf[rcvlen]='\0';
+  DBG printf("Rcvd (%d bytes): \t%s\r\n", rcvlen, buf);
+  GetUDPParamValue(buf, "\"serno\"", value, &valueLen);
+  if(valueLen != 0)
+	  GetSerialNumberStr(str, &len2);
+  else
+	  return;
+
+  if(strncmp(value, str, len2) == 0)
+  {
+	  memset(str, 0, len);
+
+	  GetUDPParamValue(buf, "\"dhcp\"", str, &valueLen);
+
+	 // memset(str, 0, len);
+	  memset(value, 0, len);
+	  GetUDPParamValue(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(buf, "\"gateway\"", value, &valueLen);
+		  if(valueLen != 0)
+			  SetGatewayStr(value);
+		  memset(value, 0, len);
+
+		  GetUDPParamValue(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();
+
+		NVIC_SystemReset();
+	  }
+  }
+}
+
+
+
+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);
+        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();
+            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);
+}
+
+
+

+ 14 - 0
modules/Ethernet/udp_netsetting.h

@@ -0,0 +1,14 @@
+/*
+ * udp_netsetting.h
+ *
+ *  Created on: 22.07.2016
+ *      Author: balbekova
+ */
+
+#ifndef UDP_NETSETTING_H_
+#define UDP_NETSETTING_H_
+
+void UDP_netsetting_init();
+
+
+#endif /* UDP_NETSETTING_H_ */