123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- #include "string.h"
- #include <stdlib.h>
- #include "protocol.h"
- #include "malloc.h"
- #include "gateway_message.h"
- GATEWAY_PARAMS gateway_config_params = {0};
- GATEWAY_PARAMS *get_gateway_config_params()
- {
- return &gateway_config_params;
- }
- void parseStringField(const char *data, const char *field, char *value);
- int parseIntField(const char *data, const char *field);
- void addNode(char *nodestring);
- void addDevice(char *string, NODE_PARAMS *node);
- int extract_substring(const char *input_string, const char *start_token, const char *end_token, char *result);
- void addSensorListParams(char *paramString, DEVICE_PARAMS *device);
- void addCommandListParams(char *paramString, DEVICE_PARAMS *device);
- void addGatewayParams(char *gatewayString)
- {
- parseStringField(gatewayString, "\"commandTopic\":\"", (char *)&gateway_config_params.commandTopic);
- parseStringField(gatewayString, "\"messageTopic\":\"", (char *)&gateway_config_params.messageTopic);
- parseStringField(gatewayString, "\"deviceId\":\"", (char *)&gateway_config_params.deviceId);
- parseStringField(gatewayString, "\"host\":\"", (char *)&gateway_config_params.host);
- gateway_config_params.port = parseIntField(gatewayString, "\"port\":");
- gateway_config_params.node_params = NULL;
- gateway_config_params.pollTime = parseIntField(gatewayString, "\"pollTime\":");
- char *nodeString = strstr(gatewayString,"nodeList");
-
- while (1)
- {
- addNode(nodeString);
- nodeString=nodeString;
- nodeString=strstr(nodeString,"}");
- nodeString[0]='A';
- nodeString++;
- if(nodeString[0]==']')
- {
- break;
- }
- }
- }
- void addNode(char *nodestring)
- {
-
- char *deviceString = (char *)nodestring;
- NODE_PARAMS *newNode = malloc(sizeof(NODE_PARAMS));
- newNode->device_params = NULL;
- newNode->nextNode = NULL;
- char nodeIdString[5];
- parseStringField(nodestring, "\"nodeId\":\"", (char *)&nodeIdString);
- for (int j = 0; j < 2; j++)
- {
- uint8_t byte;
- sscanf((const char *)&nodeIdString[j * 2], "%2hhx", &byte);
- newNode->node_address[j]=byte;
- }
- newNode->RFFrequency = parseIntField(nodestring, "\"RFFrequency\":");
- newNode->SignalBw = parseIntField(nodestring, "\"SignalBw\":");
- newNode->SpreadingFactor = parseIntField(nodestring, "\"SpreadingFactor\":");
- newNode->ErrorCoding = parseIntField(nodestring, "\"ErrorCoding\":");
-
- deviceString=strstr(nodestring,"deviceList");
- while (1)
- {
- if (deviceString)
- {
- addDevice(deviceString, newNode);
- deviceString=deviceString;
- deviceString = strstr(deviceString, "}");
- deviceString[0]='A';
- deviceString++;
- if(deviceString[0]==']')
- {
- break;
- }
- }
- else
- {
- return;
- }
-
- }
-
-
- if (gateway_config_params.node_params == NULL)
- {
- gateway_config_params.node_params = newNode;
- }
- else
- {
- NODE_PARAMS *current = gateway_config_params.node_params;
- while (current->nextNode != NULL)
- {
- current = current->nextNode;
- }
- current->nextNode = newNode;
- }
- }
- void addDevice(char *deviceString, NODE_PARAMS *node)
- {
- char *paramString = (char *)deviceString;
-
- DEVICE_PARAMS *newDevicePage = (DEVICE_PARAMS *)malloc(sizeof(DEVICE_PARAMS));
- newDevicePage->nextDevice = NULL;
- parseStringField(deviceString, "\"deviceId\":\"", (char *)&newDevicePage->deviceID);
- newDevicePage->protocol = parseIntField(deviceString, "\"protocol\":");
- newDevicePage->params = (PARAMS_PROTOCOL_COMMAND *)malloc(sizeof(PARAMS_PROTOCOL_COMMAND));
- paramString = strstr(paramString, "\"sensorData\":[");
- while (1)
- {
- addSensorListParams(paramString, newDevicePage);
- paramString=paramString;
- paramString = strstr(paramString, "}");
- paramString[0]='A';
- paramString++;
- if (paramString[0] == ']')
- {
- paramString = (char *)deviceString;
- break;
- }
- }
- if(newDevicePage->protocol==MODBUS)
- {
- paramString=deviceString;
- newDevicePage->MDBbigLittleFormat = parseIntField(paramString, "\"bigLittleFormat\":");
- newDevicePage->MDBdataType= parseIntField(paramString, "\"dataType\":");
- paramString = strstr(paramString, "\"commandData\":[");
- if(paramString!=NULL)
- {
- while(1)
- {
- addCommandListParams(paramString, newDevicePage);
- paramString = strstr(paramString, "}");
- paramString[0]='A';
- paramString++;
- if (paramString[0] == ']')
- {
- paramString = (char *)deviceString;
- break;
- }
- }
- }
- }
-
-
-
- if (node->device_params == NULL)
- {
- node->device_params = newDevicePage;
- }
- else
- {
- DEVICE_PARAMS *current = node->device_params;
- while (current->nextDevice != NULL)
- {
- current = current->nextDevice;
- }
- current->nextDevice = newDevicePage;
- }
-
-
- }
- void addSensorListParams(char *paramString, DEVICE_PARAMS *device)
- {
- switch (device->protocol)
- {
- case DLT645_97:
- case DLT645_07:
- {
- NODE_READ_DLT645_COMMAND *read_dlt645_command = malloc(sizeof(NODE_READ_DLT645_COMMAND));
- read_dlt645_command->Identification = parseIntField(paramString, "\"identifier645\":");
- parseStringField(paramString, "\"identifier\":\"", (char *)&read_dlt645_command->keyword);
- char *string = mymalloc(SRAMIN, 13);
- parseStringField(paramString, "\"deviceID645\":\"", string);
- for (int j = 0; j < 6; j++)
- {
- uint8_t byte;
- sscanf((const char *)&string[j * 2], "%2hhx", &byte);
- read_dlt645_command->deviceID645[j]=byte;
- }
- myfree(SRAMIN, string);
- if (device->params->node_read_dlt645_command == NULL)
- {
- device->params->node_read_dlt645_command = read_dlt645_command;
- }
- else
- {
- NODE_READ_DLT645_COMMAND *current = device->params->node_read_dlt645_command;
- while (current->nextParams != NULL)
- {
- current = current->nextParams;
- }
- current->nextParams = read_dlt645_command;
- }
- }
- break;
- case MODBUS:
- {
- NODE_READ_MODBUS_COMMAND *read_modbus_command = malloc(sizeof(NODE_READ_MODBUS_COMMAND));
- parseStringField(paramString,"\"identifier\":\"",(char *)&read_modbus_command->keyword);
- read_modbus_command->decimalPoint = parseIntField(paramString, "\"precise\":");
- read_modbus_command->functionCode = parseIntField(paramString, "\"rFunctionCode\":");
- read_modbus_command->slaveAddress = parseIntField(paramString, "\"slaveAddress\":");
- read_modbus_command->registerAddress = parseIntField(paramString, "\"registerAddress\":");
- read_modbus_command->registerByteNum = parseIntField(paramString, "\"registerByteNum\":");
- if (device->params->node_read_modbus_command == NULL)
- {
- device->params->node_read_modbus_command = read_modbus_command;
- }
- else
- {
- NODE_READ_MODBUS_COMMAND *current = device->params->node_read_modbus_command;
- while (current->nextParams != NULL)
- {
- current = current->nextParams;
- }
- current->nextParams = read_modbus_command;
- }
- }
- break;
- default:
- break;
- }
- }
- void addCommandListParams(char *paramString, DEVICE_PARAMS *device)
- {
-
- NODE_WRITE_MODBUS_COMMAND *write_modbus_command=malloc(sizeof(NODE_WRITE_MODBUS_COMMAND));
- parseStringField(paramString,"\"identifier\":\"",(char *)&write_modbus_command->keyword);
- write_modbus_command->functionCode=parseIntField(paramString, "\"wFunctionCode\":");
- write_modbus_command->slaveAddress=parseIntField(paramString, "\"slaveAddress\":");
- write_modbus_command->registerAddress = parseIntField(paramString, "\"registerAddress\":");
- if(device->params->node_write_modbus_command == NULL)
- {
- device->params->node_write_modbus_command=write_modbus_command;
- }
- else
- {
- NODE_WRITE_MODBUS_COMMAND *current=device->params->node_write_modbus_command;
- while (current->nextParams != NULL)
- {
- current = current->nextParams;
- }
- current->nextParams = write_modbus_command;
- }
- }
- int parseIntField(const char *data, const char *field)
- {
- char *ptr = strstr(data, field) + strlen(field);
- int value;
- value = strtol(ptr, &ptr, 10);
- return value;
- }
- void parseStringField(const char *data, const char *field, char *value)
- {
- char *ptr = strstr(data, field) + strlen(field);
- sscanf(ptr, "%[^\"],", value);
- }
- void processStringJson(uint8_t *data)
- {
- GATEWAY_PARAMS *gateway;
- gateway = get_gateway_config_params();
- uint8_t *ptr = (uint8_t *)data;
- parseStringField((char *)&ptr, "\"messageTopic\":\"", (char *)&gateway->messageTopic);
- parseStringField((char *)&ptr, "\"commandTopic\":\"", (char *)&gateway->commandTopic);
- gateway->port = parseIntField((char *)&ptr, "\"port\":\"");
- parseStringField((char *)&ptr, "\"host\":\"", (char *)&gateway->host);
- parseStringField((char *)&ptr, "\"deviceId\":\"", (char *)&gateway->deviceId);
-
- int nodeNum = 1;
- char *node_index = malloc(10);
- sprintf(node_index, "node_%d", nodeNum);
- strstr(ptr, node_index);
- while (*ptr == NULL)
- {
- }
- free(node_index);
- }
- int extract_substring(const char *input_string, const char *start_token, const char *end_token, char *result)
- {
- const char *start_ptr = strstr(input_string, start_token);
- if (start_ptr == NULL)
- {
- return 0;
- }
- start_ptr += strlen(start_token);
- const char *end_ptr = strstr(start_ptr, end_token);
- if (end_ptr == NULL)
- {
-
- strcpy(result, start_ptr);
- }
- else
- {
-
- size_t length = end_ptr - start_ptr;
- strncpy(result, start_ptr, length);
- result[length] = '\0';
- }
- return 1;
- }
|