【问题标题】:Connecting to a specific bluetooth port on a bluetooth device using Android使用 Android 连接到蓝牙设备上的特定蓝牙端口
【发布时间】:2012-03-31 00:28:01
【问题描述】:

Android 有什么方法可以使用特定端口而不是使用服务 UUID 连接到蓝牙设备? 我知道此选项在其他提供蓝牙支持的平台上可用(例如,通过指定“btspp://”样式 URL 来指定 Java ME)。

谢谢!

【问题讨论】:

    标签: android mobile bluetooth communication


    【解决方案1】:

    好的,已经有一段时间了,但我找到了解决问题的方法。我实际上打算放弃并使用 UUID,但我一直收到服务发现失败 (IO) 异常,当我试图找到服务发现问题的解决方案时,我找到了我原来问题的解决方案...... Ain' t生活吗?:)

    无论如何,this is the link I stumbled upon,尽管您应该注意到答案中有一个错误(他们实际上只是连接到端口 1,而不是使用服务 UUID)。

    在这个简短的历史课之后,这里是解决方案:

    使用反射,可以创建连接到端口号而不是 UUID 的 Rfcomm 套接字:

    int bt_port_to_connect = 5; // just an example, could be any port number you wish
    BluetoothDevice device = ... ; // get the bluetooth device (e.g., using bt discovery)
    BluetoothSocket deviceSocket = null;
    ...
    // IMPORTANT: we create a reference to the 'createInsecureRfcommSocket' method
    // and not(!) to the 'createInsecureRfcommSocketToServiceRecord' (which is what the 
    // android SDK documentation publishes
    Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
    
    deviceSocket = (BluetoothSocket) m.invoke(device,bt_port_to_connect);
    

    需要注意的几点:

    1. 由于我们使用的是Invoke,所以第一个参数是我们要调用方法的对象,invoke的第二个参数实际上是第一个函数参数)
    2. 还有一个可用的安全版本 ('createRfcommSocket'),它接受蓝牙通道号作为单个参数(同样,由于这是调用样式,您需要传递对象来调用方法,如-1-中提到)
    3. 我发现似乎是a link to these functions' prototypes

    祝大家好运。

    【讨论】:

      【解决方案2】:

      蓝牙 Android 连接仅通过 UUID 完成。每个蓝牙设备对其运行的每项服务都有一个 UUID(请参阅蓝牙 SDP)。

      您只需为 Android 提供要监视的 UUID,在客户端模式下,它会自动找到要连接的套接字(包括端口)。在服务器模式下,它将等待指定设备使用指定的 UUID 发起连接。 BluetoothSocket 对象在建立连接时也有效(使用 getInput/Output Stream) 请参阅Server Socket documentationClient Socket documentation


      如果您真的想检查所有内容,您可以从其他设备的 SDP 和您提供的 UUID 中查看 Android 解码的内容。

      使用this tutorial获取蓝牙接口(很容易做到)。 那么代码应该是这样的:

      IBluetooth ib =getIBluetooth();
      Int otherDevicePort = ib.getRemoteServiceChannel(otherDeviceAddress, UUID);
      

      【讨论】:

      • 谢谢!我实际上找到了解决问题的方法(现在作为下面的答案)。当我尝试使用 UUID 时,我不断收到服务发现失败的 IOException,但我会检查您的建议,看看这是否解决了异常..
      • 我不知道这个......我的意思是它可以解决你的问题,但是,你到底怎么知道没有 SDP 的其他设备的端口?您是否只是假设它始终为 1(因为您对蓝牙上的其他设备什么也不做?)
      • 我的问题确实不常见且非常具体,因为我需要与自定义设备通信,该设备始终侦听特定端口并且不公开服务记录 UUID。没错,在大多数情况下,标准(可能也是推荐的)方法是使用 SDP 查找设备公开的服务记录并根据该记录查找端口。
      • @radu 我正在尝试将 Android 应用程序连接到 Linux 计算机。不幸的是,Python 蓝牙 API 通过端口号而不是 UUID 连接。在旧版本的 Android BluetoothDevice API 中,它也曾允许 RFCOMM 连接到端口号。但是,在当前的 Kotlin 版本中,这已被淘汰。
      【解决方案3】:

      我正在使用bluecove,它允许我使用函数Connector.open() 这样做。

      我使用以下网址: btspp://" + phoneID + ":" + phonePort

      注意:可以添加一些选项(例如:authenticate=false;encrypt=false;)。

      phoneID 是蓝牙地址,phonePort 是端口号。

      如何找到蓝牙地址? 来自这个link

      1. 从主屏幕打开应用抽屉,然后打开“设置”。
      2. 选择“系统”。 (在某些型号上跳过此步骤)
      3. 向下滚动到底部,然后点按“关于手机”、“关于设备”或“关于平板电脑”。
      4. 向下滚动到底部并点按“状态”。
      5. 向下滚动,“蓝牙地址”将显示在列表中。

      如何找到端口号? 我还没有找到应该使用哪个端口... 我使用了 5,它可以工作,但我需要研究原因,如果我想更换手机,我需要知道是否还需要更换端口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-24
        • 1970-01-01
        • 1970-01-01
        • 2016-06-08
        • 1970-01-01
        • 1970-01-01
        • 2014-10-04
        相关资源
        最近更新 更多