Skip to main content

Onenet MQTT Client

onenet平台配置

  1. 在消息队列MQ页面中,创建实例。

image.png

  1. 进入实例页面,此页面中的access-key会配置到airiot平台驱动配置中。点击左侧的topic管理,添加topic。

image.png

  1. 进入topic管理后,可添加topic。点击某个topic的详情,进入topic的配置页面,在topic下,增加订阅名称。

image.png image.png

配置说明

  1. 在系统模型管理界面中选择要配置的模型,右侧选项卡选择设备配置,在设备驱动一栏选择MQTT客户端。无无该选项时,点击右侧的驱动市场按钮在线安装驱动。

image.png

  1. 配置驱动参数

image.png 注: (1)通讯监控参数:平台通用配置,当某个资产数据点中的最新上数时间距离当前时间超过此参数时,平台判定资产掉线。 (2)自定义脚本:用户可编写自定义脚本适配不同设备,解析消息和组装要发送的消息内容。

  1. 根据设备具体情况配置数据点

image.png 注:数据点标识将会在脚本返回值中使用。

脚本

脚本格式

脚本语言采用的是JavaScript,一部分为固定格式: 脚本返回值是驱动接收的固定格式,整体为对象数组:[{ id:设备标识, values:数据点标识和值,time:毫秒时间戳 }],可同时返回多个资产的数据。 values为对象,例如:{"d1":100},属性名为数据点标识,值为数据点值。 类型:id为字符串,values为对象,time为number。 数组内每个对象对应单个资产的多个数据值,若没有time字段,驱动将以当前时间为准。

[ 
{ "id":"965564161", "values":{"d1":100},"time": 1657680448722}
]
ParseHandle = function (topic, package) {
// 处理package
// .......

// 将处理后的数据转为平台接收的格式
let id = "abcd1234" //id是资产编号,平台通过id判断数据和资产的对应关系,必需
let values = {"d1":100} // values是一个对象,key为数据点标识,值就是采集的具体数值,必需
let time = 1644290863000 // 数据点采集时间,UNIX毫秒时间戳,没有time时,默认采用服务器时间
return [ //可返回多个对象,对应多个资产
{ id, values,time } //返回的对象中的key的名字必须为id,values,time
]
}

消息格式

收到的topic为onenet发送消息的topic
package为onenet发送的消息,格式为一个js对象。属性有msgid,data,timestamp,类型均为字符串
例:package = {
'msgid': '13248',
'data': '{"sysProperty":{"messageType":"deviceDatapoint","productId":"531980"},"appProperty":{"deviceId":"965564161","dataTimestamp":1657531586957,"datastream":"3200_0_5750"},"body":"42345678"}',
'timestamp': '1657531586962 '
}

脚本示例

本示例以固定数据点d1为例,实际应用中,应解析协议,再对应数据点。

// 收到的值:
// package = {
// 'msgid': '13248',
// 'data': '{"sysProperty":{"messageType":"deviceDatapoint","productId":"531980"},"appProperty":{"deviceId":"965564161","dataTimestamp":1657531586957,"datastream":"3200_0_5750"},"body":"42345678"}',
// 'timestamp': '1657531586962'
//}

ParseHandle = function (topic, package) {
console.log(package)
let msg = JSON.parse(package.data) // 将package.data解析为js对象

if (msg.sysProperty && msg.sysProperty.messageType && msg.sysProperty.messageType === "deviceDatapoint") {

let id = msg.appProperty.deviceId
let values = { "d1": Number(msg.body) } // 以数据点d1为例,将body的值赋给d1
return [{ id, values }]
}

return []
}