void parseJSON() { JSON_Value *root_value = json_parse_string(getData); if (root_value != NULL) { JSON_Value_Type type = root_value->type; if (type == JSONArray) { JSON_Array *stations = json_value_get_array(root_value); char lookupCallsign[32]; sprintf(lookupCallsign, "%s%s", icaoCode, "_ATIS"); for (int i = 0; i < json_array_get_count(stations); i++) { const JSON_Object *station = json_array_get_object(stations, i); const char *callsign = json_object_dotget_string(station, "callsign"); if (strcmp(callsign, lookupCallsign) == 0) { message = json_object_dotget_string(station, "atis"); XPLMDebugString(message); break; } } } json_value_free(root_value); } newData = 0; }
int APP_ParseCommand(char * pReadBuffer) { if(pReadBuffer == NULL) return COMMAND_BAD_POINTER; JSON_Value *rootValue = json_parse_string(pReadBuffer); if (json_value_get_type(rootValue) != JSONObject) return COMMAND_BAD_JSON; JSON_Object * tObject = json_value_get_object(rootValue); if(json_object_dotget_string(tObject, "message.command") != NULL) { if(strcmp(json_object_dotget_string(tObject, "message.command"), "hello") == 0) { return COMMAND_HELLO; } else if (strcmp(json_object_dotget_string(tObject, "message.command"), "configuration") == 0) { return COMMAND_CONFIGURE; } else if (strcmp(json_object_dotget_string(tObject, "message.command"), "debug_set") == 0) { return COMMAND_DEBUG_SET; } else { return COMMAND_INVALID; } } else { return COMMAND_INVALID; } return COMMAND_INVALID; }
void do_network(JSON_Value* json, char* msg) { if(json_value_get_type(json) == JSONObject) { JSON_Object* obj = json_value_get_object(json); const char* msgtype = json_object_dotget_string(obj, "type"); if(strcmp(msgtype, msg_type_sensor) == 0 || strcmp(msgtype, msg_type_actor) == 0) { const char* command = json_object_dotget_string(obj, "msg.command"); if(command != 0) execute_command(command); } } }
int parse_gateway_configuration(const char * conf_file) { const char conf_obj[] = "gateway_conf"; JSON_Value *root_val; JSON_Object *root = NULL; JSON_Object *conf = NULL; unsigned long long ull = 0; /* try to parse JSON */ root_val = json_parse_file_with_comments(conf_file); root = json_value_get_object(root_val); if (root == NULL) { MSG("ERROR: %s id not a valid JSON file\n", conf_file); exit(EXIT_FAILURE); } conf = json_object_get_object(root, conf_obj); if (conf == NULL) { MSG("INFO: %s does not contain a JSON object named %s\n", conf_file, conf_obj); return -1; } else { MSG("INFO: %s does contain a JSON object named %s, parsing gateway parameters\n", conf_file, conf_obj); } /* getting network parameters (only those necessary for the packet logger) */ sscanf(json_object_dotget_string(conf, "gateway_ID"), "%llx", &ull); lgwm = ull; MSG("INFO: gateway MAC address is configured to %016llX\n", ull); json_value_free(root_val); return 0; }
gchar * jobdesc_element_caps (gchar *job, gchar *element) { JSON_Value *val; JSON_Object *obj; JSON_Array *array; gchar *p, *caps; gint index; val = json_parse_string_with_comments (job); obj = json_value_get_object (val); if (g_str_has_prefix (element, "encoder")) { array = json_object_dotget_array (obj, "encoders"); sscanf (element, "encoder.%d", &index); obj = json_array_get_object (array, index); } else { obj = json_object_get_object (obj, "source"); } p = g_strrstr (element, "elements"); caps = (gchar *)json_object_dotget_string (obj, p); if (caps == NULL) { p = NULL; } else { p = g_strdup (caps); } json_value_free (val); return p; }
/* Testing correctness of parsed values */ void test_suite_2(void) { JSON_Value *root_value; JSON_Object *object; JSON_Array *array; int i; const char *filename = "tests/test_2.txt"; printf("Testing %s:\n", filename); root_value = json_parse_file(filename); TEST(root_value); TEST(json_value_get_type(root_value) == JSONObject); object = json_value_get_object(root_value); TEST(STREQ(json_object_get_string(object, "string"), "lorem ipsum")); TEST(STREQ(json_object_get_string(object, "utf string"), "lorem ipsum")); TEST(json_object_get_number(object, "positive one") == 1.0); TEST(json_object_get_number(object, "negative one") == -1.0); TEST(json_object_get_number(object, "hard to parse number") == -0.000314); TEST(json_object_get_boolean(object, "boolean true") == 1); TEST(json_object_get_boolean(object, "boolean false") == 0); TEST(json_value_get_type(json_object_get_value(object, "null")) == JSONNull); array = json_object_get_array(object, "string array"); if (array != NULL && json_array_get_count(array) > 1) { TEST(STREQ(json_array_get_string(array, 0), "lorem")); TEST(STREQ(json_array_get_string(array, 1), "ipsum")); } else { tests_failed++; } array = json_object_get_array(object, "x^2 array"); if (array != NULL) { for (i = 0; i < json_array_get_count(array); i++) { TEST(json_array_get_number(array, i) == (i * i)); } } else { tests_failed++; } TEST(json_object_get_array(object, "non existent array") == NULL); TEST(STREQ(json_object_dotget_string(object, "object.nested string"), "str")); TEST(json_object_dotget_boolean(object, "object.nested true") == 1); TEST(json_object_dotget_boolean(object, "object.nested false") == 0); TEST(json_object_dotget_value(object, "object.nested null") != NULL); TEST(json_object_dotget_number(object, "object.nested number") == 123); TEST(json_object_dotget_value(object, "should.be.null") == NULL); TEST(json_object_dotget_value(object, "should.be.null.") == NULL); TEST(json_object_dotget_value(object, ".") == NULL); TEST(json_object_dotget_value(object, "") == NULL); array = json_object_dotget_array(object, "object.nested array"); if (array != NULL && json_array_get_count(array) > 1) { TEST(STREQ(json_array_get_string(array, 0), "lorem")); TEST(STREQ(json_array_get_string(array, 1), "ipsum")); } else { tests_failed++; } TEST(json_object_dotget_boolean(object, "nested true")); json_value_free(root_value); }
/* Testing correctness of parsed values */ void test_suite_2(JSON_Value *root_value) { JSON_Object *root_object; JSON_Array *array; size_t i; TEST(root_value); TEST(json_value_get_type(root_value) == JSONObject); root_object = json_value_get_object(root_value); TEST(STREQ(json_object_get_string(root_object, "string"), "lorem ipsum")); TEST(STREQ(json_object_get_string(root_object, "utf string"), "lorem ipsum")); TEST(STREQ(json_object_get_string(root_object, "utf-8 string"), "あいうえお")); TEST(STREQ(json_object_get_string(root_object, "surrogate string"), "lorem𝄞ipsum𝍧lorem")); TEST(json_object_get_number(root_object, "positive one") == 1.0); TEST(json_object_get_number(root_object, "negative one") == -1.0); TEST(json_object_get_number(root_object, "hard to parse number") == -0.000314); TEST(json_object_get_boolean(root_object, "boolean true") == 1); TEST(json_object_get_boolean(root_object, "boolean false") == 0); TEST(json_value_get_type(json_object_get_value(root_object, "null")) == JSONNull); array = json_object_get_array(root_object, "string array"); if (array != NULL && json_array_get_count(array) > 1) { TEST(STREQ(json_array_get_string(array, 0), "lorem")); TEST(STREQ(json_array_get_string(array, 1), "ipsum")); } else { tests_failed++; } array = json_object_get_array(root_object, "x^2 array"); if (array != NULL) { for (i = 0; i < json_array_get_count(array); i++) { TEST(json_array_get_number(array, i) == (i * i)); } } else { tests_failed++; } TEST(json_object_get_array(root_object, "non existent array") == NULL); TEST(STREQ(json_object_dotget_string(root_object, "object.nested string"), "str")); TEST(json_object_dotget_boolean(root_object, "object.nested true") == 1); TEST(json_object_dotget_boolean(root_object, "object.nested false") == 0); TEST(json_object_dotget_value(root_object, "object.nested null") != NULL); TEST(json_object_dotget_number(root_object, "object.nested number") == 123); TEST(json_object_dotget_value(root_object, "should.be.null") == NULL); TEST(json_object_dotget_value(root_object, "should.be.null.") == NULL); TEST(json_object_dotget_value(root_object, ".") == NULL); TEST(json_object_dotget_value(root_object, "") == NULL); array = json_object_dotget_array(root_object, "object.nested array"); if (array != NULL && json_array_get_count(array) > 1) { TEST(STREQ(json_array_get_string(array, 0), "lorem")); TEST(STREQ(json_array_get_string(array, 1), "ipsum")); } else { tests_failed++; } TEST(json_object_dotget_boolean(root_object, "nested true")); TEST(STREQ(json_object_get_string(root_object, "/**/"), "comment")); TEST(STREQ(json_object_get_string(root_object, "//"), "comment")); }
void print_commits_info(const char *username, const char *repo) { JSON_Value *root_value; JSON_Array *commits; JSON_Object *commit; size_t i; char curl_command[512]; char cleanup_command[256]; char output_filename[] = "commits.json"; /* it ain't pretty, but it's not a libcurl tutorial */ sprintf(curl_command, "curl -s \"https://api.github.com/repos/%s/%s/commits\" > %s", username, repo, output_filename); sprintf(cleanup_command, "rm -f %s", output_filename); system(curl_command); /* parsing json and validating output */ root_value = json_parse_file(output_filename); if (json_value_get_type(root_value) != JSONArray) { system(cleanup_command); return; } /* getting array from root value and printing commit info */ commits = json_value_get_array(root_value); printf("%-10.10s %-10.10s %s\n", "Date", "SHA", "Author"); for (i = 0; i < json_array_get_count(commits); i++) { commit = json_array_get_object(commits, i); printf("%.10s %.10s %s\n", json_object_dotget_string(commit, "commit.author.date"), json_object_get_string(commit, "sha"), json_object_dotget_string(commit, "commit.author.name")); } /* cleanup code */ json_value_free(root_value); system(cleanup_command); }
gchar * jobdesc_m3u8streaming_push_server_uri (gchar *job) { JSON_Value *val; JSON_Object *obj; gchar *ret, *push_url; val = json_parse_string_with_comments (job); obj = json_value_get_object (val); push_url = (gchar *)json_object_dotget_string (obj, "m3u8streaming.push-server-uri"); ret = g_strdup (push_url); json_value_free (val); return ret; }
void do_network(JSON_Value* json, char* msg) { if(json_value_get_type(json) == JSONObject) { JSON_Object* obj = json_value_get_object(json); if(strcmp(json_object_dotget_string(obj, "type"), "act.heating.central") == 0) { if(json_object_dotget_value(obj, "msg.level") != 0) { int heatingLevel = 9 - (int)json_object_dotget_number(obj, "msg.level"); printf("ACTING on cmd: %d\n", heatingLevel); if(heatingLevel > 9) heatingLevel = 9; if(heatingLevel < 0) heatingLevel = 0; printf("Set level %d\n", heatingLevel); serial_write("%d", heatingLevel); } } } }
int parse_SX1301_configuration(const char * conf_file) { int i; const char conf_obj[] = "SX1301_conf"; char param_name[32]; /* used to generate variable parameter names */ const char *str; /* used to store string value from JSON object */ struct lgw_conf_board_s boardconf; struct lgw_conf_rxrf_s rfconf; struct lgw_conf_rxif_s ifconf; JSON_Value *root_val; JSON_Object *root = NULL; JSON_Object *conf = NULL; JSON_Value *val; uint32_t sf, bw; /* try to parse JSON */ root_val = json_parse_file_with_comments(conf_file); root = json_value_get_object(root_val); if (root == NULL) { MSG("ERROR: %s id not a valid JSON file\n", conf_file); exit(EXIT_FAILURE); } conf = json_object_get_object(root, conf_obj); if (conf == NULL) { MSG("INFO: %s does not contain a JSON object named %s\n", conf_file, conf_obj); return -1; } else { MSG("INFO: %s does contain a JSON object named %s, parsing SX1301 parameters\n", conf_file, conf_obj); } /* set board configuration */ memset(&boardconf, 0, sizeof boardconf); /* initialize configuration structure */ val = json_object_get_value(conf, "lorawan_public"); /* fetch value (if possible) */ if (json_value_get_type(val) == JSONBoolean) { boardconf.lorawan_public = (bool)json_value_get_boolean(val); } else { MSG("WARNING: Data type for lorawan_public seems wrong, please check\n"); boardconf.lorawan_public = false; } val = json_object_get_value(conf, "clksrc"); /* fetch value (if possible) */ if (json_value_get_type(val) == JSONNumber) { boardconf.clksrc = (uint8_t)json_value_get_number(val); } else { MSG("WARNING: Data type for clksrc seems wrong, please check\n"); boardconf.clksrc = 0; } MSG("INFO: lorawan_public %d, clksrc %d\n", boardconf.lorawan_public, boardconf.clksrc); /* all parameters parsed, submitting configuration to the HAL */ if (lgw_board_setconf(boardconf) != LGW_HAL_SUCCESS) { MSG("WARNING: Failed to configure board\n"); } /* set configuration for RF chains */ for (i = 0; i < LGW_RF_CHAIN_NB; ++i) { memset(&rfconf, 0, sizeof(rfconf)); /* initialize configuration structure */ sprintf(param_name, "radio_%i", i); /* compose parameter path inside JSON structure */ val = json_object_get_value(conf, param_name); /* fetch value (if possible) */ if (json_value_get_type(val) != JSONObject) { MSG("INFO: no configuration for radio %i\n", i); continue; } /* there is an object to configure that radio, let's parse it */ sprintf(param_name, "radio_%i.enable", i); val = json_object_dotget_value(conf, param_name); if (json_value_get_type(val) == JSONBoolean) { rfconf.enable = (bool)json_value_get_boolean(val); } else { rfconf.enable = false; } if (rfconf.enable == false) { /* radio disabled, nothing else to parse */ MSG("INFO: radio %i disabled\n", i); } else { /* radio enabled, will parse the other parameters */ snprintf(param_name, sizeof param_name, "radio_%i.freq", i); rfconf.freq_hz = (uint32_t)json_object_dotget_number(conf, param_name); snprintf(param_name, sizeof param_name, "radio_%i.rssi_offset", i); rfconf.rssi_offset = (float)json_object_dotget_number(conf, param_name); snprintf(param_name, sizeof param_name, "radio_%i.type", i); str = json_object_dotget_string(conf, param_name); if (!strncmp(str, "SX1255", 6)) { rfconf.type = LGW_RADIO_TYPE_SX1255; } else if (!strncmp(str, "SX1257", 6)) { rfconf.type = LGW_RADIO_TYPE_SX1257; } else { MSG("WARNING: invalid radio type: %s (should be SX1255 or SX1257)\n", str); } snprintf(param_name, sizeof param_name, "radio_%i.tx_enable", i); val = json_object_dotget_value(conf, param_name); if (json_value_get_type(val) == JSONBoolean) { rfconf.tx_enable = (bool)json_value_get_boolean(val); } else { rfconf.tx_enable = false; } MSG("INFO: radio %i enabled (type %s), center frequency %u, RSSI offset %f, tx enabled %d\n", i, str, rfconf.freq_hz, rfconf.rssi_offset, rfconf.tx_enable); } /* all parameters parsed, submitting configuration to the HAL */ if (lgw_rxrf_setconf(i, rfconf) != LGW_HAL_SUCCESS) { MSG("WARNING: invalid configuration for radio %i\n", i); } } /* set configuration for LoRa multi-SF channels (bandwidth cannot be set) */ for (i = 0; i < LGW_MULTI_NB; ++i) { memset(&ifconf, 0, sizeof(ifconf)); /* initialize configuration structure */ sprintf(param_name, "chan_multiSF_%i", i); /* compose parameter path inside JSON structure */ val = json_object_get_value(conf, param_name); /* fetch value (if possible) */ if (json_value_get_type(val) != JSONObject) { MSG("INFO: no configuration for LoRa multi-SF channel %i\n", i); continue; } /* there is an object to configure that LoRa multi-SF channel, let's parse it */ sprintf(param_name, "chan_multiSF_%i.enable", i); val = json_object_dotget_value(conf, param_name); if (json_value_get_type(val) == JSONBoolean) { ifconf.enable = (bool)json_value_get_boolean(val); } else { ifconf.enable = false; } if (ifconf.enable == false) { /* LoRa multi-SF channel disabled, nothing else to parse */ MSG("INFO: LoRa multi-SF channel %i disabled\n", i); } else { /* LoRa multi-SF channel enabled, will parse the other parameters */ sprintf(param_name, "chan_multiSF_%i.radio", i); ifconf.rf_chain = (uint32_t)json_object_dotget_number(conf, param_name); sprintf(param_name, "chan_multiSF_%i.if", i); ifconf.freq_hz = (int32_t)json_object_dotget_number(conf, param_name); // TODO: handle individual SF enabling and disabling (spread_factor) MSG("INFO: LoRa multi-SF channel %i enabled, radio %i selected, IF %i Hz, 125 kHz bandwidth, SF 7 to 12\n", i, ifconf.rf_chain, ifconf.freq_hz); } /* all parameters parsed, submitting configuration to the HAL */ if (lgw_rxif_setconf(i, ifconf) != LGW_HAL_SUCCESS) { MSG("WARNING: invalid configuration for LoRa multi-SF channel %i\n", i); } } /* set configuration for LoRa standard channel */ memset(&ifconf, 0, sizeof(ifconf)); /* initialize configuration structure */ val = json_object_get_value(conf, "chan_Lora_std"); /* fetch value (if possible) */ if (json_value_get_type(val) != JSONObject) { MSG("INFO: no configuration for LoRa standard channel\n"); } else { val = json_object_dotget_value(conf, "chan_Lora_std.enable"); if (json_value_get_type(val) == JSONBoolean) { ifconf.enable = (bool)json_value_get_boolean(val); } else { ifconf.enable = false; } if (ifconf.enable == false) { MSG("INFO: LoRa standard channel %i disabled\n", i); } else { ifconf.rf_chain = (uint32_t)json_object_dotget_number(conf, "chan_Lora_std.radio"); ifconf.freq_hz = (int32_t)json_object_dotget_number(conf, "chan_Lora_std.if"); bw = (uint32_t)json_object_dotget_number(conf, "chan_Lora_std.bandwidth"); switch(bw) { case 500000: ifconf.bandwidth = BW_500KHZ; break; case 250000: ifconf.bandwidth = BW_250KHZ; break; case 125000: ifconf.bandwidth = BW_125KHZ; break; default: ifconf.bandwidth = BW_UNDEFINED; } sf = (uint32_t)json_object_dotget_number(conf, "chan_Lora_std.spread_factor"); switch(sf) { case 7: ifconf.datarate = DR_LORA_SF7; break; case 8: ifconf.datarate = DR_LORA_SF8; break; case 9: ifconf.datarate = DR_LORA_SF9; break; case 10: ifconf.datarate = DR_LORA_SF10; break; case 11: ifconf.datarate = DR_LORA_SF11; break; case 12: ifconf.datarate = DR_LORA_SF12; break; default: ifconf.datarate = DR_UNDEFINED; } MSG("INFO: LoRa standard channel enabled, radio %i selected, IF %i Hz, %u Hz bandwidth, SF %u\n", ifconf.rf_chain, ifconf.freq_hz, bw, sf); } if (lgw_rxif_setconf(8, ifconf) != LGW_HAL_SUCCESS) { MSG("WARNING: invalid configuration for LoRa standard channel\n"); } } /* set configuration for FSK channel */ memset(&ifconf, 0, sizeof(ifconf)); /* initialize configuration structure */ val = json_object_get_value(conf, "chan_FSK"); /* fetch value (if possible) */ if (json_value_get_type(val) != JSONObject) { MSG("INFO: no configuration for FSK channel\n"); } else { val = json_object_dotget_value(conf, "chan_FSK.enable"); if (json_value_get_type(val) == JSONBoolean) { ifconf.enable = (bool)json_value_get_boolean(val); } else { ifconf.enable = false; } if (ifconf.enable == false) { MSG("INFO: FSK channel %i disabled\n", i); } else { ifconf.rf_chain = (uint32_t)json_object_dotget_number(conf, "chan_FSK.radio"); ifconf.freq_hz = (int32_t)json_object_dotget_number(conf, "chan_FSK.if"); bw = (uint32_t)json_object_dotget_number(conf, "chan_FSK.bandwidth"); if (bw <= 7800) ifconf.bandwidth = BW_7K8HZ; else if (bw <= 15600) ifconf.bandwidth = BW_15K6HZ; else if (bw <= 31200) ifconf.bandwidth = BW_31K2HZ; else if (bw <= 62500) ifconf.bandwidth = BW_62K5HZ; else if (bw <= 125000) ifconf.bandwidth = BW_125KHZ; else if (bw <= 250000) ifconf.bandwidth = BW_250KHZ; else if (bw <= 500000) ifconf.bandwidth = BW_500KHZ; else ifconf.bandwidth = BW_UNDEFINED; ifconf.datarate = (uint32_t)json_object_dotget_number(conf, "chan_FSK.datarate"); MSG("INFO: FSK channel enabled, radio %i selected, IF %i Hz, %u Hz bandwidth, %u bps datarate\n", ifconf.rf_chain, ifconf.freq_hz, bw, ifconf.datarate); } if (lgw_rxif_setconf(9, ifconf) != LGW_HAL_SUCCESS) { MSG("WARNING: invalid configuration for FSK channel\n"); } } json_value_free(root_val); return 0; }
void APP2_Tasks ( void ) { /* Update the application state machine based * on the current state */ switch(app2Data.state) { case APP2_STATE_INIT: /* Open the device layer */ app2Data.deviceHandle = USB_DEVICE_Open( USB_DEVICE_INDEX_0, DRV_IO_INTENT_READWRITE ); if(app2Data.deviceHandle != USB_DEVICE_HANDLE_INVALID) { /* Register a callback with device layer to get event notification (for end point 0) */ USB_DEVICE_EventHandlerSet(app2Data.deviceHandle, APP_USBDeviceEventHandler, 0); app2Data.state = APP2_STATE_WAIT_FOR_CONFIGURATION; } else { /* The Device Layer is not ready to be opened. We should try * again later. */ } break; case APP2_STATE_WAIT_FOR_CONFIGURATION: /* Check if the device was configured */ if(app2Data.isConfigured) { app2Data.state = APP2_STATE_SCHEDULE_READ; } break; case APP2_STATE_SCHEDULE_READ: if(APP_StateReset()) { break; } /* If a read is complete, then schedule a read * else wait for the current read to complete */ app2Data.state = APP2_STATE_WAIT_FOR_READ_COMPLETE; if(app2Data.isReadComplete == true) { app2Data.isReadComplete = false; app2Data.readTransferHandle = USB_DEVICE_CDC_TRANSFER_HANDLE_INVALID; USB_DEVICE_CDC_Read (USB_DEVICE_CDC_INDEX_0, &app2Data.readTransferHandle, app2Data.readBuffer, APP_READ_BUFFER_SIZE); if(app2Data.readTransferHandle == USB_DEVICE_CDC_TRANSFER_HANDLE_INVALID) { app2Data.state = APP2_STATE_ERROR; break; } } break; case APP2_STATE_WAIT_FOR_READ_COMPLETE: if(APP_StateReset()) { break; } if(app2Data.isReadComplete == true) { // Check for delimiter int res = APP_CheckForMessage(app2Data.readBuffer); if(res == MESSAGE_BAD_POINTER) { // Do something break; } else if(res == MESSAGE_NO_DELIMITER) { strcat(messageBuffer, app2Data.readBuffer); memset(app2Data.readBuffer, '\0', APP_READ_BUFFER_SIZE); app2Data.state = APP2_STATE_SCHEDULE_READ; break; } strcat(messageBuffer, app2Data.readBuffer); // Parse for the command being sent so we can handle it int command = APP_ParseCommand(messageBuffer); // Lets build our response message // First initialize the JSON value and object from parson library JSON_Value *rootValue = json_value_init_object(); JSON_Object *rootObject = json_value_get_object(rootValue); char *serializedString = NULL; // Build response and handle the command switch(command) { // If hello command, respond with discovery packet case COMMAND_HELLO: json_object_dotset_string(rootObject, "message.command", "discovery"); json_object_dotset_string(rootObject, "message.discovery_object.title", APP_TITLE); json_object_dotset_string(rootObject, "message.discovery_object.part_number", APP_PART_NUMBER); json_object_dotset_string(rootObject, "message.discovery_object.mac_address", appData.macAddress); json_object_dotset_string(rootObject, "message.discovery_object.firmware_version", APP_FIRMWARE_VERSION); json_object_dotset_string(rootObject, "message.discovery_object.harmony_version", SYS_VERSION_STR); json_object_dotset_boolean(rootObject, "message.discovery_object.is_commissioned", appData.isCommissioned); break; // If configuration command, respond with ACK/NACK case COMMAND_CONFIGURE: { if(appData.isCommissioned == false) { JSON_Value *messageRoot = json_parse_string(messageBuffer); if(json_value_get_type(messageRoot) != JSONObject) { BuildAckNackMessage(rootObject, "nack", "Invalid JSON Object"); break; } else { JSON_Object *messageObject = json_value_get_object(messageRoot); if( json_object_dotget_string(messageObject, "message.configuration_object.aws_iot_endpoint_address") != NULL && json_object_dotget_string(messageObject, "message.configuration_object.aws_certificate") != NULL && json_object_dotget_string(messageObject, "message.configuration_object.aws_certificate_private_key") != NULL ) { json_object_dotset_string(rootObject, "message.command", "ack"); json_object_dotset_string(rootObject, "message.ack_nack_message", "Writing commission parameters to flash"); sprintf((char *)appData.host, json_object_dotget_string(messageObject, "message.configuration_object.aws_iot_endpoint_address")); sprintf((char *)appData.clientCert, json_object_dotget_string(messageObject, "message.configuration_object.aws_certificate")); sprintf((char *)appData.clientKey, json_object_dotget_string(messageObject, "message.configuration_object.aws_certificate_private_key")); appData.isCommissioned = true; appData.writeToNVM = true; } else { BuildAckNackMessage(rootObject, "nack", "Invalid commission parameters"); break; } } } else { BuildAckNackMessage(rootObject, "nack", "Already commissioned"); } break; } case COMMAND_DEBUG_SET: { JSON_Value *messageRoot = json_parse_string(messageBuffer); if(json_value_get_type(messageRoot) != JSONObject) { BuildAckNackMessage(rootObject, "nack", "Invalid JSON Object"); break; } JSON_Object *messageObject = json_value_get_object(messageRoot); if(messageObject == NULL) { BuildAckNackMessage(rootObject, "nack", "NULL Pointer"); break; } BuildAckNackMessage(rootObject, "ack", "Received debug set"); int DebugMessage = DEBUG_UPDATE; xQueueSendToFront(app2Data.debugQueue, &DebugMessage, 1); if(json_object_dotget_boolean(messageObject, "message.debug_set_object.set")) appData.debugSet = true; else appData.debugSet = false; break; } case COMMAND_BAD_JSON: BuildAckNackMessage(rootObject, "nack", "Bad JSON"); break; case COMMAND_INVALID: BuildAckNackMessage(rootObject, "nack", "Command Invalid"); break; default: BuildAckNackMessage(rootObject, "nack", "Something went wrong"); break; } memset(app2Data.writeBuffer, '\0', APP_WRITE_BUFFER_SIZE); // With our response built, serialize the response into a string serializedString = json_serialize_to_string(rootValue); strcpy(app2Data.writeBuffer, serializedString); // Find length of string and add delimiter to end app2Data.writeBuffer[strlen(app2Data.writeBuffer)] = '\r'; json_free_serialized_string(serializedString); // Reset string buffers memset(app2Data.readBuffer, '\0', APP_READ_BUFFER_SIZE); memset(messageBuffer, '\0', APP_MESSAGE_BUFFER_SIZE); app2Data.state = APP2_STATE_SCHEDULE_WRITE; } else { app2Data.state = APP2_STATE_WAIT_FOR_READ_COMPLETE; if( uxQueueMessagesWaiting( app2Data.debugQueue ) > 0 ) { int debugMessageNumber; xQueueReceive( app2Data.debugQueue, &debugMessageNumber, 1 ); sprintf(app2Data.writeBuffer, "{" "\"message\":{" "\"command\":\"debug\"," "\"debug_object\":{" "\"board_ip_address\":\"%d.%d.%d.%d\"," "\"aws_iot_endpoint\":\"%s\"," "\"mac_address\":\"%s\"," "\"socket_connected\":%s," "\"mqtt_connected\":%s," "\"raw_message\":\"%s\"" "}}}\r", appData.board_ipAddr.v4Add.v[0], appData.board_ipAddr.v4Add.v[1], appData.board_ipAddr.v4Add.v[2], appData.board_ipAddr.v4Add.v[3], appData.host, appData.macAddress, (appData.socket_connected ? "true" : "false"), (appData.mqtt_connected ? "true" : "false"), APP_ReturnDebugCodeToString(debugMessageNumber)); app2Data.state = APP2_STATE_SCHEDULE_DEBUG_WRITE; } } break; case APP2_STATE_SCHEDULE_WRITE: if(APP_StateReset()) { break; } app2Data.writeTransferHandle = USB_DEVICE_CDC_TRANSFER_HANDLE_INVALID; app2Data.isWriteComplete = false; app2Data.state = APP2_STATE_WAIT_FOR_WRITE_COMPLETE; USB_DEVICE_CDC_Write(USB_DEVICE_CDC_INDEX_0, &app2Data.writeTransferHandle, app2Data.writeBuffer, strlen(app2Data.writeBuffer), USB_DEVICE_CDC_TRANSFER_FLAGS_DATA_COMPLETE); break; case APP2_STATE_WAIT_FOR_WRITE_COMPLETE: if(APP_StateReset()) { break; } /* Check if message sent. The isWriteComplete * flag gets updated in the CDC event handler */ if(app2Data.isWriteComplete == true) { app2Data.state = APP2_STATE_SCHEDULE_READ; } break; case APP2_STATE_SCHEDULE_DEBUG_WRITE: if(APP_StateReset()) { break; } app2Data.writeTransferHandle = USB_DEVICE_CDC_TRANSFER_HANDLE_INVALID; app2Data.isWriteComplete = false; app2Data.state = APP2_STATE_WAIT_FOR_DEBUG_WRITE_COMPLETE; USB_DEVICE_CDC_Write(USB_DEVICE_CDC_INDEX_0, &app2Data.writeTransferHandle, app2Data.writeBuffer, strlen(app2Data.writeBuffer), USB_DEVICE_CDC_TRANSFER_FLAGS_DATA_COMPLETE); break; case APP2_STATE_WAIT_FOR_DEBUG_WRITE_COMPLETE: if(APP_StateReset()) { break; } /* Check if message sent. The isWriteComplete * flag gets updated in the CDC event handler */ if(app2Data.isWriteComplete == true) { app2Data.state = APP2_STATE_WAIT_FOR_READ_COMPLETE; } break; case APP2_STATE_ERROR: break; default: break; } }
int main(int argc, char** argv) { printf("haltestelle built <%s %s> version %s\n", __DATE__, __TIME__, VERSION); if(argc < 5) { fprintf(stderr, "usage: %s <designation> <busfarhn_host> <busfarhn_port> <serialport>\n", argv[0]); exit(-1); } /*global*/ designation = argv[1]; /*global*/ busfarhn_host = argv[2]; /*global*/ busfarhn_port = atoi(argv[3]); char* serialport = argv[4]; /*global*/ sockfd = start_socket(); if(connect_to_busfarhn(designation) != 0) { fprintf(stderr, "[ERROR] connecting to %s:%d failed\n", busfarhn_host, busfarhn_port); return -1; } #ifdef USE_SERIAL #ifdef SERIAL_IS_A_FILE printf("%s is a FILE\n", serialport); #elif defined SERIAL_IS_A_ATH0 printf("%s is a SERIAL PORT (ATH style)\n", serialport); #else printf("%s is a SERIAL PORT\n", serialport); #endif #else printf("WARNING: NOT USING THE SERIAL PORT\n"); #endif printf("[STARTUP] connected to %s:%i with designation %s\n", busfarhn_host, busfarhn_port, designation); #ifdef USE_SERIAL #ifdef SERIAL_IS_A_FILE /*global*/ serialfd = fopen(serialport, "rw"); #elif defined SERIAL_IS_A_ATH0 /*global*/ serialfd = open(serialport, O_RDWR); #else /*global*/ serialfd = open(serialport, O_RDWR | O_NOCTTY | O_SYNC); #endif if (serialfd < 0) { fprintf(stderr, "error %d opening %s: %s", errno, serialport, strerror (errno)); return; } #if !(defined SERIAL_IS_A_FILE || defined SERIAL_IS_A_ATH0) set_interface_attribs (serialfd, SERIAL_BAUDRATE, 0); // set speed to 115,200 bps, 8n1 (no parity) set_blocking (serialfd, 0); // set no blocking #endif #endif hs_startup(); char netbuf[MAXBUFLEN]; unsigned int netbufpos = 0; struct sockaddr_storage their_addr; socklen_t addr_len; #ifdef USE_SERIAL pthread_t pth; pthread_create(&pth, NULL, thread_read_serial, NULL); #endif while(1) { // network int numbytes; addr_len = sizeof their_addr; if ((numbytes = recvfrom(sockfd, (netbuf + netbufpos), MAXBUFLEN - (netbufpos + 1), MSG_DONTWAIT, (struct sockaddr *)&their_addr, &addr_len)) > 0) { printf("[NET] received %i bytes\n", numbytes); int i = 0; for(i = 0; i < numbytes; i++) if(netbuf[netbufpos + i] == '\n') break; netbufpos += numbytes; if(i < numbytes) { // found breakline netbuf[netbufpos - 1] = '\0'; netbufpos = 0; printf("CMD <%s>\n", netbuf); JSON_Value* json = json_parse_string(netbuf); if(json_value_get_type(json) == JSONObject) { JSON_Object* obj = json_value_get_object(json); const char* msgtype = json_object_dotget_string(obj, "type"); if(strcmp(msgtype, "io.tcp.ping") == 0) do_ping(); else do_network(json, netbuf); } json_value_free(json); } if(netbufpos + 1 == MAXBUFLEN) { printf("[NET] ERROR: received %i bytes and still no breakline. Discarding the message.\n", MAXBUFLEN); netbufpos = 0; } } else if(numbytes == 0) { break; } } hs_shutdown(); close(sockfd); return 0; }
int config_parse(const char *file, config_t *config) { JSON_Value *jvroot; JSON_Object *joroot; JSON_Object *jomaccmd; JSON_Array *jarray; JSON_Value_Type jtype; const char *string; int ret; int i; if(file == NULL){ return -1; } /** Clear all flags */ config_free(config); printf("Start parsing configuration file....\n\n"); /* parsing json and validating output */ jvroot = json_parse_file_with_comments(file); jtype = json_value_get_type(jvroot); if (jtype != JSONObject) { return -1; } joroot = json_value_get_object(jvroot); string = json_object_get_string(joroot, "band"); if(string == NULL){ config->band = LW_BAND_EU868; }else{ for(i=0; i<LW_BAND_MAX_NUM; i++){ if(0 == strcmp(string, config_band_tab[i])){ config->band = (lw_band_t)i; break; } } if(i==LW_BAND_MAX_NUM){ config->band = LW_BAND_EU868; } } string = json_object_dotget_string(joroot, "key.nwkskey"); if(string != NULL){ if(str2hex(string, config->nwkskey, 16) == 16){ config->flag |= CFLAG_NWKSKEY; } } string = json_object_dotget_string(joroot, "key.appskey"); if(string != NULL){ if(str2hex(string, config->appskey, 16) == 16){ config->flag |= CFLAG_APPSKEY; } } string = json_object_dotget_string(joroot, "key.appkey"); if(string != NULL){ if(str2hex(string, config->appkey, 16) == 16){ config->flag |= CFLAG_APPKEY; } } ret = json_object_dotget_boolean(joroot, "join.key"); if(ret==0){ //printf("Join key false\n"); config->joinkey = false; }else if(ret==1){ //printf("Join key true\n"); config->joinkey = true; }else{ //printf("Unknown join key value\n"); config->joinkey = false; } string = json_object_dotget_string(joroot, "join.request"); if(string != NULL){ uint8_t tmp[255]; int len; len = str2hex(string, tmp, 255); if(len>0){ config->flag |= CFLAG_JOINR; config->joinr = malloc(len); if(config->joinr == NULL){ return -2; } config->joinr_size = len; memcpy(config->joinr, tmp, config->joinr_size); } } string = json_object_dotget_string(joroot, "join.accept"); if(string != NULL){ uint8_t tmp[255]; int len; len = str2hex(string, tmp, 255); if(len>0){ config->flag |= CFLAG_JOINA; config->joina = malloc(len); if(config->joina == NULL){ return -3; } config->joina_size = len; memcpy(config->joina, tmp, config->joina_size); } } jarray = json_object_get_array(joroot, "messages"); if(jarray != NULL){ uint8_t tmp[255]; for (i = 0; i < json_array_get_count(jarray); i++) { string = json_array_get_string(jarray, i); if(string!=NULL){ int len = str2hex(string, tmp, 255); if(len>0){ message_t *pl = malloc(sizeof(message_t)); memset(pl, 0, sizeof(message_t)); if(pl == NULL){ return -3; } pl->buf = malloc(len); if(pl->buf == NULL){ return -3; } pl->len = len; memcpy(pl->buf, tmp, pl->len); pl_insert(&config->message, pl); }else{ printf("Messages[%d] \"%s\" is not hex string\n", i, string); } }else{ printf("Messages item %d is not string\n", i); } } }else{ printf("Can't get payload array\n"); } jarray = json_object_get_array(joroot, "maccommands"); if(jarray != NULL){ uint8_t mhdr; int len; uint8_t tmp[255]; for (i = 0; i < json_array_get_count(jarray); i++) { jomaccmd = json_array_get_object(jarray, i); string = json_object_get_string(jomaccmd, "MHDR"); if(string != NULL){ len = str2hex(string, &mhdr, 1); if(len != 1){ printf("\"maccommands\"[%d].MHDR \"%s\" must be 1 byte hex string\n", i, string); continue; } }else{ string = json_object_get_string(jomaccmd, "direction"); if(string != NULL){ int j; len = strlen(string); if(len>200){ printf("\"maccommands\"[%d].direction \"%s\" too long\n", i, string); continue; } for(j=0; j<len; j++){ tmp[j] = tolower(string[j]); } tmp[j] = '\0'; if(0==strcmp((char *)tmp, "up")){ mhdr = 0x80; }else if(0==strcmp((char *)tmp, "down")){ mhdr = 0xA0; }else{ printf("\"maccommands\"[%d].MHDR \"%s\" must be 1 byte hex string\n", i, string); continue; } }else{ printf("Can't recognize maccommand direction\n"); continue; } } string = json_object_get_string(jomaccmd, "command"); if(string != NULL){ len = str2hex(string, tmp, 255); if(len <= 0){ printf("\"maccommands\"[%d].command \"%s\" is not hex string\n", i, string); continue; } }else{ printf("c\"maccommands\"[%d].command is not string\n", i); continue; } message_t *pl = malloc(sizeof(message_t)); memset(pl, 0, sizeof(message_t)); if(pl == NULL){ return -3; } pl->buf = malloc(len+1); if(pl->buf == NULL){ return -3; } pl->len = len+1; pl->buf[0] = mhdr; pl->next = 0; memcpy(pl->buf+1, tmp, pl->len-1); pl_insert(&config->maccmd, pl); } } print_spliter(); printf("%15s %s\n","BAND:\t", config_band_tab[LW_BAND_EU868]); printf("%15s","NWKSKEY:\t"); putlen(16); puthbuf(config->nwkskey, 16); printf("\n"); printf("%15s","APPSKEY:\t"); putlen(16); puthbuf(config->appskey, 16); printf("\n"); printf("%15s","APPKEY:\t"); putlen(16); puthbuf(config->appkey, 16); printf("\n"); printf("%15s","JOINR:\t"); putlen(config->joinr_size); puthbuf(config->joinr, config->joinr_size ); printf("\n"); printf("%15s","JOINA:\t"); putlen(config->joina_size); puthbuf(config->joina, config->joina_size ); printf("\n"); pl_print(config->message); maccmd_print(config->maccmd); json_value_free(jvroot); return 0; }