1、使用服务端订阅功能,需在控制台上进行设置,选择要推送的消息类型。
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!这句话)

收藏 打印