代码之家  ›  专栏  ›  技术社区  ›  user2149122

在Android上难以从BLE软件包中读取数据

  •  0
  • user2149122  · 技术社区  · 7 年前

    目前,由于传感器不可用,我正在使用另一个安卓设备作为BLE广告客户。注意,我没有连接到设备,我只是阅读了广告包。

    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 scanner应用程序接收的原始数据就是我想要发送的数据。

    问题出在接受方。我要做的是:

    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。

    请在这件事上给我一些智慧。

    1 回复  |  直到 7 年前
        1
  •  0
  •   user2149122    7 年前

    我发现android使用16位UUID,这意味着它以以下方式翻译128位UUID:

    01122334-4556-6778-899A-ABBCCDDEEFF0

    使用此UUID发送数据。

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

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

    0000XXXX-0000-1000-8000-00805f9b34fb .

    其中XXXX是我的16位UUID 2334。

    00002334-0000-1000-8000-00805f9b34fb .

    我不知道为什么会这样,但现在它工作得很好。