树莓派与笔记本蓝牙连接时出现Unreachable Network Error问题排查
蓝牙连接问题排查(树莓派服务端+Windows客户端)
问题场景
树莓派运行C++蓝牙服务端(监听RFCOMM通道1,接收8位浮点数组),Windows 11运行Python客户端尝试连接时触发错误:
OSError: A socket operation was attempted to an unreachable network.
已开启树莓派蓝牙可发现性,Windows出站规则无限制,求其他排查方向。
服务端C++代码
#include <iostream> #include <unistd.h> #include <sys/socket.h> #include <bluetooth/bluetooth.h> #include <bluetooth/rfcomm.h> int main() { struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 }; socklen_t opt = sizeof(rem_addr); int server_sock = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); loc_addr.rc_family = AF_BLUETOOTH; memset(&loc_addr.rc_bdaddr, 0, sizeof(loc_addr.rc_bdaddr)); loc_addr.rc_channel = (uint8_t) 1; if (bind(server_sock, (struct sockaddr *)&loc_addr, sizeof(loc_addr)) < 0) { perror("Failed to bind Bluetooth socket"); return 1; } listen(server_sock, 1); while (true) { std::cout << "Waiting for connections..." << std::endl; int client_sock = accept(server_sock, (struct sockaddr *)&rem_addr, &opt); if (client_sock < 0) { std::cerr << "Failed to accept connection" << std::endl; continue; } std::cout << "Connection accepted" << std::endl; while (true) { float buffer[8]; int bytes_read = read(client_sock, buffer, sizeof(buffer)); if (bytes_read > 0) { std::cout << "Received array of floats:" << std::endl; for (int i = 0; i < 8; ++i) { std::cout << buffer[i] << std::endl; } } else { std::cout << "Connection closed or read error" << std::endl; break; } } close(client_sock); } close(server_sock); return 0; }
客户端Python代码
import struct import bluetooth class Driver(): def __init__(self): self.serverMACAddress = 'DC:A6:32:99:B1:66' # mock mac address self.port = 1 self.device_socket = None def main(self): print("connecting...") self.connect() def connect(self): self.device_socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM) self.device_socket.connect((self.serverMACAddress, self.port)) def send(self,message): print("sending {}".format(message)) data = struct.pack('8f', *message) self.sock.send(data) self.sock.close() if __name__ == "__main__": d = Driver() d.main() d.send([1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8])
可能的排查方向
- MAC地址准确性验证:确认树莓派蓝牙MAC地址是否正确,Windows端是否能通过蓝牙设置发现设备,避免使用示例中的假地址。
- RFCOMM通道权限:树莓派上运行服务端需使用
sudo,非root用户无权限绑定RFCOMM通道,尝试sudo ./your_server_binary启动服务。 - 蓝牙配对状态:Windows与树莓派需完成蓝牙配对,未配对设备无法建立RFCOMM连接。在Windows蓝牙设置中找到树莓派设备完成配对,树莓派端可通过
bluetoothctl pair <Windows_MAC>确认。 - 服务端通道可用性:检查树莓派RFCOMM通道1是否被其他服务占用,使用
sdptool browse local查看已注册的蓝牙服务,确保通道1未被占用。 - Windows蓝牙驱动兼容性:更新Windows蓝牙适配器驱动至最新版本,部分旧驱动对RFCOMM支持存在问题。
- 客户端代码错误修正:Python客户端
send方法中使用了未初始化的self.sock,实际应使用self.device_socket,修正后再测试:def send(self,message): print("sending {}".format(message)) data = struct.pack('8f', *message) self.device_socket.send(data) self.device_socket.close() - 第三方安全软件拦截:临时关闭Windows端第三方安全软件,排查是否存在蓝牙连接拦截。
- 蓝牙信号强度:确保树莓派与Windows设备在蓝牙有效范围内(通常10米内),避免信号弱导致连接失败。
内容的提问来源于stack exchange,提问作者Yes
相关产品推荐
相关产品推荐

