不需要配对,Android 蓝牙 RFCOMM 直接连接树莓派

3
我需要制作一个应用程序,通过 RFCOMM socketRaspberry Pi 进行通信,而不需要配对。 在 Android 端,我有 RPi 的 MAC 地址,并尝试使用以下代码连接到服务器:
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
BluetoothSocket mmSocket = null;

    try {
        mmSocket = device.createRfcommSocketToServiceRecord(UUID);
        mmSocket.connect();
        Log.d(TAG, "mmSocket returned");
    }
    ...

UUID与服务器端相同,我还尝试使用createInsecureRfcommSocket方法。

在树莓派方面,我使用了pybluez的rfcomm服务器示例(这是示例)。

它曾经起作用,但我不明白为什么它会起作用或者为什么它不再起作用,因为当我试图从手机发起连接时,在树莓派上收到了配对请求,而在手机上没有收到配对请求,并且安卓上的套接字对象已成功连接。

有人知道我做错了什么,或者有任何想法可以帮助我吗?这样的事情是否可行。提前感谢。

1个回答

0

我发现了这个未被回答的问题,我认为至少对于我的情况,我有一个可行的解决方案。

我只需要调用这三条命令:

sudo hciconfig hci0 piscan 
sudo hciconfig hci0 sspmode 1
sudo hciconfig hci0 class 0x400100

前两行代码使得树莓派可被发现,来自这个答案,该答案声称树莓派应该会自动配对。但是这对我来说并不起作用。它仍然需要在两个设备上进行PIN确认,这对于一个无头树莓派来说是不幸的。

这个答案中的第三行代码是至关重要的,它允许将RFCOMM套接字连接到未配对的树莓派。 更改类别可能会导致其他蓝牙服务停止工作,不确定,我只需要RFCOMM。

在此之后,以下示例对我和我的Win10笔记本电脑与RPI 4B一起使用:

import socket
from contextlib import closing

# MAC address of RPi, can be obtained with `bluetoothctl list` on RPi.
rpi_addr =  'e4:5f:01:7d:8A:A3' 
# 1-32, some might be used already, e.g. 3 for me, in that case bind fails.
channel = 15
def server():

    print("Creating socket")
    with closing(socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, 
    socket.BTPROTO_RFCOMM)) as s:
        print("Binding socket")
        s.bind((rpi_addr ,channel))
        print("Listening socket")
        s.listen()

        s_sock, addr = s.accept()
        with closing(s_sock):
            print ("Accepted connection from "+str(addr))

            data = s_sock.send(b"Hello from RPi")

def client():

    print("Creating socket")
    s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, 
    socket.BTPROTO_RFCOMM)
    print("Connecting socket")
    s.connect((rpi_addr,channel))
    print("Connected")

    data = s.recv(1024)

    print(f"Received {data}")

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