Websocket
Guide to websocket communications with the Ardexa API
Last updated
Guide to websocket communications with the Ardexa API
Last updated
The Ardexa API uses socket.io (
https://socket.io/
)
for websocket requests. There are client libraries available for a variety of programming languages. The examples listed here will use NodeJS.
To get started, we will issue a simple REMOTE SHELL request. You will need:
An API token with the Control Devices privilege
For testing, you can simply use your current session token: (Your name) -> My Profile -> Version -> Copy to clipboard
The workgroup ID and device ID of the device
These can be found under Manual Config -> General on the Devices page for the target device
Here is an example connect
function:
All operations using socket.io
are event driven, so in this example we have wrapped the connection events in a Promise to make things a little easier. The important parts to notice are:
The API token is read from an environment variable called TOKEN
The cloud is app.ardexa.com
. Please update this to match your cloud URL.
The workgroupId
is passed in at connection time. You must use a separate connection for each workgroup
The websocket will emit connect
when successfully connected, or connect_error
if there was a problem
Now that we're connected, we can issue a REMOTE SHELL by emitting (sending) the correct event type and listening for the responses
device:cmd
is emitted with the following parameters
deviceId
: the ID of the target device
cmd
: the command we want to run on that device
requestId
: optional. Will be returned in any subsequent replies. Useful for matching requset and response objects if you are running many concurrent requests
device:cmd:rpc
is received first. This confirms that the API has received the request and it has been successfully processed. If there are errors, such as a permission problem, they will be delivered here and there will be no reply
. Successful requests will be assigned a correlationId
which can be used to match the reply/replies to the initial request
device:cmd:reply
is received once the request has been fully processed by the edge device. For device:cmd
, this includes the output of the command (stdout and stderr) as well as the return code.
Here is a sample of the output when the script is run from the command line:
Sent when a device's online state changes (online/offline). Contains the cn
(Common name), vhost
(aka workgroup ID) and the latest online
status
Sent when a new device is created. Contains the id
(aka Device ID), the cn
and it's online
status (which is always false
)
Sent when there is a change to the agent configuration. Contains the device ID as the id
property. The workgroup ID is the one used to connect the current socket.
Get a live feed of data directly from the broker. The deviceId
, table
and source
are mandatory. For CSV scenarios you can optionally include a specific field to only stream a single value (the default is to stream an array of values)
The device:feed:rpc
will include a feedId
:
The value
prop will contain the value(s) requested:
Will stop an existing feed. Simply pass in the feedId
received in the :rpc
response
Takes no arguments, will stop all feeds associated with the current socket connection.
Send a config object (JSON) to the specified device ID for testing and validation. Since the destination format is YAML, but the request is using JSON, the API will pre-process the request to look for "anchors" in the config, specifically in the fields
property. In the example below, example_fields
is used as an anchor by the tail
scenario.
As the request is fairly determinate in terms of time taken, there is only a single :rpc
response indicating success:
Or failure:
Just like device:testConfig
, except the configuration will be saved and the agent will be restarted
Just like device:applyConfig
, except the configuration is a String instead of an Object, and the string must be a YAML document.
Dynamically mapped scenarios (read: anything logged to /opt/ardexa/logs
), can occasionally get out of sync with the cloud. To force a re-read and re-sync event, use this RPC request
Will always succeed
Will be followed by a device:stateChange
as the agent is restarted, and a device:metaChange
as the metadata is re-synced
Upgade the agent to the latest version
Will emit a series of device:doUpgrade:reply
events at each step of the process
The final message in a successful series will set complete: true
If there is an error, it will be reported and no further replies will be forthcoming
Send a cooy of the ardexactl
control script to the target device. This normally happens automatically if the script is required, e.g. device:doUpgrade
, but there are situations where that's not the case, such as agent API logins.
And the device:sendArdexactl:rpc
response
Send a cooy of the ardpkg
plugin management app to the target device. This normally happens automatically if the script is required, e.g. installing a plugin. This call can also be used to upgrade ardpkg to the latest version
And the device:
sendArdpkg:rpc
response