物模型是什么?
物模型指物理设备在云端的数字抽象,由属性、事件、行为组成,分别表示设备的状态、设备触发的事件以及设备端的执行动作。
物联网开发平台通过 JSON 格式描述设备的物模型,设备可根据云端定义的物模型上报数据,应用可从云端发起修改设备属性、调用设备行为的操作。
为什么物模型日志最新值和最新时间为空?
用户设备已成功连接到平台,并成功发布了数据至平台,为什么物模型日志如下图红色线框所示,没有展示设备上报的最新值以及最新的更新时间戳。
首先判断设备发布数据到平台的 Topic 是否是
$thing/up/property/产品ID/${deviceName}
这类 Topic,如果不是该 Topic,则最新值、更新时间不会显示。只有 Topic 为$thing/up/property/产品ID/${deviceName}
才会在物模型日志显示对应的属性、事件、行为日志。若是自定义 Topic 或者物模型 Topic 的明细报文,则可以在“内容日志”查看。其次判断设备上报的物模型 JSON 格式是否是正确的 JSON 格式,若格式不正确也无法显示。
设备上报物模型属性到平台,为什么控制台的物模型日志无法查看设备上报的数据?
当设备端向 Topic
$thing/up/property/{ProductID}/{DeviceName}
发布消息时,无法查看到设备属性、设备日志中的数据,需要检查上报的报文是否符合以下要求,若不符合,则在控制台无法查看到。可通过 物模型协议了解详细报文细节。报文格式是否是正确的 JSON 格式。
时间戳 timestamp 格式必须为 UNIX 系统时间戳,不能是类似"2021-08-01 10:00:00"这类格式。
检查 params 结构中的属性标识符是否与物模型定义中的标识符一致。
检查 params 结构中的 value 部分的类型是否与物模型定义的数据类型一致。
检查 params 结构中 value 的范围是否超出数据定义范围。
设备上报物模型属性到平台的常见错误
设备端向 Topic
$thing/up/property/{ProductID}/{DeviceName}
发布消息时,若接收到返回报文的code为406的返回报文时,通常是如下错误。非法的JSON格式
当设备端向 Topic
$thing/up/property/{ProductID}/{DeviceName}
发布消息为非法JSON格式时,物模型日志的最新值无法展示,在内容日志将可查询到系统日志为“json format illegal”,如下图所示:
由于设备上报的 JSON 报文错误,如下“lac”:9 后面还有个逗号。所以用户设备向
$thing/up/property/{ProductID}/{DeviceName}
发布消息前,需验证上报的是合法的 JSON 报文。{"method": "report","clientToken": "IUZ9DQISGJ-10","params": {"cid": 8,"lac": 9,}}
上报数据值的类型与物模型定义的数据类型不匹配
当设备端向 Topic
$thing/up/property/{ProductID}/{DeviceName}
发布的 JSON 消息中,若数值型的 Key 设置为字符串类型的值、字符串类型的Key设置为数值型时,也会出现类型检测错误。{"method": "report","clientToken": "IUZ9DQISGJ-10","params": {"cid": 8,"lac": "9","str_model": 133}}
如上述 JSON 中,若 lac 在物模型的定义是数值类型,但对应的 Value 为字符串类型9;str_model 的物模型的定义为字符串型,但是对应的 Value 为数值型133,当这样的格式上报后,系统会分别提示如下错误:
{"method":"report_reply","clientToken":"IUZ9DQISGJ-10","code":406,"status":"check report data err: readNumberAsString: invalid number, error found in #0 byte of ...|\\"str\\"|..., bigger context ...|\\"str\\"|..."}
{"method":"report_reply","clientToken":"IUZ9DQISGJ-10","code":406,"status":"check report data err: ReadString: expects \\" or n, but found 1, error found in #1 byte of ...|133|..., bigger context ...|133|..."}
数值范围越界错误
布尔型的值超出0或1范围,数值型上报的数值超过物模型所定义的数据范围,则会出现越界错误。
{"method": "report","clientToken": "IUZ9DQISGJ-10","params": {"win_switch":3,"altitude": 9999999}}
如上述 JSON 中,若 win_switch 在物模型的定义是布尔型,但对应的 Value 为3;altitude 的物模型的定义为数值型,但是对应的数值范围为:-1000至20000,当上述格式上报后,系统会分别提示如下错误:
{"method":"report_reply","clientToken":"IUZ9DQISGJ-10","code":406,"status":"check report data err: win_switch value 3 out of range:[0,1]"}
{"method":"report_reply","clientToken":"IUZ9DQISGJ-10","code":406,"status":"check report data err: altitude value 9999999 out of range:[-1000,20000]"}
枚举值不存在
枚举整型的值,若上报的枚举值不在物模型所定义的枚举值,则会出现枚举项未定义的错误。
{"method": "report","clientToken": "IUZ9DQISGJ-10","params": {"work_mode":3}}
上述报文返回是设备端上报枚举类型 work_mode 的值,上报枚举键值为3,但实际物模型定义,并没有枚举键值3,平台将会返回如下报文。
{"method":"report_reply","clientToken":"IUZ9DQISGJ-10","code":406,"status":"check report data err: work_mode value 3 enum not defined"}
如何将设备上报的数据及设备上下线状态,实时同步到用户自己的业务系统?