与Nrf UART的蓝牙配对无法正常工作 [英] Bluetooth Pairing with Nrf UART is not working properly

查看:173
本文介绍了与Nrf UART的蓝牙配对无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

The Bluetooth pairing is not working properly. I am developing the Application based on Bluetooth pairing with UART. Here I have included my concept and Program.Help me out to fix the problem.

我的预期结果是:如果用户按下连接"按钮.它应该是没有用户输入的配对,以及配对请求和PIN的确认屏幕.最终,设备被响应回已连接状态.

My Expected Result is If the user is press the Connect button. It should be pair without user input and Confirmation Screen for Pair Request and PIN. Finally The Device is Respond back to Connected.

我的实际结果是确认"屏幕,将打开用户输入"弹出窗口.设备配对后.最终,设备没有回复我已连接.

My Actual Result is The Confirmation Screen and User Input Popup will open .After that the Device is Paired. Finally the Device is not responded back to I am connected.

我被困在这个问题超过2天了.帮我解决这个问题.

I am Stuck in that Problem More than 2 days. Help me out of this Problem.

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 */

/* After devices is connected I am creating the Bond*/

     @Override
     public void onDeviceConnected(BluetoothDevice device) {

        device.createBond();

      }

推荐答案

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

You can bypass the native Bluetooth pairing process and pair with Bluetooth peripheral pro-grammatically. Try this:

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

Register a receiver for BluetoothDevice.ACTION_PAIRING_REQUEST with the highest priority.

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

To make sure that device is paired register a receiver for 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;
            }
        }
    }
};

在清单中添加权限

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

这篇关于与Nrf UART的蓝牙配对无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆