设备消息订阅

更新时间:2023-11-10 10:16:07下载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":"02200434dc4f221axxxx",
     "deviceName":"****插座****(wifi)_0",
     "gwId":"",
     "location":{
       "child":{
         "id":"1256152666585710592",
         "name":"****测试房间****"
       },
       "id":"1256148753241358336",
       "name":""
     },
     "namespace":"BgdBXzUhIg5x77770LL1OfpDxxxxx",
     "ownerId":"139960xx",
     "position":"****书房****",
     "productId":"qCY4YFq02AP0i1xx",
     "sub":false,
     "uid":"bay1588324079695kFxx",
     "uuid":"02200434dc4f221a6xxx"
   },
   "bizCode":"device",
   "eventType":"bind"
 }

设备解绑消息示例

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

}

设备重置消息示例

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

}

设备上线消息示例

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

设备下线消息示例

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

设备状态上报消息示例

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

设备更名消息示例

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

语音事件类型

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

语音识别结果消息示例

{
  "data":{
  "devId":"6cd40b4ed084ac264bmcvu",
  "namespace":"BgdBXzUhIg5x77770LL1OfpDwXj6b",
  "nlu":"[{\"entities\":[{\"value\":\"电视\",\"entity\":\"deviceName\"}], \"domain\":\"mediaControl\",\"confidence\":1,\"text\":\"可不可以给我让电视暂停播放\",\"intent\":\"pause\"}]",
  "productId":"fabzep46",
  "uid":"bay1588324079695kF7G",
  "uuid":"f572ecc09e19d8c1"
},
  "bizCode":"voice",
  "eventType":"voice_nlu"
}