长连接通道 SDK
更新时间:2018-05-29 15:05:55
概要
长连接通道SDK,提供 IoT 业务协议封装的云端数据下行能力;为 app 提供订阅、发布消息的能力, 和支持请求响应模型。
依赖SDK | 概述 |
---|---|
API 通道 | 提供API通道能力 |
初始化
初始化 Mobile 长连接通道 SDK 前,请先初始化 API 通道 SDK,请参见 API 通道 - 初始化。Mobile 长连接通道 SDK 的初始化配置可以参照 MobileConnectConfig , 示例初始化代码如下:
//打开Log 输出
ALog.setLevel(ALog.LEVEL_DEBUG);
MobileConnectConfig config = new MobileConnectConfig();
// 设置 appKey 和 authCode(必填)
config.appkey = "{YOUR_APP_KEY}";
config.securityGuardAuthcode = "114d";
// 设置验证服务器(默认不填,SDK会自动使用“API通道SDK“的Host设定)
config.authServer = "";
// 指定长连接服务器地址。 (默认不填,SDK会使用默认的地址及端口。默认为国内华东节点。)
config.channelHost = "{长连接服务器域名}";
// 开启动态选择Host功能。 (默认false,海外环境建议设置为true。此功能前提为ChannelHost 不特殊指定。)
config.autoSelectChannelHost = false;
MobileChannel.getInstance().startConnect(context, config, new IMobileConnectListener() {
@Override
public void onConnectStateChange(MobileConnectState state) {
ALog.d(TAG,"onConnectStateChange(), state = "+state.toString());
}
});
使用方式
SDK 封装了上行 RPC 请求、订阅、取消订阅等接口 。
注意:
SDK中描述的Topic都是简短的Topic。例如完整的上行请求Topic“/sys/{productKey}/{deviceName}/app/up/test/publish</span>”,上行请求SDK 内部会判断补齐“/sys/{productKey}/{deviceName}/app/up/</span>”,所以在调用SDK入参的时候只需要输入 “/test/publish”即可。 对应的下行Topic,例如完整的设备状态变化下行Topic是 “/sys/{productKey}/{deviceName}/app/down/things/status</span>”, SDK回调里面只会露出“/things/status”,自动阶段掉“/sys/{productKey}/{deviceName}/app/down</span>”前缀。
业务请求响应模型
这个接口实际上是封装了一个 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);
}
});
长连接通道与账号绑定
绑定前需要确认账号已经登录,否则无法获取对应的iotToken。 绑定时需要当前账号对应的iotToken来完成绑定。获取 IOTToken需要集成 身份认证 SDK 。
MobileChannel.getInstance().bindAccount(ioTCredentialManage.getIoTToken(), new IMobileRequestListener() {
@Override
public void onSuccess(String jsonData) {
}
@Override
public void onFailure(AError error) {
}
});
取消长连接通道与账号关联
取消关联需要在用户退出前进行操作;
MobileChannel.getInstance().unBindAccount(new IMobileRequestListener() {
@Override
public void onSuccess(String jsonData) {
}
@Override
public void onFailure(AError error) {
}
});
混淆配置
-keep class com.aliyun.alink.linksdk.channel.**{*;}