与Nrf UART配对的蓝牙无法正常工作

时间:2018-01-22 06:14:52

标签: bluetooth-lowenergy uart nrf51 nrf52

蓝牙配对无法正常工作。我正在开发基于蓝牙与UART配对的应用程序。在这里,我已经包含了我的概念和程序。帮助我解决问题。

我的预期结果是如果用户按下“连接”按钮。它应该是没有用户输入的配对和配对请求和PIN的确认屏幕。最后,设备将响应回已连接。

我的实际结果是确认屏幕,用户输入弹出窗口将打开。之后设备已配对。最后,设备未响应我已连接。

我被困在那个问题超过2天。帮助我摆脱这个问题。

1。在onstart()方法中注册PAIRING

          IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
         this.registerReceiver(mPairingRequestReceiver, filter);

2。 BroadcastReceiver用于接收PairingRequest。

  private BroadcastReceiver mPairingRequestReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
            try {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                int pin = intent.getIntExtra("android.bluetooth.device.extra.PAIRING_KEY", 123456);
                //the pin in case you need to accept for an specific pin
                byte[] pinBytes;
                pinBytes = ("" + pin).getBytes("UTF-8");
                device.setPin(pinBytes);


        } catch (Exception e) {
                Log.e(TAG, "Error occurs when trying to auto pair");
                e.printStackTrace();
            }
        }
    }
};

/ *连接设备后,我正在创建Bond * /

     @Override
     public void onDeviceConnected(BluetoothDevice device) {

        device.createBond();

      }

1 个答案:

答案 0 :(得分:2)

您可以绕过本机蓝牙配对过程,并以编程方式与蓝牙外设配对。试试这个:

BluetoothDevice.ACTION_PAIRING_REQUEST注册具有最高优先级的接收器。

private void notPaired(){
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
    filter.setPriority(SYSTEM_HIGH_PRIORITY-1);
    registerReceiver(mReceiver, filter);
    mDevice.createBound();// OR establish connection with the device and read characteristic for triggering the pairing process 
    getBoundState();
}

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

            if(type == BluetoothDevice.PAIRING_VARIANT_PIN){
                byte[] pin = "123456".getBytes();
                device.setPin(pin);
                Log.i("Pairing Process ", "Pairing Key Entered");
                abortBroadcast();
            }else
                Log.i("Pairing Process: ", "Unexected Pairing type");
        }
    }
};

要确保设备已配对,请注册BluetoothDevice.ACTION_BOND_STATE_CHANGED

的接收器
private void getBoundState(){
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
    registerReceiver(boundStateReciver, filter);
}

private final BroadcastReceiver boundStateReciver= new BroadcastReceiver()
{
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
            final int d = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,-1);
            switch(d){
                case BluetoothDevice.BOND_BONDED:
                    Log.i("Pairing Process ", "Paired successfully");
                break;
            }
        }
    }
};

在清单中添加this权限

<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />