Community Tip - Want the oppurtunity to discuss enhancements to PTC products? Join a working group! X
Hi,
I have added a remote thing, It was working til the previous day.BUt now its showing "isconnected" as "false" after connecting also.
What might be the reason behind this?
Check the code
Hi Supriya V,
Can you please post a screenshot of your Command Line output after running the jar file for temperature-thing-jar-with-dependencies along with the command for running it?
Thank you,
Veronica
Hi veronica,
is it possible to connect to more than one thing using same C SDK?
Hi Anup G Prasad,
Yes, it is possible, you just need to bind more than one Thing using this method :
/* Bind our thing */
twApi_BindThing(thingName);
You also need to separately register the properties you need for the Thing :
/* Regsiter our properties */
twApi_RegisterProperty(TW_THING, thingName, "Temperature", TW_NUMBER, NULL, "ALWAYS", 0, propertyHandler,NULL);
twApi_RegisterProperty(TW_THING, thingName, "Humidity", TW_NUMBER, NULL, "ALWAYS", 0, propertyHandler,NULL);
Best regards,
Veronica
Hi Veronica,
Am using the csdk and sample code given in it.so am executing the twc_agent file.can you tell me in which file i should make the above changes to connect to a new thing?
thanks
Anup
Hi Anup G Prasad,
For which device are you running the twc_agent file ? I am not very familiar with the projects posted on the developer community, but for Intel Galileo with C SDK for example I saw that there is a file named twc_agent_akp.c at this path in the archieve ..\TWC_Agent_Galileo-Gen2\install\src where you can bind your thing (in the ThingWorxTask method at line 471)
/* Bind our thing */ | |
twApi_BindThing(progSets.tw_name); | |
I believe you should be able to create additional Things and bind them here in the same way as the current bound Thing.
I hope this helps.
Best regards,
Veronica
Hi Veronica,
I have tried the mentioned steps but when i run the code it shows:
Message 1 timed out
Already connected
Message 2 timed out
Already connected
Message 3 timed out
Already connected
Hi Anup can you copy and paste the class that you modified to have more than on thing connected? I will test it on my Intel Galileo.
Thank you,
Veronica
// Standard includes
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include "AKPMessage.h"
#include "SerialConnector.h"
#include "Settings.h"
#include "pinspectre.h"
#include "pinspectre_hwbase.h"
#include "twLinux.h"
#include "twLogger.h"
#include "twApi.h"
//*****************************************************************************
// MACROS
//*****************************************************************************
#define APPLICATION_NAME "Remote asset Monitoring"
#define APPLICATION_VERSION "1.0.0"
#define PING_HOST_NAME "www.thingworx.com"
#define SERIAL_COLLECTION_RATE_MSEC 20000
#define UART_PRINT printf
#define PIN_ENABLE_PULLUP 1
#define PIN_DISABLE_PULLUP 0
#define PIN_LBL_ANALOG "A"
#define PIN_LBL_DIGITAL "D"
#define PIN_LBL_INPUT "I"
#define PIN_LBL_OUTPUT "O"
int parse_reportPinConfig(char *pin_lbl, char *configStr);
//*****************************************************************************
// STRUCTS -- Start
//*****************************************************************************
typedef struct
{
int direction;
int type;
int value;
}pinConfig;
/*****************
A simple structure to handle properties
******************/
struct
{
char * hostName;
char * PalletId;
char * Perimeter; //Perimeter flag
char * Theft;
char * Content;
struct twLocation Location;
} properties;
//*****************************************************************************
// GLOBAL VARIABLES -- Start
//*****************************************************************************
unsigned long g_ulStatus=0;
tw_settings progSets;
tw_settings progSets1;
propertyList *g_pinConf=NULL;
#if defined(gcc)
extern void (* const g_pfnVectors[])(void);
#endif
#if defined(ewarm)
extern uVectorEntry __vector_table;
#endif
//*****************************************************************************
// GLOBAL VARIABLES -- End
//*****************************************************************************
/*****************
Helper Functions
*****************/
/*****************************************************************************/
/*Function: writeProperty() */
/* */
/*This function is called automatically whenever a value is set for a proper-*/
/*ty by the thingWorx Platform. It consists of a section of if else statement*/
/*s that further direct what happens, if anything, when a property is written*/
/*****************************************************************************/
enum msgCodeEnum writeProperty(const char * propertyName, twInfoTable * value) {
if (!propertyName || !value) return TWX_BAD_REQUEST;
printf("Got VALUE FROM DI: %s\n", propertyName);
if(strstr(propertyName, "Config")!=NULL) {
char *pinCmd;
twInfoTable_GetString(value, propertyName,0, &pinCmd);
// Store pinConfig text in the JSON and set the pin
printf("SETTING VALUE FROM DI: %s\n", propertyName);
setPinFromConfStr((char *)propertyName, pinCmd);
}
else if(strstr(propertyName, "GPIO")!=NULL) {
double int_val=-1;
twInfoTable_GetNumber(value, propertyName, 0, &int_val);
setValueFromPinName((char *)propertyName, (int)int_val);
}
return TWX_SUCCESS;
}
/*****************************************************************************/
/*Function: sendPropertyUpdate() */
/* */
/*This function reads the values from the local struct "properties" and adds */
/*them to a list of properties that it will send up to the ThingWorx platform*/
/*When it is done adding the values it will send the data. */
/*****************************************************************************/
void sendPropertyUpdate(propertyList *inputProplist) {
propertyList *proplist=NULL;
printf("creating property list....%p", inputProplist);
if (!inputProplist) {
proplist = twApi_CreatePropertyList("Hostname",twPrimitive_CreateFromString(properties.hostName, 1), 0);
}
else {
proplist=inputProplist;
twApi_AddPropertyToList(proplist, "HostName", twPrimitive_CreateFromString(properties.hostName, 1), 0);
}
printf("Added Hostname...%p\n", properties.hostName);
go_data(proplist, progSets.sim_mode);
twApi_AddPropertyToList(proplist,"PalletId",twPrimitive_CreateFromString(properties.PalletId, 1), 0);
twApi_AddPropertyToList(proplist,"Perimeter",twPrimitive_CreateFromString(properties.Perimeter, 1), 0);
twApi_AddPropertyToList(proplist,"Theft",twPrimitive_CreateFromString(properties.Theft, 1), 0);
twApi_AddPropertyToList(proplist,"Content",twPrimitive_CreateFromString(properties.Content, 1), 0);
twApi_AddPropertyToList(proplist,"Location",twPrimitive_CreateFromLocation(&properties.Location), 0);
//printf("Added Pallet ID ..%p\n", properties.PalletId);
//printf("Added Flag ..%p\n", properties.Flag);
//printf("Staring Board Specific properties...%p\n", proplist);
//getTWPropertyUpdates(proplist); //send up board specific properties with current readings@
//getTWPinConfigs(proplist);
twApi_PushProperties(TW_THING, progSets.tw_name, proplist, -1, FALSE);
twApi_DeletePropertyList(proplist);
}
void sendPropertyUpdate1(propertyList *inputProplist1) {
propertyList *proplist1=NULL;
printf("creating property list....%p", inputProplist1);
if (!inputProplist1) {
proplist1 = twApi_CreatePropertyList("Hostname",twPrimitive_CreateFromString(properties.hostName, 1), 0);
}
else {
proplist1=inputProplist1;
twApi_AddPropertyToList(proplist1, "HostName", twPrimitive_CreateFromString(properties.hostName, 1), 0);
}
printf("Added Hostname...%p\n", properties.hostName);
go_data(proplist1, progSets1.sim_mode);
twApi_AddPropertyToList(proplist1,"PalletId",twPrimitive_CreateFromString(properties.PalletId, 1), 0);
//printf("Added Pallet ID ..%p\n", properties.PalletId);
//printf("Added Flag ..%p\n", properties.Flag);
//printf("Staring Board Specific properties...%p\n", proplist);
//getTWPropertyUpdates(proplist); //send up board specific properties with current readings
//getTWPinConfigs(proplist);
twApi_PushProperties(TW_THING, progSets1.tw_name, proplist1, -1, FALSE);
twApi_DeletePropertyList(proplist1);
}
void resetTask(DATETIME now, void * params) {
TW_LOG(TW_FORCE,"shutdownTask - Shutdown service called. SYSTEM IS SHUTTING DOWN");
twApi_UnbindThing(progSets.tw_name);
twApi_UnbindThing(progSets1.tw_name);
twSleepMsec(100);
twApi_Delete();
twLogger_Delete();
}
/*****************************************************************************/
/*Function: dispatch_AKP_Message() */
/* */
/*This function takes AKP messages that have been recieved from the serial */
/*bus and routes them accordingly. AKP is a short haul serial protocol for */
/*connecting two devices together and exchanging data items. */
/*****************************************************************************/
//Handles translating AKP messages and storing values into the global data struct.
void dispatch_AKPMessage(AKPMessage *msg){
switch(msg->msgType){
case DATA_ANALOG:
/* if(strcmp(msg->name, "LA")==0){
properties.LevelA=atoi(msg->value);
} */
break;
case DATA_STRING:
/*if(strcmp(msg->name, "S1")==0){
properties.Situation1LED=msg->value[0];
}
else if(strcmp(msg->name, "S2")==0){
properties.Situation2LED=msg->value[0];
}*/
break;
case DATA_BOOLEAN:
//For future expansion....
break;
case ALARM:
//For future expansion....
break;
case EVENT:
//For future expansion....
break;
case ERRORS:
break;
case COMMANDS:
break;
case SYSREGS:
break;
}
}
/***************
Serial Read Task
****************/
/*
This function gets called at the rate defined in the task creation
This task takes care of parsed messages and takes action on them.
*/
void SerialReadTask( DATETIME now, void * params )
{
/* get next AKP message*/
}
/*****************
Property Handler Callbacks
******************/
enum msgCodeEnum propertyHandler(const char * entityName, const char * propertyName, twInfoTable ** value, char isWrite, void * userdata) {
char * asterisk = "*";
if (!propertyName) propertyName = asterisk;
printf("propertyHandler - Function called for Entity %s, Property %s\r\n", entityName, propertyName);
TW_LOG(TW_TRACE,"propertyHandler - Function called for Entity %s, Property %s", entityName, propertyName);
if (value) {
if (isWrite && *value) {
/* Property Writes */
/* All are writable */
return writeProperty(propertyName, *value);
} else {
/* Property Reads */
if (strcmp(propertyName, "Name") == 0) *value = twInfoTable_CreateFromString(propertyName, properties.hostName, TRUE);
else if (strcmp(propertyName, "PalletId") == 0) *value = twInfoTable_CreateFromString(propertyName, properties.PalletId, TRUE);
else if (strcmp(propertyName, "Perimeter") == 0) *value = twInfoTable_CreateFromString(propertyName, properties.Perimeter, TRUE);
else if (strcmp(propertyName, "Theft") == 0) *value = twInfoTable_CreateFromString(propertyName, properties.Theft, TRUE);
else if (strcmp(propertyName, "Content") == 0) *value = twInfoTable_CreateFromString(propertyName, properties.Content, TRUE);
else if (strcmp(propertyName, "Location") == 0) *value = twInfoTable_CreateFromLocation(propertyName, &properties.Location);
else return TWX_NOT_FOUND;
}
return TWX_SUCCESS;
} else {
TW_LOG(TW_ERROR,"propertyHandler - NULL pointer for value");
return TWX_BAD_REQUEST;
}
}
/*****************
Service Callbacks
******************/
/* Example of handling a single service in a callback */
enum msgCodeEnum addNumbersService(const char * entityName, const char * serviceName, twInfoTable * params, twInfoTable ** content, void * userdata) {
double a, b, res;
UART_PRINT("addNumbersService - Function called\r\n");
TW_LOG(TW_TRACE,"addNumbersService - Function called");
if (!params || !content) {
TW_LOG(TW_ERROR,"addNumbersService - NULL params or content pointer");
return TWX_BAD_REQUEST;
}
twInfoTable_GetNumber(params, "a", 0, &a);
twInfoTable_GetNumber(params, "b", 0, &b);
res = a + b;
*content = twInfoTable_CreateFromNumber("result", res);
if (*content) return TWX_SUCCESS;
else return TWX_INTERNAL_SERVER_ERROR;
}
/* Example of handling multiple services in a callback */
enum msgCodeEnum multiServiceHandler(const char * entityName, const char * serviceName, twInfoTable * params, twInfoTable ** content, void * userdata) {
TW_LOG(TW_TRACE,"multiServiceHandler - Function called");
if (!content) {
TW_LOG(TW_ERROR,"multiServiceHandler - NULL content pointer");
return TWX_BAD_REQUEST;
}
if (strcmp(entityName, progSets.tw_name) == 0) {
if (strcmp(serviceName, "Reset") == 0) {
/* Create a task to handle the shutdown so we can respond gracefully */
twApi_CreateTask(1, resetTask);
}
return TWX_NOT_FOUND;
}
return TWX_NOT_FOUND;
}
enum msgCodeEnum blinkPin(const char * entityName, const char * serviceName, twInfoTable * params, twInfoTable ** content, void * userdata) {
char *pinName=NULL;
//double pinNumber;
double blinkct=0;
int pin_id=-1;
pid_t child_pid=0;
TW_LOG(TW_TRACE,"BlinkPinService - Function called");
if (!params || !content) {
TW_LOG(TW_ERROR,"BlinkPinService - NULL params or content pointer");
return TWX_BAD_REQUEST;
}
twInfoTable_GetString(params, "pinName", 0, &pinName);
twInfoTable_GetNumber(params, "numberOfBlinks", 0, &blinkct);
pin_id=name2Pin_Id(pinName);
if(pin_id>0) {
child_pid=fork();
if(child_pid!=0) {
printf("Spawned new process for blinks: %d\n", child_pid);
*content = twInfoTable_CreateFromNumber("result", blinkct);
return TWX_SUCCESS;
}
else {
for(blinkct=blinkct; blinkct>0; blinkct--){
pin_writeValue(pin_id, PIN_HIGH);
sleep(1);
pin_writeValue(pin_id, PIN_LOW);
sleep(1);
printf("blink ct: %f\n", blinkct);
}
printf("Quitting Child process\n");
exit(0);
}
}
else {
TW_LOG(TW_ERROR,"BlinkPinService - %s is not a known pin", pinName);
}
*content = twInfoTable_CreateFromNumber("result", blinkct);
return TWX_SUCCESS;
}
/***************
Data Collection Task
****************/
/*
This function gets called at the rate defined in the task creation. The SDK has
a simple cooperative multitasker, so the function cannot infinitely loop.
Use of a task like this is optional and not required in a multithreaded
environment where this functonality could be provided in a separate thread.
*/
#define DATA_COLLECTION_RATE_MSEC 2000
void dataCollectionTask(DATETIME now, void * params) {
sendPropertyUpdate(NULL);
sendPropertyUpdate1(NULL);
if(AKPMessagesWaiting()>0){
AKPMessage *temp=getNextAKPMessage();
while( temp!=NULL) {
//Map AKP Type to TW types
int tw_type=0;
if(temp->msgType==DATA_STRING) { tw_type = TW_STRING; }
else if(temp->msgType==DATA_ANALOG) { tw_type = TW_NUMBER; }
else if(temp->msgType==DATA_BOOLEAN) { tw_type = TW_BOOLEAN; }
//Register the property we recieved
twApi_RegisterProperty(TW_THING, progSets.tw_name, temp->name, tw_type, NULL, "ALWAYS", 0, propertyHandler, NULL);
propertyList * proplist;
twApi_RegisterProperty(TW_THING, progSets1.tw_name, temp->name, tw_type, NULL, "ALWAYS", 0, propertyHandler, NULL);
propertyList * proplist1;
//Send the data we just got
switch(tw_type){
case TW_STRING:
proplist= twApi_CreatePropertyList(temp->name,twPrimitive_CreateFromString(temp->value, 1), 0);
proplist1= twApi_CreatePropertyList(temp->name,twPrimitive_CreateFromString(temp->value, 1), 0);
break;
case TW_NUMBER:
proplist= twApi_CreatePropertyList(temp->name,twPrimitive_CreateFromNumber(atoi(temp->value)), 0);
proplist1= twApi_CreatePropertyList(temp->name,twPrimitive_CreateFromNumber(atoi(temp->value)), 0);
break;
case TW_BOOLEAN:
proplist= twApi_CreatePropertyList(temp->name,twPrimitive_CreateFromBoolean(atoi(temp->value)), 0);
proplist1= twApi_CreatePropertyList(temp->name,twPrimitive_CreateFromBoolean(atoi(temp->value)), 0);
break;
}
/*For now we only send data that's been put into our properties structure*/
sendPropertyUpdate(proplist);
sendPropertyUpdate1(proplist1);
//Grab the next waiting message
temp=getNextAKPMessage();
}
}
}
/***************
Slow Data Collection Task
****************/
/*
This function is used to collect data that won't change as often.
This function gets called at the rate defined in the task creation. The SDK has
a simple cooperative multitasker, so the function cannot infinitely loop.
Use of a task like this is optional and not required in a multithreaded
environment where this functonality could be provided in a separate thread.
*/
/*#define SLOW_DATA_COLLECTION_RATE_MSEC 20000000 //~every 5 hours or so
void slowDataCollectionTask(DATETIME now, void * params) {
//TODO: update with system calls to get info.
properties.hostName="test";
properties.Device_id="0.0.0.0";
}
*/
void ThingWorxTask() {
/************************************/
/************************************/
/*
* ThingWorx Example Application
* Copyright (C) 2014 ThingWorx Inc.
*
* Test application
*/
// int16_t port = progSets.tw_port;
int prog_err=0;
int prog_err1=0;
twDataShape * ds = 0;
if(progSets.debug_log==1)
{
twLogger_SetLevel(TW_TRACE);
twLogger_SetIsVerbose(1);
}
TW_LOG(TW_FORCE, "Starting up");
/* Wait until we have an Internet connection */
twSleepMsec(5);
/* Initialize the API */
//prog_err = twApi_Initialize(TW_HOST_NAME, port, TW_URI, APP_KEY, NULL, MESSAGE_CHUNK_SIZE, MESSAGE_CHUNK_SIZE, TRUE);
prog_err = twApi_Initialize(progSets.tw_host, (int16_t)progSets.tw_port, TW_URI, progSets.tw_appKey, NULL, MESSAGE_CHUNK_SIZE, MESSAGE_CHUNK_SIZE, TRUE);
prog_err1 = twApi_Initialize(progSets1.tw_host, (int16_t)progSets1.tw_port, TW_URI, progSets1.tw_appKey, NULL, MESSAGE_CHUNK_SIZE, MESSAGE_CHUNK_SIZE, TRUE);
if (prog_err!=0) {
TW_LOG(TW_ERROR, "Error initializing the API");
exit(prog_err);
}
/* Allow self signed certs */
twApi_SetSelfSignedOk();
/* Register Connection Events */
/* These events are not necessary when running in a full OS*/
//twApi_RegisterConnectCallback(OnConnectEvent);
//twApi_RegisterCloseCallback(OnDisconnectEvent);
/* Register our sample services */
//ds = twDataShape_Create(twDataShapeEntry_Create("a",NULL,TW_NUMBER));
//twDataShape_AddEntry(ds, twDataShapeEntry_Create("b",NULL,TW_NUMBER));
//twApi_RegisterService(TW_THING, progSets.tw_name, "AddNumbers", NULL, ds, TW_NUMBER, NULL, addNumbersService, NULL);
//twApi_RegisterService(TW_THING, progSets.tw_name, "Reset", NULL, NULL, TW_NOTHING, NULL, multiServiceHandler, NULL);
//twDataShape *blink_pin_ds=twDataShape_Create(twDataShapeEntry_Create("pinName","The Pin to Blink",TW_NUMBER));
//twDataShape_AddEntry(blink_pin_ds, twDataShapeEntry_Create("numberOfBlinks","The number of times to Blink",TW_NUMBER));
//twApi_RegisterService(TW_THING, progSets.tw_name, "BlinkPin", "Blinks pin(pinNumber) a number of times(blinks)", blink_pin_ds, TW_NOTHING, NULL, blinkPin, NULL);
/* Regsiter our properties */
twApi_RegisterProperty(TW_THING, progSets.tw_name, "PalletId", TW_STRING, NULL, "ALWAYS", 0, propertyHandler, NULL);
twApi_RegisterProperty(TW_THING, progSets.tw_name, "Perimeter", TW_STRING, NULL, "ALWAYS", 0, propertyHandler, NULL);
twApi_RegisterProperty(TW_THING, progSets.tw_name, "Theft", TW_STRING, NULL, "ALWAYS", 0, propertyHandler, NULL);
twApi_RegisterProperty(TW_THING, progSets.tw_name, "Content", TW_STRING, NULL, "ALWAYS", 0, propertyHandler, NULL);
//twApi_RegisterProperty(TW_THING, progSets.tw_name, "Name", TW_STRING, NULL, "ALWAYS", 0, propertyHandler, NULL);
twApi_RegisterProperty(TW_THING, progSets.tw_name, "Location", TW_LOCATION, NULL, "ALWAYS", 0, propertyHandler, NULL);
//GPIO properties
//twApi_RegisterProperty(TW_THING, progSets.tw_name, "Error", TW_STRING, NULL, "ALWAYS", 0, propertyHandler, NULL);
twApi_RegisterProperty(TW_THING, progSets.tw_name, "Temperature", TW_NUMBER, NULL, "ALWAYS", 0, propertyHandler, NULL);
twApi_RegisterProperty(TW_THING, progSets.tw_name, "Humidity", TW_NUMBER, NULL, "ALWAYS", 0, propertyHandler, NULL);
//twApi_RegisterProperty(TW_THING, progSets.tw_name, "In_use", TW_BOOLEAN, NULL, "ALWAYS", 0, propertyHandler, NULL);
//twApi_RegisterProperty(TW_THING, progSets.tw_name, "flag", TW_BOOLEAN, NULL, "ALWAYS", 0, propertyHandler, NULL);
twApi_RegisterProperty(TW_THING, progSets.tw_name, "Power_consumption", TW_NUMBER, NULL, "ALWAYS", 0, propertyHandler, NULL);
//registerLocalPinProperties(progSets.tw_name, propertyHandler);
twApi_RegisterProperty(TW_THING, progSets1.tw_name, "PalletId", TW_STRING, NULL, "ALWAYS", 0, propertyHandler, NULL);
/* Bind our thing */
twApi_BindThing(progSets.tw_name);
twApi_BindThing(progSets1.tw_name);
//twApi_CreateTask(SERIAL_COLLECTION_RATE_MSEC, SerialReadTask);
/* Connect to server */
if (!twApi_Connect(CONNECT_TIMEOUT, -1)) {
/* Register our "Data collection Task" with the tasker */
printf("Starting data Collection Task...\n");
twApi_CreateTask(DATA_COLLECTION_RATE_MSEC, dataCollectionTask);
/* Register our "Serial Task" with the tasker */
//twApi_CreateTask(DATA_COLLECTION_RATE_MSEC, serialParseTask);
} else {
printf("ERROR Establishing websocket to %s:%d\r\n", progSets.tw_host, progSets.tw_port);
}
while(1) {
twSleepMsec(5);
}
printf("Tearing Down Process....\n");
twApi_UnbindThing(progSets.tw_name);
twApi_UnbindThing(progSets1.tw_name);
twSleepMsec(100);
twApi_Delete();
twLogger_Delete();
exit(0);
}
//*****************************************************************************
// MAIN FUNCTION
//*****************************************************************************
int main()
{
//initBoardPins();
loadSettingsFile("agent.properties", &progSets);
loadSettingsFile("agent.properties1", &progSets1);
//readPinConf(progSets.pin_config);
//printf("Thing Name: %s\n", progSets.tw_name);
//printf("Thing Server: %s:%d\n", progSets.tw_host, progSets.tw_port);
//printf("Thing AppKey: %s\n", progSets.tw_appKey);
//printf("Scan Rate: %d\n", progSets.scanRate);
//Start the serial port for the serial data injector
//printf("Opening serial port %s...", progSets.serialPort);
//int ser_res=startSerial(progSets.serialPort, 115200, 8, 0, 1);
//if(ser_res>0) { printf("Success!\n"); }
//else { printf("Error :-(\n"); perror("Serial Error:"); }
/* Initialize Properties */
properties.hostName="RaspberryPi";
properties.PalletId="IN0001W0001P0001";
properties.Perimeter="FALSE";
properties.Theft="No";
properties.Content="HDD";
properties.Location.longitude = 76.948623;
properties.Location.latitude = 8.4874949;
//start the Thingworx task that will send the data
ThingWorxTask();
return 0;
}
Are you connecting via an EMS or SDK?
@Ravi am connecting via c sdk
Hello Anup,
Can you please share with me the structures of progSets and progSets1?
Thank you,
Ciprian
Hi Ciprian,
progSet
tw_host=ge2-3611.cloud.thingworx.com
tw_port=80
AppKey=118e56a5-a714-432f-a4d2-5fb770d04824
ScanRate=2000
Name=RaspberryPi_C_11364156447720966
ComPortId=/dev/ttyAMA0
SimMode=true
PinConfig=pinConfig_rPi.json
Debug=false
progset1
tw_host=ge2-3611.cloud.thingworx.com
tw_port=80
AppKey=118e56a5-a714-432f-a4d2-5fb770d04824
ScanRate=2000
Name=Am2302
ComPortId=/dev/ttyAMA0
SimMode=true
PinConfig=pinConfig_rPi.json
Debug=false