前序系列文章>>>
【涂鸦物联网脚印】涂鸦云平台规范指令集
凋谢音讯平台次要通过 Pulsar 被动推送各种事件数据给内部合作伙伴,以满足合作伙伴对音讯实时性和音讯长久化的要求。

一、Pulsar

对于Pulsar的介绍,大家能够看一下这位大佬的简略介绍>>>pulsar-介绍。简略来说,Pulsar最后由雅虎开发,当初由 Apache 软件基金会治理,是一个反对多租户、高性能的服务器到服务器之间音讯通信的解决方案。

涂鸦智能基于开源的 Pulsar 零碎进行了定制改良,依照涂鸦智能提供的 Pulsar SDK 可实现音讯接入。

Pulsar 作为音讯代理采纳了Pub/Sub(公布订阅)的设计模式。该设计模式中,生产者将音讯公布到主题,而后消费者能够订阅这些主题,解决传入音讯,并在解决实现时发送确认。当订阅被创立时(即便音讯解决设施已断开连接)所有的音讯都将被 Pulsar 保留。只有在音讯解决设施确认音讯被胜利解决后,保留下来的音讯才会被抛弃。

此外,一个主题能够由多个消费者订阅,并且当消费者胜利解决音讯时,它须要向代理发送确认,以便代理能够抛弃该音讯。涂鸦智能的 Pulsar 音讯散发器(Broker)为每个主题调配了多个分区,Pulsar 音讯散发器将依据分区和消费者散发音讯。

二、相干阐明

平安:

  • 认证平安:涂鸦智能 Pulsar 音讯零碎针对身份认证进行了深度定制以满足高安全性要求,涂鸦智能采纳动静令牌机制加强平安,开发者可疏忽实现细节,基于涂鸦智能提供的 SDK 实现认证。
  • 数据安全:

    • 传输平安:涂鸦智能 Pulsar 音讯推送零碎基于 SSL 传输数据。
    • 业务平安:业务数据均采纳 AES-128 加密,申请均附上签名。

申请形式:

具体参考 ConsumerExample 代码。接入时须要提供以下三局部数据:

  • username:填写云开发平台中 API 受权密钥的 Access ID
  • password:填写云开发平台中 API 受权密钥的 Access Secret
  • url:依据调用的区域进行抉择。

    • 中国区:pulsar+ssl://mqe.tuyacn.com:7285/
    • 美国区:pulsar+ssl://mqe.tuyaus.com:7285/
    • 欧洲区:pulsar+ssl://mqe.tuyaeu.com:7285/
    • 印度区:pulsar+ssl://mqe.tuyain.com:7285/

开明形式:

  1. 登录 IoT 工作台 > 云开发

2. 创立我的项目。

3. 在我的项目中的音讯订阅模块,开明音讯订阅性能。

代码示例:

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();

数据格式:

{   "protocol": 4,   "pv": "2.0",   "t": 146052438362,"data":"4FDEE3FE59FCD76E260F7115011D65C7FD2AF59BFA4DC29E5DDF3FDA6BD5447E02F679052C34BBAAB7BB0EFEED62C760FD2AF59BFA4DC29E5DDF3FDA6BD5447EC660C816075824E004EC0123DE4FD1B638BB633A478EB2C2004EF4289276****",   "sign": "58285279b5b5790c7d917de88b3e****"}

数据签名:

在取得真正的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 位代码进行解密 ,从而失去真正的设施状态数据。

解密后数据格式如下:

{    "devId": "002dj00118fe34d9****",    "productKey": "开发者平台定义产品对应的产品 Key",    "dataId":"1459168450ddfdfoiopiopi****",//全局惟一 ID, 数据上报惟一标识 ID    "status": [    {      "code":"switch",      "value":false,      "mode":"rw",      "t":146052438362    },    {      "code":"work_mode",      "value":"colour",      "mode":"rw",      "t":146052438362    }  ]}

三、业务数据

协定号:

协定号(不同协定号代表了不同的性能)。

设施数据上报事件:

{  "devId": "002dj00118fe34d9****",  "productKey": "开发者平台定义产品对应的产品 Key",  "dataId": "1459168450ddfdfoiopiopi****",  "status": [    {      "数据点编码1(产品定义时对应的数据点编码)": "数据点对应的值",      "t": 1540615024283  // 数据点状态产生工夫    },    {      "数据点编码2(产品定义时对应的数据点编码)": "数据点对应的值",      "t": 1540615024283 // 数据点状态产生工夫    }  ]}

其余事件:

  • 设施上线:

bizData 阐明

数据示例

{  "devId": "002dj00118fe34d9****",  "productKey": "开发者平台定义产品对应的产品 Key",  "bizCode": "online",  "bizData": {    "time": 146052438362  }}
  • 设施离线:

bizData阐明

数据示例

 {    "devId": "002dj00118fe34d9****",    "productKey": "开发者平台定义产品对应的产品 Key",    "bizCode": "offline",    "bizData": {      "time": 146052438362    }  } 
  • 设施名变更

bizData 阐明

数据示例

{  "devId": "002dj00118fe34d9****",  "productKey": "开发者平台定义产品对应的产品 Key",  "bizCode": "nameUpdate",  "bizData": {    "devId": "002dj00118fe34d9****",    "name": "new name"  }}
  • 设施 DP 名变更

bizData 阐明

数据示例

{  "devId": "002dj00118fe34d9****",  "productKey": "开发者平台定义产品对应的产品 Key",  "bizCode": "dpNameUpdate",  "bizData": {    "devId": "002dj00118fe34d9****",    "name": "new name",    "dpId": "dpId"  }}
  • 设施绑定

bizData 阐明

数据示例

{  "devId": "002dj00118fe34d9****",  "productKey": "开发者平台定义产品对应的产品 Key",  "bizCode": "bindUser",  "bizData": {    "devId": "002dj00118fe34d9****",    "uuid": "06200043b4e618c1****",    "uid":"ay1529485403390****",    "token": "IIpQ****"  }}
  • 设施移除

bizData 阐明

数据示例

{  "devId": "002dj00118fe34d9****",  "productKey": "开发者平台定义产品对应的产品 Key",  "bizCode": "delete",  "bizData": {    "devId": "002dj00118fe34d9****",    "uid":"ay1529485403390S****"  }}
  • 设施降级状态

bizData 阐明

数据示例

{    "bizCode":"upgradeStatus",    "bizData": {        "devId":"6ca8756d*****1b4ewsdn",          "moduleType":0,        "upgradeStatus":2,        "description":"降级测试",        "oldVersion": "1.0.1",        "newVersion": "1.0.2"             },    "devId":"6ca8756d*****1b4ewsdn",    "productKey":"vFHpaEFwu8UD****",    "ts":1562232522192}