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

Posted

技术标签:

【中文标题】与 Nrf UART 的蓝牙配对无法正常工作【英文标题】:Bluetooth Pairing with Nrf UART is not working properly 【发布时间】:2018-06-30 17:34:50 【问题描述】:

蓝牙配对不正常。我正在开发基于蓝牙与 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();
            
        
    
;

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

     @Override
     public void onDeviceConnected(BluetoothDevice device) 

        device.createBond();

      

【问题讨论】:

【参考方案1】:

您可以绕过原生蓝牙配对过程并以编程方式与蓝牙外围设备配对。试试这个:

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

【讨论】:

您需要为您的 IntentFilter 设置最大优先级以绕过系统配对弹出窗口。 我已经尝试了高优先级和低优先级。它不能正常工作。它显示相同的弹出窗口。 你们是不是没有得到在几分之一秒内来来去去的配对弹出窗口? @YogeshByndoor 设置 Intent 过滤器的高优先级 filter.setPriority(SYSTEM_HIGH_PRIORITY-1);

以上是关于与 Nrf UART 的蓝牙配对无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

nrf52832 学习笔记配对和绑定

NRF51 使用设备管理器实现配对绑定(教程翻译)

[嵌入式方案][nrf51822][LSC-01] BLE模块 从机 AT指令 BLE HID NUS 密码配对 自动回连 电量显示 OTA DFU DTM 定频 4路PWM 2路ADC4路自定义IO

如何查看安卓手机中已配对蓝牙设备信息

蓝牙音箱 找到蓝牙了 可是无法配对成功 提示无法连接通信 怎么解决?

Android蓝牙协议-蓝牙配对与连接