device_message.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #include "device_message.h"
  2. #include "gd32f10x.h"
  3. #include "string.h"
  4. int parseIntField(const char *data, const char *field);
  5. void parseStringField(const char *data, const char *field, char *value);
  6. void addDevice(char *deviceString);
  7. void addSensorListParams(char *paramString, DEVICE_PARAMS *device);
  8. void addCommandListParams(char *paramString, DEVICE_PARAMS *device);
  9. GATEWAY_PARAMS gateway_config_params = {0};
  10. GATEWAY_PARAMS *get_gateway_config_params()
  11. {
  12. return &gateway_config_params;
  13. }
  14. /***
  15. ***其主要分为了三层结构来做的最外层网关层,设备层,属性层
  16. ***其不用json解析,json消耗量太大,用关键字匹配去解析json数据用'}'和后一位']'去做结束判断依次从最内层往外层一层一层解析,解析完最内层的数据将'}'变为'A'防止外层去找结束符号时找到了内层
  17. ***/
  18. //解析网关最外层的相关信息
  19. int addGatewayParams(char *gatewayString)
  20. {
  21. parseStringField(gatewayString, "\"commandTopic\":\"", (char *)&gateway_config_params.commandTopic);
  22. parseStringField(gatewayString, "\"messageTopic\":\"", (char *)&gateway_config_params.messageTopic);
  23. parseStringField(gatewayString, "\"deviceId\":\"", (char *)&gateway_config_params.deviceId);
  24. parseStringField(gatewayString, "\"host\":\"", (char *)&gateway_config_params.host);
  25. gateway_config_params.port = parseIntField(gatewayString, "\"port\":");
  26. gateway_config_params.pollTime = parseIntField(gatewayString, "\"pollTime\":");
  27. gateway_config_params.baudrate=parseIntField(gatewayString, "\"baudrate\":");
  28. gateway_config_params.checkBit=parseIntField(gatewayString, "\"checkBit\":");
  29. gateway_config_params.dataBits=parseIntField(gatewayString, "\"dataBit\":");
  30. gateway_config_params.stopBit=parseIntField(gatewayString, "\"stopBit\":");
  31. gateway_config_params.inboundTime=parseIntField(gatewayString, "\"inboundTime\":");
  32. char *deviceString = strstr(gatewayString, "deviceList");//找到设备数组所处位置
  33. while (1)
  34. {
  35. addDevice(deviceString); // 往此节点下挂载设备信息
  36. deviceString=deviceString;//deviceString内容被内部数据改写了进行一次数据重加载
  37. deviceString = strstr(deviceString, "}"); // 移动到下一条属性
  38. deviceString[0]='A';
  39. deviceString++;
  40. if(deviceString[0]==']')
  41. {
  42. break;
  43. }
  44. }
  45. }
  46. void addGatewayParamsJson(char *gatewayString)
  47. {
  48. }
  49. //添加新的设备
  50. //应其为多层嵌套结构所以其找到最内部对象{}后将其值改写,这样可以避免外部的结构再去寻找
  51. void addDevice(char *deviceString)
  52. {
  53. char *paramString = (char *)deviceString; // 属性指针
  54. DEVICE_PARAMS *newDevicePage = (DEVICE_PARAMS *)malloc(sizeof(DEVICE_PARAMS));
  55. newDevicePage->nextDevice = NULL;
  56. parseStringField(deviceString, "\"deviceId\":\"", (char *)&newDevicePage->deviceID);
  57. newDevicePage->protocol = parseIntField(deviceString, "\"protocol\":");
  58. newDevicePage->params = (PARAMS_PROTOCOL_COMMAND *)malloc(sizeof(PARAMS_PROTOCOL_COMMAND));
  59. paramString = strstr(paramString, "\"sensorData\":["); // 找到该节点的轮询上发属性
  60. if(paramString!=NULL)
  61. {
  62. while(1)
  63. {
  64. addSensorListParams(paramString, newDevicePage); // 解析一个属性并挂载该属性于该属性下
  65. paramString = strstr(paramString, "}"); // 移动到下一条属性
  66. paramString[0]='A';
  67. paramString++;
  68. if (paramString[0] == ']')
  69. {
  70. paramString = (char *)deviceString;//找完了设备层内的属性,将指针指向设备层一开始的位置,防止json导致的sensorList和commandData乱序问题
  71. break;
  72. }
  73. }
  74. }
  75. if(newDevicePage->protocol==MODBUS) //如果为modbus的话解析写指令
  76. {
  77. paramString=deviceString; //移动到最开始的地方
  78. newDevicePage->MDBbigLittleFormat = parseIntField(paramString, "\"bigLittleFormat\":");
  79. newDevicePage->MDBdataType= parseIntField(paramString, "\"dataType\":");
  80. paramString = strstr(paramString, "\"commandData\":["); // 找到其轮询的写命令
  81. if(paramString!=NULL)//可能不存在commandData
  82. {
  83. while(1)
  84. {
  85. addCommandListParams(paramString, newDevicePage);
  86. paramString = strstr(paramString, "}");
  87. paramString[0]='A';
  88. paramString++;
  89. if (paramString[0] == ']')
  90. {
  91. paramString = (char *)deviceString;
  92. break;
  93. }
  94. }
  95. }
  96. }
  97. if(gateway_config_params.device_params==NULL)
  98. {
  99. gateway_config_params.device_params=newDevicePage;
  100. }else
  101. {
  102. DEVICE_PARAMS *current=gateway_config_params.device_params;
  103. while (current->nextDevice != NULL)
  104. {
  105. current = current->nextDevice;
  106. }
  107. current->nextDevice = newDevicePage;
  108. }
  109. }
  110. /**
  111. * @brief 解析输入字符串的paramString数据,将数据保存到至该设备结构体下,此处解析sensorList
  112. * @param uint8_t *paramString输入的字符串数据,DEVICE_PARAMS *device节点信息
  113. * @retval 无
  114. */
  115. void addSensorListParams(char *paramString, DEVICE_PARAMS *device)
  116. {
  117. switch (device->protocol)
  118. {
  119. case DLT645_97:
  120. case DLT645_07:
  121. {
  122. READ_DLT645_COMMAND *read_dlt645_command = malloc(sizeof(READ_DLT645_COMMAND));
  123. READ_MODBUS_COMMAND *read_modbus_command =NULL;
  124. read_dlt645_command->Identification = parseIntField(paramString, "\"identifier645\":");
  125. parseStringField(paramString, "\"identifier\":\"", (char *)&read_dlt645_command->keyword);
  126. char *string = malloc(13);
  127. parseStringField(paramString, "\"deviceID645\":\"", string);
  128. for (int j = 0; j < 6; j++)
  129. {
  130. uint8_t byte;
  131. sscanf((const char *)&string[j * 2], "%2hhx", &byte);
  132. read_dlt645_command->deviceID645[j]=byte;
  133. }
  134. free(string);
  135. if (device->params->node_read_dlt645_command == NULL)
  136. {
  137. device->params->node_read_dlt645_command = read_dlt645_command;
  138. }
  139. else
  140. {
  141. READ_DLT645_COMMAND *current = device->params->node_read_dlt645_command;
  142. while (current->nextParams != NULL)
  143. {
  144. current = current->nextParams;
  145. }
  146. current->nextParams = read_dlt645_command;
  147. }
  148. }
  149. break;
  150. case MODBUS:
  151. {
  152. READ_MODBUS_COMMAND *read_modbus_command = malloc(sizeof(READ_MODBUS_COMMAND));
  153. READ_DLT645_COMMAND *read_dlt645_command = NULL;
  154. parseStringField(paramString,"\"identifier\":\"",(char *)&read_modbus_command->keyword);
  155. read_modbus_command->decimalPoint = parseIntField(paramString, "\"precise\":");
  156. read_modbus_command->functionCode = parseIntField(paramString, "\"rFunctionCode\":");
  157. read_modbus_command->slaveAddress = parseIntField(paramString, "\"slaveAddress\":");
  158. read_modbus_command->registerAddress = parseIntField(paramString, "\"registerAddress\":");
  159. read_modbus_command->registerByteNum = parseIntField(paramString, "\"registerByteNum\":");
  160. if (device->params->node_read_modbus_command == NULL)
  161. {
  162. device->params->node_read_modbus_command = read_modbus_command;
  163. }
  164. else
  165. {
  166. READ_MODBUS_COMMAND *current = device->params->node_read_modbus_command;
  167. while (current->nextParams != NULL)
  168. {
  169. current = current->nextParams;
  170. }
  171. current->nextParams = read_modbus_command;
  172. }
  173. }
  174. break;
  175. default:
  176. break;
  177. }
  178. }
  179. void addCommandListParams(char *paramString, DEVICE_PARAMS *device)
  180. {
  181. WRITE_MODBUS_COMMAND *write_modbus_command=malloc(sizeof(WRITE_MODBUS_COMMAND));
  182. parseStringField(paramString,"\"identifier\":\"",(char *)&write_modbus_command->keyword);
  183. write_modbus_command->registerByteNum = parseIntField(paramString, "\"registerByteNum\":");
  184. write_modbus_command->functionCode=parseIntField(paramString, "\"wFunctionCode\":");
  185. write_modbus_command->slaveAddress=parseIntField(paramString, "\"slaveAddress\":");
  186. write_modbus_command->registerAddress = parseIntField(paramString, "\"registerAddress\":");
  187. if(device->params->node_write_modbus_command == NULL)
  188. {
  189. device->params->node_write_modbus_command=write_modbus_command;
  190. }
  191. else
  192. {
  193. WRITE_MODBUS_COMMAND *current=device->params->node_write_modbus_command;
  194. while (current->nextParams != NULL)
  195. {
  196. current = current->nextParams;
  197. }
  198. current->nextParams = write_modbus_command;
  199. }
  200. }
  201. // 提取int数据如果没有提取到数据则返回-1;提取到返回正确的值
  202. int parseIntField(const char *data, const char *field)
  203. {
  204. char *ptr = strstr(data, field) + strlen(field);
  205. int value;
  206. value = strtol(ptr, &ptr, 10);
  207. return value;
  208. }
  209. /*
  210. */
  211. // 提取string字符串
  212. void parseStringField(const char *data, const char *field, char *value)
  213. {
  214. char *ptr = strstr(data, field) + strlen(field);
  215. sscanf(ptr, "%[^\"],", value);
  216. }