簡體   English   中英

Android低功耗藍牙:從外圍設備切換到中央設備

[英]Android Bluetooth Low Energy: Switching from Peripheral To Central

我想我在這里撞牆。 我有兩個設備:運行Android 6.0的Mediatek Desire Plus和運行Android 6.0的ASUS X008DC。 在一台設備上,我運行ReaderActivity,在另一台設備上(ASUS),我運行WriterActivity。 ReaderActivity應該執行以下操作:

  1. 掃描具有特定服務UUID UUID_1的外圍設備
  2. 依次連接至設備,停止掃描並開始閱讀服務說明中提供的特征。
  3. 讀取所有特征后,以外圍設備開始並使用UUID UUID_2通告服務。

WriterActivity應該與ReaderActivity相反:

  1. 使用UUID_1來發布給定的服務
  2. 當連接到中央服務器時,停止發布廣告並一個接一個地開始提供特征(主要是在每個20字節的塊中)
  3. 提供所有特征后,停止(關閉)GATT服務器並以Central身份啟動,以查找帶有UUID UUID_2的服務。

問題是:在兩個設備上,一切正常,直到第2點為止。在切換角色之后,兩個設備都看不到對方,換句話說,永遠不會調用WriterActivity的onScanResult。

我已經嘗試了ALMOST的所有方法:從重新啟動藍牙(使用異步的BroadcastReceiver),到在給定的空閑時間中斷兩個設備的掃描/廣告,再到停止WIFI連接,...

我在此放棄BLE,回到標准藍牙。 這可能還不是穩定的技術。 我在這里想念什么? 在此先感謝您的時間。

編輯1:我在兩個設備上都從Play商店安裝了“ BLE Central,Peripheral Checker”,這表明兩個設備都支持BT classic,Central和Peripheral。

錯誤是,一台設備聯發科技Desire不需要Android 23許可請求,而另一台ASUS更加嚴格,並要求它允許掃描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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM