蓝牙 Breeze SDK
更新时间:2018-08-03 17:40:02
概要
阿里巴巴物联网平台定义了《阿里巴巴物联平台蓝牙设备接入规范》,包括蓝牙广播规范,蓝牙接入服务规范,通信协议规范等,用于阿里巴巴的合作厂商作为阿里巴巴物联平台蓝牙设备的接入标准。此规范适用于需要复杂交互的蓝牙设备。
Breeze SDK 是按照规范实现的手机端蓝牙 SDK,方便合作厂商在手机端快速接入蓝牙功能。Breeze SDK 包含的主要功能有:设备发现连接,设备通信,加密传输,大数据传输等。
注:Breeze SDK 需要和设备端 SDK 配套使用。
初始化
使用 SDK 之前,务必使用 createBreeze 初始化,建议在 Application.onCrezte() 里调用如下接口:
breeze = Factory.createBreeze(app);;
为方便调试,可以打开调试开关,参考如下代码配置SDK:
Config config = new Config.Builder()
.debug(BuildConfig.DEBUG)
.log(BuildConfig.DEBUG)
.logLevel(BuildConfig.DEBUG ? Log.VERBOSE :Log.WARN)
.build();
breeze.configure(config);
初始化之后,可以使用 Breeze 对象进行扫描,连接,收发数据等操作。
使用说明
开始发现设备
1.连接前,必须要扫描到设备,通过 startLeScan 启动一个扫描
LeScanCallBack scanCb = new LeScanCallBack(){
void onLeScan(BreezeDeviceDescriptor device, int rssi, byte[] scanRecord){
// 处理扫描到的设备
scannedDevice = device;
}
};
breeze.startLeScan(scanCb);
2.当扫描到支持Breeze协议的蓝牙设备时,通过 onLeScan 回调给用户
停止发现设备
因为扫描是一个耗电过程,在扫描到目标设备后,开始连接前,停止扫描,调用 stopLeScan 实现。
breeze.stopLeScan(scanCb)
注意, 停止扫描时必须传入开始扫描时传入的回调参数,不然,将无法正确停止扫描,可能导致再次连接设备不成功,且浪费电池资源。
连接设备
提供2种方式连接设备。
- 通过之前扫描返回的 BreezeDeviceDescriptor 对象连接到设备
- 直接通过 Breeze 设备的mac 地址连接到设备
通过 BreezeDeviceDescriptor 对象连接到设备
1.当通过之前的扫描过程发现 Breeze 设备后,通过 open 连接到设备:
connCb = new ConnectionCallback(){
void onConnectionStateChange(IBreezeDevice device, int state, int status){
if (state == BluetoothProfile.STATE_CONNECTED) {
//连接建立成功
connectedDevice = device;
}
}
};
breeze.open(false, scannedDevice, connCb);
2.连接状态变化通过接口 onConnectionStateChange 回调;
3.只有当state 是BluetoothProfile.STATE_CONNECTED时,才可以通过返回的IBreezeDevice对象收发数据。
通过设备的mac 地址连接到设备
注意 该接口只在 1.2.1(包含1.2.1)版本后提供
接口跟通过 BreezeDeviceDescriptor 对象连接到设备类似,仅仅将 BreezeDeviceDescriptor 对象改为 MAC 地址,具体参见 这里
断开设备连接
与如何连接设备对应地,提供2种方式断开根设备的连接
通过 IBreezeDevice对象断开跟设备的连接
通过 MAC 地址断开跟设备的连接
注意,连接和断开设备连接的方法要对应,即通过 BreezeDeviceDescriptor 连接的必须也通过 BreezeDeviceDescriptor 断开 ,通过 MAC 连接的必须通过 MAC 断开
通过 BreezeDeviceDescriptor 断开到设备的连接
当不需要使用 Breeze 时,需及时释放资源,通过调用接口 close 即可。
breeze.close(scannedDevice, connCb)
一个 open 操作,务必对应一个 close 操作,防止资源泄露。
通过 MAC 断开到设备的连接
注意 该接口只在 1.2.1(包含1.2.1)版本后提供
接口跟通过 BreezeDeviceDescriptor 断开类似,将 BreezeDeviceDescriptor 对象改为 MAC 地址,具体参见 这里
数据收发
当收到STATE_CONNECTED状态回调时,回调接口会同时返回一个 IBreezeDevice 对象,发送数据通过sendMessage() 完成;数据发送接口有两种方式:
不需要业务回调的,使用 sendMessage(byte[] data, OperationCallback cb), 数据是否发送完毕通过OperationCallback 回调回来;
byte[] data = ... connectedDevice.sendMessage(data, new OperationCallback(){ void onOpError(int code, String message){ // 操作失败 } void onOpSuccess(){ // 操作成功 } });
需要业务回调的,使用 sendMessage(byte[] data, ResponseCallback cb),业务数据会通过ResponseCallback 回调回来。
byte[] data = ... connectedDevice.sendMessage(data, new ResponseCallback(){ void onResponse(int code, byte[] data){ if (code == ResponseCallback.NO_ERROR){ // 收到设备回复数据 } } });
当设备主动发送数据到SDK时,需要注册 addOnMessageCallback() 回调接口才能收到设备主动发送的数据,不需要时,需及时注销掉removeOnMessageCallback() 。
获取蓝牙设备信息
IBreezeDevice mDevice = ... ;
DeviceInfo mDeviceInfo = ... ;
BreezeHelper.getDeviceInfo(mDevice, new IDeviceInfoCallback{
@Override
public void onDeviceInfo(DeviceInfo info) {
mDeviceInfo = info
//收到蓝牙设备信息
}
}
用户绑定蓝牙设备
BreezeHelper.bindBreezeDevice(mDeviceInfo, new IoTCallback{
@Override
public void onFailure(IoTRequest request, Exception e) {
Log.w(TAG, "onFailure", e);
}
@Override
public void onResponse(IoTRequest request, IoTResponse response) {
mIotId = (String) response.getData();
}
}
混淆配置
-keep class com.aliyun.iot.ble.**{*;}
-keep class com.aliyun.iot.breeze.**{*;}