文档首页> 设备接入 IoTDA> 常见问题> 消息通信相关问题
更新时间:2024-05-29 GMT+08:00

消息通信相关问题

数据上报失败如何处理?

  1. 若设备是使用接口注册的,请确认设备是否因为没在指定的timeout时间内上线而被物联网平台自动删除了。如果设备已被删除,请重新注册设备再尝试上报数据。
  2. 请检查使用接口注册设备时,填写的产品信息是否和产品模型一致。
  3. 请检查上报的数据名称是否和产品模型定义的服务属性一致。
  4. 确定以上都不存在问题时,请检查设备和物联网平台之间的网络链路是否畅通,设备是否正常运行。

设备上报数据,应该选择消息接口还是属性接口?

根据实际业务场景来使用。如果不需要平台解析数据,仅透传数据的话,可以使用消息上报(无需开发产品模型);如果需要平台解析数据,请使用属性接口上报(需要开发产品模型)。

设备消息上报成功后,如何在平台查看是否上报成功?

由于消息是透传的,当前可以通过消息跟踪和运行日志查看。

  • 消息跟踪:进入设备接入控制台,选择设备 > 所有设备,单击具体设备,启动消息跟踪后查看。
  • 运行日志:可参考运行日志使用说明进行配置,启动运行日志后查看。

设备显示上报数据成功,在控制台未看到数据?

可能原因

设备上报的数据内容与产品模型中定义的属性不匹配。

解决方法

  1. 查看设备对应产品信息,比较产品模型中的属性信息和设备上报属性是否一致。
  2. 进入设备接入控制台,选择设备 > 所有设备,单击具体设备,启动消息跟踪,设备重新上报后可以查看是否有相关日志,如果没有日志,表示数据未到达平台,检查设备侧的网络状态;如果有日志,可以查看日志内具体报错信息。
  3. 也可单击监控运维 >运行日志进入运行日志页面,可参考运行日志使用说明进行配置,启动后可以查看日志内具体报错信息。

设备影子显示数据与设备上报数据不一致?

设备接入服务中,设备上报的二进制数据平台进行了Base64处理,因此显示的数据不一致。进行Base64解密后数据将一致。

设备通过自定义Topic上报数据失败?

可能原因

自定义Topic不匹配或没有发布权限。

解决方案

console平台操作已指定消息topic前缀为$oc/devices/{device_id}/user/, 用户在前缀的基础上增加自定义部分,且不能是变量。通过自定义Topic上报数据时需要确认Topic是否已存在并已具备发布权限。

图1 自定义Topic

设备上报数据后,收不到物联网平台回复的数据上报响应?

  • 如果插件为在线开发,则插件的数据上报消息中需要勾选“添加响应字段”
    图2 新增消息样例
  • 如果插件为离线开发,则插件代码中需要定义cloudRsp逻辑。
    图3 插件代码样例

设备在一个位置上报数据成功,在另一个位置上报失败?

请联系NB-IoT网络运营商,确认NB-IoT卡是否有地域限制,以及当地NB网络状态。

NB设备上报数据为字符串时如何转换为二进制编码?

请先将字符串转换为ASCII编码再转换为二进制编码,例如“abc”转换成ASCII编码是979899,再转换为二进制编码011000010110001001100011。

为何上报中文数据,平台会乱码呈现?

问题描述

使用MQTT.fx设备模拟器进行数据上报时,在json字符串中携带中文字符,如下图:

图4 MQTT.fx数据上报截图

上报至IoTDA平台后,会出现乱码情况,如下图:

图5 设备详情样例

可能原因

MQTT.fx设备模拟器不支持中文字符。

解决办法

  1. 与平台交互时,不使用中文字符。
  2. 请将上报数据中的中文字符进行Unicode编码处理。
  3. 替换第三方设备模拟器,推荐使用IoTDA自研的设备模拟器

LWM2M/CoAP协议接入的设备如何进行命令下发?

LWM2M/CoAP协议接入的设备,在设备 > 所有设备 > 设备详情 > > 云端下发 > 命令下发 > > 异步命令下发页面下发命令。

详细操作可参考LwM2M/CoAP设备命令下发

MQTT协议接入的设备如何进行命令下发?

MQTT协议接入的设备,在设备 > 所有设备 > 设备详情 > 云端下发 > 命令下发 > 同步命令下发页面下发命令。

详细操作可参考MQTT设备命令下发

命令下发失败如何处理?

问题描述

调用命令下发接口报错或调用接口成功但设备未收到命令。

可能原因

  1. 设备协议不支持。
  2. 设备订阅的下行topic不正确或者设备上行topic及消息体不正确。

解决方法

  1. 确认使用的接口是否支持设备协议(同步命令下发当前仅支持MQTT协议设备)。
  2. 同步命令下发操作步骤:
    • 确认设备订阅下行topic是否正确(需订阅成功后才可调用接口,不订阅,设备收不到平台消息),详细请参考平台命令下发接口文档。
    • 若设备有收到平台下发的消息,确认设备上行topic及消息体是否正确,且必须在收到平台消息20s内(消息接口不限定20s),通过上行topic向平台发送,否则接口报错(request_id为下行消息中携带)。
  3. 异步命令下发操作步骤:

    确认是立即下发还是缓存下发(根据入参的send_strategy判断)。

    • 立即下发:设备在线,调用接口后设备立即收到。
    • 缓存下发:调用接口后,设备上报数据后收到。

设备变为异常或者离线后,命令下发会成功吗?

同步命令会下发失败。

异步命令入参send_strategy为delay,命令会被缓存起来,等数据上报或者设备上线之后下发。

命令/属性下发总是超时?

命令下发、属性设置、属性查询接口为同步命令,需要设备及时回响应,否则会超时。

物联网平台下发异步命令有重发机制吗?

物联网平台具备异步命令重发机制。异步命令发送后(可以在设备接入的命令详情中查看命令发送时间):如果物联网平台未收到设备返回的ACK,则在10s~15s后会进行第一次重传。如果物联网平台仍未收到设备返回的ACK,在20s~30s后进行第二次重传。如果物联网平台依旧未收到设备返回的ACK,在40s~60s进行第三次重传。如果物联网平台在80s~180s后还没收到设备返回的ACK,则命令状态变为超时。

物联网平台的命令状态总共有几种?

LWM2M/CoAP设备命令下发状态

物联网平台命令下发包含如下状态:
  • 超期:表示命令在物联网平台缓存时间超期,未向设备下发。
  • 成功:表示物联网平台已经将命令下发给设备,且收到设备上报的命令执行结果。
  • 失败:表示编解码插件解析为空,或执行结果响应里面有“ERROR CODE”等。
  • 超时:表示物联网平台等待ACK响应超时。
  • 取消:表示应用侧已经取消命令下发。
  • 等待:表示命令在物联网平台缓存,还未下发给设备。
  • 已发送:表示物联网平台已经将命令下发给设备。
  • 已送达:表示物联网平台已经将命令下发给设备,且收到设备返回的ACK消息。

各命令状态之间的转换如下图所示:

图6 命令状态转换图

MQTT设备下发消息状态

  • 等待:MQTT设备不在线,物联网平台会将消息进行缓存,此时任务状态为“等待”状态。
  • 超时:物联网平台缓存的PENDING状态的消息,如果1天之内还没有下发下去,物联网平台会将消息状态设置为"超时”。
  • 已送达:物联网平台将消息发送给设备后,状态变为“已送达”。
  • 失败:物联网平台发送消息给设备不成功,消息状态变为“失败”。

各消息状态之间的转换如下图所示:

图7 消息状态转换图

平台能批量下发命令吗?

通过调用物联网平台的创建批量任务接口可以进行批量命令下发。

通过创建批量任务下发的命令为缓存命令。

同步接口调用失败,显示超时该如何处理?

同步命令下发显示超时一般是端侧未在20s左右回复响应导致。可以使用真实设备或者模拟器来模拟设备上报响应(同步命令下发响应属性修改响应属性查询响应),其中特别注意设备侧响应的request_id需要跟平台下发的保持一致。

LwM2M协议设备的命令下发多条,为什么只有一条是成功,其他是已发送状态?

因为LwM2M协议是异步命令下发,并且是逐条下发的,收到上一条协议回复的响应后,才会进行下一条指令的下发。

平台向NB-IoT设备缓存下发命令,为什么设备一直收到同一条控制命令?

设备收到平台下发的命令后,必须向平台返回ACK响应,平台才认为设备收到了命令,否则平台认为这条命令没有下发成功,会重复下发这条命令直到收到ACK响应或命令过期。