与Nrf UART的蓝牙配对无法正常工作 [英] Bluetooth Pairing with Nrf UART is not working properly
问题描述
蓝牙配对无法正常工作.我正在开发基于蓝牙和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屋!