【问题标题】:How to send and receive data in Android Programming using bluetooth without pairing?如何在不配对的情况下使用蓝牙在Android编程中发送和接收数据?
【发布时间】:2011-06-27 13:58:16
【问题描述】:

我是Android编程新手,并且有java概念,我想知道如何使用蓝牙发送和接收数据而无需配对或任何密码(只有两个设备都安装了我的应用程序), 有什么建议吗?

【问题讨论】:

  • Sockets 可以跳过 BT 部分,直接通过 Wifi (IP)。这可能比导航 BT 的搜索 + 配对步骤更容易。
  • 我有同样的问题,我正在尝试通过蓝牙从测距仪接收信息而不配对设备(我 100% 确定这是可能的)。你有什么解决办法吗?
  • @SalutAmigo,这个问题我在 2011 年问过,现在是 2017 年。由于 Android 设置的安全性,当时不可能。我不知道图书馆现在的行为如何。因此,请阅读他们的官方文档。谢谢。

标签: android sockets bluetooth


【解决方案1】:

据我所知,如果不配对,就不可能通过 RFCOMM 套接字发送或接收数据。我已经用我正在开发的应用程序进行了广泛的尝试。我的结果是:

  • 如果两个设备已配对且可发现,则可以进行双向通信
  • 如果两台设备已配对,但“服务器”设备(Android 设备尝试连接的设备)设置为不可可发现,则双向通信仍然是可能的
  • 如果两个设备未配对,但“服务器”设备是可发现的,则在双向通信可能之前仍需要配对请求。这意味着 RFCOMM client 套接字(即来自 Android 的套接字)需要配对设备。这是在运行 Android 2.2 的三星 Captivate 上测试的。我觉得这很奇怪,因为我可以理解在允许 RFCOMM 服务器套接字之前需要配对,但是要求对 client 套接字进行配对有点严格。

正如@ethrbunny 提到的,您也可以只使用 WiFi,在每台设备上设置并行服务器/客户端线程,然后发送您想要的任何内容。要发现本地网络上的服务,您可以选择使用 zeroconf。

【讨论】:

    【解决方案2】:

    我从this Google groups post by Kristopher Micinski 得到以下信息。 希望对您有所帮助。

    我相信让它发挥作用的关键在于mUuid 列表。

    仔细看看这是在做什么:

    for (int i = 0; i < Connection.MAX_SUPPORTED && myBSock == null; i++) {
        for (int j = 0; j < 3 && myBSock == null; j++) {
            myBSock = getConnectedSocket(myBtServer, mUuid.get(i));
            if (myBSock == null) {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    Log.e(TAG, "InterruptedException in connect", e);
                }
            }
        }
    }
    


    这段代码的作用是看起来连接到设备,但它是如何连接的 这样做?它使用多个 UUID 多次尝试套接字 会议。

    本质上,这意味着我们只能使用UUID一次。所以取而代之的是 应用程序使用七个 UUID 实现,然后服务器侦听并 接受服务器端的每个 UUID,这就是使用 以下代码:

    for (int i = 0; i < Connection.MAX_SUPPORTED && maxConnections > 0; i++) {
        BluetoothServerSocket myServerSocket = mBtAdapter.listenUsingRfcommWithServiceRecord(srcApp, mUuid.get(i));
        BluetoothSocket myBSock = myServerSocket.accept();
        myServerSocket.close(); // Close the socket now that the
        // connection has been made.
    
        String address = myBSock.getRemoteDevice().getAddress();
    
        mBtSockets.put(address, myBSock);
        mBtDeviceAddresses.add(address);
        Thread mBtStreamWatcherThread = new Thread(new BtStreamWatcher(address));
        mBtStreamWatcherThread.start();
        mBtStreamWatcherThreads.put(address, mBtStreamWatcherThread);
        maxConnections = maxConnections - 1;
        if (mCallback != null) {
            mCallback.incomingConnection(address);
        }
    }
    

    现在,在客户端做了什么?客户不 知道服务器当前有多少活动连接。

    如果我们有一些客户必须使用的商定订单,我们可以 简单地使用它,然而,在我们的例子中,我们只是简单地尝试每个 UUID 依次进行,直到我们“找到正确的”。

    短版: -- 使用多个 UUID,一次只能使用一个。所以定义七个(微微网使用的最大值)并尝试每一个,直到 你找到合适的。

    【讨论】:

    • 但是亲爱的我想同时发送和接收,就像我向 Android 发送一个字符串然后那个 android 也会发送给我 ,,,, 意味着客户端和服务器都是一个设备,那你怎么办说什么?
    • 对于您(显然)尝试做的事情,一旦他们连接,谁是客户端/服务器并不重要。他们只会交换消息。两个进程都会在“socket->read”上有一些阻塞进程,它会捕获字符,直到接收到完整的消息。然后处理消息并回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2023-04-07
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    相关资源
    最近更新 更多