HTTP2接入
更新时间:2018-09-25 19:20:18
1. 概述
HTTP转储功能适用于物联网平台间与企业服务器之间的大量消息流转,需要使用HTTP2 SDK。HTTP2 SDK提供身份认证、消息接收能力。
- SDK接入
在项目中添加maven依赖
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>iot-client-message</artifactId> <version>1.0.0</version> </dependency>
2. 身份认证
身份认证需要使用AppKey和AppSecret,目前可以从控制台->服务调用->验证管理中获取,如图所示:
建连时使用MessageClient.connect(Profile, MessageCallback)
方法,Profile需要提供EndPoint,AppKey和AppSecret,用于鉴权,MessageCallback为默认的消息回调,用于接收消息,参考消息回调接口。
示例如下:
Profile profile = new Profile("${END_POINT}", "${APP_KEY}", "${APP_SECRET}");
MessageClient messageClient = MessageClientFactory.messageClient(profile);
messageClient.connect(new MessageCallback() {
@Override
public boolean consume(MessageToken messageToken) {
log.info("receive : " + new String(messageToken.getMessage().getPayload()));
return true;
}
});
3. 消息订阅
阅消息订阅需要在控制台配置,具体步骤:控制台->产品详情->设备详情->转储服务->HTTP2转储,选择您需要的消息类型并保存,如图所示:
4. 取消订阅
取消订阅步骤和控制台订阅类似,取消勾选订阅并保存即可。
5. 消息接收
连接建立后,服务端会立即向SDK推送已订阅的消息,因此建连时需要提供默认消息接收接口,用于处理未设置回调的消息。建议在connect
之前,调用setMessageListener
设置消息回调,参考指定Topic回调。
5.1 消息接收接口
用户需要实现MessageCallback
接口的consume
方法,并调用client的setMessageListener()
方法。consume
示例如下:
MessageCallback messageCallback = new MessageCallback() {
@Override
public boolean consume(MessageToken messageToken) {
log.info("receive : " + new String(messageToken.getMessage().getPayload()));
return true;
}
};
messageClient.setMessageListener("${TOPIC}",messageCallback);
consume
方法返回值用于处理ACK,参考ACK。参数MessageToken
为消息回执的消息体,用于获取消息体以及手动ack使用。
5.2 指定Topic回调
设置回调时,可以指定带通配符的Topic,如/${ProductKey}/{$DeviceName}/#
指定Topic的回调优先级高于通用回调,一条消息匹配到多个Topic时,按字典序优先调用,仅回调一次。
使用示例:
messageClient.setMessageListener("/Product_A/Device_B/#",messageCallback);
//当收到消息的Topic匹配到"/Product_A/Device_B/update"时,会优先调用该回调
5.3 通用回调
设置该回调后,设置未指定的topic回调的消息,会调用该回调。
使用示例:
messageClient.setMessageListener(messageCallback);
//当收到消息的topic未匹配到已指定的Topic时,调用该回调
5.4 ACK
对于QOS>0的消息,消费后需要回复ACK,SDK支持自动和手动ACK两种,通过MessageClient.setManualAcks
设置是否手动回复ACK。默认为自动回复ACK
5.4.1 自动ACK
设置自动回复ACK后,MessageCallback.consumer
的返回值表示是否处理成功,返回true会SDK发送ACK,返回false或抛出异常,不会返回ACK。服务端对于QOS>0且未回复ACK的消息,会重新发送。
5.4.2 手动ACK
设置手动回复ACK后,需要调用MessageClient.ack()
方法回复ack,参数为MessageToken
,在接收消息时可以得到该参数
messageClient.ack(messageToken);