关于阿里云IoT平台CoAP接入,可见笔记阿里云IoT平台CoAP接入
小能手另外分享了NB-IoT的应用开发心得,先从模组端对几个常见模块进行试用分析,接着对更上层具体的CoAP协议进行研究,并且演示如何对接主流的第三方物联网平台,可以见NB-IoT应用开发笔记
上一篇使用基础版产品进行接入,此种应用,阿里云IoT平台作为一个数据管道。另外阿里云物联网套件中还提供了高级版产品,使用物模型(TSL)来细化产品定义,可以在阿里云平台直接操作产品。
物联网套件高级版中,对物理空间中的实体进行了数字化建模,物理实体可以是各类传感器、车载装置、工业切片机等,也可以是“楼宇”、“房间”甚至“工厂”等等。现阶段,物联网中与人发生直接交互的物,更多是一个个具体的设备,因此,我们将设备抽象为“物”(Thing),通过物模型对设备是什么、能做什么、可以对外提供哪些服务进行描述。
一般情况下,物模型表现为设备的“功能”,包括至少一个“属性”(Property)或“服务”(Service)或“事件”(Event)。开发者完成产品的功能定义后,系统将自动生成该产品的“物模型”,以JSON格式表述,称之为 TSL(即 Thing Specification Language),请参考文档产品功能定义。
具体关于物模型的介绍可以查看官方帖子,阿里云物联网套件 > 快速入门 > 高级版快速开始 > 基于物模型开发设备
这篇笔记将会介绍官方的物模型示例,官方花了较多篇幅介绍物模型,我就不搬运了。但是物模型如何转化为 Alink Json 才是接入时最重要的一点,也是最容易出错的地方,本能手花了好几天,在阿里云伙伴的帮助下终于成功上报了数据。为了其他朋友少走一些弯路,本能手创建了一个烟感产品,演示如何把TSL转化为 Alink Json。这为下一步高级版的 CoAP 接入测试做好协议准备。
官方将 Alink Json 协议的介绍,放在了开发指南里面,阿里云物联网套件 > 开发指南 > 设备协议,其中有属性、事件、服务的 Alink Json 通信格式介绍。
我这边搬运一个设备属性上报的示例,其他例子大家可以多看看,特别是再处理具体协议时,可以到这边做个比对。
{
"id" : "123",
"version":"1.0",
"params" : {
"Power" : {
"value":"on",
"time":1524448722000
}
"WF" : {
"value":{},
"time":1524448722000
}
},
"method":"thing.event.property.post"
}
具体字段的细节定义如下:
有几点要注意下,如果没有严格按照这个格式来,后台就无法解析:
物模型字段必须完全一致。
id、version、method、time 等等这些字段一个都不能少。开发者可变的就是“请求参数”下的“属性名称”和“属性的值”这些键值对。
各个属性的字段一定要注意看其定义的数据类型
比如 time 字段的数值是UTC毫秒,是长整形数,不用加双引号。是的,本能手一定犯过这个错,才会重点写出来告诉大家。
本能手这边举例的设备定义是烟感设备。
属性 烟雾检测状态 SmokeSensorState enum 枚举值:0-正常; 1-检测到烟雾;
事件 故障上报 Error - 事件类型:信息
{
"id":"123",
"version":"1.0",
"params":{
"SmokeSensorState":{
"value":1,
"time":1524448722000
}
},
"method":"thing.event.property.post"
}
{
"id":"123",
"version":"1.0",
"params":{
"Error":{
"value":1,
"time":1524448722000
}
},
"method":"thing.event.property.post"
}
官方模版比较简单,只有1个属性和1个事件。我再定义相对完备的烟雾报警器。
{
"identifier": "SmokeSensorState",
"dataType": {
"specs": {
"0": "正常",
"1": "检测到烟雾"
},
"type": "enum"
},
"name": "烟雾检测状态"
},
{
"identifier": "RemoveState",
"dataType": {
"specs": {
"0": "正常",
"1": "拆卸报警"
},
"type": "bool"
},
"name": "拆卸报警状态"
},
{
"identifier": "BatteryPercentage",
"dataType": {
"specs": {
"unit": "%",
"min": "0",
"unitName": "百分比",
"max": "100"
},
"type": "double"
},
"name": "电池电量"
},
{
"identifier": "Period",
"dataType": {
"specs": {
"unit": "″",
"min": "10",
"unitName": "秒",
"max": "79800"
},
"type": "int"
},
"name": "心跳上报周期"
}
Alink Json 整理如下:
{
"id":"123",
"version":"1.0",
"params":{
"SmokeSensorState":{
"value":0,
"time":1526051254000
},
"RemoveState":{
"value":0,
"time":1526051254000
},
"BatteryPercentage":{
"value":99,
"time":1526051254000
},
"Period":{
"value":10,
"time":1526051254000
}
},
"method":"thing.event.property.post"
}