通信消息相关问题

本文介绍设备与物联网平台和物联网平台与服务器端的通信相关问题和解决方法。

类目

问题

上下行消息

通信Topic订阅

消息转发

消息存储

查询消息

设备重复收到消息,如何去重?

由于QoS 1消息的机制是保证最少收到一次消息,所以可能会出现重复收到消息的情况,但重复消息的消息ID是相同的。设备端可以根据消息ID去重;物联网平台也会减少重复发送QoS 1消息。

设备使用MQTT协议接入物联网平台后,接收不到通信数据,怎么办?

设备接收不到数据时,您可以根据实际场景,从以下几个方面进行排查解决:

  • 如果一直接收不到消息:检查设备是否订阅对应的通信Topic,MQTT设备接收消息需要先订阅对应的通信Topic。

  • 如果偶尔接收不到消息:查看设备端通信程序的回调中是否存在耗时逻辑。如果存在,建议相关耗时业务另起线程处理,不要在回调中直接处理。

  • 如果设备端是Android、Java等SDK:设备程序中需先执行通信Topic的订阅操作,再执行初始化操作,以免消息下推时,SDK尚未完成订阅,导致错过消息接收。

  • 如果是QoS 1的消息没有接收到:检查MQTT连接参数cleanSession是否为falsecleanSession需要设置为false才可以接收离线期间的QoS 1消息。

物联网平台是否会保存消息?

消息通过Topic发送后,物联网平台就会立即将消息转发给订阅了该Topic的设备。

  • QoS 0消息:物联网平台不保存。

  • QoS 1消息:物联网平台会保存7天。

物联网平台的设备数据,在不转储的情况下,数据保留多长时间?

  • QoS 0消息:物联网平台不保存。

  • QoS 1消息:物联网平台会保存7天。

您可在物联网平台控制台对应实例下的监控运维 > 日志服务页面,查看最近7天的通信日志。详细内容,请参见日志服务

物联网平台发送消息比较慢,存在超时情况,为什么?

可能是网络不稳定导致。

您可以执行以下操作,测试设备连接通信的网络可用性:

  1. 登录物联网平台控制台

  2. 实例概览页面,找到对应的实例,单击实例ID或备注名称。

  3. 在左侧导航栏,选择设备管理 > 设备

  4. 设备页面的设备列表上方,输入目标设备的DeviceName备注名称,搜索设备。

  5. 单击设备对应操作列的查看,查看设备信息。

  6. 设备信息页签下,单击实时延迟右侧的测试

  7. 单击确认,测试网络延迟。

您可重复步骤6~步骤7,多测试几次。如果通信链路有高延迟,则说明是网络不稳定。

物联网平台支持遗嘱消息和保留消息吗?

支持。物联网平台支持使用MQTT 5.0通信协议设置遗嘱消息和保留消息。使用说明,请参见物联网平台支持的MQTT 5.0特性

服务器端如何获取设备消息?

服务器端可通过以下两种方式获取设备消息。

  • 服务端订阅:使用物联网平台的服务端订阅功能,订阅一个或多个消息类型。物联网平台根据您设置的订阅,将产品下所有设备的该类型消息流转至您的服务器。支持以下两种方式的服务端订阅:

    • AMQP服务端订阅:使用AMQP SDK接收物联网平台转发的设备消息。

    • MNS服务端订阅:使用MNS SDK接收物联网平台转发到轻量消息队列(原 MNS) SMQ(Simple Message Queue (formerly MNS))队列的设备消息。

  • 云产品流转:使用消息转发的云产品流转功能,通过数据流转规则将指定设备数据流转到轻量消息队列(原 MNS) SMQ(Simple Message Queue (formerly MNS))的主题或消息队列(RocketMQ)的队列中。服务器通过MNS或RocketMQ SDK接收消息。详细内容,请参见云产品流转概述

已配置MNS服务端订阅,但在控制台上发送消息,SMQ的队列中并没有收到该消息,为什么?

在物联网平台控制台发送的消息和调用云端API发送的消息均属于服务端发送的消息,不会转发到轻量消息队列(原 MNS) SMQ(Simple Message Queue (formerly MNS))队列,只有设备发出的消息(设备上报消息、设备状态变化通知、设备标签变更等)才会转发到SMQ队列里。

如何判断MNS服务端收到的消息是来自哪个Topic?

发送到轻量消息队列(原 MNS) SMQ(Simple Message Queue (formerly MNS))队列中的消息格式:

{
	"messageid": "12345",
	"messagetype": "status/upload",
	"topic": "null/topic",
	"payload": {},
	"timestamp": 1469564576
}

您可根据topic字段进行判断。

如何从物联网平台云端下发指令到设备端?

您可调用物联网平台API下发消息,支持API如下:

API

说明

Pub

通过自定义Topic向指定设备发布消息。

BatchPub

通过自定义Topic,向指定产品下的多个设备,批量发送消息。

PubBroadcast

向指定产品下在线设备发布广播消息。

在线设备可指定为所有在线设备或订阅了指定Topic的在线设备。

RRpc

向指定设备发送请求消息,并同步返回响应。

SetDeviceProperty

设置指定设备的物模型属性值。

SetDevicesProperty

设置指定产品下多个设备的物模型属性值。

InvokeThingService

在单个设备上调用指定的物模型服务。

InvokeThingsService

在指定产品下多个设备上调用指定的物模型服务。

两个设备之间能通信吗?

同一实例下的两个设备之间可以通信。

通过云产品流转Topic消息路由可以将一个设备的Topic消息内容,转发到另一个设备的Topic,实现不同设备间的通信。

为什么发送QoS 2消息失败?

物联网平台仅支持QoS 0、QoS 1,不支持QoS 2。

详细内容,请参见MQTT协议规范

如何在物联网平台上实现设备连接和状态同步?

可通过服务端订阅功能订阅设备状态变更消息,实现设备连接和状态信息的同步。

详细内容,请参见服务端订阅

物联网平台如何实现设备上报数据的可视化?

  • 通过服务端订阅或云产品流转功能,将设备数据转发到目的服务器或数据库后,可自行实现数据可视化。

    详细内容,请参见服务端订阅云产品流转(新版)

  • 通过物联网平台云端SDK调用相关API获取设备上报数据,用户获取数据后,可自行实现数据可视化。

    获取设备数据的API如下:

    API

    说明

    QueryDevicePropertyStatus

    查询指定设备的所有属性快照。

    QueryDeviceOriginalPropertyStatus

    查询指定设备本身上报的原始属性(通过和未通过物模型校验的所有属性)快照。

    QueryDeviceOriginalPropertyData

    查询指定设备本身上报的原始属性(通过和未通过物模型校验的所有属性)记录。

    QueryDeviceOriginalEventData

    查询指定设备本身上报的原始事件(通过和未通过物模型校验的所有事件)记录。

    QueryDeviceOriginalServiceData

    查询指定设备本身调用的原始服务(通过和未通过物模型校验的所有服务)记录。

    QueryDeviceDesiredProperty

    查询指定设备的期望属性值。

    QueryDevicePropertyData

    查询指定设备在指定时间段内,单个属性的数据。

    QueryDevicePropertiesData

    查询指定设备在指定时间段内,多个属性的数据。

    QueryDeviceEventData

    查询指定设备的事件记录。

    QueryDeviceServiceData

    查询指定设备的服务调用记录。

    QueryMessageInfo

    通过消息ID查询设备上下行消息的详情,包括消息的内容、消息的产生时间、发送消息的Topic等

    QueryDevicesHotStorageData

    查询数据服务中存储的时序数据。

    QueryDevicesHotStorageDataStatus

    查询数据服务中时序数据存储的快照数据。

  • 使用物联网平台的数据服务,将平台系统表、产品属性时序表、产品属性快照表、产品事件表和自定义存储表等数据,通过大数据开发治理平台DataWorks集成到云原生大数据计算服务MaxCompute中构建数据仓库,进而实现数据可视化。详细内容,请参见离线数据集成(DataWorks+MaxCompute)

  • 通过物联网应用开发服务,开发Web可视化页面或移动可视化页面,通过组件配置展示设备数据。详细内容,请参见IoT Studio

如何在物联网平台上发布16进制的消息,是否有相应的API接口可用?

物联网平台控制台在线调试设备模拟器和设备详情页面的Topic列表页签,下发消息给设备时,不支持十六进制格式数据。

您可调用PubBatchPubPubBroadcast接口发送十六进制的消息内容,接口的请求参数MessageContent是原始消息内容经过Base64编码后的内容。调用接口时,可以传入String类型或十六进制的Byte数组类型数据通过Base64编码后下发给设备。

业务服务器调用接口发送消息后,物联网平台会自动对消息内容进行Base64解码,再转发给设备。

设备上报数据能导出吗?

物联网平台支持的QoS 0和QoS 1消息的最大存储时间分别为1天和7天。

您可以使用数据服务的数据存储功能,存储设备离线数据和时序数据。离线数据包括平台系统表、时序表、快照表和自定义存储表。设备时序数据包括设备上报的物模型(属性、服务和事件)数据和通过时序数据存储规则配置的自定义Topic数据。详细内容,请参见配置数据存储

设备上报的十六进制的数据可以通过AMQP服务端订阅吗?

可以。

您可以通过以下方案进行十六进制数据转发:

  1. 设备可通过自定义Topic上传十六进制格式的数据。使用自定义Topic通信的消息说明,请参见使用自定义Topic通信

  2. 配置消息转发订阅设备上报的自定义Topic消息。

  3. 使用AMQP客户端SDK消费设备上报的自定义消息。

    阿里云物联网平台提供以下语言的AMQP SDK示例代码供您使用。

    其中Python3和PHP语言的AMQP客户端SDK是使用STOMP协议和物联网平台云端通信,需要在使用AMQP客户端SDK时,将消息内容Base64编码后再推送,否则消息内容可能会被截断。

    SDK使用的详细说明,请参见AMQP客户端接入

一个消费组对应一个AMQP消息队列吗?

是的。

一个AMQP消息队列中,可以启动最多128个AMQP客户端消费消息。

一个设备可以只对应一个AMQP消息队列吗?

可以。

您可以使用云产品流转功能配置数据转发到AMQP服务端订阅的消费组,在消息转发的解析器中,通过函数topic(number)deviceName()指定设备名称,通过if控制语句将指定设备的消息转发到AMQP消息队列。

解析器示例代码如下:

// 通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。
var data = payload("json");
// 获取上报消息的设备名称。
var dn = deviceName();
// 流转指定设备的物模型上报数据。
if (dn == 'device01') { 
    writeAmqp(1000, data, "调试");  
}

解析器脚本说明,请参见脚本语法。配置消息转发解析器的详细内容,请参见数据转发到AMQP服务端订阅消费组消费

设备上线后,如何通知App或小程序?

物联网平台的服务端订阅功能,可同步设备状态变更消息。您可在App或小程序所在服务器中部署并启动AMQP客户端应用,接收设备状态变更消息。

实现方案如下:

  1. 配置AMQP服务端订阅:在物联网平台控制台,配置服务端订阅消费组,推送设备状态变更消息

  2. AMQP客户端接入:在您的App或小程序所在服务器中部署并启动AMQP客户端接入物联网平台。

    设备状态变更消息的数据格式说明,请参见设备上下线状态。AMQP客户端接收消息后如何在App或小程序中显示,需您自行实现。

  3. 设备接入:设备接入物联网平台后,设备状态信息会转发到AMQP客户端消费。

通过接口Pub下发消息成功后,设备没有收到消息为什么?

对于调用接口Pub下发消息的Topic,设备端没有订阅。

您可调用SubscribeTopic接口使设备先订阅对应通信Topic,才能接收到通过该Topic下发的消息。

设备订阅Topic列表为空,如何创建和查看订阅的Topic?

  • 设备端需要主动订阅Topic,且订阅成功后,物联网平台控制台对应实例下的设备Topic列表才会展示已订阅的Topic。

  • 设备端未完成订阅Topic的功能开发,且未接入物联网平台前,设备详情页面的Topic列表页签不显示已订阅的设备Topic。

订阅Topic

设备端可通过以下方式订阅Topic:

  • 使用物联网平台提供的C语言Link SDK 3.1、3.2、4.x版本、Python语言Link SDK,设备会自动订阅具有订阅权限的基础通信Topic和物模型Topic。

    您可创建具有订阅权限的自定义Topic后,通过SDK中提供的接口订阅自定义Topic:

    如果创建自定义Topic时,开启了代理订阅,设备与物联网平台建连时,物联网平台查询已开启代理订阅的Topic,帮助设备完成订阅。

    添加自定义Topic操作,请参见使用自定义Topic通信

  • 启动设备模拟器:使用物联网平台提供的设备模拟器功能,设备会自动订阅基础通信Topic和物模型Topic。

    您可以创建具有订阅权限的自定义Topic后,使用自定义Topic的上行指令调试功能,订阅自定义Topic。

  • 使用MQTT.fx接入物联网平台:设备在线后使用Subscribe功能订阅设备Topic。

  • SubscribeTopic:设备接入物联网平台在线后,调用该接口订阅设备Topic。

    您可以创建具有订阅权限自定义Topic后,再调用接口SubscribeTopic订阅Topic。

查看已订阅的Topic

选择以下方式:

AMQP服务端订阅设备上报消息后,为什么收不到RRPC通信Topic的消息?

RRPC通信是服务端下发RRPC消息数据并同步等待设备响应数据。物联网平台不支持AMQP服务端订阅RRPC通信消息。

RRPC通信的详细内容,请参见MQTT同步通信(RRPC)

自定义Topic通信数据的标准JSON格式是什么?

对于自定义Topic的通信,物联网平台对数据格式没有要求,需您自定义。

设备端与物联网平台交互通信需要符合的ICA标准数据格式(Alink JSON)的通信Topic和数据格式说明,请参见Alink协议说明

如果设备所属产品创建时选择数据格式透传/自定义,需要配置消息解析将设备通过自定义Topic上报给物联网平台云端的自定义格式数据Payload解析为JSON格式。详细内容,请参见自定义Topic消息解析

物模型通信报错“5092 - property not found”

上下行信息中的属性不在物模型中。

可能原因:

  • 物模型属性没有定义:您可在物联网平台控制台查看物模型的属性定义,添加需要的物模型属性。具体操作,请参见添加物模型

  • 属性是在自定义物模型模块中定义的:上下行通信的属性要拼接自定义模块标识符,格式为{tsl.functionBlockId}:{tsl.properties.identifier}

物模型字段的详细说明,请参见物模型TSL字段说明。消息通信相关错误码更多信息,请参见云端运行日志的错误码

属性设置的设备响应,报错6335

物模型的属性设置方法,定义的响应数据为空,所以物联网平台云端向设备下发属性设置指令后,设备响应消息中的data字段应该返回空。如果data非空,设备响应就会报错。

更多错误码说明,请参见云端运行日志的错误码

真实的设备接入需要与产品中的设备保持同一个Topic吗?

是的。真实设备的通信Topic必须与产品下对应设备的通信Topic保持一致。

设备可以订阅其他设备的通信Topic吗?

不可以。设备仅支持订阅设备自身的通信Topic,无法订阅其他设备的Topic。

阿里云怎么配置能让服务器监听所有设备的信息?

可以使用AMQP服务端订阅功能实现服务器订阅设备消息。详细内容,请参见使用AMQP服务端订阅

硬件设备和MQTT客户端使用同一设备证书接入物联网平台,订阅同一Topic失败

  1. 一个设备证书同一时间仅支持一个设备使用,硬件设备和MQTT客户端需要使用不同的设备证书接入物联网平台。

  2. 两个设备之间的通信,不能通过订阅同一Topic实现,因为设备只能订阅设备本身的通信Topic,不能订阅其他设备的Topic,也不能向其他设备的Topic发布消息。

  3. 通过云产品流转Topic消息路由可以将一个设备的Topic消息内容,转发到另一个设备的Topic,实现不同设备间的通信。

    例如:

如何设置和修改通信Topic的操作权限?

  • 物联网平台提供的基础通信Topic和物模型通信Topic的操作权限已定义,不支持修改。查看操作权限方法:

    1. 登录物联网平台控制台

    2. 在控制台左上方,选择物联网平台所在地域。

    3. 实例概览页签的全部环境下,找到对应的实例,单击实例卡片。

    4. 在左侧导航栏,选择设备管理 > 产品

    5. 产品页面,找到目标产品,单击对应操作列的查看

    6. 产品详情页面,单击Topic类列表,分别查看基础通信Topic物模型通信Topic页签中Topic列表。

      Topic列表中对应Topic的操作权限列,显示该Topic的发布订阅权限。

      image

  • 调用接口QueryProductTopic,查询指定产品下自定义Topic类列表的详细信息。

云端运行日志能直接导出吗?

不能。

  • 您可在自己的业务服务器中调用接口QueryMessageInfo,通过消息ID查询设备上下行消息的详情,包括消息的内容、消息的产生时间、发送消息的Topic等。把数据推送到您自己的服务器后,您可自行做存储。

  • 您可以开通日志服务,然后在物联网平台控制台开通云端运行日志转储,将云端运行日志导出到您阿里云日志服务的日志库(Logstore)中长期存储。具体操作,请参见云端运行日志转储

    开通云端运行日志转储后,日志服务系统自动创建的日志存储位置如下,您可在日志服务中查看转储的云端运行日志。

    • Projectiot-log-${uid}-${regionId}。其中,${uid}是您的阿里云账号ID,${regionId}是您的物联网平台服务所在地域代码。

    • Logstoreiot-logs

物联网平台如何保证设备的一条消息发送到多个服务端,避免设备发送的消息被重复发送?

AMQP服务端订阅时,一个消费组对应一个AMQP消息队列(消费端)。如果启动的多个消费端绑定同一个消费组,设备消息会随机发送到其中一个。如果需要每个消费端都收到设备消息,需要分别绑定不同的消费组。

详细内容,请参见:

物联网平台如何将同一个消息发送到多个设备上?

物联网平台提供接口PubBroadcast,可向指定产品下的多个在线设备发布广播消息。在线设备可指定为所有在线设备或订阅了指定Topic的在线设备。

物联网平台服务端订阅报错“9203

消息流转到服务端订阅时,服务端订阅的AMQP客户端或轻量消息队列(原 MNS) SMQ(Simple Message Queue (formerly MNS))客户端不在线。AMQP客户端在线方法,请参见AMQP客户端接入说明。MNS客户端在线方法,请参见开发MNS消费客户端

物联网平台设备只要订阅一次还是每次上电都要订阅?

只需要订阅一次。建议是每次上电都订阅一次,用来触发代码的回调。设备订阅通信Topic的详细说明,请参见服务器向设备下发数据

物联网平台支持服务端先发送设备后订阅吗?

不支持的,设备只有订阅了通信Topic,才能收到该Topic的消息。详细内容,请参见使用消息通信Topic

如何使用客户端连接物联网平台并订阅设备属性实时变化?

  1. 配置AMQP服务端订阅:在物联网平台配置推送消息类型设备上报消息

  2. 使用AMQP客户端SDK接入物联网平台可以接收已订阅的设备上报数据,包含设备属性数据。

    阿里云物联网平台提供以下语言的AMQP SDK示例代码供您使用。

    其中Python3和PHP语言的AMQP客户端SDK是使用STOMP协议和物联网平台云端通信,需要在使用AMQP客户端SDK时,将消息内容Base64编码后再推送,否则消息内容可能会被截断。

    SDK使用的详细说明,请参见AMQP客户端接入说明

如何在物联网平台中授权其他账号访问并查看数据?

  • 使用设备分发功能,通过跨账号方式,将源实例下的设备分发到目标账号的目标实例中,目标账号可以查看分发设备的相关数据。设备分发的使用限制和详细使用方式,请参见设备分发

  • 目前华东2(上海)地域的旧版公共实例之间,支持将设备授权给其他账号,目标账号可访问授权设备的相关数据。授权设备的使用限制和详细使用方式,请参见授权设备