admin管理员组

文章数量:1538985

2024年7月1日发(作者:)

Android Bluetooth 学习(3)蓝牙设备

之间自动配对

0人收藏此文章, 我要收藏发表于6个月前(2013-03-21 12:01) , 已有654次阅读 ,共0个评论

前言(android2.3版本,4.0版本由于是随机获取pin值,没有研究过):

1、蓝牙设备之间自动配对,需要两个设备都安装进行配对的apk(网上好多自动配对的帖子都没

有说明情况)

2、在自动匹配的时候想通过反射调用BluetoothDevice的setPin、createBond、

cancelPairingUserInput实现设置密钥、配对请求创建、取消密钥信息输入等。

1)createBond()创建,最终会调到源码的BluetoothService的createBond(String address)

方法,通过对源码浅显的了解,createBond主要是写入匹配密钥(BluetoothService的writeDockPin

())以及进入jni注册回调函数onCreatePairedDeviceResult观察匹配结果

比如: // Pins did not match, or remote device did not respond to pin

// request in time

// We rejected pairing, or the remote side rejected pairing. This

// happens if either side presses 'cancel' at the pairing dialog.

// Not sure if this happens

// Other device is not responding at all

// already bonded

等,在jni中创建了进行匹配的device("CreatePairedDevice"),这时bluetooth会发送一个

ACTION_PAIRING_REQUEST的广播,只有当前会出现密钥框的蓝牙设备收到。写完密钥之后,发送

广播给另外一个蓝牙设备接收,然后打开密钥输入框进行匹配。

2)setPin()设置密钥,通过查看setting源码,发现在确认输入密钥之后会调用setPin()(如

果点取消,就会调用cancelPairingUserInput,取消密钥框),setPin具体通过D-BUS做了什么没

有去深究,但是在调用setPin的时候会remove掉一个map里面的键值对(address:int),也就是

我们在调用setPin之后如果再去调用onCreatePairedDeviceResult,则该方法一定返回false,并且

出现下面的打印提示:cancelUserInputNative(B8:FF:FE:55:EF:D6) called but no native data

available, ignoring. Maybe the PasskeyAgent Request was already cancelled by the remote

or by bluez.(因为该方法也会remove掉一个键值对)

3)cancelPairingUserInput()取消用户输入密钥框,个人觉得一般情况下

不要和setPin(setPasskey、setPairingConfirmation、

setRemoteOutOfBandData)一起用,这几个方法都会remove掉map里面的

key:value(也就是互斥的)。

3、蓝牙耳机、手柄等一些无法手动配置的设备是如何完成自动配对的。

在源码里面有一个自动配对的方法,也就是把pin值自动设为“0000”

1 /*package*/ synchronized boolean attemptAutoPair(String address) {

2 if (!oPairingFailed(address) &&

3 !PairingBlacklisted(address)) {

4 t(address);

5 setPin(address,

tPinToBytes("0000"));

6 return true;

7 }

8 return false;

9 }

该方法是在底层回调到java层的onRequestPinCode方法时被调用,首先 Check if its a

dock(正常输入的密钥,走正常配对方式,双方输入匹配值),然后再 try 0000 once if the

device looks dumb(涉及到_VIDEO相关部分如:耳机,免提等进入自

动匹配模式)进行自动配对。

言归正传

,虽然个人觉得自动配对需要双方乃至多方蓝牙设备都需要装上实现自动配

对的apk,已经失去了自动配对的意义,但有可能还是会派上用场。下面我们看看现

实情况的自动配对是什么样的吧。

由于BluetoothDevice配对的方法都是hide的,所以我们需要通过反射调用被隐藏

的方法,现在基本都是通用的工具类型了,网上模式基本一样。

001 package oth;

002

003 import ;

004 import ;

005 import othAdapter;

006 import othDevice;

007 import ;

008 public class ClsUtils

009 {

010 public static BluetoothDevice remoteDevice=null;

011 /**

012 * 与设备配对 参考源码:platform/packages/apps/

*

01

/Settings/src/com/android/settings/bluetooth/CachedBluetoothDevic

3

014 */

015 @SuppressWarnings("unchecked")

static public boolean createBond(@SuppressWarnings("rawtypes")

016

Class btClass, BluetoothDevice btDevice)

017 throws Exception

018 {

019 Method createBondMethod = hod("createBond");

本文标签: 配对密钥自动设备蓝牙