难以从Android上的BLE包中读取数据

时间:2017-08-07 19:29:53

标签: java android bluetooth-lowenergy advertisement

我正在接收端设计一个带传感器和Android设备的传感器系统:

目前,由于传感器不可用,我使用其他Android设备作为BLE广告客户。请注意,我没有连接到设备,我只是阅读广告包。

在发送端,我正在创建一个包含设备名称,UUID和特定UUID数据的数据包:

private void advertise() {
    BluetoothLeAdvertiser advertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();

    AdvertiseSettings settings = new AdvertiseSettings.Builder()
            .setAdvertiseMode( AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY )
            .setTxPowerLevel( AdvertiseSettings.ADVERTISE_TX_POWER_HIGH )
            .setConnectable(false)
            .build();

    ParcelUuid pUuid = new ParcelUuid( UUID.fromString( getString( R.string.ble_uuid ) ) );
    byte[] mdata = "Hello".getBytes(Charset.forName("UTF-8"));

    AdvertiseData data = new AdvertiseData.Builder()
            .setIncludeDeviceName( true )
            .addServiceUuid( pUuid )
            .addServiceData( pUuid, mdata )
            .build();

    AdvertiseCallback advertisingCallback = new AdvertiseCallback() {
        @Override
        public void onStartSuccess(AdvertiseSettings settingsInEffect) {
            super.onStartSuccess(settingsInEffect);
        }

        @Override
        public void onStartFailure(int errorCode) {
            Log.e( "BLE", "Advertising onStartFailure: " + errorCode );
            super.onStartFailure(errorCode);
        }
    };

这部分效果很好,因为我使用BLE扫描仪应用程序收到的原始数据是我要发送的数据。

问题出在接收方。我所做的是:

private void discover() {
    List<ScanFilter> filters = new ArrayList<ScanFilter>();

    ScanFilter filter = new ScanFilter.Builder()
            .setServiceUuid( new ParcelUuid(UUID.fromString( getString(R.string.ble_uuid ) ) ) )
            .build();
    filters.add( filter );

    ScanSettings settings = new ScanSettings.Builder()
            .setScanMode( ScanSettings.SCAN_MODE_LOW_LATENCY )
            .build();

    mBluetoothLeScanner.startScan(filters, settings, mScanCallback);

    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            mBluetoothLeScanner.stopScan(mScanCallback);
        }
    }, 10000);
}

我的scanCallBack功能如下:

private ScanCallback mScanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            super.onScanResult(callbackType, result);
            if( result == null
                    || result.getDevice() == null
                    || TextUtils.isEmpty(result.getDevice().getName()) )
                return;

        StringBuilder builder = new StringBuilder( result.getDevice().getName());
        for(int j = 0; j < result.getScanRecord().getServiceUuids().size(); j++){
            builder.append("\n");
            builder.append("Result no. " + j);
            builder.append("\n");
            builder.append(result.getScanRecord().getServiceUuids().get(j));
            builder.append("\n");
            builder.append("Service data: ");
            builder.append("\n");
            builder.append(result.getScanRecord().getServiceData(result.getScanRecord().getServiceUuids().get(j)));
        }
        mText.setText(builder.toString());
    }

此代码在我尝试读取数据时始终返回null。

总的来说,我可以读取设备的名称和设备的UUID,但不能读取数据。

请就此事给我一些智慧。

1 个答案:

答案 0 :(得分:0)

我发现android使用16位UUIDS,这意味着它以下列方式转换128位UUID:

这是原始的128位UUID: 01122334-4556-6778-899A-ABBCCDDEEFF0

使用此UUID发送数据。

一旦从android收到这个UUID,android只保留2334并转储其余部分。

然后它以默认方式创建一个新的128位UUID:

0000XXXX-0000-1000-8000-00805f9b34fb

XXXX是我的16位UUID 2334。

因此,为了访问我的数据,我需要查找android给我的数据的128位UUID,在这种情况下:

00002334-0000-1000-8000-00805f9b34fb

所以在我的情况下,在我分配给我自己的128位UUID上发送数据非常实用。

我不确定为什么会这样,但现在它完美无缺。