Android 移动端设备网关 SDK

更新时间:2018-11-07 14:23:18

概述

移动端设备网关 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);
      }
    }
 });

results matching ""

    No results matching ""