diff --git a/ohos/ohos/src/main/ets/components/plugin/FlutterBluePlusOhosPlugin.ets b/ohos/ohos/src/main/ets/components/plugin/FlutterBluePlusOhosPlugin.ets index 95483b9a6b0ec6fecaa4d5b20611f4578b1bdf50..03b8f038d48763fe3a666cc33b57df38759e6daf 100644 --- a/ohos/ohos/src/main/ets/components/plugin/FlutterBluePlusOhosPlugin.ets +++ b/ohos/ohos/src/main/ets/components/plugin/FlutterBluePlusOhosPlugin.ets @@ -33,6 +33,15 @@ import HexUtil from './HexUtil' import TextUtils from "./TextUtils" type byte = number; const CCCD: string = "2902"; +const BLE_ADV_TYPE_16_BIT_SERVICE_UUIDS_INCOMPLETE = 0x02; +const BLE_ADV_TYPE_16_BIT_SERVICE_UUIDS_COMPLETE = 0x03; +const BLE_ADV_TYPE_32_BIT_SERVICE_UUIDS_INCOMPLETE = 0x04; +const BLE_ADV_TYPE_32_BIT_SERVICE_UUIDS_COMPLETE = 0x05; +const BLE_ADV_TYPE_128_BIT_SERVICE_UUIDS_INCOMPLETE = 0x06; +const BLE_ADV_TYPE_128_BIT_SERVICE_UUIDS_COMPLETE = 0x07; +const BLUETOOTH_UUID_16_BIT_LENGTH = 2; +const BLUETOOTH_UUID_32_BIT_LENGTH = 4; +const BLUETOOTH_UUID_128_BIT_LENGTH = 16; /** FlutterBluePlusPlugin **/ export default class FlutterBluePlusOhosPlugin implements FlutterPlugin, MethodCallHandler { @@ -1508,6 +1517,73 @@ export default class FlutterBluePlusOhosPlugin implements FlutterPlugin, MethodC return result } + parseAdvData(data: ArrayBuffer): string[] { + let advData = new Uint8Array(data); + if (advData.byteLength == 0) { + return []; + } + let serviceUuids: string[] = []; + let curPos = 0; + while (curPos < advData.byteLength) { + let length = advData[curPos++]; + if (length == 0) { + break; + } + let advDataLength = length - 1; + let advDataType = advData[curPos++]; + switch (advDataType) { + case BLE_ADV_TYPE_16_BIT_SERVICE_UUIDS_INCOMPLETE: + case BLE_ADV_TYPE_16_BIT_SERVICE_UUIDS_COMPLETE: + this.parseServiceUuid(BLUETOOTH_UUID_16_BIT_LENGTH, curPos, advDataLength, advData, serviceUuids); + break; + case BLE_ADV_TYPE_32_BIT_SERVICE_UUIDS_INCOMPLETE: + case BLE_ADV_TYPE_32_BIT_SERVICE_UUIDS_COMPLETE: + this.parseServiceUuid(BLUETOOTH_UUID_32_BIT_LENGTH, curPos, advDataLength, advData, serviceUuids); + break; + case BLE_ADV_TYPE_128_BIT_SERVICE_UUIDS_INCOMPLETE: + case BLE_ADV_TYPE_128_BIT_SERVICE_UUIDS_COMPLETE: + this.parseServiceUuid(BLUETOOTH_UUID_128_BIT_LENGTH, curPos, advDataLength, advData, serviceUuids); + break; + default: + break; + } + curPos += advDataLength; + } + return serviceUuids; + } + + private parseServiceUuid(uuidLength: number, curPos: number, advDataLength: number, + advData: Uint8Array, serviceUuids: string[]) { + while (advDataLength > 0) { + let tmpData: Uint8Array = advData.slice(curPos, curPos + uuidLength); + serviceUuids.push(this.getUuidFromUint8Array(uuidLength, tmpData)); + advDataLength -= uuidLength; + curPos += uuidLength; + } + } + + private getUuidFromUint8Array(uuidLength: number, uuidData: Uint8Array): string { + let uuid = ""; + let temp: string = ""; + for (let i = uuidLength - 1; i > -1; i--) { + temp += uuidData[i].toString(16).padStart(2, "0"); + } + switch (uuidLength) { + case BLUETOOTH_UUID_16_BIT_LENGTH: + uuid = `0000${temp}-0000-1000-8000-00805F9B34FB`; + break; + case BLUETOOTH_UUID_32_BIT_LENGTH: + uuid = `${temp}-0000-1000-8000-00805F9B34FB`; + break; + case BLUETOOTH_UUID_128_BIT_LENGTH: + uuid = `${temp.substring(0, 8)}-${temp.substring(8, 12)}-${temp.substring(12, 16)}-${temp.substring(16, 20)}-${temp.substring(20, 32)}`; + break; + default: + break; + } + return uuid; + } + async scanCallback(data: Array) { let item = data[0] let uint8_msg = new Uint8Array(item.data); @@ -1574,6 +1650,8 @@ export default class FlutterBluePlusOhosPlugin implements FlutterPlugin, MethodC if (advData.localName != null) { map.set("adv_name", advData.localName); } + let serviceUuids = this.parseAdvData(item.data); + map.set("service_uuids", serviceUuids); deviceList.add(map) response.set("advertisements", deviceList); if (this.channel != null) {