1、使用服务端订阅功能,需在控制台上进行设置,选择要推送的消息类型。
2、在Maven工程项目中添加依赖,如下所示。
<dependencies>
<!-- Aliyun core -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.3.5</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-iot</artifactId>
<version>6.11.0</version>
</dependency>
<!-- iot message client -->
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>iot-client-message</artifactId>
<version>1.1.3</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
3、使用自己账号的accessKey、accessSecret、regionId、uid初始化客户端。
// 阿里云accessKey
String accessKey = "xxxxxxxxxxxxxxxx";
// 阿里云accessSecret
String accessSecret = "xxxxxxxxxxxxxxxxxx";
// regionId
String regionId = "cn-shanghai";
// 阿里云uid
String uid = "xxxxxxxxxxxxxxx";
// endPoint: https://${uid}.iot-as-http2.${region}.aliyuncs.com
String endPoint = "https://" + uid + ".iot-as-http2." + regionId + ".aliyuncs.com";
// 连接配置
Profile profile = Profile.getAccessKeyProfile(endPoint, regionId, accessKey, accessSecret);
// 构造客户端
MessageClient client = MessageClientFactory.messageClient(profile);
4、设置消息接收接口。
需要注意的是,目前服务端订阅还无法过滤消息,也就是说该账号下的所有产品下的所有设备的消息都会被订阅到(前提是在第一步设置了要推送的消息类型)。
但是可以针对特定Topic发布上来的消息做单独的业务处理(如下面的messageCallback),其他没有设置特殊回调的消息,统一走公共的接口(也就是下面的messageCallbackComm)
MessageCallback messageCallbackComm = new MessageCallback() {
@Override
public Action consume(MessageToken messageToken) {
Message m = messageToken.getMessage();
System.out.println("This is common callback!");
System.out.println("topic : " + m.getTopic());
System.out.println("receive : " + new String(m.getPayload()));
System.out.println(" ");
return MessageCallback.Action.CommitSuccess;
}
};
MessageCallback messageCallback = new MessageCallback() {
@Override
public Action consume(MessageToken messageToken) {
Message m = messageToken.getMessage();
System.out.println("topic : " + m.getTopic());
System.out.println("receive : " + new String(m.getPayload()));
return MessageCallback.Action.CommitSuccess;
}
};
String topic = "xxxxxxxxxxxxxxxx";
client.setMessageListener(topic,messageCallback);
client.connect(messageCallbackComm);
5、举例。
假设代码中的topic设置为设备属性上报的Topic(/sys/${productKey}/${deviceName}/thing/event/property/post)
那么设备进行上报属性的操作,在服务端收到的消息是messageCallback中打印的内容。
对于设备的其他行为(比如上下线),在服务端收到的消息是messageCallbackComm中打印的内容(也就是包括了This is common callback!这句话)