EasyBle, 面向Android的多设备进程蓝牙

分享于 

11分钟阅读

GitHub

  繁體 雙語
Multi-devices process Bluetooth library for Android
  • 源代码名称:EasyBle
  • 源代码网址:http://www.github.com/nziyouren/EasyBle
  • EasyBle源代码文档
  • EasyBle源代码下载
  • Git URL:
    git://www.github.com/nziyouren/EasyBle.git
    Git Clone代码到本地:
    git clone http://www.github.com/nziyouren/EasyBle
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/nziyouren/EasyBle
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    EasyBle

    Android多设备进程Ble库

    中文文档 README_CN.md

    :我为什么要开发这个库

    • 当应用程序与多个设备交互时,应用程序用户界面可能与蓝牙交互逻辑紧密耦合。 很难维护
    • BLE命令必须一个一个执行。 否则,可能会出现许多奇怪的问题,如包丢弃。gatt 133
    • 不同制造商制造的设备在具体Ble堆栈实现中有。 我们需要特别处理这些情况。 比如在三星设备上,必须在Android主线程上执行特性写操作。
    • 由于一些外围设备在很短的时间内不能消耗大量的数据,所以需要在生产者端控制发送速度。

    所以我开发这个库来解决 上面 问题。

    EasyBle优势

    • 完全解耦应用程序用户界面和蓝牙交互逻辑
    • 简单的API。应用程序只需要 register 一个监听器来监听所有蓝牙事件
    • 基于强大的RXAndroidBle ( https://github.com/Polidea/RxAndroidBle )。 改进 stablities,轻松线程 switch,干净代码。

    体系结构

    这里库的架构


    Drawing


    下载

    Gradle

    
    compile 'com.happysoftware.easyble:easyble:0.3.3'
    
    
    
    
    示例

    蓝牙初始化

    
    BleCenterManager bleCenterManager = BleCenterManager.getInstance();//APP keep singleton
    
    
    BleConfig config = new BleConfig.BleConfigBuilder()
    
    
    . setStopScanAfterConnected(true)
    
    
    . setStartScanAfterDisconncted(true)
    
    
    . createBleConfig();//create config
    
    
    bleCenterManager.init(this,config);//init config
    
    
    
    

    打开蓝牙

    
    try {
    
    
     bleCenterManager.openBluetooth(this, requestCode);
    
    
    } catch (EasyBleException e) {
    
    
     e.printStackTrace();
    
    
    }
    
    
    
    

    断开设备并关闭蓝牙

    
     if (bleCenterManager.isBluetoothOpen()){
    
    
     try {
    
    
     bleCenterManager.prepareClose();//disconnect device
    
    
     bleCenterManager.closeBluetooth();//close Bluetooth
    
    
     } catch (EasyBleException e) {
    
    
     e.printStackTrace();
    
    
     }
    
    
     }
    
    
    
    

    扫描设备

    
    bleCenterManager.startScan();
    
    
    
    

    停止扫描

    
    bleCenterManager.stopScan();
    
    
    
    

    设置侦听器并侦听所有蓝牙事件

    
    bleCenterManager.setBleDeviceListener(new BleDeviceListener() {
    
    
     @Override
    
    
     public void onDeviceStateChange(BleDevice device, BleDeviceState state) {
    
    
    //Device state change callback. BLE_DEVICE_STATE_CONNECTED(1),
    
    
    //BLE_DEVICE_STATE_CONNECTING(2),
    
    
    //BLE_DEVICE_STATE_DISCONNECTED(0),
    
    
    //BLE_DEVICE_STATE_DISCONNECTING(3);
    
    
     if (state == BleDeviceState.BLE_DEVICE_STATE_CONNECTED){
    
    
    
     }
    
    
     if (state == BleDeviceState.BLE_DEVICE_STATE_DISCONNECTED){
    
    
    
     }
    
    
     }
    
    
    
     @Override
    
    
     public void onDataComing(BleDevice device, BleDataType type, Object data) {
    
    
    //data coming callback
    
    
     Log.e(TAG,"onDataComing"+type+"rawData:"+data.toString());
    
    
     if (type == BleDataType.BLE_DATA_TPYE_CONTINUOUS){
    
    
    //data type is BleDataType.BLE_DATA_TPYE_CONTINUOUS
    
    
     }else (type == BleDataType.BLE_DATA_TPYE_SINGLE){
    
    
    //data type is BleDataType.BLE_DATA_TPYE_SINGLE
    
    
     }
    
    
     }
    
    
    
     @Override
    
    
     public void onInteractComplete(BleDevice device, Object finalResult) {
    
    
    //interact complete callback
    
    
     Log.e(TAG,"onInteractComplete"+device.getDeviceName()+"state:"+finalResult);
    
    
     }
    
    
    
     @Override
    
    
     public void onInteractUpdate(BleDevice device, BleStep step) {
    
    
    //interact update callback
    
    
     Log.e(TAG,"onInteractUpdate"+device.getDeviceName()+" step:"+step.action);
    
    
     }
    
    
    
     @Override
    
    
     public void onInteractError(BleDevice device, Throwable throwable, BleStep step) {
    
    
    //interact error callback
    
    
     }
    
    
    
     @Override
    
    
     public void onScanStart(){
    
    
    //scan start callback
    
    
     }
    
    
    
    @Override
    
    
    public void onScanStop(){
    
    
    //scan stop callback
    
    
    }
    
    
    
     @Override
    
    
     public void onScanUpdate(BleScanResult scanResult) {
    
    
    //scan device callback
    
    
    
     }
    
    
    
     @Override
    
    
     public void onScanError(Throwable throwable) {
    
    
    //scan error callback
    
    
    }
    
    
    });
    
    
    
    
    

    将数据写入特性

    
    public void writeCharacteristic(UUID uuid, byte[] data);
    
    
    
    

    自动将大量数据写入特性和chunkify数据

    
    public void writeCharacteristic(UUID uuid, byte[] longData, int maxLengthPerPacket);
    
    
    
    

    从特性读取数据

    
    public void readCharacteristic(UUID uuid);
    
    
    
    

    如何集成新设备

    如果你只需要 3个步骤来集成新设备,请执行以下操作:

    创建自定义AdapterFactory并实现buildDeviceAdapter方法

    
    public class BloodPressureFactory extends DeviceAdapter.Factory{
    
    
    
    //static create Factory method
    
    
    public static BloodPressureFactory create(BleCenterManager bleCenterManager){ 
    
    
     return new BloodPressureFactory(bleCenterManager);
    
    
     }
    
    
    
    public BloodPressureFactory(BleCenterManager bleCenterManager) {
    
    
     super(bleCenterManager);
    
    
    }
    
    
    
    //Create deviceAdapter
    
    
    @Override
    
    
    public DeviceAdapter<T> buildDeviceAdapter() {
    
    
     return new BloodPressureDeviceAdapter(mBleCenterManager);
    
    
    }
    
    
    }
    
    
    
    

    创建自DeviceAdatper继承的自定义deviceAdapter并实现一些方法

    public 字符串 [] supportedNames ( )

    EasyBle查找适当的deviceAdapter以按名称处理设备。 所以你的deviceAdapter需要告诉EasyBle框架你可以处理的设备名。 如果deviceAdapter支持多个设备,请返回所有名称。 如果你不确定名称,可以使用。 supportedNameRegExps() 支持 正规表达式。

    
    @Override
    
    
    public String[] supportedNames() {
    
    
     return new String[]{"Model-name-old","Model-name-new"};//return device advertised names
    
    
    }
    
    
    
    
    public UUID [] notificationUUIDs ( )

    如果你想设置UUID通知,只需返回 UUID [ ]

    
    @Override
    
    
    public UUID[] notificationUUIDs() {
    
    
     return new UUID[]{UUID.fromString("UUID-1"),UUID.fromString("UUID-2")};//return UUIDs which need to enable notification
    
    
    }
    
    
    
    
    public UUID [] indicatorUUIDs ( )

    如果要设置UUID指示,只需返回 UUID [ ]

    
    @Override
    
    
    public UUID[] indicatorUUIDs() {
    
    
    return new UUID[]{UUID.fromString("UUID-1"),UUID.fromString("UUID-2")};//return UUIDs which need to enable indication
    
    
    }
    
    
    
    
    public-void processData(UUID uuid, byte [] data )

    在这里放置外围设备和设备协议逻辑。 第二个参数数据是从外围设备接收的数据。 你可以解析。处理和发送其他数据到外围设备。

    
    @Override
    
    
    public void processData(UUID uuid, byte[] data) {
    
    
    
    //Process data you received from peripherals.
    
    
     byte cmd = data[0];
    
    
     if (cmd == 1){
    
    
    //Notify APP UI, we've reached step1. NotifyInteractUpdate is wrapper of BleDeviceListener.onInteractUpdate.
    
    
     notifyInteractUpdate(mBleDevice,new BleStep("Interact update on step1",data));
    
    
     }else if (cmd == 2){
    
    
    //Notify APP UI, we've reached step2
    
    
     notifyInteractUpdate(mBleDevice,new BleStep("Interact update on step2",data));
    
    
     }else if (cmd == 3){
    
    
    //Notify APP UI, we've reached step3
    
    
     notifyInteractUpdate(mBleDevice,new BleStep("Interact update on step3",data));
    
    
     notifyDataComing(mBleDevice,BleDataType.BLE_DATA_TPYE_CONTINUOUS,data);
    
    
     }else if (cmd == 4){
    
    
    //Notify APP UI, we've finished protocol, and pass data to APP UI through callback method. So APP UI can parse data and update UI
    
    
     notifyInteractComplete(mBleDevice,data);
    
    
     }
    
    
    
    }
    
    
    
    
    我们在 processData ( UUID UUID,字节 [] 数据) 方法中需要做的?

    由于不同外围设备具有不同的协议,所以在协议交互中,需要按照方法进行手工调用,以提高系统的性能。 应用 UI(Activity) 可以接收BLE事件回调和进程接收数据。

    register 自定义设备工厂到 BLECenterManager。

    
    bleCenterManager.addDeviceAdapterFactory(BloodPressureFactory.create(bleCenterManager));
    
    
    
    

    哇现在EasyBle可以处理和互动你的新外设设备。

    联系人

    你可以通过电子邮件联系我 nziyouren@gmail.com。

    许可证:

    Apache许可,版本 2.0


    PROC  蓝牙