Home Articles

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

Asked
Viewed 207 times
1

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

  • 扫描具有特定服务UUID,UUID_1的外围设备

  • 连接到设备,停止扫描,并依次开始读取服务说明中提供的特征 .

  • 读取所有特征后,从外围设备启动并使用UUID,UUID_2通告服务 .

WriterActivity应该与ReaderActivity相反:

  • 使用UUID,UUID_1通告给定服务

  • 当连接到中央时,停止广告并一个接一个地开始提供服务(大多数是每个20字节的块)

  • 提供所有特征后,停止(关闭)GATT服务器并以Central身份查找具有UUID,UUID_2的服务 .

问题是:一切都在两台设备上运行良好UNTIL第2点 . 切换角色后,两台设备都看不到对方,换句话说,WriterActivity的onScanResult从未被调用过 .

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

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

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

1 Answer

  • 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);
        }
    }
    

Related