0

我尝试打开一个套接字来监听来自非安卓设备的传入连接。

 Parcelable[] uuidExtra = device.getUuids(); 
 String t = uuidExtra[0].toString(); 
 t = t.toUpperCase();
 Log.i("UUID: ", t);

此代码段将为我提供蓝牙设备提供的服务的 UUID。LogCat 的输出是:

00001105-0000-1000-8000-00805F9B34FB

我相信这是 Obex 对象推送配置文件的 UUID。我假设这是因为设备的制造商告诉我该设备仅支持协议:Obex Push Profile。

例如,当我尝试访问Parcelable[]数组中的第二个元素时,输出只会是

07-12 13:29:36.305: E/AndroidRuntime(6293): java.lang.ArrayIndexOutOfBoundsException: length=1; index=1

我可以肯定地说我的数组只包含一个对象。

因此,转到更多特定于 android 的蓝牙内容。

我以这种方式使用此 UUID:

 try {
       tmp = adapter.listenUsingRfcommWithServiceRecord(device.getName(), UUID.fromString(t));
      } catch (IOException e) {
           Log.e(TAG, "FAILED BECAUSE: " + e.getMessage()); } 

异常向 LogCat 输出以下内容:

FAILED BECAUSE: Not able to register SDP record for: "name of the device" 

在谷歌搜索这个异常几个小时后,我仍然无法弄清楚如何为我的设备打开一个监听套接字。

有什么建议么?提前致谢!

4

1 回答 1

1

因此,如果有人对此感到好奇,或者面临与我相同的问题,这里是解决方案:

错误:Not able to register SDP record for: "name of the device"将被抛出,因为您正在尝试使用UUID已被占用的 aa 创建服务。在这种情况下,我尝试注册自己的服务,UUIDObex Object Push

例如,我必须做的是使用自定义 UUID 注册我自己的服务

d1b180c0-d7bc-11e1-9b23-0800200c9a66

此 UUID 是从此网页生成。至于现在你已经创建了一个新的监听套接字:

     try {
        tmp = adapter.listenUsingInsecureRfcommWithServiceRecord("My Profile",   UUID.fromString("d1b180c0-d7bc-11e1-9b23-0800200c9a66"));
        } catch (IOException e) {
           Log.e("FAILED BECAUSE:", e.getMessage()); 
        } 
        mmServerSocket = tmp;

我们现在已经准备好接受传入的请求了,这样:

socket = mmServerSocket.accept(); 

请记住,这是一个阻塞调用,因此对于您自己和您的用户,请将其放入thread.

那么为什么我的设备没有连接到安卓服务器呢?

  1. 您确定远程设备/客户端使用与服务器相同的 UUID 吗?

  2. 如果您无法为远程设备指定 UUID,请联系制造商,也许他们会很好地向您发送配置文件,这是我的情况。

如果有任何问题,请在这篇文章中添加评论。我会接受这个作为答案,因为没有人对此有解决方案。

于 2012-07-27T07:37:11.473 回答