Проект okble
Демонстрация эффекта представлена на рисунке (см. рисунок).
allprojects {
repositories {
maven {
url 'https://s01.oss.sonatype.org/content/repositories/releases/'
}
}
}
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;
}
});
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);**
}
}
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);
}
});
}
};
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 )