cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
Showing results for 
Search instead for 
Did you mean: 

Cannot updating thingworx properties via Arduino REST call

EmArduino
Participant

Cannot updating thingworx properties via Arduino REST call

Hello All,

As part of my internship, I am using Arduino to update remote thingworx properties. I implmented my first arduino program. I started in this program with pushing static values. But REST call from my arduino is not updating properties values. Although from browser it successfully updates properties.
I am using:
    1- Thingworx 8.2.1-b140
    2- Arduino 1.8.5 leonardo ETH
The output of my code is the following:

 

My IP address: ***************
connected to the server
Connexion:
prop0: 11.00
prop1: 22.00
client: 1
server: pp-1805191146zt.devportal.ptc.io
appKey: 9bc83f49-adab-46c5-9017-93fe992eaf6a
thingName: myThing
serviceName: myThingService
nameArray0: arduino_value1
nameArray1: arduino_value2
connected2
POST /Thingworx/Things/myThing/Services/myThingService?appKey=9bc83f49-adab-46c5-9017-93fe992eaf6a&method=post&x-thingworx-session=true<&arduino_value1=11.00&arduino_value2=22.00> HTTP/1.1
Host: pp-1805191146zt.devportal.ptc.io
Content-Type: text/html
Connected

And when I put the following url in browser, it updates the properties values:
https://pp-1805191146zt.devportal.ptc.io/Thingworx/Things/myThing/Services/myThingService?appKey=9bc...

Any pointers please on what I may be doing wrong?

The code I used is following:

#include <SPI.h>
#include <Ethernet2.h>
#include <ThingWorxEthernet.h>

#define propertyCount 2 //How many values you will be pushing to ThingWorx

// initialize the library instance:
EthernetClient client;

//Initialize network info and ThingWorx server and app key
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; //Choose a unique MAC address for the Arduino
char server[] = "pp-1805191146zt.devportal.ptc.io"; //ThingWorx server (do not include http://)
char appKey[] = "9bc83f49-adab-46c5-9017-93fe992eaf6a";
char thingName[] = "myThing"; //Name of your Thing in ThingWorx
char serviceName[] = "myThingService"; //Name of your Service (see above)

//Initialize Property Name Array
char* nameArray[] = {"arduino_value1", "arduino_value2"};
double propertyValues[propertyCount];

unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds

//Interval of time at which you want the properties values to be sent to TWX server
int timeBetweenRefresh = 5000;

ThingWorx myThing(propertyCount); // Initialize your ThingWorx Object

void setup() {
// start serial port:
Serial.begin(9600);
while(!Serial);
// give the ethernet module time to boot up:
delay(1000);

// start the Ethernet connection:

if (Ethernet.begin(mac)!= 0){
// print the Ethernet board/shield's IP address:
Serial.print("My IP address: ");
Serial.println(Ethernet.localIP());
}

// if you get a connection, report back via serial:
if (client.connect(server, 443)) {
//myThing.UpdateValues(tab,client,server,appKey,thingName,serviceName,nameArray);
Serial.println("connected to the server");
} else {
// if you didn't get a connection to the server:
Serial.println("connection failed");
}

// Aquire properties values
propertyValues[0] = 11;
propertyValues[1] = 22;

// if you're not connected, and ten seconds have passed since
// your last connection, then connect again and send data:
if (millis() - lastConnectionTime > timeBetweenRefresh) {
Serial.println ("Connexion:");
Serial.print ("prop0: "); Serial.println(propertyValues[0]); 
Serial.print ("prop1: "); Serial.println(propertyValues[1]);
Serial.print ("client: "); Serial.println(client);
Serial.print ("server: "); Serial.println(server);
Serial.print ("appKey: "); Serial.println(appKey);
Serial.print ("thingName: "); Serial.println(thingName);
Serial.print ("serviceName: "); Serial.println(serviceName);
Serial.print ("nameArray0: "); Serial.println(nameArray[0]);
Serial.print ("nameArray1: "); Serial.println(nameArray[1]);
updateValues(propertyValues,client,server,appKey,thingName,serviceName,nameArray);
lastConnectionTime = millis(); //Note the last connection time
Serial.println ("Connected");
}
}

void loop() {
}

void updateValues(double propertyValues[] , EthernetClient &client, char server[], char appKey[], char thingName[], char serviceName[], char* propertyNames[]) {
//build the String with the data that you will send
//through REST calls to your TWX server
char data[80];
strcpy(data, "?appKey=");
strcat(data, appKey);
strcat(data, "&method=post&x-thingworx-session=true");
// if you get a connection, report back via serial:
if (client.connected()) {
Serial.println("connected2");
// send the HTTP POST request:
client.print("POST /Thingworx/Things/");
client.print(thingName);
client.print("/Services/");
client.print(serviceName);
client.print(data);
client.print("<");
for(int idx = 0; idx < propertyCount; idx++)
{
client.print("&");
client.print(propertyNames[idx]);
client.print("=");
client.print(propertyValues[idx]);
}
client.print(">");
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(server);
client.println("Content-Type: text/html");
client.println();

// print the request out
Serial.print("POST /Thingworx/Things/");
Serial.print(thingName);
Serial.print("/Services/");
Serial.print(serviceName);
Serial.print(data);
Serial.print("<");
for(int idx = 0; idx < propertyCount; idx++)
{
Serial.print("&");
Serial.print(propertyNames[idx]);
Serial.print("=");
Serial.print(propertyValues[idx]);
}
Serial.print(">");
Serial.println(" HTTP/1.1");
Serial.print("Host: ");
Serial.println(server);
Serial.println("Content-Type: text/html");
Serial.println();
} else {
// if you couldn't make a connection:
Serial.println("the connection could not be established");
client.stop();
}
}
Tags (2)
1 REPLY 1

Re: Cannot updating thingworx properties via Arduino REST call

Hi @EmArduino bit confused as you have mentioned that properties are being updated, when you issue the REST calls, is there something else where you run into error?

Announcements

Check out the upcoming Expert Session: Understanding ThingWorx Navigate Licensing in Community "Customer Events" section.