2017-04-20 67 views
0

私はBLEデバイスをスキャンするアンドロイドアプリを実装しようとしています。私はビーコンの距離情報を必要とするので、私はRSSIを連続的に読みたいと思っています。現在、私はRSSIを表示することができますが、値は変更されません。アプリケーションは値を一度読み取って値を更新しません。私はgitHubのサンプルBLEアプリケーションを基礎として使用しました。BLEデバイスのRSSIを連続的に表示するにはどうすればよいですか?

これは私のBluetoothデバイスです:

class DeviceHolder{ 
    BluetoothDevice device; 
    int rssi; 
    public DeviceHolder(BluetoothDevice device, int rssi){ 
     this. device = device; 
     this.rssi = rssi; 
    } 
} 

リストアダプタ:

private class LeDeviceListAdapter extends BaseAdapter { 
    private ArrayList<BluetoothDevice> mLeDevices; 
    private ArrayList<DeviceHolder> mLeHolders; 
    private LayoutInflater mInflator; 

    public LeDeviceListAdapter() { 
     super(); 
     mLeDevices = new ArrayList<BluetoothDevice>(); 
     mLeHolders = new ArrayList<DeviceHolder>(); 
     mInflator = DeviceScanActivity.this.getLayoutInflater(); 
    } 
    public void addDevice(DeviceHolder deviceHolder) { 
     if(!mLeDevices.contains(deviceHolder.device)) { 
      mLeDevices.add(deviceHolder.device); 
      mLeHolders.add(deviceHolder); 
     } 
    } 

とスキャンコールバック:

private BluetoothAdapter.LeScanCallback mLeScanCallback = 
     new BluetoothAdapter.LeScanCallback() { 

      @Override 
      public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 
       DeviceHolder deviceHolder = new DeviceHolder(device,rssi); 
       runOnUiThread(new DeviceAddTask(deviceHolder)); 
      } 
     }; 

class DeviceAddTask implements Runnable { 
    DeviceHolder deviceHolder; 

    public DeviceAddTask(DeviceHolder deviceHolder) { 
     this.deviceHolder = deviceHolder; 
    } 

    public void run() { 
     mLeDeviceListAdapter.addDevice(deviceHolder); 
     mLeDeviceListAdapter.notifyDataSetChanged(); 
    } 
} 

次のようにBluetoothLeService活動中のBluetooth GattCallbackが見えます:

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     String intentAction; 
     if (newState == BluetoothProfile.STATE_CONNECTED) { 
      intentAction = ACTION_GATT_CONNECTED; 
      mConnectionState = STATE_CONNECTED; 
      boolean rssiStatus = mBluetoothGatt.readRemoteRssi(); 
      broadcastUpdate(intentAction); 
      Log.i(TAG, "Connected to GATT server."); 
      // Attempts to discover services after successful connection. 
      Log.i(TAG, "Attempting to start service discovery:" + 
        mBluetoothGatt.discoverServices()); 

     } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { 
      intentAction = ACTION_GATT_DISCONNECTED; 
      mConnectionState = STATE_DISCONNECTED; 
      Log.i(TAG, "Disconnected from GATT server."); 
      broadcastUpdate(intentAction); 
     } 
    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
     if (status == BluetoothGatt.GATT_SUCCESS) { 
      broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED); 
     } else { 
      Log.w(TAG, "onServicesDiscovered received: " + status); 
     } 
    } 

    @Override 
    public void onCharacteristicRead(BluetoothGatt gatt, 
            BluetoothGattCharacteristic characteristic, 
            int status) { 
     if (status == BluetoothGatt.GATT_SUCCESS) { 
      broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); 
     } 
    } 

    @Override 
    public void onCharacteristicChanged(BluetoothGatt gatt, 
             BluetoothGattCharacteristic characteristic) { 
     broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); 
    } 

    public void onReadRemoteRssi(BluetoothGatt gatt, 
           int rssi, int status){ 
     super.onReadRemoteRssi(gatt, rssi, status); 
     if (status == BluetoothGatt.GATT_SUCCESS) { 
      Log.d(TAG, String.format("BluetoothGatt ReadRssi[%d]", rssi)); 
     } else { 
      Log.w(TAG, "onReadRemoteRssi received: " + status); 
     } 
     broadcastUpdate(ACTION_RSSI_VALUE_READ, rssi); 

    } 
}; 

private void broadcastUpdate(final String action) { 
    final Intent intent = new Intent(action); 
    sendBroadcast(intent); 
} 

private void broadcastUpdate(final String action, int rssi){ 
    Log.d(TAG, "broadcastUpdate - rssi"); 
    final Intent intent = new Intent(action); 
    intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_RSSI, rssi); 
    intent.setAction(ACTION_RSSI_VALUE_READ); 
    sendBroadcast(intent); 
} 

私はインターネットとStackoverflowを参考にしましたが、提供された解決策は私のためには機能しませんでした。 Android 6.01でSamsung Galaxy S5を使用しています。 接続されていないデバイス(スキャン中)に対してRSSIを継続的に表示する方法はありますか?間違った実装に関するヒントも歓迎します。

ありがとうございました!

Sayus

PS:私は、デバイスも同様にconectedされたときにRSSIを読みたいのでonReadRemoteRssiが実装されています。この機能は現時点では重要ではありません。

答えて

0

アプリケーションに新しいBluetoothDeviceを追加すると、RSSI値がすでに含まれているかどうかがチェックされるため、アプリケーションはRSSI値を一度読み取って更新しません。

if(!mLeDevices.contains(deviceHolder.device)) { 
     mLeDevices.add(deviceHolder.device); 
     mLeHolders.add(deviceHolder); 
    } 

代わりに、私はあなたがデバイスのRSSI値更新Map<BluetoothDevice,Integer>作成します。mDeviceRssi.put(device, rssi)を。

+0

お返事ありがとうございます!今私はその問題を理解しています。また、リストされたデバイスのみを更新する必要があることも理解しています。私はアンドロイドの開発に慣れて以来、Map についてもう少し詳しい情報を提供できれば、私のコードでどのように使用するかは本当に素晴らしいでしょう。役に立つリンクでも十分です。もう一度ありがとう! – Sayus

関連する問題