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

Community Tip - If community subscription notifications are filling up your inbox you can set up a daily digest and get all your notifications in a single email. X

Node.js Rest API example- how to display data from the local network in Vuforia Studio project?

No ratings

In this article  we have the same start point/state as described in “How to read sensors via Rest API call in and display it Vuforia Studio experience project?”… but with one significant difference ->the sensors URLs are not visible for the Thingworx service. The problem is that the sensors values should be requested via Rest API calls in a local intranet. This means that the end devices are connected to a local router and have IP valid only in the local WLAN. Othersides the router   have also internet access. The end devices could connect to  the Experience Server and could download e.g.  the experience. The sensor URL and rest API call should be some thing like:

 

var url="http://172.16.40.43.5900/api/v0/dev_id=6&size_id=123";

 

So, it means the IP address of the device, where the value should be requested via Rest API calls is not visible from outside of the local WLAN and the Rest API call could done only inside the local network.

So here we can use a node.js program (service)  which will request the sensors and will send the values to Thingworx. So the main loop is an interval callback function “requestFunction” which is called - here in example  every 5 seconds. It will read the sensors data via Rest API fetch call . In this example the data is called from  a local test web server (it simulates an edge device) . For the test I used 2 server URLs  wich require parametrs
1.) http://127.0.0.1:8081/userId=8

here the the user_id is random value 1...10 and  the resonse returns a json object  with some properties

2.)http://127.0.0.1:8081/api/todos?id=122

here the the id is random value 1...200 and the response  returns also a  json object  with some properties

 

var http = require('http')
var https = require('https')
const fetch = require('node-fetch')
var request = require("request")

var userId = 1 //could be from 1 to  10
var todosId = 1 //could be 1 -200
function requestFunction() {
    userId = Math.floor((Math.random() * 10) + 1)
    todosId = Math.floor((Math.random() * 200) + 1)

    fetch('http://127.0.0.1:8081/userId/' + userId)
        .then(response => response.json())
        .then(json => {
            console.log(JSON.stringify(json))
 
            setPropValue("profession", json["profession"])
            setPropValue("userName", json["name"])
            setPropValue("userId", json["id"])
            setPropValue("userPassword", json["password"])
        })
    fetch('http://127.0.0.1:8081/api/todos?id=' + todosId)

        .then(response => response.json())
        .then(json => {
            console.log(JSON.stringify(json))
            setPropValue("message", json["title"])
        
        })
}
// ==============================================
setInterval(requestFunction, 5000) //every 5 sec

 

If we need information about what  the  syntax of the Rest API is  to   set/ change the value of the thing property - for this  we can  check  the  REST API Reference Guide:

https://developer.thingworx.com/en/resources/guides/rest-api-how-guide

Property values access:

https://developer.thingworx.com/en/resources/guides/rest-api-how-guide/property-values-rest-api-how

 

 When we review the code above we can see that there is function “setPropValue” which should set a value to a particular property. Here the twx server:port is mxxxxx7o.studio-trial.thingworx.io:8443. The Thingname is  “REST_API_EDGE”

 

function setPropValue(propName, propValue) {

    var options = {
        method: 'PUT',
        url: 'https://mxxxxx7o.studio-trial.thingworx.io:8443/Thingworx/Things/REST_API_EDGE/Properties/PROPNAME',
        headers: {
            // use here the user appKey who created the Thing /here REST_API_EDGE
            appKey: 'fxxx7x4a-19x4-4xx3-bxxxa-9978a8xxxx17x', //appkey for the user
            'Content-Type': 'application/json'
        },
        body: { PROPNAME: 'XXXXXXX' },
        json: true
    };
    //this will make a string from the option json and will replace the 
 // place holder “PROPNAME” by function argument propName 
     var str_temp = JSON.stringify(options).replace(/PROPNAME/g, propName)
   //this will replace place placeholder XXXXXXX by function argument propVaule
 // and will convert the string back to json
    options = JSON.parse(str_temp.replace(/XXXXXXX/g, propValue))
    console.log("option in setPropValue:")
    console.warn(options)
    request(options, function(error, response, body) {
       //print the return code – success is 200
        console.log("response.statusCode=" + response.statusCode)
        if (error) {
            console.log("error in request");
            throw new Error(error);
        }
        console.log("response")
        
    });
}
// =================================================

111117.jpg

 

The code was generated with the REST API client POSTMAN. We can use this tool to test some Rest API calls in the POSTMAN GUI , where we could use some more confortable functionality for testing and debugging . When the call is working in the POSTMAN UI we can export it to different programming formats (javaScript, nodeJs etc. - means it  will  generate here a  javaScript code for postprocessing. When we start the script (above) we can verify that the property values will change every 5 seconds.

 

111118.jpg

 

The best way now to bind the data in Vuforia studio is via the External DATA panel

 

111119.jpg

 

Afterwards  we can test in the Preview and later on the end device:

 

1111191.jpg

 

Version history
Last update:
‎Jun 30, 2019 08:48 PM
Updated by:
Labels (1)
Contributors