我需要创建一个应用程序,通过RFCOMM socket
与树莓派进行通信,而无需配对。 在安卓方面,我有RPi的MAC地址,我正在尝试使用以下代码连接到服务器:
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
BluetoothSocket mmSocket = null;
try {
mmSocket = device.createRfcommSocketToServiceRecord(UUID);
mmSocket.connect();
Log.d(TAG, "mmSocket returned");
}
...
UUID与服务器端相同,我也尝试使用createInsecureRfcommSocket方法。
在Raspberry Pi方面,我使用了rfcomm服务器的pybluez示例(这是示例(
它曾经工作过,但我不明白为什么它这样做或为什么不再工作,从某种意义上说,当我尝试从手机启动连接时,我在 Raspberry Pi 上收到了配对请求,而手机上没有配对请求,并且 android 上的套接字对象已成功连接。
有谁知道我做错了什么,或者任何可能对我有帮助的想法,这样的事情甚至可行吗? 提前谢谢。
我发现了这个未回答的问题,我认为我至少对我的情况有一个可行的解决方案。
我需要做的就是调用这三个命令:
sudo hciconfig hci0 piscan
sudo hciconfig hci0 sspmode 1
sudo hciconfig hci0 class 0x400100
前两行使 RPi 可从此答案中发现,该答案还声称 RPi 应该自动配对。这对我不起作用。它仍然需要在两台设备上进行PIN确认,这对于无头RPi来说是不幸的。
此答案中的第三行至关重要,它允许将RFCOMM套接字连接到未配对的RPi。更改类可能会使其他BT服务停止工作,不确定,我只需要RFCOMM。
在此之后,以下示例适用于我的 RPI 4B 和我的 Win10 笔记本电脑:
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}")