设备消息订阅

更新时间:2023-01-12 07:13:33下载pdf

智慧行业平台主要通过 Pulsar 主动推送各种事件数据给开发者,以满足开发者对消息实时性和消息持久化的要求。

如需对接设备消息订阅,需要通过 OEM App 或者 App SDK 的方式开发客户端。使用集智光控 App 配网的设备暂不支持推送消息到开发者。

Pulsar

Pulsar 是一个支持多租户、高性能的服务器到服务器之间消息通讯的解决方案。Pulsar 最初由雅虎开发,现在由 Apache 软件基金会管理。涂鸦智能基于开源的 Pulsar 系统进行了定制改进,按照涂鸦智能提供的 Pulsar SDK 可完成消息接入。

Pub/Sub

Pulsar 作为消息代理采用了 Pub/Sub(发布/订阅)的设计模式。该设计模式中,生产者将消息发布到主题,然后消费者可以订阅这些主题,处理传入消息,并在处理完成时发送确认。

​当订阅被创建时(即使消息处理设备已断开连接),所有的消息都将被 Pulsar 保留。只有在消息处理设备确认消息被成功处理后,保留下来的消息才会被丢弃。

此外,一个主题可以由多个消费者订阅,并且当消费者成功处理消息时,它需要向代理发送确认,以便代理可以丢弃该消息。涂鸦智能的 Pulsar 消息分发器(Broker)为每个主题分配了多个分区,Pulsar 消息分发器将根据分区和消费者分发消息。

安全

  • 认证安全:
    涂鸦 Pulsar 消息系统针对身份认证进行了深度定制,以满足高安全性要求。涂鸦采用动态令牌机制来增强安全,开发者可忽略实现细节,基于涂鸦提供的 SDK 即可完成认证。

  • 数据安全:

    • 传输安全:涂鸦 Pulsar 消息推送系统基于 SSL 传输数据。
    • 业务安全:业务数据均采用 AES-128 加密,每条请求并附上签名。

开通方式

开发者将开发者账号、授权密钥 clientId(accessId)交予智慧行业平台技术支持,开通消息订阅。

请求方式

具体参考 ConsumerExample 代码,接入时需要提供以下三部分数据:

  • username:开发者平台申请的云 API 授权部分的 Access ID
  • password:开发者平台申请的云 API 授权部分的 Access Secret
  • url(开发者根据自己的需要选择要接入的 URL):
    • 中国区:pulsar+ssl://mqe.tuyacn.com:7285/
    • 美国区:pulsar+ssl://mqe.tuyaus.com:7285/
    • 欧洲区:pulsar+ssl://mqe.tuyaeu.com:7285/

代码示例

String url = "";
String accessId = "";
String accessKey = "";
MqConsumer mqConsumer = MqConsumer.build()
    .serviceUrl(url)
    .accessId(accessId)
    .accessKey(accessKey)
    .maxRedeliverCount(3)
    .messageListener(new MqConsumer.IMessageListener() {
     @Override
     public void onMessageArrived(Message message) throws Exception {
       //write your own message processing logic
     }
    });
mqConsumer.start();

数据签名

在获得真正的data数据前,可以设置防篡改 MD5 签名校验。签名算法执行步骤如下:

  1. 将收到的 JSON 格式的每个参数(除 sign 和值为空外)格式化为 key=val
  2. 进行组装,使用 key 升序。组装后的字符串格式示例:k1=v1||k2=v2
  3. 添加密钥。例如:k1=v1||k2=v2...kn=vn||key
  4. 进行整串字符串的 MD5 签名。
  5. 如果 MD5 值和收到数据的 sign 一致,则表明数据没有被篡改。否则视为被篡改。

签名校验通过后,对数据进行解密:

  1. 先对数据进行 Base64 解码。
  2. 通过 AES (ECB 模式)对 accessKey 的中间 16 位代码进行解密 ,从而得到真正的设备状态数据。

数据格式

消息格式

参数名 类型 说明
encryptPayload String 消息体密文
sign String 采用指定签名算法计算出的签名
encryptType String 加密类型
t Long 13 位标准时间戳
v String 版本号

消息示例

{
  "encryptType": "aes_ecb",
  "v": "1.0",
  "t": 1588918073598,
  "encryptPayload":"4FDEE3FE59FCD76E260******33A478EB2C2004EF4289276****",
  "sign": "4b7084b3b87b550c0d967f7736e9****"
}

消息体格式

参数名 类型 说明
bizCode String 业务类型
eventType String 事件类型
data JSON 消息数据

业务类型说明

bizCode 描述
device 设备事件推送
voice 语音业务推送
construction 施工业务推送

消息体示例

{
  "bizCode": "device",
  "eventType": "dp_report",
  "data": {}
}

设备事件类型

eventType 描述
bind 设备绑定
unbind 设备解绑
reset 设备重置
online 设备上线
offline 设备下线
dp_report 设备状态上报
name_update 设备名称变更

设备绑定消息示例

{
   "data":{
     "devId":"02200434dc4f221a****",
     "deviceName":"****插座****(wifi)_0",
     "gwId":"",
     "location":{
       "child":{
         "id":"1256152666585710592",
         "name":"****测试房间****"
       },
       "id":"1256148753241358***",
       "name":""
     },
     "namespace":"BgdBXzUhIg5x77770LL1OfpD****",
     "ownerId":"139960xx",
     "position":"****书房****",
     "productId":"qCY4YFq02AP0i***",
     "sub":false,
     "uid":"bay1588324079695k***",
     "uuid":"02200434dc4f221a6***"
   },
   "bizCode":"device",
   "eventType":"bind"
 }

设备解绑消息示例

{
   "data":{
     "devId":"02200434dc4f221***",
     "namespace":"****开发者对应的****namespace"
   },
   "bizCode":"device",
   "eventType":"unbind"

}

设备重置消息示例

{
   "data":{
     "devId":"02200434dc4f221***",
     "namespace":"****开发者对应的****namespace"
   },
   "bizCode":"device",
   "eventType":"reset"

}

设备上线消息示例

{
   "data":{
     "devId":"02200434dc4f221a***",
     "namespace":"****开发者对应的****namespace",
     "time":1589019224062
   },
   "bizCode":"device",
   "eventType":"online"
 }

设备下线消息示例

{
   "data":{
     "devId":"02200434dc4f221a6***",
     "namespace":"****开发者对应的****namespace",
     "time":1589019224062
   },
   "bizCode":"device",
   "eventType":"offline"
 }

设备状态上报消息示例

{
  "data":{
  "devId": "002dj00118fe34***",
  "productId": "开发者平台定义产品对应的产品ID",
  "dataId": "145************",//全局唯一ID,标志单数据上报
  "namespace":"开发者对应的namespace",
  "status": [
    {
      "code": "switch_1",
      "value": "true",
      "time": 1589767589137
    }
  ]
},
  "bizCode":"device",
  "eventType":"dp_report"
}

设备更名消息示例

{
   "data":{
     "devId":"02200434dc4f221a***",
     "deviceName":"****插座****",
     "namespace":"****开发者对应的****namespace"
   },
   "bizCode":"device",
   "eventType":"name_update"
 }

语音事件类型

eventType 描述
voice_nlu 语音识别结果推送
voice_room_bind 音箱房间绑定结果推送

语音识别结果消息示例

{
  "data":{
  "devId":"6cd40b4ed084ac264bm***",
  "namespace":"BgdBXzUhIg5x77770LL1OfpDw*****",
  "nlu":"[{\"entities\":[{\"value\":\"电视\",\"entity\":\"deviceName\"}], \"domain\":\"mediaControl\",\"confidence\":1,\"text\":\"让电视暂停播放\",\"intent\":\"pause\"}]",
  "productId":"fabze***",
  "uid":"bay1588324079695k***",
  "uuid":"f572ecc09e19d***"
},
  "bizCode":"voice",
  "eventType":"voice_nlu"
}