基于HTTP/2通道的服务端订阅-设备状态和数据
一、服务端订阅
服务端订阅流程
在IoT场景,有时候我们期望业务服务器能接收到设备状态和设备采集的数据,而不是通过云产品中转,
这时我们可以开启服务端订阅,IoT平台会把设备产生的消息通过HTTP/2通道推送到业务服务器,以便根据自身业务场景消费。
注:HTTP/2是方便、快捷、低延时,小堆积的消息流转通道,不是队列。目前是只有java8客户端sdk。 如果业务数据流非常大, 需要支持海量消息堆积,建议通过规则引擎流转队列方式处理。
不论那个方式,消费端还是需要提升自身消费速率才能高效处理业务消息。
服务端订阅SDK
注:目前仅提供Java8版SDK java sdk依赖
<!-- Aliyun core --><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>3.7.1</version></dependency><!-- iot message client --><dependency><groupId>com.aliyun.openservices</groupId><artifactId>iot-client-message</artifactId><version>1.1.2</version></dependency>
消费iot平台设备实时采集数据
import .UnknownHostException;import java.util.concurrent.ExecutionException;import com.aliyun.openservices.iot.api.Profile;import com.aliyun.openservices.iot.api.message.MessageClientFactory;import com.aliyun.openservices.iot.api.message.api.MessageClient;import com.aliyun.openservices.iot.api.message.callback.MessageCallback;import com.aliyun.openservices.iot.api.message.entity.Message;public class H2Client {public static void main(String[] args) throws UnknownHostException, ExecutionException, InterruptedException {// 身份String accessKey = "阿里云accessKey";String accessSecret = "阿里云accessSecret";String regionId = "cn-shanghai";String uid = "阿里云账号 uid";String endPoint = "https://" + uid + ".iot-as-http2." + regionId + ".";// 连接配置Profile profile = Profile.getAccessKeyProfile(endPoint, regionId, accessKey, accessSecret);// 构造客户端MessageClient client = MessageClientFactory.messageClient(profile);// 数据接收client.connect(messageToken -> {Message m = messageToken.getMessage();System.out.println("\ntopic="+m.getTopic());System.out.println("payload=" + new String(m.getPayload()));System.out.println("generateTime=" + m.getGenerateTime());// 此处标记CommitSuccess已消费,IoT平台会删除当前Message,// 否则会保留到过期时间return mitSuccess;});}}
注:目前服务端订阅是基于uid的,所有产品的消息都会被HTTP/2的client端消费,这时需要我们自己根据topic包含的productKey/deviceName区分
如果觉得《阿里物联网平台(IOT)——业务服务器获取阿里iot平台接入设备的实时设备采集数据》对你有帮助,请点赞、收藏,并留下你的观点哦!