本文介绍HTTP/2服务端订阅的相关问题、原因和解决办法。

为什么发布消息报错?

服务端订阅客户端只能用于订阅物联网平台推送的消息,不能发布消息。如果您用HTTP/2 SDK发布消息,会有如下报错信息:

  • 6095 [nioEventLoopGroup-2-1] ERROR com.aliyun.openservices.iot.api.message.impl.MessageClientImpl - failed to publish message 0, error: failed to publish, code: 400,  content: Forbidden.
  • 6095 [nioEventLoopGroup-2-1] INFO com.aliyun.openservices.iot.api.message.impl.MessageClientImpl - give up publishing, message id: 0

因为配置HTTP/2 SDK时,使用Profile.getAccessKeyProfile 配置连接,表示SDK以订阅者身份接入物联网平台,只能订阅消息,不能发布消息,且subscribeunsubscribepublish 三个接口无法使用。

为什么服务端没有接收到消息?

您的服务端没有接收到已订阅的消息,原因如下:

  • 该消息是您通过控制台或API下发给设备的消息。服务端订阅仅支持设备端上报云端的消息,不支持订阅下行消息。
  • 有多个消息消费端。如果同时有多个消费端,物联网平台会将消息随机推送到其中一个消费端,并不是每个消费端都会推送。
  • 服务端订阅回调中,存在耗时业务。解决方法:配置HTTP/2 SDK时,需配置收到消息后尽快return CommitSuccess;并且,配置另起线程处理业务。
  • 没有在物联网平台控制台配置服务端订阅。解决方法:请登录物联网平台控制台,在产品的服务端订阅页签下确认。如果没有设置订阅相关消息,请及时设置。

消息接收慢的原因是什么?

原因:服务端订阅回调中,可能存在耗时业务。

解决方法:配置HTTP/2 SDK时,需配置收到消息后尽快return CommitSuccess;并且,配置另起线程处理业务。

如何进行消息过滤?

物联网平台会将已订阅的消息全量推送到您的消费端,您需调用setMessageListener进行本地消息过滤,处理指定Topic的消息。具体方法如下:

setMessageListener(String topic, MessageCallback messageCallback)

匹配指定Topic的消息到达时,则会调用指定的回调messageCallback处理;不匹配指定Topic的消息到达时,则会调用您在connect中指定的回调处理。

为什么测试环境会收到线上产品的消息?

服务端订阅是账号维度的消息推送,无法从产品或设备维度来区分消息。如果不希望在测试环境收到线上产品的消息,建议如下两种处理方式:

HTTP/2 SDK限制

服务端订阅仅支持 Java 和 .NET 两种语言的SDK,并且两种语言的SDK有以下限制:

  • Java SDK仅支持JDK 8环境。
  • .NET 不支持 .NET Core。

服务端订阅如何收费?

服务端订阅按照消息数量计费。具体计费方法,请参见计费方法