2017-08-07 82 views
0
讀取數據

我設計具有傳感器和在接收端的Android裝置的傳感器系統:難度從BLE包在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,但不能讀取數據。

請給我一些關於此事的看法。

+0

你有沒有試過檢查'scanRecord'是否有任何值? – Natan

+0

是的。我使用'.getScanRecord()。getServiceUuids()。get(0)'和'.getScanRecord()。getDeviceName()'來讀取設備名稱和UUID,所有工作都很好。 – user2149122

+0

getBytes()'怎麼辦? – Natan

回答

0

我發現,Android使用16位的UUID,這意味着它轉換以下列方式一個128位的UUID:

原來這個128位的UUID: 01122334-4556-6778-899A-ABBCCDDEEFF0

使用此UUID發送數據。

一旦從android接收到此UUID,android只保留2334並轉儲其餘的。

然後創建一個新的128-bit的UUID,在默認方式:

0000XXXX-0000-1000-8000-00805f9b34fb

XXXX是我的16位UUID 2334

因此,爲了獲得在這種情況下我的數據,我需要尋找128位的UUID機器人給了我的數據,:

00002334-0000-1000-8000-00805f9b34fb

所以在我的情況下,發送我的數據在android分配給我自己的128位UUID是非常實用的。

我不知道爲什麼會發生這種情況,但現在它完美地工作。