长连接通道SDK

长连接通道SDK,提供IoT业务协议封装的云端数据下行能力。为App提供订阅、发布消息的能力和支持请求响应模型。

依赖SDK概述
API通道提供API通道能力

初始化

初始化前需确保已集成安全图片,初始化的操作请参见SDK初始化

使用方式

SDK封装了上行RPC请求、订阅、取消订阅等接口 。

SDK中描述的Topic都是简短的Topic。例如完整的上行请求Topic/sys/{productKey}/{deviceName}/app/up/test/publish,上行请求SDK内部会判断补齐/sys/{productKey}/{deviceName}/app/up/,所以在调用SDK入参的时候只需要输入/test/publish即可。

对应的下行Topic,例如完整的设备状态变化下行Topic是 /sys/{productKey}/{deviceName}/app/down/things/status,SDK回调里面只会出现/things/status,自动阶段调用/sys/{productKey}/{deviceName}/app/down前缀。

业务请求响应模型

该接口实际上是封装了一个 Remote Procedure Call 的过程。以用户账号绑定通道的示例来说明内部逻辑,例如用户账号绑定通道的Topic为/sys/{productKey}/{deviceName}/app/up/account/bind

向该Topic 发布数据前,需先订阅该Topic对应的Reply Topic。其格式如下所示 /sys/{productKey}/{deviceName}/app/down/account/bind_reply

订阅成功后开始发布数据,IoT用户中心在收到SDK发布到/sys/{productKey}/{deviceName}/app/up/account/bind这个Topic的数据后,并完成账号绑定的业务逻辑后,会往 /sys/{productKey}/{deviceName}/app/down/account/bind_reply这个Topic发布响应数据。

SDK在收到reply Topic的数据后,将响应结果通过onSuccess回调给用户,从而完成整个业务逻辑。

业务请求响应模型示例如下。

//带请求响应的 RPC 请求
String topic = "path/of/topic";
JSONObject params = new JSONObject();
params.put("key","value");
MobileChannel.getInstance().asyncSendRequest(topic, null, params, new IMobileRequestListener() {
    @Override
    public void onSuccess(String jsonData) {
        ALog.d(TAG,"onSuccess, rsp = "+jsonData);
    }

    @Override
    public void onFailure(AError error) {
        ALog.d(TAG,"onFailure");
    }
});
            

订阅Topic

//订阅请求
String topic = "path/of/topic";
MobileChannel.getInstance().subscrbie(topic, new IMobileSubscrbieListener() {
    @Override
    public void onSuccess(String topic) {
        ALog.d(TAG,"onSuccess, topic = "+topic);

    }

    @Override
    public void onFailed(String topic, AError error) {
        ALog.d(TAG,"onFailed, topic = "+topic);
    }

    @Override
    public boolean needUISafety() {
        return false;
    }
});
            

取消订阅Topic

//取消订阅
String topic = "path/of/topic";
MobileChannel.getInstance().unSubscrbie(topic, new IMobileSubscrbieListener() {
    @Override
    public void onSuccess(String topic) {
        ALog.d(TAG,"onSuccess, topic = "+topic);

    }

    @Override
    public void onFailed(String topic, AError error) {
        ALog.d(TAG,"onFailed, topic = "+topic);
    }

    @Override
    public boolean needUISafety() {
        return false;
    }
});
            

Publish数据

上行请求推荐使用API通道。

//Publish 请求
String topic = "path/of/topic";
JSONObject params = new JSONObject();
params.put("key","value");
MobileChannel.getInstance().ayncSendPublishRequest(topic, params, new IMobileRequestListener() {
    @Override
    public void onSuccess(String jsonData) {
        ALog.d(TAG,"onSuccess, rsp = "+jsonData);
    }

    @Override
    public void onFailure(AError error) {
        ALog.d(TAG,"onFailure");
    }
});

注册下行Listener

设置长连接通道连接变化以及云端推送的下行消息监听事件。目前云端下行接口包括设备属性、事件及连接状态变更推送,相关Topic参见长连接服务API

/**
  设置通道的下推回调,如果不需要用的时候,记得调用 unRegisterDownstreamListener
  回调里的Method即为Topic,e.g. /thing/properties,/thing/events,/thing/status
*/
MobileChannel.getInstance().registerDownstreamListener(true, new IMobileDownstreamListener() {
    @Override
    public void onCommand(String method, String data) {
        ALog.d(TAG,"接收到Topic = "+method+", data="+data);
    }

    @Override
    public boolean shouldHandle(String method) {
        // method 即为Topic,如果该Topic需要处理,返回true后onCommand才会回调。        
        return true;
    }
});

/** 注册通道的状态变化,记得调用 unRegisterConnectListener */
MobileChannel.getInstance().registerConnectListener(true, new IMobileConnectListener() {
    @Override
    public void onConnectStateChange(MobileConnectState state) {
        ALog.d(TAG,"通道状态变化,state="+state);
    }
});
            

解绑长连接通道与账号

在初始化时,已实现长连接通道与账号的绑定,此时如果您需要解绑长连接通道与账号,参照以下代码执行。

如需解绑长连接通道跟用户账号的绑定,请在账号登出前操作,否则会导致解绑失败。

MobileChannel.getInstance().unBindAccount(new IMobileRequestListener() {
            @Override
            public void onSuccess(String jsonData) {
            }

            @Override
            public void onFailure(AError error) {
            }
        });
            

混淆配置

proguard-rules.pro文件中,加入以下代码,排除不需要被混淆的类和方法。

-keep class com.aliyun.alink.linksdk.channel.**{*;}