
# 消息通信相关问题
#### 数据上报失败如何处理？
1. 若设备是使用接口注册的，请确认设备是否因为没在指定的timeout时间内上线而被物联网平台自动删除了。如果设备已被删除，请重新注册设备再尝试上报数据。
2. 请检查使用接口注册设备时，填写的产品信息是否和产品模型一致。
3. 请检查上报的数据名称是否和产品模型定义的服务属性一致。
4. 确定以上都不存在问题时，请检查设备和物联网平台之间的网络链路是否畅通，设备是否正常运行。
5. 若设备为NB-IoT设备，请再参考[NB模组无法正常上报数据怎么办？](https://support.huaweicloud.com/iothub_faq/iot_faq_01005.html#ZH-CN_TOPIC_0000001598450617__section62791733105513)进行排查。
 
#### 设备上报数据，应该选择消息接口还是属性接口？
根据实际业务场景来使用。如果不需要平台解析数据，仅透传数据的话，可以使用消息上报（无需开发产品模型）；如果需要平台解析数据，请使用属性接口上报（需要开发产品模型）。
#### 设备消息上报成功后，如何在平台查看是否上报成功？
由于消息是透传的，当前可以通过消息跟踪和运行日志查看。
- 消息跟踪：进入设备接入控制台，进入您的实例，选择"设备 \> 所有设备"，单击具体设备，启动"消息跟踪"后查看。
- 运行日志：可参考[运行日志使用说明](https://support.huaweicloud.com/usermanual-iothub/iot_01_0030_8.html)进行配置，启动运行日志后查看。
 
 #### 设备显示上报数据成功，在控制台未看到数据？
**可能原因**：
设备上报的数据内容与产品模型中定义的属性不匹配。
**解决方法**：
1. 查看设备对应产品信息，比较产品模型中的属性信息和设备上报属性是否一致。
2. 进入设备接入控制台，选择"设备 \> 所有设备"，单击具体设备，启动"消息跟踪"，设备重新上报后可以查看是否有相关日志，如果没有日志，表示数据未到达平台，检查设备侧的网络状态；如果有日志，可以查看日志内具体报错信息。
3. 也可单击"监控运维 \>运行日志"进入运行日志页面，可参考[运行日志使用说明](https://support.huaweicloud.com/usermanual-iothub/iot_01_0030_8.html)进行配置，启动后可以查看日志内具体报错信息。
 
#### 设备影子显示数据与设备上报数据不一致？
设备接入服务中，设备上报的二进制数据平台进行了Base64处理，因此显示的数据不一致。进行Base64解密后数据将一致。
#### 设备通过自定义Topic上报数据失败？
**可能原因**：
自定义Topic不匹配或没有发布权限。
**解决方案**：
console平台操作已指定消息topic前缀为$oc/devices/{device_id}/user/， 用户在前缀的基础上增加自定义部分，且不能是变量。通过自定义Topic上报数据时需要确认Topic是否已存在并已具备发布权限。
图1Topic管理-新增自定义Topic   
![](https://support.huaweicloud.com/iothub_faq/figure/zh-cn_image_0000001950350270.png "点击放大")
#### 设备上报数据后，收不到物联网平台回复的数据上报响应?
- 如果插件为在线开发，则插件的数据上报消息中需要勾选"添加响应字段"。
  图2插件开发-新增消息   
  ![](https://support.huaweicloud.com/iothub_faq/figure/zh-cn_image_0000001981477077.png "点击放大") 
- 如果插件为离线开发，则插件代码中需要定义cloudRsp逻辑。
  图3插件代码样例   
  ![](https://support.huaweicloud.com/iothub_faq/figure/zh-cn_image_0000001547277076.png "点击放大") 
 
#### 设备在一个位置上报数据成功，在另一个位置上报失败？
请联系NB-IoT网络运营商，确认NB-IoT卡是否有地域限制，以及当地NB网络状态。
#### NB设备上报数据为字符串时如何转换为二进制编码？
请先将字符串转换为ASCII编码再转换为二进制编码，例如"abc"转换成ASCII编码是979899，再转换为二进制编码011000010110001001100011。
 #### 为何上报中文数据，平台会乱码呈现？
**问题描述**
使用MQTT.fx设备模拟器进行数据上报时，在json字符串中携带中文字符，如下图：
图4MQTT.fx数据上报截图   
![](https://support.huaweicloud.com/iothub_faq/figure/zh-cn_image_0000001547436556.png "点击放大")
上报至IoTDA平台后，会出现乱码情况，如下图：
图5设备-设备属性乱码样例   
![](https://support.huaweicloud.com/iothub_faq/figure/zh-cn_image_0000001985974241.png "点击放大")
**可能原因**
MQTT.fx设备模拟器不支持中文字符。
**解决办法**
1. 与平台交互时，不使用中文字符。
2. 请将上报数据中的中文字符进行Unicode编码处理。
3. 替换第三方设备模拟器，推荐使用IoTDA自研的[设备模拟器](https://support.huaweicloud.com/bestpractice-iothub/iot_bp_00016.html#section10)。
 
#### LWM2M/CoAP协议接入的设备如何进行命令下发？
LWM2M/CoAP协议接入的设备，在"设备 \> 所有设备 \> 设备详情 \> 云端下发 \> 异步命令下发 \> 命令下发"页面下发命令。
详细操作可参考[LwM2M/CoAP设备命令下发](https://support.huaweicloud.com/usermanual-iothub/iot_01_0339.html)。
#### MQTT协议接入的设备如何进行命令下发？
MQTT协议接入的设备，在"设备 \> 所有设备 \> 设备详情 \> 云端下发 \> 同步命令下发 \> 命令下发"页面下发命令。
详细操作可参考[MQTT设备命令下发](https://support.huaweicloud.com/usermanual-iothub/iot_01_0339.html)。
#### 命令下发失败如何处理？
**问题描述**
调用命令下发接口报错或调用接口成功但设备未收到命令。
**可能原因**
1. 设备协议不支持。
2. 设备订阅的下行topic不正确或者设备上行topic及消息体不正确。
**解决方法**
1. 确认使用的接口是否支持设备协议（同步命令下发当前仅支持MQTT协议设备）。
2. 同步命令下发操作步骤：
   - 确认设备订阅下行topic是否正确（需订阅成功后才可调用接口，不订阅，设备收不到平台消息），详细请参考[平台命令下发](https://support.huaweicloud.com/api-iothub/iot_06_v5_3014.html)接口文档。
   
   - 若设备有收到平台下发的消息，确认设备上行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命令状态转换图   
![](https://support.huaweicloud.com/iothub_faq/figure/zh-cn_image_0000001598276221.png "点击放大")
**MQTT设备下发消息状态**
- 等待：MQTT设备不在线，物联网平台会将消息进行缓存，此时任务状态为"等待"状态。
- 超时：物联网平台缓存的PENDING状态的消息，如果1天之内还没有下发下去，物联网平台会将消息状态设置为"超时"。
- 已送达：物联网平台将消息发送给设备后，状态变为"已送达"。
- 失败：物联网平台发送消息给设备不成功，消息状态变为"失败"。
各消息状态之间的转换如下图所示：
图7消息状态转换图   
![](https://support.huaweicloud.com/iothub_faq/figure/zh-cn_image_0000001547596260.png "点击放大")
#### 平台能批量下发命令吗？
通过调用物联网平台的创建批量任务接口可以进行批量命令下发。
![](https://support.huaweicloud.com/iothub_faq/public_sys-resources/note_3.0-zh-cn.png)
通过创建批量任务下发的命令为缓存命令。
#### 同步接口调用失败，显示超时该如何处理？
同步命令下发显示超时一般是端侧未在20s左右回复响应导致。可以使用真实设备或者模拟器来模拟设备上报响应（[同步命令下发响应](https://support.huaweicloud.com/api-iothub/iot_06_v5_3014.html)、[属性修改响应](https://support.huaweicloud.com/api-iothub/iot_06_v5_3008.html)、[属性查询响应](https://support.huaweicloud.com/api-iothub/iot_06_v5_3011.html)），其中特别注意设备侧响应的request_id需要跟平台下发的保持一致。
#### LwM2M协议设备的命令下发多条，为什么只有一条是成功，其他是已发送状态？
因为LwM2M协议是异步命令下发，并且是逐条下发的，收到上一条协议回复的响应后，才会进行下一条指令的下发。
#### 平台向NB-IoT设备缓存下发命令，为什么设备一直收到同一条控制命令？
设备收到平台下发的命令后，必须向平台返回ACK响应，平台才认为设备收到了命令，否则平台认为这条命令没有下发成功，会重复下发这条命令直到收到ACK响应或命令过期。
