You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派与笔记本蓝牙连接时出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:17:47