阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

业务场景

阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

1、设备端主动上报物模型属性,物联网平台更新物模型属性值
2、前端下发更新物模型属性指令,物模型平台不更新属性值,平台将临时的物模型属性值再转发到设备端。
3、云平台自发向设备端下发更新物模型属性指令(云平台流转->下发物模型属性),物模型平台不更新属性值。
4、设备端从物模型接收到临时的物模型属性值后进行其业务逻辑处理。
5、前端获取物模型属性值,物模型平台给真实的物模型属性值。
6、服务端获取物模型属性值,物模型平台给真实的物模型属性值。


原理

1、物模型属性的真实值来源只有一个,设备端主动上报

2、物联网平台只有设备端主动上报才会更新真实的物模型属性值


剖析

1、为什么物模型真实来源只能是设备端上报,下发更新物模型属性指令为什么都不行?
因为阿里云平台物模型属性的更新机制只认设备上报的属性,这又是为什么呢?

(1)设备上报的属性肯定是体现了设备当前真正的状态
(2)指令下发也有同步和异步的,并不能保证指令一下发,设备的真实状态就发生了变化,这样物模型属性就和设备真实的状态不同步了。

(3)设备端可能由于种种原因,或者其业务逻辑限制,指令下发下来并不代表一定会生效,并不代表一定要按照指令去执行
(4)指令下发过程中指令也可能被丢失,由于网络波动,资源紧张等情况,指令被舍弃。
(5)有可能同时存在多个客户端同时下发指令到设备,那到底谁才是正确的呢?那当然是设备端自己主动上报的那个咯。


2、什么样的物模型消息才是正确的呢?
先看协议格式:
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

日志服务中有物模型才能代表物模型数据更新
物模型消息只能代表向物模型topic发送了数据,不一定是正确的

来看下错误的格式:
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

正确的格式:
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

从这里可以看到,time字段和value字段是可选的,也就是物模型消息的时间戳可以有,也可以没有,但是就是不能没有Params字段


3、Payload格式注意事项

A、Payload格式必须为json格式

  Payload上报数据会经过哪些流程?
 (1) 首先,如果集成了SDK,会先经过SDK的校验。如果没有集成SDK或者直接使用MQTT接口进行上报
  那么会先经过平台的 《物模型消息》这一关,如果不是Json格式:

阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

(2)然后是《物模型check》这一关,虽然满足了json格式,但是如果不满足Alink Json协议
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

(3)《物模型check》如果满足Alink Json协议,但是部分数据不满足物模型定义
AMQP可以正常订阅,物模型可以正常更新数据,但是物模型数据的日志没有生成。(后来验证又有一条错误日志,感觉平台还是有bug)
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

AMQP:
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

经过后来多次验证,发现《物模型check》还是有个错误日志的,平台6332也没有定义这个错误码

阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

(4)《物模型check》如果满足Alink Json协议,但是全部数据都不满足物模型定义
物模型数据不会更新,AMQP正常订阅消息,但是消息内容里面有俩条5092的错误码
日志中物模型check这一关会提示6332错误码,tsl parse failed
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

(5)《物模型check》如果满足Alink Json协议,也满足物模型定义
物模型check通过,物模型数据更新正常,AMQP消息订阅正常,内容正常
物模型check通过
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

物模型数据
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

AMQP:
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

B、带time的格式和不带time的格式都是可以成功上报的
不带time格式:
"{"params":{"Temperature":99.99,"BatteryPercentage":88.88}}";

阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

带time格式
"{"params":{"Temperature":{"value":75.75,"time":1603248612000}}}";
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

C、如果上报的时候自带time,那么控制台上最新的数据按照控制台的时间排布,但是历史数据就是按照自带的time的数据
eg:测试时间:2020-10-24 14:46:50
验证:当上报数据time写死1603248612000 (2020/10/21 10:50:12)
{"params":{"Temperature":{"value":75.75,"time":1603248612000}}}
历史数据:
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

但是最新数据也是他:
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

AMQP订阅到的消息:
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

顺便再看看日志记录里是什么样:
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

D、如果上报数据的时候不带time

历史数据就是最新数据
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

看看AMQP收到的消息:
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

再看看日志:
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?


4、通过云平台流转至物模型属性下发怎样才能生效?

阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?

物模型属性的真实值来源只有一个,设备端主动上报。所以不管是云端下发指令,还是平台转发指令(如云平台流转)等,设备端需要接收到指令的后,再将该属性进行上报


小结

本片文章只是剖析,不讲实操,把原理讲通

1、物模型属性的真实值来源只有一个,设备端主动上报
2、物联网平台只有设备端主动上报才会更新真实的物模型属性值
3、Payload注意事项
4、物模型消息的正确格式

后续再逐步更新实操文档:

《阿里云物联网平台物模型属性下发如何才能生效》
《阿里云物联网平台通过云平台流转实现设备间物模型属性的同步》
《阿里云物联网云平台物模型流转SQL编写技巧》

上一篇:微软孵化器在班加罗尔选定了最新一批本土初创企业


下一篇:阿里云物联网平台之云端API调用(即云端开发)