消息通信相关问题
数据上报失败如何处理?
- 若设备是使用接口注册的,请确认设备是否因为没在指定的timeout时间内上线而被物联网平台自动删除了。如果设备已被删除,请重新注册设备再尝试上报数据。
- 请检查使用接口注册设备时,填写的产品信息是否和产品模型一致。
- 请检查上报的数据名称是否和产品模型定义的服务属性一致。
- 确定以上都不存在问题时,请检查设备和物联网平台之间的网络链路是否畅通,设备是否正常运行。
- 若设备为NB-IoT设备,请再参考NB模组无法正常上报数据怎么办?进行排查。
设备上报数据,应该选择消息接口还是属性接口?
根据实际业务场景来使用。如果不需要平台解析数据,仅透传数据的话,可以使用消息上报(无需开发产品模型);如果需要平台解析数据,请使用属性接口上报(需要开发产品模型)。
设备消息上报成功后,如何在平台查看是否上报成功?
由于消息是透传的,当前可以通过消息跟踪和运行日志查看。
- 消息跟踪:进入设备接入控制台,进入您的实例,选择 ,单击具体设备,启动 后查看。
- 运行日志:可参考运行日志使用说明进行配置,启动运行日志后查看。
设备显示上报数据成功,在控制台未看到数据?
可能原因:
设备上报的数据内容与产品模型中定义的属性不匹配。
解决方法:
- 查看设备对应产品信息,比较产品模型中的属性信息和设备上报属性是否一致。
- 进入设备接入控制台,选择 ,单击具体设备,启动 ,设备重新上报后可以查看是否有相关日志,如果没有日志,表示数据未到达平台,检查设备侧的网络状态;如果有日志,可以查看日志内具体报错信息。
- 也可单击运行日志使用说明进行配置,启动后可以查看日志内具体报错信息。 进入运行日志页面,可参考
设备影子显示数据与设备上报数据不一致?
设备接入服务中,设备上报的二进制数据平台进行了Base64处理,因此显示的数据不一致。进行Base64解密后数据将一致。
设备通过自定义Topic上报数据失败?
可能原因:
自定义Topic不匹配或没有发布权限。
解决方案:
console平台操作已指定消息topic前缀为$oc/devices/{device_id}/user/, 用户在前缀的基础上增加自定义部分,且不能是变量。通过自定义Topic上报数据时需要确认Topic是否已存在并已具备发布权限。
设备上报数据后,收不到物联网平台回复的数据上报响应?
- 如果插件为在线开发,则插件的数据上报消息中需要勾选“添加响应字段”。
图2 插件开发-新增消息
- 如果插件为离线开发,则插件代码中需要定义cloudRsp逻辑。
图3 插件代码样例
设备在一个位置上报数据成功,在另一个位置上报失败?
请联系NB-IoT网络运营商,确认NB-IoT卡是否有地域限制,以及当地NB网络状态。
NB设备上报数据为字符串时如何转换为二进制编码?
请先将字符串转换为ASCII编码再转换为二进制编码,例如“abc”转换成ASCII编码是979899,再转换为二进制编码011000010110001001100011。
为何上报中文数据,平台会乱码呈现?
问题描述
使用MQTT.fx设备模拟器进行数据上报时,在json字符串中携带中文字符,如下图:
上报至IoTDA平台后,会出现乱码情况,如下图:
可能原因
MQTT.fx设备模拟器不支持中文字符。
解决办法
- 与平台交互时,不使用中文字符。
- 请将上报数据中的中文字符进行Unicode编码处理。
- 替换第三方设备模拟器,推荐使用IoTDA自研的设备模拟器。
命令下发失败如何处理?
问题描述
调用命令下发接口报错或调用接口成功但设备未收到命令。
可能原因
- 设备协议不支持。
- 设备订阅的下行topic不正确或者设备上行topic及消息体不正确。
解决方法
- 确认使用的接口是否支持设备协议(同步命令下发当前仅支持MQTT协议设备)。
- 同步命令下发操作步骤:
- 确认设备订阅下行topic是否正确(需订阅成功后才可调用接口,不订阅,设备收不到平台消息),详细请参考平台命令下发接口文档。
- 若设备有收到平台下发的消息,确认设备上行topic及消息体是否正确,且必须在收到平台消息20s内(消息接口不限定20s),通过上行topic向平台发送,否则接口报错(request_id为下行消息中携带)。
- 异步命令下发操作步骤:
确认是立即下发还是缓存下发(根据入参的send_strategy判断)。
- 立即下发:设备在线,调用接口后设备立即收到。
- 缓存下发:调用接口后,设备上报数据后收到。
设备变为异常或者离线后,命令下发会成功吗?
同步命令会下发失败。
异步命令入参send_strategy为delay,命令会被缓存起来,等数据上报或者设备上线之后下发。
物联网平台下发异步命令有重发机制吗?
物联网平台具备异步命令重发机制。异步命令发送后(可以在设备接入的命令详情中查看命令发送时间):如果物联网平台未收到设备返回的ACK,则在10s~15s后会进行第一次重传。如果物联网平台仍未收到设备返回的ACK,在20s~30s后进行第二次重传。如果物联网平台依旧未收到设备返回的ACK,在40s~60s进行第三次重传。如果物联网平台在80s~180s后还没收到设备返回的ACK,则命令状态变为超时。
物联网平台的命令状态总共有几种?
LWM2M/CoAP设备命令下发状态
- 超期:表示命令在物联网平台缓存时间超期,未向设备下发。
- 成功:表示物联网平台已经将命令下发给设备,且收到设备上报的命令执行结果。
- 失败:表示编解码插件解析为空,或执行结果响应里面有“ERROR CODE”等。
- 超时:表示物联网平台等待ACK响应超时。
- 取消:表示应用侧已经取消命令下发。
- 等待:表示命令在物联网平台缓存,还未下发给设备。
- 已发送:表示物联网平台已经将命令下发给设备。
- 已送达:表示物联网平台已经将命令下发给设备,且收到设备返回的ACK消息。
各命令状态之间的转换如下图所示:
MQTT设备下发消息状态
- 等待:MQTT设备不在线,物联网平台会将消息进行缓存,此时任务状态为“等待”状态。
- 超时:物联网平台缓存的PENDING状态的消息,如果1天之内还没有下发下去,物联网平台会将消息状态设置为"超时”。
- 已送达:物联网平台将消息发送给设备后,状态变为“已送达”。
- 失败:物联网平台发送消息给设备不成功,消息状态变为“失败”。
各消息状态之间的转换如下图所示:
平台能批量下发命令吗?
通过调用物联网平台的创建批量任务接口可以进行批量命令下发。
通过创建批量任务下发的命令为缓存命令。
同步接口调用失败,显示超时该如何处理?
同步命令下发显示超时一般是端侧未在20s左右回复响应导致。可以使用真实设备或者模拟器来模拟设备上报响应(同步命令下发响应、属性修改响应、属性查询响应),其中特别注意设备侧响应的request_id需要跟平台下发的保持一致。
LwM2M协议设备的命令下发多条,为什么只有一条是成功,其他是已发送状态?
因为LwM2M协议是异步命令下发,并且是逐条下发的,收到上一条协议回复的响应后,才会进行下一条指令的下发。
平台向NB-IoT设备缓存下发命令,为什么设备一直收到同一条控制命令?
设备收到平台下发的命令后,必须向平台返回ACK响应,平台才认为设备收到了命令,否则平台认为这条命令没有下发成功,会重复下发这条命令直到收到ACK响应或命令过期。