Android蓝牙低功耗:从外设切换到中央

时间:2017-08-10 21:26:34

标签: android bluetooth bluetooth-lowenergy

我想我在这里撞墙了。 我有两个设备:运行Android 6.0的Mediatek Desire Plus和运行Android 6.0的ASUS X008DC。 在一台设备上我运行一个ReaderActivity,另一台(ASUS)运行一个WriterActivity。 ReaderActivity应该执行以下操作:

  1. 扫描具有特定服务UUID,UUID_1
  2. 的外围设备
  3. 连接到设备,停止扫描,并依次开始阅读服务说明中提供的特征。
  4. 阅读完所有特征后,从外围设备开始,使用UUID,UUID_2宣传服务。
  5. WriterActivity应该与ReaderActivity相反:

    1. 使用UUID,UUID_1
    2. 宣传指定的服务
    3. 当连接到中央时,停止广告并一个接一个地开始提供服务(大多数是每个20字节的块)
    4. 提供所有特征后,停止(关闭)GATT服务器并以中心方式寻找具有UUID,UUID_2的服务。
    5. 问题:两个设备上的一切都很好用UNTIL点2.切换角色后,两个设备都看不到对方,换句话说,WriterActivity的onScanResult从未被调用过。

      我已经尝试了几乎所有的东西:从重新启动蓝牙(使用异步BroadcastReceiver)到在给定的空闲时段中断两个设备上的扫描/广告,到停止WIFI连接,到......

      我正是为了放弃BLE并重新使用标准蓝牙。它可能还不是一种稳定的技术。 我在这里错过了什么?在此先感谢您的时间。

      编辑1:我在两个设备上都安装了Play商店的“BLE Central,Peripheral Checker”,它表示BOTH设备支持BT classic,Central和Peripheral。

1 个答案:

答案 0 :(得分:0)

错误是一台设备,即MediaTek Desire,不需要Android 23权限请求,而另一台设备则更严格,并要求它允许扫描BLE设备。这是在onCreate方法中调用的函数,它修复了问题:

private void checkNetworkLocation() {
    try {
        boolean gps_enabled = false, network_enabled = false;
        LocationManager localLocationManager =
                (LocationManager) getSystemService(LOCATION_SERVICE);;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if ((checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
                    || (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)) {
                throw new Exception();
            }
        }
        try {
            gps_enabled = localLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch(Exception ex) {}

        try {
            network_enabled = localLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch(Exception ex) {}

        if(!gps_enabled && !network_enabled) {
            new AlertDialog.Builder(this).setMessage("Location service is disabled, please enable it to find BLE devices.").setCancelable(false).setNeutralButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {
                    DeviceScanActivity.this.startActivityForResult(new Intent("android.settings.LOCATION_SOURCE_SETTINGS"), 0);
                }
            }).show();
        }
        return;
    } catch (Exception e) {
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
    }
}