基于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 java.net.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 + ".aliyuncs.com"; // 连接配置 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 MessageCallback.Action.CommitSuccess; }); } }
注:目前服务端订阅是基于uid的,所有产品的消息都会被HTTP/2的client端消费,这时需要我们自己根据topic包含的productKey/deviceName区分
-
- java sdk依赖