0

我正在编写关于查找和检测 IBeacons(这些是 BLE 设备)和测距它们(取决于 RSSI 值)的 Android 应用程序我使用来自https://developer.android.com/guide/topics/connectivity/bluetooth-le 的示例代码。 html

但是此代码在我的 android 设备(三星 Galaxy S3 和 LG G3)上的工作方式不同。

在我的 S3 上,“onLeScan”回调在循环中上升了很多次(大约每秒 5 次),并且每次都根据范围给我不同的 RSSI 值。

但是在我的 LG G3 上,当我开始扫描时,“onLeScan”回调只会上升一次。所以如果我想获得新的 RSSI 值,我需要重新开始扫描。而且我认为这不是很好。

我不知道 LG G3 驱动程序是否有问题,或者我必须检查一些 android 设置。任何人都可以告诉我一些关于它的事情吗?

这是我的代码:

public class Main2Activity extends Activity implements BluetoothAdapter.LeScanCallback {

private BluetoothAdapter mBluetoothAdapter;
private boolean mScanning;
private Handler mHandler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    /**/
    final BluetoothManager bluetoothManager =
            (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    mBluetoothAdapter = bluetoothManager.getAdapter();
    if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        enableBtIntent.addFlags(enableBtIntent.FLAG_ACTIVITY_NEW_TASK);
        this.startActivity(enableBtIntent);

    }   
    scanLeDevice(true);
}

private void scanLeDevice(final boolean enable) {
    if (enable) {
        // Stops scanning after a pre-defined scan period.
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mScanning = false;
                mBluetoothAdapter.stopLeScan(Main2Activity.this);
            }
        }, 30000);

        mScanning = true;
        mBluetoothAdapter.startLeScan(Main2Activity.this);
    } else {
        mScanning = false;
        mBluetoothAdapter.stopLeScan(Main2Activity.this);
    }
}

ArrayList<String> datas = new ArrayList<String>();
@Override
public void onLeScan(BluetoothDevice arg0, int arg1, byte[] arg2) {
    // TODO Auto-generated method stub
    datas.add( arg2.toString() );
}



@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    return true;
}
4

2 回答 2

2

不幸的是,您需要停止并重新开始扫描才能获得额外的回调。这正是它在Android Beacon Library中的实现方式,它每 1.1 秒停止一次扫描,然后立即重新启动。 这使得在操作系统没有为每个广告都进行回调的情况下,每个周期可以获得一个回调。

目前尚不清楚这在设备和操作系统版本之间究竟如何变化。在搭载 Android 4.3 的 Nexus 4 上,可连接 BLE 广告与不可连接 BLE 广告的扫描行为不同。可连接的广告在每个扫描周期仅导致一个广告回调,而非可连接的广告在每个扫描周期接收多个回调。此行为可能在其他设备和操作系统版本上有所不同,这就是为什么需要循环以实现广泛兼容性的原因。

在搭载 Android 5.0 的 Nexus 5 设备上,新的扫描 API 始终为来自同一设备的每个 BLE 广告返回多个回调,无论该广告是否可连接。搭载 Android 5.0 的 Nexus 4 设备,但在扫描停止并重新启动之前,仍然只能获得一个可连接广告的广告回调。这似乎是在驱动程序级别实现的,因此每个 ROM 映像可能不同。

于 2014-10-27T15:23:36.567 回答
0

看到这个答案。BLE 规范说您不必每个广告获取报告,除非您重新开始扫描。所以有些手机可以,有些不可以。你不能依赖它。

在我看来,这是一个愚蠢的举动。

于 2015-03-28T13:13:45.523 回答