移动端设备网关 SDK
更新时间:2018-10-19 11:29:34
概述
移动端设备网关 SDK,运行于 APP 上的子设备网关,对于无法直连网络的子设备,如蓝牙设备,提供子设备的管理功能,如子设备添加拓扑,删除拓扑,上线,下线以及数据上下行等
依赖 SDK | 概述 |
---|---|
长连接通道 | 提供了 App 生命周期内的,适用于 IoT 业务场景的长连接通道 |
初始化
设备网关 SDK 的初始化依赖长连接通道的初始化。请参见长连接通道 SDK - 初始化在长连接通道初始化成功后,再初始化设备网关 SDK。
String clientId = MobileChannel.getInstance().getClientId();
if (TextUtils.isEmpty(clientId)) {
//请检查长连接通道是否初始化成功
return;
}
String mobileProductKey = clientId.split("&")[1];
String mobileDeviceName = clientId.split("&")[0];
}
GatewayConnectConfig config = new GatewayConnectConfig(productKey, deviceName, "");
GatewayChannel.getInstance().startConnect(this, config, new IGatewayConnectListener() {
@Override
public void onConnectStateChange(GatewayConnectState state) {
Log.d(TAG,"onConnectStateChange(), state = "+state.toString());
if (state == GatewayConnectState.CONNECTED) {
Log.d(TAG,"网关建联成功");
}
}
});
使用方式
前期准备
- 蓝牙连接已经建立
以下流程都是基于子设备跟 APP 已经建立好蓝牙连接通路的前提下。
子设备跟网关建立/删除 topo 关系
所谓 topo 关系,即在 IoT 云端的上下级丛属关系。子设备要通过网关实现数据上下云必须首先跟
网关建立 topo 关系。topo 关系建立后一直存在,直到删除 topo 关系接口或者子设备
跟另外的网关建立了 topo 关系。
在建立 topo 关系的流程中,IoT 云端会校验子设备生成的 sign 值来认证子设备身份。
- 建立 topo 示例
/** 建立拓扑关系
*/
private String signMethod = "";
private String signValue = "";
private String clientId = "";
private String subProductKey = "";
private String subDeviceName = "";
GatewayChannel.getInstance().addSubDevice(new SubDeviceInfo(subProductKey, subDeviceName),
new ISubDeviceConnectListener() {
@Override
public String getSignMethod() {
// 对于蓝牙设备,signMethod指定为sha256
return signMethod;
}
@Override
public String getSignValue() {
/*假定:clientId=123, deviceName=test,
productKey=123,deviceSecret=secret. signMethod:"sha256",
则sign计算规则如下sign = sha256(clientId123deviceNametestdeviceSecretsecretproductKey123)
其中productKey、deviceName、deviceSecret为子设备的三元组信息
*/
return signValue;
}
@Override
public String getClientId() {
// clientId客户端标识,可以取mac,也可以是随机字串,由设备端确定.
return clientId;
}
@Override
public void onConnectResult(boolean isSuccess, ISubDeviceChannel channel, AError error) {
ALog.d(TAG,"添加拓扑关系,onConnectResult, isSucc = "+isSuccess+", error ="+ (error!=null?error.getMsg():""));
}
@Override
public void onDataPush(String topic, String data) {
ALog.d(TAG,"子设备下行: topic = "+topic+" ,data = "+data);
}
});
开发者需实现 ISubDeviceConnectListener 接口,在相应接口中提供子设备的签名算法、签名值等信息。
- 删除 topo 示例
GatewayChannel.getInstance().removeSubDevice(new SubDeviceInfo(subProductKey, subDeviceName),
new ISubDeviceRemoveListener() {
@Override
public void onSuceess() {
ALog.d(TAG,"删除拓扑关系,Succ");
subDeviceChannel = null;
}
@Override
public void onFailed(AError error) {
ALog.d(TAG,"删除拓扑关系,fail ,error ="+error.getMsg());
}
});
在拓扑关系建立成功后,在 ISubDeviceConnectListener 的 onConnectResult 回调中,返回了子设备通道对象实例,基于此实例,可以实现子设备的上行请求操作,包括子设备上下线,请求等。具体接口可以参考 ISubDeviceChannel
子设备上线/下线
所谓上线即子设备复用网关跟 IoT云端 已经建立好的长连接通路。子设备只有上线成功,才能复用网关
的长连接通路。上线的前提条件是:子设备跟网关已经建立了 topo 关系。
上线成功后,子设备的数据可以上行到云,而云也可下推数据到子设备。
- 上线示例:
//子设备上线
subDeviceChannel.online(new ISubDeviceActionListener() {
@Override
public void onSuccess() {
ALog.d(TAG,"上线请求成功");
}
@Override
public void onFailed(AError error) {
ALog.d(TAG,"上线请求失败, error = "+error.getMsg());
}
});
下线示例:
//子设备下线
subDeviceChannel.offline(new ISubDeviceActionListener() {
@Override
public void onSuccess() {
ALog.d(TAG,"下线请求成功");
}
@Override
public void onFailed(AError error) {
ALog.d(TAG,"下线请求失败, error = "+error.getMsg());
}
});
网关子设备上行请求
//子设备发布请求
String topic = "/sys/"+subProductKey+"/"+subDeviceName+"/thing/event/property/post";
String data = "{\"id\":\"123\",\"version\":\"1.0\",\"params\":{\"propertyIdentifier22\":\"higuketestproper"
+ "\"},\"method\":\"thing.event.property.post\"}";
subDeviceChannel.uploadData(topic, data, new ISubDeviceActionListener() {
@Override
public void onSuccess() {
ALog.d(TAG,"子设备发布成功");
}
@Override
public void onFailed(AError error) {
ALog.d(TAG,"子设备发布失败, e = "+error.getMsg());
}
});
//子设备订阅
String topic = "path/of/topic";
subDeviceChannel.subscribe(topic, new ISubDeviceActionListener() {
@Override
public void onSuccess() {
ALog.d(TAG,"子设备订阅Topic成功");
}
@Override
public void onFailed(AError error) {
ALog.d(TAG,"子设备订阅失败");
}
});
//子设备取消订阅
String topic = "path/of/topic";
subDeviceChannel.unSubscribe(topic, new ISubDeviceActionListener() {
@Override
public void onSuccess() {
ALog.d(TAG,"子设备取消订阅Topic成功");
}
@Override
public void onFailed(AError error) {
ALog.d(TAG,"子设备取消订阅失败");
}
});
监听云端下推子设备数据
开发者实现 ISubDeviceConnectListener 接口后,子设备的下推数据会在该接口的 onDataPush(java.lang.String topic, java.lang.String data)
方法中抛出。
混淆配置
-keep class com.aliyun.alink.linksdk.channel.gateway.api.**{*;}
更多功能
蓝牙设备如何接入移动端网关
蓝牙设备可以使用标准蓝牙协议,也可以使用阿里巴巴IoT蓝牙协议。
这里以阿里巴巴IoT蓝牙协议举例说明:
1.接入蓝牙 SDK,请参考 BreezeSDK 接入
2.蓝牙设备跟网关建立topo关系时,需要用到参数signMethod,signValue,clientId,subProductKey,subDeviceName,参见如下代码示例获取:
IBreezeDevce device = ...;
ISubDeviceConnectListener listener = ...;
BreezeHelper.getDeviceInfo(device, new BreezeHelper.IDeviceInfoCallback() {
@Override
public void onDeviceInfo(BreezeHelper.DeviceInfo info) {
if (null != info) {
SubDeviceInfo subDeviceInfo = new SubDeviceInfo();
subDeviceInfo.productKey = info.produceKey;
subDeviceInfo.deviceName = info.deviceName;
String clientId = info.scanRecord.getModelIdHexStr().toUpperCase();
String deviceSign = info.sign;
String signMethod = "sha256";
GatewayChannel.getInstance().addSubDevice(subDeviceInfo, listener);
}
}
});