Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中指定链接键而不进行配对_Android_Bluetooth - Fatal编程技术网

在android中指定链接键而不进行配对

在android中指定链接键而不进行配对,android,bluetooth,Android,Bluetooth,我正在尝试确定android中是否有办法将特定的链接键与已经存在的远程蓝牙设备实例相关联 基本上,我想做的是创建一个与不可发现的蓝牙设备的连接,而无需执行配对或重新配对过程 我无法在标准配对过程中建立与设备的链接密钥,因为我使用的是自定义专有配对机制。我更愿意在不使用本机代码的情况下完成此任务,但如果必须这样做,我会这样做。没有公共api机制可以在不经过配对过程的情况下将链接密钥与设备关联 配对后,此关联将自动创建(也称为绑定),设备绑定后,进一步的连接将重新使用以前生成的链接密钥 即使设备不可

我正在尝试确定android中是否有办法将特定的链接键与已经存在的远程蓝牙设备实例相关联

基本上,我想做的是创建一个与不可发现的蓝牙设备的连接,而无需执行配对或重新配对过程


我无法在标准配对过程中建立与设备的链接密钥,因为我使用的是自定义专有配对机制。我更愿意在不使用本机代码的情况下完成此任务,但如果必须这样做,我会这样做。

没有公共api机制可以在不经过配对过程的情况下将链接密钥与设备关联

配对后,此关联将自动创建(也称为绑定),设备绑定后,进一步的连接将重新使用以前生成的链接密钥

即使设备不可发现,如果您知道设备的蓝牙地址,您也应该能够与其连接绑定/配对

通过更改底层android bluez代码、连接以提供预生成的链接密钥等内部/私有机制在理论上是可能的,这将是一个困难的项目和定制解决方案。 这是假设您有要馈送/关联的链接键。注-链路键是两个设备的设备地址以及设备时钟等的函数。
蓝牙

我需要自己解决这个问题。关键的一步是查找,它告诉我将android.bluetooth包添加到我的项目中,并添加文件IBluetooth.aidl和IBluetoothCallback.aidl(您可以在链接中找到)

实例化IBluetooth对象后,您就可以访问BluetoothService类,并且可以使用IBluetooth.aidl中的任何方法。我感兴趣的方法是

setPin(String address, byte[] pin)
使用它的问题在于,另一个蓝牙代码期望已经调用了配对对话框,并在BluetoothEventLoop类的HashMap中跟踪该对话框。如果在未启动配对请求的情况下尝试调用setPin(),您将看到如下错误:

setPin(<address>) called but no native data available, ignoring. Maybe the PasskeyAgent Request was cancelled by the remote device or by bluez.
setPin()已调用,但没有可用的本机数据,将忽略。可能远程设备或bluez取消了PasskeyAgent请求。

因此,我的解决方法(使用聊天示例)是启动连接线程以启动配对请求,然后休眠500毫秒以确保线程已启动,然后调用setPin()。

是的,我知道上述所有内容。你确定我要修改Bluez代码吗?我希望能够通过使用反射来完成这项任务。我在android源代码中发现了这个函数,它似乎是用来设置密钥的——这些是私有API/包装器,最终与底层的BlueZ代码通信。这里没有设置链接键的内容,所以我不能在JavaAPI中使用前面提到的setPasskey包装器来设置链接键?或者您是说这甚至不是正确的参数(passkey!=link key),与链接key相关的所有内容都在BlueZ中处理?passkey与link key不同,passkey用于生成链接key。传递键通常为4-6位,链接键为16字节(128位)啊,是的,刚刚意识到函数的参数太短,无法下注链接键(int)。我假设passkey与link键相同,因为还有另一个隐藏函数setPin。我相信的Pin码是配对时输入的4-6位数字。感谢您的帮助,我将不得不进一步研究源代码,看看这是否可行;方法m2=btDevice.getClass().getMethod(“setPin”,新类[]{Array.newInstance(byte.Class,4.getClass()});m2.调用(BTAR设备);setPin方法不只是用来设置配对过程中使用的pin值,而不是128位的链接键吗?你是对的,但这是“创建与不可发现的蓝牙设备的连接,而无需执行配对或重新配对过程”的答案。@JPM:
Array.newInstance(byte.class,4.getClass()
可以写成
字节[]。class
@hemisphire您能否详细说明您在聊天示例中插入代码的具体位置?我在
BluetoothChatService.connect(设备)
中使用JPM的方法,就在'mConnectThread=new ConnectThread(设备)之后;mConnectThread.start();`类似于:`byte[]ar=newbyte[]{0x31,0x32,0x33,0x34}//1234方法m2;尝试{Thread.sleep(500);m2=device.getClass().getMethod(“setPin”,新类[]{Array.newInstance(byte.Class,4.getClass()});m2.invoke(device,ar);}catch{something}`PS。由于某些原因,格式化无法工作。