广播通信

云端可以对批量设备发送广播下行通知,设备端可以按照如下方式对广播进行处理。目前云端支持单设备广播和批量广播,这两种下发的topic格式是不一样的,设备端需要根据需要支持的形式做响应。

批量广播

批量广播是系统广播,无需端上进行订阅即可收到。topic格式:/sys/${pk}/${dn}/broadcast/request/+。

定向广播

定向广播是需要端上进行订阅才能收到广播下行的。topic格式:/broadcast/${pk}/${自定义action}。

广播接收

本功能需要在SDK正常初始化,且注册了下行监听器才可以收到通知。需要注意定向广播需要设备端进行订阅,topic是由发送端定义的,须符合 /broadcast/${pk}/${自定义action} 格式。其中自定义action可以是符合格式的任意值,设备端根据发送端的定义来进行订阅。

// 注册下行监听器
LinkKit.getInstance().registerOnPushListener(notifyListener);
/**
 * 下行监听器,云端 MQTT 下行数据都会通过这里回调
 */
private static IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
    /**
         * onNotify 会触发的前提是 shouldHandle 没有指定不处理这个topic
         * @param connectId 连接类型,这里判断是否长链 connectId == ConnectSDK.getInstance().getPersistentConnectId()
         * @param topic 下行的topic
         * @param aMessage 下行的数据内容
         */
    @Override
    public void onNotify(String connectId, String topic, AMessage aMessage) {
        String data = new String((byte[]) aMessage.data);
        // 服务端返回数据示例  data = {"method":"thing.service.test_service","id":"12*****67","params":{"vv":60},"version":"1.0.0"}
        ALog.d(TAG, "onNotify() called with: connectId = [" + connectId + "], topic = [" + topic + "], aMessage = [" + data + "]");
        if (ConnectSDK.getInstance().getPersistentConnectId().equals(connectId) && !TextUtils.isEmpty(topic) &&
                   topic.startsWith("/sys/" + DemoApplication.productKey + "/" + DemoApplication.deviceName + "/broadcast/request/")) {
            /**
                 * topic 格式:/sys/${pk}/${dn}/broadcast/request/+
                 * 无需订阅,云端免订阅,默认无需业务进行ack,但是也支持用户云端和设备端约定业务ack
                 * 示例:/sys/a14*****ZA/android_lp_test1/broadcast/request/1229336863924294656
                 * 注意:触发端数据需要进行Base64编码,否则会出现端上乱码,
                 * 如云端: org.apache.commons.codec.binary.Base64.encodeBase64String("broadcastContent".getBytes())
                 */
            //
            ToastUtils.showToast("收到云端批量广播下行:topic=" + topic + ",data=" + data);
            //TODO 根据批量广播做业务逻辑处理
        } else if (ConnectSDK.getInstance().getPersistentConnectId().equals(connectId) && !TextUtils.isEmpty(topic) &&
                   topic.startsWith("/broadcast/" + DemoApplication.productKey )) {
            //
            /**
                 * topic 需要用户自己订阅才能收到,topic 格式:/broadcast/${pk}/${自定义action},需要和云端发送topic一致
                 * 示例:/broadcast/a14*****ZA/oldBroadcast
                 * 注意:触发端数据需要进行Base64编码,否则会出现端上乱码,
                 * 如云端: org.apache.commons.codec.binary.Base64.encodeBase64String("broadcastContent".getBytes())
                 */
            ToastUtils.showToast("收到云端广播下行:topic=" + topic + ",data=" + data);
            //TODO 根据广播做业务逻辑处理
        } else {
            ToastUtils.showToast("收到云端下行:topic=" + topic + ",data=" + data);
            /**
                 * TODO
                 * 根据订阅的具体 topic 做业务处理
                 */
        }
    /**
 * @param connectId 连接类型,这里判断是否长链 connectId == ConnectSDK.getInstance().getPersistentConnectId()
 * @param topic 下行topic
 * @return 是否要处理这个topic,如果为true,则会回调到onNotify;如果为false,onNotify不会回调这个topic相关的数据。建议默认为true。
 */
@Override
public boolean shouldHandle(String connectId, String topic) {
    return true;
}
    }