BLE Производство Рекламные данные

В данных производителя BLE при преобразовании байтов в String я получаю такие данные:

JLG BLE

ÿS7452396��������ÿSPH90234380,100084, �����������������.

Даже преобразование из байтов в шестнадцатеричное, а затем из шестнадцатеричного в строковую печать только так.

шестнадцатеричный формат:

02010608084A4C4720424C45020A0A0FFF530704373435323339360000000015FF5307504839303233343338302C3130303038342C000000000000000000.

В ios Manufacture данные печатаются вот так

1. сырые данные (Ascii):

53070355 52323031 39313130 33315048 39303233 34333830 2c313030 3038342c

2. значение строки:

SUR201911031PH90234380,100084,

Итак, в Android, как я могу распечатать необработанные данные и строковое значение, например iOS

Я получаю такой результат сканирования

ScanResult {device = D6: 23: 72: 02: 69: 72, scanRecord = ScanRecord [mAdvertiseFlags = 6, mServiceUuids = null, mManufacturerSpecificData = {1875 = [80, 72, 57, 48, 50, 51, 52, 51, 56, 48, 44, 49, 48, 48, 48, 56, 52, 44]}, mServiceData = {}, mTxPowerLevel = 10, mDeviceName = JLG BLE], rssi = -59, timestampNanos = 34872779608333, eventType = 27, primaryPhy = 1, secondaryPhy = 0, AdvertisingSid = 255, txPower = 127, periodAdvertisingInterval = 0}

private ScanCallback mScanCallback = new ScanCallback() {

    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        try {

            BluetoothDevice btDevice = result.getDevice();
            String name = btDevice.getName();
          //  Log.d("advertisedData",);
            if (name != null && name.equalsIgnoreCase(JLGConstants.BLE_NAME)) {
                JLGBluetoothManufacturerData bluetoothManufacturerData = new JLGBluetoothManufacturerData();
                bluetoothManufacturerData.setBluetoothDevice(result.getDevice());
                bluetoothManufacturerData.setRssi(result.getRssi());
                Log.e("address",""+result);


                if (bluetoothManufactureDataList.isEmpty()) {
                    String scanHex = "";

                    SparseArray<byte[]> advertisedData = result.getScanRecord().getManufacturerSpecificData();
                    ScanRecord advertisedDataBytes = result.getScanRecord();

                    Log.d("advertisedData hex format",JLGCommonFunctions.bytesToHex(advertisedDataBytes.getBytes()));

                   Log.d("advertisedData  String format",JLGCommonFunctions.bytesToString(advertisedDataBytes.getBytes()));


                } 

            }
        } catch (Exception e) {
            JLGCommonFunctions.logExceptions(e);
        }
    }
    @Override
    public void onBatchScanResults(List<ScanResult> results) {
        /*do nothing*/
    }
    @Override
    public void onScanFailed(int errorCode) {
        /*do nothing*/
    }
};

person Community    schedule 22.11.2019    source источник


Ответы (1)


Следующие байты находятся в необработанных данных, полученных как на Android, так и на iOS:

39303233343338302C3130303038342C

Перед этой частью ваше периферийное устройство JLG кодирует данные разных производителей между Android и iOS.

Предположительно, данные iOS включают частный адрес BLE периферийного устройства, поскольку с iOS невозможно получить частный адрес рекламного периферийного устройства BLE через рекламные пакеты с помощью CoreBluetooth.

Если вашему приложению необходимо однозначно идентифицировать неизвестное периферийное устройство BLE, эта идентифицирующая информация должна предоставляться периферийным устройством, если эта информация умещается в рекламном пакете.

person matdev    schedule 22.11.2019
comment
почему появляются такие вопросительные знаки JLG BLE ÿS7452396��������ÿSPH90234380,100084, ����������������� - person ; 22.11.2019
comment
Это не связано с вашим производителем JLG. Знак вопроса - это заполнитель для нулевого или пустого значения. - person matdev; 22.11.2019
comment
� являются заменой неизвестных символов в наборе. - person Nithin P; 22.11.2019