【问题标题】:BluetoothGattCallback returns 129 -> GATT_INTERNAL_ERROR for a Beacon, but returns 0 for phonesBluetoothGattCallback 为 Beacon 返回 129 -> GATT_INTERNAL_ERROR,但为电话返回 0
【发布时间】:2018-02-02 11:38:34
【问题描述】:

我调用我的蓝牙适配器mBluetoothAdapter.startDiscovery();,然后它会返回一个蓝牙设备列表。当我按下其中一台设备时,我会这样做:

   mBluetoothGatt = bluetoothDevice.connectGatt(MainActivity.this, false, mGattCallback);

我的回调在哪里:

   private final BluetoothGattCallback mGattCallback =
        new BluetoothGattCallback() {
            @Override
            public void onConnectionStateChange(BluetoothGatt gatt, int status,
                                                int newState) {
                if (newState == BluetoothProfile.STATE_CONNECTED) {
                    mConnectionState = STATE_CONNECTED;
                    Log.i(TAG, "Connected to GATT server.");
                    Log.i(TAG, "Attempting to start service discovery:" +
                            mBluetoothGatt.discoverServices());
                    List<BluetoothGattService> listBGS = mBluetoothGatt.getServices();
                    Log.i("","list size: " + listBGS.size());

                } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                    mConnectionState = STATE_DISCONNECTED;
                    Log.i(TAG, "Disconnected from GATT server.");
                }
            }

            @Override
            // New services discovered
            public void onServicesDiscovered(BluetoothGatt gatt, int status) {
                if (status == BluetoothGatt.GATT_SUCCESS) {
                    Log.w(TAG, "onServicesDiscovered GATT_SUCCESS: " + status);
                    List<BluetoothGattService> listBGS = mBluetoothGatt.getServices();
                    Log.i("","list size: " + listBGS.size());
                } else {
                    Log.w(TAG, "onServicesDiscovered received: " + status);
                }
            }

            @Override
            // Result of a characteristic read operation
            public void onCharacteristicRead(BluetoothGatt gatt,
                                             BluetoothGattCharacteristic characteristic,
                                             int status) {
                if (status == BluetoothGatt.GATT_SUCCESS) {
                    Log.w(TAG, "onCharacteristicRead GATT_SUCCESS: " + status + " / char: " + characteristic);
                }
            }
        };

现在,当我在手机上尝试时,我在 onConnectionStateChange 上得到了 STATE_CONNECTED,然后我调用了 discoverServices,我得到了 GATT_SUCCESS onServicesDiscoveres。所以我可以从我的服务中获取 uuid。 但是当我在信标上尝试它时,我会返回 STATE_CONNECTED,当我调用 discoverServices 时,我会返回一个状态码:129 -> GATT_INTERNAL_ERROR 为什么我的信标会出现这种情况?还有另一种方法,我如何获取设备 uuid? 对于beaconManager,我只需要UUID就可以做到这一点:

 try {
        beaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId", null, null, null));
    } catch (RemoteException e) {    }

编辑

我知道信标应该要求我输入配对代码,但它没有。为什么? 我尝试添加此代码:

    final IntentFilter pairingRequestFilter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
    pairingRequestFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY - 1);
    registerReceiver(mPairingRequestRecevier, pairingRequestFilter);

但我仍然没有收到配对和输入密码的请求

这是我的pairingRequestReceiver:

  private final BroadcastReceiver mPairingRequestRecevier = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(intent.getAction()))
        {
            final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            int type = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.ERROR);

            if (type == BluetoothDevice.PAIRING_VARIANT_PIN)
            {
                device.setPin(intToByteArray(123456));
                abortBroadcast();
            }
            else
            {
                Log.e("","Unexpected pairing type: " + type);
            }
        }
    }
};

【问题讨论】:

    标签: android bluetooth bluetooth-lowenergy service-discovery bluetooth-gatt


    【解决方案1】:

    经过数小时的反复试验,我确实设法找到了一种让它像这样工作的方法: 1.我同样开始发现,但是当我选择一个蓝牙设备时,我要求像这样绑定(配对)它:

     private void pairDevice(BluetoothDevice device) {
        try {
            Method method = device.getClass().getMethod("createBond", (Class[]) null);
            method.invoke(device, (Object[]) null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    我有一个 ACTION_BOND_STATE_CHANGED 接收器:

     private final BroadcastReceiver mPairReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
    
            if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
                final int state        = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);
                final int prevState    = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.ERROR);
    
                if (state == BluetoothDevice.BOND_BONDED && prevState == BluetoothDevice.BOND_BONDING) {
                    Log.i("","Paired");
                    mBluetoothGatt = btDevice.connectGatt(MainActivity.this, false, mGattCallback);
                } else if (state == BluetoothDevice.BOND_NONE && prevState == BluetoothDevice.BOND_BONDED){
                    Log.i("","Unpaired");
                }
    
            }
        }
    };
    

    我是这样注册的:

             IntentFilter intent = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
        registerReceiver(mPairReceiver, intent);
    

    只有在这之后,我才会尝试连接我的 BluetoothGattCallback。因此,我可以发现服务,等等

    【讨论】:

      猜你喜欢
      • 2015-10-04
      • 1970-01-01
      • 2017-11-14
      • 2018-10-17
      • 1970-01-01
      • 2011-12-04
      • 2015-06-21
      • 1970-01-01
      • 2014-05-16
      相关资源
      最近更新 更多