【问题标题】:Android BLE Beacon scanning on different phone modelsAndroid BLE Beacon 扫描不同型号的手机
【发布时间】:2014-10-27 09:24:44
【问题描述】:

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

但此代码在我的 Android 设备(Samsung 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;
}

【问题讨论】:

  • 您是否在沙滩箱中使用相同的信标硬件?它是什么信标模型?另外,每台设备上的 Android 版本是什么?
  • 是的,我只有 1 个 IBeacon Cc2541(在此处购买:wellcorping.en.made-in-china.com/product/cSUnrYpPTuWE/…) Android 版本:G3 上为 4.4.2,S3 上为 4.3
  • 这是由于蓝牙过滤造成的已知差异。不同的设备/品牌在 android 上实现 BLE 扫描的方式不同。 stackoverflow.com/questions/19502853/…。我不确定您是否可以做任何事情来“修复”它。
  • 那太糟糕了。所以我必须重新开始扫描,每次我需要新的 RSSI 值时。(

标签: android bluetooth-lowenergy ibeacon samsung-mobile lg


【解决方案1】:

很遗憾,您需要停止并重新开始扫描才能获得额外的回调。这正是它在Android Beacon Library 中的实现方式,而stops scanning every 1.1 seconds and then immediately restarts. 这使得在操作系统没有为每个广告都进行回调的情况下,可以在每个周期获得一个回调。

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

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

【讨论】:

    【解决方案2】:

    this answer。 BLE 规范说您没有必须获取每个广告的报告,除非您重新开始扫描。所以有些手机可以,有些不可以。你不能依赖它。

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

    【讨论】:

      猜你喜欢
      • 2021-05-16
      • 1970-01-01
      • 2017-05-03
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多