In this blog I will be inspecting the setup below, using the REST APIs exposed by the different components (log-analysis-free guaranteed). 
   
    
    
 The components are started in stages, and I will do some exploration between each stages : 
 
 EMS only 
 EMS + LSR 1 
 EMS + LSR 1 + LSR 2 
 
   
  The REST APIs 
   
 
 Edge MicroServer (EMS) REST API 
 
 
 
 This API is very similar to the ThingWorx platform REST API, see REST APIs Supported by WS EMS for specificity. 
 I will be monitoring the EMS using the LocalEms virtual Thing (EMS only) 
 
 
 
 ThingWorx Platform REST API
 
 This is the well known ThingWorx Core REST API -  see REST API Core Concepts 
 
 
 
 
 
 I will be monitoring the EMS, from the platform, using an EMSGateway thing.
 
 The EMSGateway exposes on the platform some of the LocalEms services (like GetEdgeThings). 
 
 
 I'm also inspecting the remote properties / services / events exposed on the things using the RemoteThing::GetRemoteMetadata service. 
 
 
 
 Lua Script Resource (LSR) REST API 
 
 
 
 This API largely differs from the ones above, the API documentation is served by the LSR itself (e.g. http://localhost:8001/) 
 
 
    
   
 
 
 I will use it to list the scripts loaded by the LSR process. 
 
 
  Configuration 
   
 See above diagram - Platform is listening on port 8084, no encryption, EMS and LSRs on the same host... 
   
 
 Platform configuration : for each edge thing, a corresponding remote thing was manually created on the platform
 
 EMSGateway1 as a EMSGateway Thing Template 
 EMSOnlyThing as a RemoteThingWithFileTransfer 
 LUAThing2 as a RemoteThing 
 LUAThing1 as a RemoteThing 
 LUAOnlyThing as a RemoteThing 
 
 
 
   
 
 EMS configuration : /etc/config.json - listening on default port 8000 
 
   
 
 
 
 
 
 { 
     "ws_servers": [{ 
             "host": "tws74neo", 
             "port": 8084 
         } 
     ], 
     "appKey": "xxxxxx-5417-4248-bc01-yyyyyyy", 
     "logger": { 
         "level": "TRACE" 
     }, 
     "ws_connection": { 
         "encryption": "none" 
     }, 
     "auto_bind": [{ 
             "name": "EMSGateway1", 
             "gateway": true 
         }, { 
             "name": "EMSOnlyThing", 
             "gateway": false 
         }, { 
             "name": "LUAThing2", 
             "host": "localhost", 
             "port": 8002, 
             "gateway": false 
         }, { 
             "name": "LUAThing1", 
             "gateway": false 
         } 
     ], 
     "file": { 
         "virtual_dirs": [{ 
                 "emsrepository": "E:\\ptc\\ThingWorx\\EMS-5-3-2\\repositories\\data" 
             } 
         ], 
         "staging_dir": "E:\\ptc\\ThingWorx\\EMS-5-3-2\\repositories\\staging" 
     } 
 } 
 
 
 
 
 
 
 LSR process (1) : /etc/config.lua - listening on default port 8001 (using the out of the box sample Lua scripts) 
 
   
 
 
 
 
 
 scripts.log_level = "INFO" 
   
 scripts.LUAThing1 = { 
     file = "thing.lua", 
     template = "example", 
 } 
   
 scripts.sample = { 
   file = "sample.lua" 
 } 
 
 
 
 
 
 
 LSR process (2) : /etc/config2.lua - listening on port 8002 (using the out of the box sample Lua scripts)
 
 This LSR process is started with command "luaScriptResource.exe -cfg .\etc\config2.lua" 
 
 
 
   
 
 
 
 
 
 scripts.log_level = "INFO" 
 scripts.script_resource_port = 8002 
   scripts.LUAThing2 = { 
     file = "thing.lua", 
     template = "example", 
 } 
   
 scripts.LUAOnlyThing = { 
     file = "thing.lua", 
     template = "example", 
 } 
 
 
 
 
 
   
 Stage 1 : EMS only 
   
    
   
 ThingWorx REST API 
   
 
 
 
 Request: Call the GetEdgeThings service on the EMSGateway1 thing 
 
 
 POST   
 twx74neo:8084/Thingworx/Things/EMSGateway1/Services/GetEdgeThings 
 
 
 Response: As expected, only the remote things flagged as auto_bind are listed 
 
 
   
 
 
 
 
 name 
 host 
 port 
 path 
 keepalive 
 timeout 
 proto 
 user 
 accept 
 
 
 EMSGateway1 
   
 8001.0 
 / 
 60000.0 
 30000.0 
 http 
   
 application/json 
 
 
 EMSOnlyThing 
   
 8001.0 
 / 
 60000.0 
 30000.0 
 http 
   
 application/json 
 
 
 LUAThing1 
   
 8001.0 
 / 
 60000.0 
 30000.0 
 http 
   
 application/json 
 
 
 LUAThing2 
 localhost 
 8002.0 
 / 
 60000.0 
 30000.0 
 http 
   
 application/json 
 
 
 
 
 
 
 
      
                                                          
 
 
 
 Request: Call the GetRemoteMetadata service on the LUAThing1 thing 
 
 
 POST   
 twx74neo:8084/Thingworx/Things/LUAThing1/Services/GetRemoteMetadata 
 
 
 Response: As expected, remote properties / services and events are not available since the LSR associated with this thing is off. 
 
 
   
 Unable to Invoke Service GetRemoteMetadata on LUAThing1 : null 
 
 
 
   
 EMS REST API 
   
 
 
 
 Request: Call the GetEdgeThings service on the LocalEms virtual thing 
 
 
 POST   
 localhost:8000/Thingworx/Things/LocalEms/Services/GetEdgeThings 
 
 
 Response: output is identical to the gateway thing on the platform 
 
 
   
 
 { "name": "EMSGateway1", "host": "", "port": 8001, "path": "/",  "keepalive": 60000, "timeout": 30000, "proto": "http", "user": "", "accept": "application/json" }, 
 { "name": "EMSOnlyThing", "host": "", "port": 8001, "path": "/", "keepalive": 60000, "timeout": 30000, "proto": "http", "user": "", "accept": "application/json" }, 
 { "name": "LUAThing1", "host": "", "port": 8001, "path": "/", "keepalive": 60000, "timeout": 30000, "proto": "http", "user": "", "accept": "application/json" }, 
 { "name": "LUAThing2", "host": "localhost", "port": 8002, "path": "/", "keepalive": 60000, "timeout": 30000, "proto": "http", "user": "", "accept": "application/json"} 
 
 
 
 
            
 LSR REST API 
 N/A - no LSR process started yet. 
   
 Stage 2 : EMS + LSR 1 (8001) 
   
    
   
 ThingWorx REST API 
   
 
 
 
 Request: Call the GetEdgeThings service on the EMSGateway1 thing 
 
 
 POST   
 twx74neo:8084/Thingworx/Things/EMSGateway1/Services/GetEdgeThings 
 
 
 Response: LUAThing1 is associated to an LUA script 
 
 
   
 
 
 
 
 name 
 host 
 port 
 path 
 keepalive 
 timeout 
 proto 
 user 
 accept 
 
 
 EMSGateway1 
   
 8001.0 
 / 
 60000.0 
 30000.0 
 http 
   
 application/json 
 
 
 EMSOnlyThing 
   
 8001.0 
 / 
 60000.0 
 30000.0 
 http 
   
 application/json 
 
 
 LUAThing1 
 localhost 
 8001.0 
 /scripts/Thingworx 
 60000.0 
 15000.0 
 http 
   
 application/json 
 
 
 LUAThing2 
 localhost 
 8002.0 
 / 
 60000.0 
 30000.0 
 http 
   
 application/json 
 
 
 
 
 
 
 
   
 
 
 
 Request: Call the GetRemoteMetadata service on the LUAThing1 thing 
 
 
 POST   
 twx74neo:8084/Thingworx/Things/LUAThing1/Services/GetRemoteMetadata 
 
 
 Response: Now that the Lua script for LUAThing1 is running, remote properties / services and events are available 
 
 
   
 {"isSystemObject":false,"propertyDefinitions":{"Script_Pushed_Datetime":{"sourceType":"ThingShape","aspects":{"isReadOnly":false,"dataChangeThreshold":0,"defaultValue":1495619610000,"isPersistent":false,"pushThreshold":0,"dataChangeType":"VALUE","cacheTime":0,"pushType":"ALWAYS"},"name":"Script_Pushed_Datetime","description":"","category":"","tags":[],"baseType":"DATETIME","ordinal":0},"Pushed_InMemory_Boolean":{"sourceType":"ThingShape","aspects":.... 
 
 
 
   
 EMS REST API 
      LocalEms::GetEdgeThings returns same output as EMSGateway::GetEdgeThings 
   
 LSR REST API (port 8001) 
   
 
 
 
 Request: List all the scripts running in the first LSR 
 
 
 GET   
 localhost:8001/scripts?format=text/html 
 
 
 Response: We find our sample script and the script associated with LUAThing1 (the Thingworx script is part of the infrastructure and always there) 
 
 
   
 
 
 
 
 Name 
 Status 
 Result 
 File 
 
 
 LUAThing1 
 Running 
   
 E:\ptc\ThingWorx\EMS-5-3-2\etc\thingworx\scripts\thing.lua 
 
 
 sample 
 Running 
   
 sample.lua 
 
 
 Thingworx 
 Running 
   
 E:\ptc\ThingWorx\EMS-5-3-2\etc\thingworx\scripts\thingworx.lu 
 
 
 
 
 
 
 
   
 Stage 3 : EMS + LSR 1 (8001) + LSR 2 (8002) 
   
    
   
 ThingWorx REST API 
   
 
 
 
 Request: Call the GetEdgeThings service on the EMSGateway1 thing 
 
 
 POST   
 twx74neo:8084/Thingworx/Things/EMSGateway1/Services/GetEdgeThings 
 
 
 Response: LUAOnlyThing is now listed and LUAThing2 is associated with a LUA script 
 
 
   
 
 
 
 
 name 
 host 
 port 
 path 
 keepalive 
 timeout 
 proto 
 user 
 accept 
 
 
 EMSGateway1 
   
 8001.0 
 / 
 60000.0 
 30000.0 
 http 
   
 application/json 
 
 
 EMSOnlyThing 
   
 8001.0 
 / 
 60000.0 
 30000.0 
 http 
   
 application/json 
 
 
 LUAOnlyThing 
 localhost 
 8002.0 
 /scripts/Thingworx 
 60000.0 
 15000.0 
 http 
   
 application/json 
 
 
 LUAThing1 
 localhost 
 8001.0 
 /scripts/Thingworx 
 60000.0 
 15000.0 
 http 
   
 application/json 
 
 
 LUAThing2 
 localhost 
 8002.0 
 /scripts/Thingworx 
 60000.0 
 15000.0 
 http 
   
 application/json 
 
 
 
 
 
 
 
   
 EMS REST API 
      LocalEms::GetEdgeThings returns same output as  EMSGateway::GetEdgeThings 
   
 LSR REST API (port 8002) 
   
 
 
 
 Request: List all the scripts running in the second LSR 
 
 
 GET   
 localhost:8002/scripts?format=text/html 
 
 
 Response: Returns the status of all the scripts currently loaded 
 
 
   
 
 
 
 
 Name 
 Status 
 Result 
 File 
 
 
 LUAOnlyThing 
 Running 
   
 .\etc\thingworx\scripts\thing.lua 
 
 
 LUAThing2 
 Running 
   
 .\etc\thingworx\scripts\thing.lua 
 
 
 Thingworx 
 Running 
   
 .\etc\thingworx\scripts\thingworx.lua 
 
 
 
 
 
 
 
        
        View full tip