tcp_server.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. #include "lwip/opt.h"
  2. #include "lwip/sys.h"
  3. #include "tcp_server.h"
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include "stm32f2xx.h"
  7. #include "main.h"
  8. #include "lwip/tcp.h"
  9. #include "lwip/memp.h"
  10. #include "lwip/api.h"
  11. #include "lwip/sockets.h"
  12. #include "log.h"
  13. #include "app_ethernet.h"
  14. #include "gateway_message.h"
  15. #include "stdlib.h"
  16. #include "timer.h"
  17. #include "sys_mqtt.h"
  18. #include "updata.h"
  19. #include "app_ethernet.h"
  20. #include "stm32f2xx_hal.h"
  21. #include "myFile.h"
  22. uint8_t closeFlag = 0; // DHCP关闭标志位
  23. uint8_t ProtocolsModeFlag = 1;// 默认 :开启内置协议模式
  24. uint8_t TransparentModeFlag = 0; // 表示用串口透传 将数据原封不动的发给客户端
  25. ip_config load_ip_config = {0};
  26. ip_config *get_ip_config()
  27. {
  28. return &load_ip_config;
  29. }
  30. #if 1
  31. // 解析设备当前的硬件信息(结构体内的数据)
  32. void get_device_params(char* device_params)
  33. {
  34. GATEWAY_PARAMS *get;
  35. get= get_gateway_config_params();
  36. DEVICE_PARAMS *current_device=get->device_params;
  37. sprintf(device_params, "{\"read_config\":\"success\",\"baudrate\":%d,\"checkBit\":%d,\"commandTopic\":\"%s\",\"dataBit\":%d,\
  38. \"deviceId\":\"%s\",\"host\":\"%s\",\"inboundTime\":%d,\"messageTopic\":\"%s\",\"port\":%d,\"stopBit\":%d,\"deviceList\":[",get->baudrate,
  39. get->checkBit,get->commandTopic,get->dataBits,get->deviceId,get->host,get->inboundTime,get->messageTopic,get->port,get->stopBit);
  40. while(current_device != NULL)
  41. {
  42. sprintf(device_params + strlen(device_params),"{\"protocol\":%d,\"bigLittleFormat\":%d,\"deviceId\":\"%s\",\"sensorData\":[",
  43. current_device->protocol,current_device->MDBbigLittleFormat,current_device->deviceID);
  44. GATEWAY_READ_DLT645_COMMAND *read_dlt645_command = current_device->params->gateway_read_dlt645_command;
  45. GATEWAY_READ_MODBUS_COMMAND *read_modbus_command = current_device->params->gateway_read_modbus_command;
  46. GATEWAY_WRITE_MODBUS_COMMAND *write_modbus_command = current_device->params->gateway_write_modbus_command;
  47. // dlt645 read
  48. while(read_dlt645_command != NULL)
  49. {
  50. sprintf(device_params + strlen(device_params),"{\"identifier645\":%d,\"identifier\":\"%s\",\"deviceID645\":\"%s\"},",
  51. read_dlt645_command->Identification,read_dlt645_command->keyword,read_dlt645_command->deviceID645);
  52. read_dlt645_command = read_dlt645_command->nextParams;
  53. }
  54. // modbus read
  55. while(read_modbus_command != NULL)
  56. {
  57. sprintf(device_params + strlen(device_params),"{\"rFunctionCode\":%d,\"registerAddress\":%d,\"slaveAddress\":%d,\"registerByteNum\":%d,\"identifier\":\"%s\",\"precise\":%d},",
  58. read_modbus_command->functionCode, read_modbus_command->registerAddress,read_modbus_command->slaveAddress,
  59. read_modbus_command->registerByteNum,read_modbus_command->keyword,read_modbus_command->decimalPoint);
  60. read_modbus_command = read_modbus_command->nextParams;
  61. }
  62. // modbus write
  63. sprintf(device_params + strlen(device_params)-1,"], \"commandData\":[");//sensorData:[
  64. while(write_modbus_command != NULL)
  65. {
  66. sprintf(device_params + strlen(device_params),"{\"registerAddress\":%d,\"slaveAddress\":%d,\"wFunctionCode\":%d,\"registerByteNum\":%d},",
  67. write_modbus_command->registerAddress,write_modbus_command->slaveAddress,write_modbus_command->functionCode,write_modbus_command->registerByteNum);
  68. write_modbus_command = write_modbus_command->nextParams;
  69. }
  70. sprintf(device_params + strlen(device_params)-1,"]},");// commandData:[
  71. current_device = current_device->nextDevice;
  72. }
  73. sprintf(device_params + strlen(device_params) -1 ,"]}");
  74. }
  75. // 储存上位机发送的config数据,并返回上位机操作结果
  76. void save_config(int client_socket,char* buf)
  77. {
  78. char* saveData = mymalloc(SRAMEX,20 * 1024);//(RECV_BUF_SIZE);// 存储config数据 最大20K
  79. if(saveData == NULL)
  80. LogPrint(LOG_ERROR,__FILE__,__FUNCTION__,__LINE__,"recv buf malloc fail");
  81. memset(saveData,0,strlen(saveData));
  82. // 插入tcp_config标志位,后续不通过http获取默认配置数据
  83. sprintf(saveData, "tcp_config");
  84. sprintf(saveData + strlen(saveData),"%s",buf);
  85. // 获取上位机发送的数据
  86. do{
  87. memset(buf, 0, strlen(buf));
  88. recv(client_socket,buf,1460,0);
  89. memcpy(saveData + strlen(saveData), buf, strlen(buf));
  90. }while(buf[1] != 0 && buf[1459] != 0);
  91. DeleteDirFile("device.txt");
  92. write_file("device.txt",saveData,strlen(saveData));// 储存到flash 不用判断失败
  93. myfree(SRAMEX, saveData);
  94. char* retMsg = mymalloc(SRAMEX,32);
  95. memset(retMsg, 0, strlen(retMsg));
  96. retMsg = "{\"write_config\":\"success\"}";
  97. send(client_socket, retMsg, strlen(retMsg), 0);
  98. myfree(SRAMEX ,retMsg);
  99. }
  100. // 储存上位机发送的config_add数据,并返回上位机操作结果
  101. void add_config(int client_socket, char* dataBuf)
  102. {
  103. GATEWAY_PARAMS *get;
  104. get= get_gateway_config_params();
  105. DEVICE_PARAMS *device=get->device_params;
  106. char* retMsg = mymalloc(SRAMEX,32);
  107. memset(retMsg, 0, strlen(retMsg));
  108. while(device != NULL)// 一直轮询到当前为NULL
  109. {
  110. device = device->nextDevice;
  111. }
  112. addDevice(dataBuf);
  113. // 再检查更新后的deviceId是否为NULL
  114. if(device == NULL)// error
  115. {
  116. retMsg = "{\"write_config\":\"error\"}";
  117. send(client_socket, retMsg, strlen(retMsg), 0);
  118. }
  119. else// success
  120. {
  121. retMsg = "{\"write_config\":\"success\"}";
  122. send(client_socket, retMsg, strlen(retMsg), 0);
  123. }
  124. myfree(SRAMEX, retMsg);
  125. }
  126. // 设备嗅探
  127. void find_device(int client_socket)
  128. {
  129. char deviceId[50];// 发送设备名
  130. GATEWAY_PARAMS *get;
  131. get= get_gateway_config_params();
  132. if(get->device_params == NULL)
  133. {
  134. sprintf(deviceId, "{\"find_device\":\"%s\"}", gatewayId);
  135. send(client_socket, deviceId, strlen(deviceId), 0);
  136. }
  137. else
  138. {
  139. sprintf(deviceId, "{\"find_device\":\"%s\"}", get->deviceId);
  140. send(client_socket, deviceId, strlen(deviceId), 0);
  141. }
  142. memset(deviceId, 0, 50);
  143. }
  144. // 发送设备当前的config数据
  145. void send_config(int client_socket)
  146. {
  147. GATEWAY_PARAMS *get;
  148. get= get_gateway_config_params();
  149. char* device_params = mymalloc(SRAMEX, 3 * 1024);
  150. memset(device_params,0,3 * 1024);
  151. if(get->device_params == NULL)
  152. {
  153. sprintf(device_params, "{\"read_config\":\"error\"}");
  154. send(client_socket, device_params, strlen(device_params), 0);
  155. }
  156. else
  157. {
  158. get_device_params(device_params);
  159. send(client_socket, device_params, strlen(device_params), 0);
  160. }
  161. myfree(SRAMEX, device_params);
  162. }
  163. // 解析上位机发送的ip_config数据
  164. void analysis_ip_config(int client_socket, int sockfd,struct sockaddr_in tcpServerSock, char* buf)
  165. {
  166. // 打开DHCP
  167. if (strstr(buf, "\"dhcpMode\":\"open\"") != NULL)
  168. {
  169. DHCP_open();
  170. char* retMsg = mymalloc(SRAMEX,32);
  171. retMsg = "{\"ip_config\":\"success\"}";
  172. send(client_socket,retMsg,strlen(retMsg),0);
  173. myfree(SRAMEX, retMsg);
  174. }
  175. // 关闭DHCP
  176. else if (strstr(buf, "\"dhcpMode\":\"close\"") != NULL)
  177. {
  178. uint8_t prot[6];
  179. // 设置静态IP地址,并关闭DHCP
  180. set_ipaddr(buf);
  181. // 解析buf内的数据,保存到load_ip_config结构体
  182. parseStringField(buf, "\"ipv4\":\"", (char *)&load_ip_config.host);// eg:192.168.1.100
  183. parseStringField(buf, "\"subnetMask\":\"", (char *)&load_ip_config.subnetMask);// eg:255.255.255.0
  184. parseStringField(buf, "\"defaultGateway\":\"", (char *)&load_ip_config.defaultGateway);// eg:192.168.1.1
  185. parseStringField(buf, "\"udpLogPort\":\"", (char *)&prot);
  186. load_ip_config.udpLogPort = atoi((char *)&prot);
  187. // 关闭服务端和客户端
  188. lwip_close(sockfd);
  189. lwip_close(client_socket);
  190. // DHCP关闭标志位置 1
  191. closeFlag = 1;
  192. }
  193. }
  194. // 切换工作模式
  195. void work_mode(char* buf)
  196. {
  197. /* 用标志位开关data_task任务中,发送数据的方式 */
  198. // 内置协议模式
  199. if(strstr(buf,"protocolsMode") != NULL)
  200. {
  201. ProtocolsModeFlag = 1;// 开启内置协议模式
  202. TransparentModeFlag = 0; // 关闭透明传输模式
  203. LogPrint(LOG_INFO,__FILE__,__FUNCTION__,__LINE__,"ProtocolsMode");
  204. }
  205. // 透明传输模式
  206. if(strstr(buf,"TransparentMode") != NULL)
  207. {
  208. ProtocolsModeFlag = 0;// 关闭内置协议模式
  209. TransparentModeFlag = 1; // 开启透明传输模式
  210. LogPrint(LOG_INFO,__FILE__,__FUNCTION__,__LINE__,"TransparentModeFlag");
  211. }
  212. }
  213. #endif
  214. void tcp_server_task(void const * argument)
  215. {
  216. int ret,sockfd;
  217. int recv_size;
  218. struct sockaddr_in tcpServerSock;
  219. struct sockaddr_in client_sock;
  220. // 命令集
  221. char* recv_cmd[] = {"\"cmd\":\"write_config\"","\"cmd\":\"write_config_add\"",
  222. "\"cmd\":\"read_config\"","\"cmd\":\"find_device\"",
  223. "\"cmd\":\"ip_config\"","\"cmd\":\"toggle_work_mode\"",
  224. "\"cmd\":\"software_update\"","\"cmd\":\"reboot\""};
  225. while(dhcp_done!=1) {vTaskDelay(100);}
  226. tcpServerSock.sin_family = AF_INET;
  227. inet_aton("192.168.0.100",&(tcpServerSock.sin_addr));
  228. // tcpServerSock.sin_addr.s_addr = htonl(IPADDR_ANY);
  229. tcpServerSock.sin_port = htons(8080);
  230. tcp_server_begin:
  231. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  232. if (sockfd < 0)
  233. {
  234. goto tcp_server_begin;
  235. }
  236. ret = bind(sockfd, (struct sockaddr *)&tcpServerSock, sizeof(tcpServerSock));
  237. if (ret < 0)
  238. {
  239. lwip_close(sockfd);
  240. sockfd = -1;
  241. goto tcp_server_begin;
  242. }
  243. ret = listen(sockfd, 10);
  244. if (ret < 0)
  245. {
  246. lwip_close(sockfd);
  247. sockfd = -1;
  248. goto tcp_server_begin;
  249. }
  250. socklen_t len = sizeof(client_sock);
  251. int client_socket = accept(sockfd, (struct sockaddr*)&client_sock,&len);
  252. if (client_socket<0)
  253. {
  254. printf("error");
  255. }
  256. LogPrint(LOG_INFO,__FILE__,__FUNCTION__,__LINE__,"PC connect success");
  257. while (1)
  258. {
  259. vTaskDelay(100);
  260. char *dataBuf= mymalloc(SRAMEX,RECV_BUF_SIZE);// 存储上位机下发数据
  261. memset(dataBuf,0,RECV_BUF_SIZE);
  262. // 获取上位机发送的数据
  263. recv_size=recv(client_socket,dataBuf,RECV_BUF_SIZE,0);
  264. // 接收到消息
  265. // 解析上位机发送的CMD命令
  266. if(recv_size>0)
  267. {
  268. int j = 0;
  269. for(int i = 0; i < sizeof(recv_cmd)/sizeof(recv_cmd[0]); i++)
  270. {
  271. if(strstr(dataBuf,recv_cmd[i]) != NULL)
  272. {
  273. i = sizeof(recv_cmd)/sizeof(recv_cmd[0]);
  274. }
  275. j++;
  276. }
  277. if (ProtocolsModeFlag) {
  278. switch (j) {
  279. case WRITE_CONFIG:
  280. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "write config");
  281. save_config(client_socket, dataBuf);
  282. __set_PRIMASK(1);
  283. NVIC_SystemReset();
  284. break;
  285. case WRITE_CONFIG_ADD:
  286. add_config(client_socket, dataBuf);
  287. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "write config add");
  288. break;
  289. case READ_CONFIG:
  290. send_config(client_socket);
  291. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "read config");
  292. break;
  293. case FIND_DEVICE:
  294. find_device(client_socket);
  295. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "find device");
  296. break;
  297. case IP_CONFIG:
  298. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "ipconfig");
  299. analysis_ip_config(client_socket, sockfd, tcpServerSock, dataBuf);
  300. if (closeFlag == 1) {
  301. // 更新新的地址
  302. inet_aton((char*)&load_ip_config.host, &(tcpServerSock.sin_addr));
  303. closeFlag = 0;
  304. goto tcp_server_begin;
  305. }
  306. break;
  307. case TOGGLE_MODE:
  308. work_mode(dataBuf);
  309. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "toggle work mode");
  310. break;
  311. case UPDATE:
  312. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "update");
  313. updata_task_creat(client_socket);
  314. break;
  315. case REBOOT:
  316. send(client_socket,"{\"reboot\":\"success\"}", 20, 0);
  317. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "reboot");
  318. __set_PRIMASK(1);
  319. NVIC_SystemReset();
  320. break;
  321. }
  322. } else {
  323. switch (j) {
  324. case FIND_DEVICE:
  325. find_device(client_socket);
  326. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "find device");
  327. break;
  328. case IP_CONFIG:
  329. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "ip config");
  330. analysis_ip_config(client_socket, sockfd, tcpServerSock, dataBuf);
  331. if (closeFlag == 1) {
  332. // 更新新的地址
  333. inet_aton((char*)&load_ip_config.host, &(tcpServerSock.sin_addr));
  334. closeFlag = 0;
  335. goto tcp_server_begin;
  336. }
  337. break;
  338. case TOGGLE_MODE:
  339. work_mode(dataBuf);
  340. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "toggle work mode");
  341. break;
  342. case UPDATE:
  343. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "update");
  344. updata_task_creat(client_socket);
  345. break;
  346. case REBOOT:
  347. send(client_socket,"{\"reboot\":\"success\"}", 20, 0);
  348. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "reboot");
  349. __set_PRIMASK(1);
  350. NVIC_SystemReset();
  351. break;
  352. }
  353. }
  354. }
  355. // 没接收到消息
  356. else if(recv_size==0)
  357. {
  358. lwip_close(client_socket);
  359. LOG_PRINT(LOG_ERROR,"PC disconnect,wait reconnect");
  360. client_socket= accept(sockfd, (struct sockaddr*)&client_sock,&len);
  361. }
  362. myfree(SRAMEX, dataBuf);
  363. }
  364. }
  365. /*!
  366. \brief initialize the tcp_client application
  367. \param[in] none
  368. \param[out] none
  369. \retval none
  370. */
  371. void tcp_server_init(void)
  372. {
  373. osThreadDef(SERVER, tcp_server_task, osPriorityNormal, 0, configMINIMAL_STACK_SIZE*8);
  374. osThreadCreate(osThread(SERVER), NULL);
  375. }