Message Queue and how to use it

About Message Queue (MQ)

In order to support near-real-time data communication, the PDi Digital system provides customers and partners data via message queues.

A message queue is a form of asynchronous service-to-service communication. Messages are stored on the queue until they are processed and deleted. Each message is processed only once, by a single consumer.

How to subscribe to the MQ

Cloud sepioo®

Listening to queues in Cloud Sepioo

This feature is disabled by default for the Cloud version of sepioo®. 

Access needs to be requested to PDI Digital Support by sending us an email (support@pdi-digital.com). 
After the MQ is activated, next step is to receive the MQ credentials. 

https://industrial-api.azure-api.net/v2.0/{YOUR_ACCOUNT}/mqaccess

The response of this requests contains the credentials for the different queues:

[{
  "domain": "{YOUR_ACCOUNT}.button_press",
  "namespace": "industrial-messagequeue.servicebus.windows.net",
  "primaryConnectionString": "XXX", 
  "secondaryConnectionString": "XXX",
  "headers": {
    "auth": "XXX"
  },
  "url": "https://industrial-messagequeue.servicebus.windows.net/{YOUR_ACCOUNT}.button_press",
  "expires": 1898838640,
  "from": "2021-03-15T07:10:40.0902672Z"},
...
]

Different examples on how to listen to the MQs can be found on the officially Microsoft documentation site: Get started with Azure Service Bus queues (Azure.Messaging.ServiceBus) – Azure Service Bus | Microsoft Docs

On Premise sepioo®

Listening to queues in On Premise sepioo®

In the On-Premise version of the platform, the MQ is implemented with a RabbitMQ. The default credentials are “root:example”.

The queue names are:

  • button_press
  • device_data
  • status_update
  • action
 

Listen to queues 

Different examples on the officially RabbitMQ documentation can be found on the following site: Get started with RabbitMQ queues – RabbitMQ | Docs

Which information does the MQ contain?

The Message Queue system supports different types of messages, which will be stored in different queues:

  • Button Press Event Queue
  • Device Data Queue
  • Status Update Queue
  • Action Queue

Button press event queue

This queue delivers all button press in the following format:

  • location: string
  • deviceId: string
  • deviceType: string
  • messageType: string: ”BUTTON_PRESSED”
  • status: string: ”SUCCESSFUL|ERROR|FAILED|DELAYED|TIMEOUT”
  • date: date
  • type: int:1|2|3|4
  • typeDescription: string: “TOP|BOTTOM|UP|DOWN”
  • duration: string: “SHORT|LONG”
  • data: int32: 0-2.147.483.647
  • page: int
  • counter: int
  • confirmedLate: boolean
  • customFields: object

 

Sample Message:
{
  "location": "{YOUR_ACCOUNT}.{YOUR_LOCATION}",
  "deviceId": "BBFFBB03",
  "deviceType": "label",
  "messageType": "BUTTON_PRESS",
  "status": "SUCCESSFUL",
  "date": "2021-01-01T00:00:00.000Z[Etc/UTC]",
  "payload": {
    "type": 1,
    "typeDescription": "TOP",
    "duration": "SHORT",
    "data": 0,
    "page": 1,
    "counter": 1,
    "confirmedLate": false,
    "customFields": {ANY_DATA},
  }
}

Device data queue

This queue delivers all device data in the following format:

  • location: string
  • deviceId: string
  • deviceType: string
  • messageType: string: ”DEVICE_DATA”
  • eventId: int: optional –> eventId is optional and only available if data has been actively queried by the API
  • externalEventId: string: optional –> externalEventId is optional and only available if data has been actively queried by the API with an external event id
  • status: string:”SUCCESSFUL|ERROR|FAILED|DELAYED|TIMEOUT”
  • date: date
  • type: int: 5|40|41|42|43
  • data: int32: 0-2.147.483.647
  • weight: int –> only if the device type is a scale

 

Sample Message:
{
  "location": "{YOUR_ACCOUNT}.{YOUR_LOCATION}",
  "deviceId": "BBFFBB03",
  "deviceType": "scale",
  "messageType": "DEVICE_DATA ",
  "status": "SUCCESSFUL",
  "date": "2021-01-01T00:00:00.000Z[Etc/UTC]",
  "payload": {
    "type": 1,
    "data": 0,
    "weight": 1,
 }
}

Status update queue

This queue delivers all device (labels, modules and access points) related status updates in the following format:

  • location: string
  • deviceId: string: optional à deviceId is filled out when labels and module data is transmitted
  • deviceType: string
  • messageType: string: ”ACCESSPOINT_STATUS_UPDATE|DEVICE_STATUS_UPDATE|EVENT_STATUS_UPDATE”
  • eventId : int: optional à eventId is optional and only available if data has been actively queried by the API
  • eventStatus: string: ”SUCCESSFUL|ERROR|FAILED|DELAYED|TIMEOUT|RUNNING”
  • taskId: string
  • taskType: string: “IMAGE|FLASHING|GET_CONFIG|SET_CONFIG|PING|REFRESH|SWITCH_PAGE|NDEF_MESSAGE|REGISTER_LABEL|REFRESH|REFRESH_DISPLAY”
  • taskStatus: string: ”SUCCESSFUL|ERROR|FAILED|DELAYED|TIMEOUT”
  • rssi: int
  • syncQuality: int
  • syncQualityLevel: “PERFECT|GOOD|AVERAGE|BAD|UNKNOWN” // from version v1.11
  • lqi: int
  • connectionStatus: string: “ONLINE|OFFLINE|DISCOVERED|UNKNOWN”,
  • powerStatus:string:”GOOD|BAD”,
  • accessPointId: int: optional à accessPointId is filled when device and accesspoint related updates are transmitted
  • wakeupTime: date,
  • date: date
  • currentPage: string “none, 1, 2, 3, …”
  • eventStatusCode: int
  • eventStatusCodeType: string

 

Sample message for an ACCESSPOINT_STATUS_UPDATE:
{
"location": "{YOUR_ACCOUNT}.{YOUR_LOCATION}",
"deviceType": "AccessPoint",
"messageType": "ACCESSPOINT_STATUS_UPDATE",
"accessPointId": 1,
"date": "2021-01-01T00:00:00.000Z[Etc/UTC]"
}
Sample message for a failed EVENT_STATUS_UPDATE:
{
"location": "{YOUR_ACCOUNT}.{YOUR_LOCATION}",
"deviceId": "BBFFBB03",
"deviceType": "label",
"messageType": "EVENT_STATUS_UPDATE",
"eventId": 1,
"eventStatus": "ERROR",
"taskId": "xxxx-yyyy-zzzz-aaaa",
"taskType": "IMAGE",
"taskStatus": "ERROR",
"date": "2021-01-01T00:00:00.000Z[Etc/UTC]"
}

Action queue

This queue delivers status updates triggered by Action Commands in the following formatting:

  • location: string
  • date: date
  • payload: object

The payload property is a dynamically value and will be configured separately for each action.

 

Sample message for a ACTION:
{
  "location": "{YOUR_ACCOUNT}.{YOUR_LOCATION}",
  "date": "2021-01-01T00:00:00.000Z[Etc/UTC]",
  "payload": {
      ...
  }
}