Exchange ase.exchange.driver
Setup
User: device-driver-user
Permissions: the device driver user can create an exclusive queue that starts with
                    "ase.queue.driver." (with a unique suffix) and bind it to the
                    ase.exchange.driver (headers) exchange specifying which
                headers/arguments to bind with (x-match=all or x-match=any). This user can only
                subscribe and consume/get messages. This is a mechanism for core services to publish
                messages to the driver with specific targeting.
The headers to be used for binding and targeting as follows.
| Exchange | Headers | 
|---|---|
ase.exchange.driver | 
                            thingID=<thingID> | 
                        
ase.exchange.driver | 
                            messageType=addThing | 
                        
Incoming Messages
These messages come in on the unique queue bound to the exchange.
| Exchange | Queue | Headers | Body | Response | 
|---|---|---|---|---|
ase.exchange.driver | 
                            <unique> | 
                            messageType=addThing | 
                            <The Thing Description for thingID> | 
                            "none" | 
                        
ase.exchange.driver | 
                            <unique> | 
                            
                                 
 
  | 
                            <The Thing Description for thingID> | 
                            "none" | 
                        
ase.exchange.driver | 
                            <unique> | 
                            
                                 
 
  | 
                            <empty> | "none" | 
                        
ase.exchange.driver | 
                            <unique> | 
                            
                                 
 
 
  | 
                            {"<propertyKey>": <propertyValue>} | 
                            "none" | 
                        
ase.exchange.driver | 
                            <unique> | 
                            
                                 
 
 
 
  | 
                            {"<actionKey>": {"input": <action
                                input>}} | 
                            "actionStatus" | 
                        
ase.exchange.driver | 
                            <unique> | 
                            
                                 
 
 
 
  | 
                            {"<actionKey>": {"input": <action
                                input>}} | 
                            "actionStatus" | 
                        
ase.exchange.driver | 
                            <unique> | 
                            messageType=ping | 
                            <empty> | "pong" | 
                        
ase.exchange.driver | 
                            <unique> | 
                            messageType=setLogConfig | 
                            {"level":<level>, "pretty": <true/false>, "color":
                                    <true/false>} | 
                            "setLogConfig" | 
                        
ase.exchange.driver | 
                            <unique> | 
                            
                                 
 
 
  | 
                            <see applications > device drivers > opcua/bacnet > usage> | "reportStatus" | 
                        
ase.exchange.driver | 
                            <unique> | 
                            
                                 
 
 
  | 
                            <see applications > device drivers > opcua/bacnet > usage> | "reportStatus" | 
                        
ase.exchange.driver | 
                            <unique> | 
                            messageType=requestAPIregistration | 
                            <none> | "registerAPI" | 
                        
Response Messages
The following are response messages to the incoming messages. Note that the messages are published to different exchanges or queues. The queue is the "replyTo" property of the AMQP message.
The responses to the incoming messages related to discovery ("upload" and "reportStatus" responses) are described on the "Exchange Core" page.
The response to the requestAPIregistration message is done by publishing a message to the "Exchange API" as described on the "Register API" page.
| Exchange | Queue | Headers | Body | Response To | 
|---|---|---|---|---|
ase.exchange.telemetry | 
                        
                             
 
 
  | 
                        {"messageType":<messageType>,"thingID":<thingID>,"timestamp":<timestamp>,"data":{"<actionKey>":{"href":<action
                                href>"input":<action input>,"status":<action
                                status>}}} | 
                        "requestAction""cancelAction" | 
                    |
<replyTo> | 
                        
                             
 
 
 
 
 
 
  | 
                        <empty> | "ping" | 
                    |
<replyTo> | 
                        
                             
 
  | 
                        {"status": "completed"} | 
                        "setLogConfig" | 
                    
Action Message Processing
Let's use an example of a device that has an Action called "activate" defined on its Thing description (schema) and an Event, with the same name, as follows:
"uid": "453AEP18F901FRJK8J1MJ10ZYR", "actions": { "activate": { "title": "Activate", "description": "Activate the device", "input": { "properties": { "address": { "type": "string" }, "secure_key": { "type": "string" } }, "type": "object" } } }, "events": { "activate": { "title": "Activate request is done", "description": "Response of activate request", "data": { "type": "object" } } }
When the user request this Action through an API call (using Studio or direct), the
                following AMQP message is published to all queues on the
                    ase.exchange.driver exchange bound with header
                    thingID=453AEP18F901FRJK8J1MJ10ZYR as follows:
- AMQP headers:
 - 
                        
messageType=requestAction thingID=453AEP18F901FRJK8J1MJ10ZYR action=activate actionID=6CTAX0F1M01FRJKZ1DJXG5T3ZS
 - AMQP message body:
 - 
                        
{ "activate": { "input": { "address": "f1110197", "secure_key": "e4eb6ff6281bea9e568236802dcf4e0a" } } } 
When the third party service receives this Action request it should first publish an
                    actionStatus message to the
                    ase.exchange.telemetry exchange as follows:
- AMQP headers:
 - 
                        
messageType=actionStatus publishTag=raw thingID=453AEP18F901FRJK8J1MJ10ZYR - AMQP message body:
 - 
                        
{ "thingId": "453AEP18F901FRJK8J1MJ10ZYR", "timestamp": 1645421436, "data": { "activate" { "href": "/things/453AEP18F901FRJK8J1MJ10ZYR/actions/activate/6CTAX0F1M01FRJKZ1DJXG5T3ZS", "timeRequested": "2022-02-21T05:30:36Z", "status": "received" } } } 
The href item is required for further processing by the core
                services of the ECP and is constructed as follows:
                    /things/<thingID>/actions/<action>/<actionID>.
The status item will update the state of the action request. When
                the third party service has received an action request this status should be updated
                to received. 
event message to the
                    ase.exchange.telemetry exchange as follows:- AMQP headers:
 - 
                            
messageType=event publishTag=raw thingID=453AEP18F901FRJK8J1MJ10ZYR - AMQP message body:
 - 
                            
{ "thingId": "453AEP18F901FRJK8J1MJ10ZYR", "data": { "activate" { "data": { "address": "f1110197", "access_key": "ea9e56823e4eb6ff6281b6802dcf4e0a" } } } } 
With the action completed successfully, an actionStatus message
                needs to be published with status=completed to the
                    ase.exchange.telemetry exchange as follows:
- AMQP headers:
 - 
                        
messageType=actionStatus publishTag=raw thingID=453AEP18F901FRJK8J1MJ10ZYR - AMQP message body:
 - 
                        
{ "thingId": "453AEP18F901FRJK8J1MJ10ZYR", "timestamp": 1645421439, "data": { "activate" { "href": "/things/453AEP18F901FRJK8J1MJ10ZYR/actions/activate/6CTAX0F1M01FRJKZ1DJXG5T3ZS", "timeRequested": "2022-02-21T05:30:36Z", "timeCompleted": "2022-02-21T05:30:39Z", "status": "completed" } } } 
However, if the action was not successful, the event should not be published and the
                final actionStatus message should be sent with
                    status=failed instead.
Property Message Processing
readOnly:false) called "pollSeconds" defined on its thing
                description (schema) as
                follows:"uid": "RJK8J1453AEP18F901FMJ10ZYR", "properties: { "pollSeconds": { "title": "Poll Seconds", "type": "integer", "readOnly": false } }
ase.exchange.driver exchange bound with header
                    thingID=RJK8J1453AEP18F901FMJ10ZYR as follows:- AMQP headers:
 - 
                            
messageType=setProperty thingID=RJK8J1453AEP18F901FMJ10ZYR property=pollSeconds
 - AMQP message body:
 - 
                            
{ "pollSeconds": 20 } 
propertyStatus
                message to the ase.exchange.telemetry exchange, just like any
                regular telemetry data publish, as follows:- AMQP headers:
 - 
                            
messageType=propertyStatus publishTag=raw thingID=RJK8J1453AEP18F901FMJ10ZYR
 - AMQP message body:
 - 
                            
{ "thingId": "RJK8J1453AEP18F901FMJ10ZYR", "timestamp": 1645421449, "data": { "pollSeconds": 20 } }