1.开发前准备
1.1 引入ZGLedSdk-release.aar
将提供的ZGLedSdk-release.aar拖入工程根目录的libs文件夹即可(若没有请自行创建)
并在项目module模块(该实例则是ZGSdkDemo module)下的build.gradle文件的dependencies代码块里,添加如下代码
implementation fileTree(dir: 'libs',includes: ['*.aar','*.jar'])
并引入如下库
implementation 'org.fusesource.mqtt-client:mqtt-client:1.16'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'
api 'io.reactivex.rxjava3:rxandroid:3.0.0'
api 'io.reactivex.rxjava3:rxjava:3.0.1'
1.2 申请权限
在项目AndroidManifest.xml文件加入相关权限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
2.设备配网
2.1 动态权限申请
在Android6.0上使用蓝牙扫描功能需先动态申请android.permission.ACCESS_FINE_LOCATION,android.permission.ACCESS_COARSE_LOCATION权限,请上网查阅或参考demo代码
2.2 搜索所有可配网设备
2.2.1 声明ZGHBDeviceProvisionHandler和ZGHBDeviceHadler类,并添加到DisBroad类(注:需准备一个唯一全局类存放DisBroad类以供后续调用)
DisBoard disBoard;
disBoard=new DisBoard();
List<String> macList=new ArrayList<>();
ZGHBDeviceHandler zghbDeviceHandler=new ZGHBDeviceHandler(macList,this);
ZGHBDeviceProvisionHandler zghbDeviceProvisionHandler=new ZGHBDeviceProvisionHandler(macList);
disBoard.addHandler(zghbDeviceHandler,zghbDeviceProvisionHandler);
2.2.2 启动配网
ZGHBDeviceProvisionHandler provisionHandler=disBoard.summon(ZGHBDeviceProvisionHandler.class)
provisionHandler.addEvent(this)//添加搜索设备回调
provisionHandler.addLifecycleEvent(this,this);
provisionHandler.start(5000, unused -> {
Toast.makeText(BleMainActivity.this, "scan Time out", Toast.LENGTH_SHORT).show();
});
disBoard.start(this,Throwable::printStackTrace);
2.2.3 搜索设备回调
List<String> deviceMacList=new ArrayList<>();
@Subscribe(threadMode = ThreadMode.MAIN)
public void onDeviceUpdate(BaseDevice device) {
if (device==null||device.getMacAddress().isEmpty())
return;
Log.i(TAG, "onDeviceUpdate: "+device.toString());
if (!deviceMacList.contains(device)){
deviceMacList.add(device.getMacAddress());
DisBoard disBoard=disBoardWeakReference.get();
if (disBoard!=null){
executor.execute(new Runnable() {
@Override
public void run() {
ZGHBDeviceHandler deviceHandler=disBoard.summon(ZGHBDeviceHandler.class);
if (deviceHandler!=null){
deviceHandler.updateMacList(deviceMacList);//配网成功添加到ZGHBDebviceHandler,则ZGHBDebviceHandler才会把搜到的设备传递给上层处理
}
ZGHBDeviceProvisionHandler provisionHandler=disBoard.summon(ZGHBDeviceProvisionHandler.class);
if (provisionHandler!=null){
provisionHandler.updateMacList(deviceMacList);//配网成功添加到ZGHBDeviceProvisionHandler,则ZGHBDeviceProvisionHandler跳过对已配网设备处理
}
}
});
}
}
}
3.设备控制
3.1 搜索所有可控制设备
3.1.1 ZGHBDeviceHadler添加监听回调
ZGHBDeviceHandler zghbDeviceHandler=App.getCurrent().disBoard.summon(ZGHBDeviceHandler.class);
zghbDeviceHandler.addEvent(this);
3.1.2 监听回调
@Subscribe(threadMode = ThreadMode.MAIN)
public void onDeviceUpdate(BaseDevice device) {
if (device==null)
return;
Log.i(TAG, "onDeviceUpdate: "+device.toString());
//Do what you want to do
}
3.2 发送控制指令
3.2.1 发送写命令(不需要返回结果)
disBoard.summon(ZGHBDeviceHandler.class).write(zghbDevice.getMacAddress(), (byte) 0x0b,commandData)
.subscribe(new Observer<Boolean>() {
@Override
public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
}
@Override
public void onNext(@io.reactivex.rxjava3.annotations.NonNull Boolean aBoolean) {
if (!aBoolean){
Toast.makeText(BleMainActivity.this, "send failed.", Toast.LENGTH_SHORT).show();
}else{
//write success
}
}
@Override
public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
Toast.makeText(BleMainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete() {
}
});
3.2.2 发送请求命令(需要返回结果)
disBoard.summon(ZGHBDeviceHandler.class)
.request(zghbDevice.getMacAddress(),(byte) 0x07,(byte) 0x07,new byte[]{})
.subscribe(new Observer<byte[]>() {
@Override
public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
}
@Override
public void onNext(byte @io.reactivex.rxjava3.annotations.NonNull [] bytes) {
if (bytes.length == 0) {
Toast.makeText(BleMainActivity.this, "byte:null", Toast.LENGTH_SHORT).show();
} else {
//Do what you want to do
}
}
@Override
public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});