蓝牙忘记了PIN码

4
我正在开发一个连接到嵌入式蓝牙设备的应用程序。这个设备有不同版本,在我的测试设备上,通过安全的rfcomm socket通信一切正常。然而,另一组设备让我感到不安。它们似乎丢失了绑定状态。虽然它们被标记为已配对,但每次我建立连接时都要求重新输入PIN码。这真的是不希望发生的事情。此外,这种行为并不在所有设备上发生,但大多数设备上会出现。实际上,唯一不会忘记PIN码的设备是Galaxy Nexus S。Samsung Galaxy Nexus、ACE、GIO和X10 mini Pro往往会“忘记”之前配对过的设备。使用API lvl 10,我已经尝试了不安全的RFCOMM连接,但没有成功。我迷失了方向。有人有想法吗?最好的问候!

我遵循我们都熟悉的蓝牙聊天服务示例的参考实现。连接线程使用远程设备进行初始化。然后,从createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"))获取BluetoothSocket SPP UUID。 当执行线程时,会调用阻塞函数socket.connect(),如果没有抛出异常,则调用connect函数。连接线程关闭,并将打开的socket传递给已连接线程的构造函数。然后run()读取输入流。 - John Smith
我仍在尝试以编程方式配对设备,但没有成功。此外,对于我们的客户来说,对目标移动设备进行root操作不是一个选择。 - John Smith
谢谢你的输入。我也卡在这里了。连接到这些设备的设备通常通过使用专用芯片在相当低的级别上解决这个问题,该芯片只需在客户端设备请求时提供所需的引脚即可。与技术部门交谈,也没有任何升级任何固件的机会。让我感到困扰的是它在Nexus S上表现良好,但我们迄今为止测试过的其他设备都没有。我不是一个低级别的人,但我认为Nexus S适配器建立连接的方式略有不同... - John Smith
好吧,我在这里也无能为力。你的问题似乎比程序上的更多涉及政治方面。希望你能找到解决办法,如果找到了,请在这里发布答案。祝好! - Rigotti
哦,该死...好吧,至少这不是你的问题... - Rigotti
显示剩余10条评论
1个回答

1
如果您的设备的getBTMajorDeviceClass是BluetoothClass.Device.Major.UNCATEGORIZED,请尝试生成自己的UUID:
private UUID generateUuid() {
String android_id = Secure.getString(getApplicationContext()
    .getContentResolver(), Secure.ANDROID_ID);
Log.i("System out", "android_id : " + android_id);

final TelephonyManager tm = (TelephonyManager) getBaseContext()
    .getSystemService(Context.TELEPHONY_SERVICE);

final String tmDevice, tmSerial, androidId;
tmDevice = "" + tm.getDeviceId();
Log.i("System out", "tmDevice : " + tmDevice);
tmSerial = "" + tm.getSimSerialNumber();
Log.i("System out", "tmSerial : " + tmSerial);
androidId = ""
    + android.provider.Settings.Secure.getString(
        getContentResolver(),
        android.provider.Settings.Secure.ANDROID_ID);

UUID deviceUuid = new UUID(androidId.hashCode(),
    ((long) tmDevice.hashCode() << 32) | tmSerial.hashCode());

return deviceUuid;
}

并在套接字创建时使用它 createRfcommSocketToServiceRecord(generateUuid());

*需要READ_PHONE_STATE权限


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接