1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/chinasoft3_ohos-okble

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Проект okble

Проект

  • Название проекта: okble.
  • Серия: openharmony, сторонние компоненты для адаптации.
  • Функция: простая в использовании BLE library.
  • Состояние переноса проекта: основная функция выполнена.
  • Вызовы: отсутствуют.
  • Версия разработки: sdk6, DevEco Studio 2.2 Beta1.
  • Базовая версия: okble компонент Releases 1.1.3.

Эффект демонстрации

Демонстрация эффекта представлена на рисунке (см. рисунок).

Инструкция по установке

  1. В файле build.gradle в корневом каталоге проекта:
allprojects {
    repositories {
        maven {
            url 'https://s01.oss.sonatype.org/content/repositories/releases/'
        }
    }
}
  1. В файле entry модуля build.gradle:
dependencies {
    implementation('com.gitee.chinasoft_ohos:okble:1.0.0')
    ......  
 }

В версии sdk6 и DevEco Studio 2.2 Beta1 проект можно запустить напрямую. Если запуск не удаётся, удалите файлы проекта .gradle, .idea, build, gradle, build.gradle и создайте новый проект с соответствующей версией. Скопируйте файлы из нового проекта в корневой каталог.

Использование

  • Сканирование внешних устройств:
OKBLEScanManager scanManager = new OKBLEScanManager(this);
scanManager.setScanCallBack(scanCallBack);
DeviceScanCallBack scanCallBack = new DeviceScanCallBack() {
    @Override
    public void onBLEDeviceScan(BLEScanResult device, int rssi) {
       LogUtils.e(" scan:"+device.toString());
   }

   @Override
   public void onFailed(int code) {
       // код опущен
   }

   @Override
   public void onStartSuccess() {
   }
};
  • Подключение внешних устройств:
OKBLEDevice okbleDevice=new OKBLEDeviceImp(mContext,bleScanResult);
//okbleDevice=new OKBLEDeviceImp(mContext);
//okbleDevice.setBluetoothDevice(mBluetoothDevice);
okbleDevice.addDeviceListener(this);
okbleDevice.connect(true);//true означает автоматическое переподключение после разрыва соединения
  • Отключение приложения от внешнего устройства:
okbleDevice.disConnect(false); //false означает отсутствие автоматического переподключения после разрыва соединения; disConnect разрывает соединение, можно использовать okbleDevice.connect() для повторного подключения
  • Очистка соединения приложения:
okbleDevice.remove(); //remove очищает информацию о подключённом устройстве; перед повторным подключением необходимо заново вызвать setBleScanResult/setBluetoothDevice для установки информации об устройстве
  • Обмен данными:
// Read
application.okbleDevice.addReadOperation(characteristicModel.getUuid(), new OKBLEOperation.ReadOperationListener() {
                @Override
                public void onReadValue(final byte[] value) {
                    eventHandler.postTask(new Runnable() {
                        @Override
                        public void run() {
                            addLog("onReadValue:" + OKBLEDataUtils.BytesToHexString(value) + " (" + new String(value) + ")");
                        }
                    });
                }

                @Override
                public void onFail(int code, final String errMsg) {
                    eventHandler.postTask(new Runnable() {
                        @Override
                        public void run() {
                            addLog("read onFail:" + errMsg);
                        }
                    });
                }

                @Override
                public void onExecuteSuccess(OKBLEOperation.OperationType type) {
                }
            });

            // Write
 application.okbleDevice.addWriteOperation(characteristicModel.getUuid(), value, new OKBLEOperation.WriteOperationListener() {
                                @Override
                                public void onWriteValue(final byte[] byteValue) {
                                    eventHandler.postTask(new Runnable() {
                                        @Override
                                        public void run() {
``` ```
addLog(" onWriteValue:" + byteValue);
                                            }
                                        });
                                    }
                                    @Override
                                    public void onFail(int code, final String errMsg) {
                                        eventHandler.postTask(new Runnable() {
                                            @Override
                                            public void run() {
                                                addLog("write onFail:" + errMsg);
                                            }
                                        });
                                    }
                                    @Override
                                    public void onExecuteSuccess(OKBLEOperation.OperationType type) {
                                        eventHandler.postTask(new Runnable() {
                                            @Override
                                            public void run() {
                                                addLog("write value execute success value length:" + OKBLEDataUtils.hexStringToBytes(value).length + " value:" + value);
                                            }
                                        });
                                    }
                                });
// Notify/Indicate
application.okbleDevice.addNotifyOrIndicateOperation(characteristicModel.getUuid(), true, new OKBLEOperation.NotifyOrIndicateOperationListener() {
                    @Override
                    public void onNotifyOrIndicateComplete() {
                      eventHandler.postTask(new Runnable() {
                            @Override
                            public void run() {
                                addLog("onNotifyOrIndicateComplete");
                             
                            }
                        });
                    }

                    @Override
                    public void onFail(int code, final String errMsg) {
                      eventHandler.postTask(new Runnable() {
                            @Override
                            public void run() {
                                addLog("NotifyOrIndicate onFail:" + errMsg);
                            }
                        });
                    }

                    @Override
                    public void onExecuteSuccess(OKBLEOperation.OperationType type) {
                        operationType[0] = type;
                    }
                });
  • Отправка больших данных (прикладной сценарий 1: OAD/воздушное обновление) OAD принцип на самом деле заключается в том, чтобы загрузить файл прошивки (.bin файл) в виде массива byte[], а затем отправить данные byte[] на устройство по частям. Следующий код демонстрирует основную часть разделения, детали OAD не показаны (например, интеграция каждого пакета), в зависимости от требований будут изменения.
final int sendInterval=50;//интервал отправки между каждым пакетом, некоторые телефоны могут привести к сбою Bluetooth из-за слишком быстрой отправки, коэффициент отказов OAD очень высок, можно соответствующим образом увеличить, например, 80-100;
okbleDevice.setOperationInterval(sendInterval);
byte[] oadValues=loadBytesFromFile(filePath);
final int blockSize=20;//представляем отправку 20 байт за пакет
final int blockCount= (int) Math.ceil(oadValues.length*1.0f/blockSize);//общее количество отправляемых пакетов
percent=0;
for (int i=0;i<blockCount;i++){
    byte[] value=new byte[blockSize];
    System.arraycopy(oadValues,i*blockSize,value,0,blockSize);
    okbleDevice.addWriteOperation(OAD_WRITE_UUID, value, new OKBLEOperation.WriteOperationListener() {
        @Override
        public void onWriteValue(byte[] value) {
            percent++;
            float progress=percent*1.0f/blockCount;
            int leftSeconds= (int) ((sendInterval*blockCount)/1000*(1-progress));              
            HiLog.error(LABEL, "OAD 进度:"+progress+" 剩余时间:"+leftSeconds +"秒");
        }

        @Override
        public void onFail(int code, String errMsg) {
            HiLog.error(LABEL, " OAD failed");
            okbleDevice.clearOperations();
            break;
        }
    });
}
``` **onExecuteSuccess(OKBLEOperation.OperationType type) {
                }
            });**

— APP模拟成外设 (可被扫描并连接)
```java
        OKBLEAdvertiseManager okbleAdvertiseManager;
        OKBLEServerDevice serverDevice;
        okbleAdvertiseManager=new OKBLEAdvertiseManager(this);
        serverDevice=new OKBLEServerDeviceImp(this);
        OKBLEAdvertiseSettings settings= new OKBLEAdvertiseSettings.Builder().setConnectable(true).build();
        OKBLEAdvertiseData.Builder dataBuilder = new OKBLEAdvertiseData.Builder().setIncludeDeviceName(true);
        //开启广播
        okbleAdvertiseManager.startAdvertising(settings, okbleAdvertiseData, new OKBLEAdvertiseCallback() {  
         @Override
            public void onStartSuccess() {
                LogUtils.e("---onStartSuccess ---");
                new EventHandler(EventRunner.getMainEventRunner()).postTask(() -> 
                ToastUtil.toast(mContext,"Advertising Success");
                configServer();//配置service 和characteristic
            }
            @Override
            public void onStartFailure(int errorCode, String errMsg) {
                LogUtils.e("---onStartFailure errMsg:" + errMsg);
                int screenWidht = DisplayManager.getInstance().getDefaultDisplay(mContext).get().getAttributes().width;
                DirectionalLayout toastLayout = (DirectionalLayout) LayoutScatter.getInstance(mContext)
                        .parse(ResourceTable.Layout_layout_toast, null, false);
                Text msg_toast = (Text) toastLayout.findComponentById(ResourceTable.Id_msg_toast);

                msg_toast.setText("Advertising Failed:"+errMsg);
                new ToastDialog(mContext) .setComponent(toastLayout)
                        .setSize((int) (screenWidht*0.7), DirectionalLayout.LayoutConfig.MATCH_CONTENT).show();
            }      
        });
        
        private void configServer() {
            OKBLEServiceModel serviceModel = new OKBLEServiceModel(CommonUUIDUtils.createCompleteUUIDByShortUUID("fff0"));
            OKBLECharacteristicModel characteristicModel = new OKBLECharacteristicModel(CommonUUIDUtils.createCompleteUUIDByShortUUID("fff1"));
            characteristicModel.setCanWrite(true);
            characteristicModel.setCanNotify(true);
            characteristicModel.setCanRead(true);
            OKBLECharacteristicModel characteristicModel_2 = new OKBLECharacteristicModel(CommonUUIDUtils.createCompleteUUIDByShortUUID("fff2"));
            characteristicModel_2.setCanWriteNoResponse(true);
            List<OKBLECharacteristicModel> characteristicModels = new ArrayList<>();
            characteristicModels.add(characteristicModel);
            characteristicModels.add(characteristicModel_2);
            serverDevice.addCharacteristic(characteristicModels, serviceModel, new OKBLEServerOperation.BLEServerOperationListener() {
                @Override
                public void onAddCharacteristicFailed(int errorCode, String errorMsg) {
                    LogUtils.e("onAddCharacteristicFailed:" + errorMsg);
                }
                @Override
                public void onAddCharacteristicSuccess() {
                    LogUtils.e("onAddCharacteristicSuccess");
                }
            });
        }

— Считывание iBeacon устройств

    OKBLEBeaconScanManager scanManager;
    scanManager=new OKBLEBeaconScanManager(this);
    scanManager.setBeaconScanCallback(scanCallBack);
    OKBLEBeaconManager.OKBLEBeaconScanCallback scanCallBack = new OKBLEBeaconManager.OKBLEBeaconScanCallback() {
        @Override
        public void onScanBeacon(OKBLEBeacon beacon) {
            refreshBtn.setEnabled(true);
            int value[] = scanedResults.put(beacon.getIdentifier(), beacon);
            new EventHandler(EventRunner.getMainEventRunner()).postTask(new Runnable() {
                @Override
                public void run() {
                    if (value[1] == 1) {
                        //это новые данные
                        provider.notifyDataChanged();
                    } else {
                        //это повторяющиеся данные, обновить rssi

``` **int index = value[0];**  
**updatePosition(index);**  
}  
}
  • APP имитирует работу iBeacon
    OKBLEBeBeaconManager beBeaconManager;
    beBeaconManager = new OKBLEBeBeaconManager(this);
    beBeaconManager.setOKBLEBeBeaconListener(startBeaconListener);

    String uuid ="12345678-1234-1234-1234-1234567890ab";
    int major=1;
    int minor=2;
    beBeaconManager.startIBeacon(uuid, major, minor);

     OKBLEBeBeaconManager.OKBLEStartBeaconListener startBeaconListener = new OKBLEBeBeaconManager.OKBLEStartBeaconListener() {
        @Override
        public void onStartSuccess() {
            eventHandler.postTask(new Runnable() {
                @Override
                public void run() {
                 ToastUtil.toast(mContext,"start success");
                }
            });
        }
        @Override
        public void onStartFailure(String errMsg) {
            eventHandler.postTask(new Runnable() {
                @Override
                public void run() {
                 ToastUtil.toast(mContext,"start failed:" + errMsg);
                }
            });
        }
    };
  • Обнаружение входа и выхода из зоны действия iBeacon
    OKBLEBeaconManager beaconManager=new OKBLEBeaconManager(this);
    beaconManager.setRegionListener(this);
    String uuid ="12345678-1234-1234-1234-1234567890ab";
    int major=1;
    int minor=2;
    OKBLEBeaconRegion okbleBeaconRegion=OKBLEBeaconRegion.getInstance(uuid,major,minor);
    //OKBLEBeaconRegion okbleBeaconRegion=OKBLEBeaconRegion.getInstance(uuid,major);
    //OKBLEBeaconRegion okbleBeaconRegion=OKBLEBeaconRegion.getInstance(uuid);
    beaconManager.startMonitoringForRegion(okbleBeaconRegion);

    @Override
    public void onEnterBeaconRegion(OKBLEBeaconRegion beaconRegion) {
    
    }

    @Override
    public void onExitBeaconRegion(OKBLEBeaconRegion beaconRegion) {
    
    }

Тестирование

CodeCheck — тестирование кода без исключений.
CloudTest — тестирование кода без исключений. Вирусная безопасность — проверка пройдена. Текущая версия demo функционально не отличается от исходного компонента.

Версия

1.0.0

Авторские права и лицензии

Copyright 2018 a1anwang

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Библиотека для реализации BLE. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/chinasoft3_ohos-okble.git
git@api.gitlife.ru:oschina-mirror/chinasoft3_ohos-okble.git
oschina-mirror
chinasoft3_ohos-okble
chinasoft3_ohos-okble
master