Python Raspberry pi蓝牙-发送数据

Python Raspberry pi蓝牙-发送数据,python,bluetooth,bluetooth-lowenergy,Python,Bluetooth,Bluetooth Lowenergy,在发布这篇文章之前,我试着寻找一个简单的程序,使用BLE和rapsberry pi发送任何类型的数据。但我了解的更多细节是,我知道有一些BLE库支持在RPi上使用Python编程。我是python网络编程新手,正在寻找教程。每一个教程都是关于如何使用BLE连接RPi和某种手机的。他们没有展示如何制作py脚本来发送一些传感器数据或类似的东西。请指导。请参阅下面的材料,这些材料是从我针对该主题创建的SO文档条目中复制的 最后,您基本上有一个类似TCP的套接字,可以通过它发送任何数据。但我建议您使用A

在发布这篇文章之前,我试着寻找一个简单的程序,使用BLE和rapsberry pi发送任何类型的数据。但我了解的更多细节是,我知道有一些BLE库支持在RPi上使用Python编程。我是python网络编程新手,正在寻找教程。每一个教程都是关于如何使用BLE连接RPi和某种手机的。他们没有展示如何制作py脚本来发送一些传感器数据或类似的东西。请指导。

请参阅下面的材料,这些材料是从我针对该主题创建的SO文档条目中复制的

最后,您基本上有一个类似TCP的套接字,可以通过它发送任何数据。但我建议您使用ATT和GATT协议(参见蓝牙规范)。所有BLE设备都应该使用这些协议,但是如果发送方和接收方都是由您编程的,那么您可以使用自己的,可能更简单的协议

这不是特定于RPi的,没有必要,因为几乎每个Linux发行版都使用相同的蓝牙堆栈,称为Bluez。您需要
libbluetooth dev
软件包来开发自己的应用程序

对于Python,您可以使用以下任一库:

您可以找到第二个的详细教程。它是为特定的蓝牙硬件设计的,但它应该足以让您使用BLE


开放式L2CAP插座,用于低能耗通信 在C中,使用Bluez 首先,我们需要的所有变量,解释将在适当的位置进行

    int ssock = 0;
    int csock = 0;
    int reuse_addr = 1;
    struct sockaddr_l2 src_addr;
    struct bt_security bt_sec;
    int result = 0;
首先,我们需要创建一个套接字,可以从中接受连接。套接字系列是
PF_BLUETOOTH
,套接字类型是
SOCK_SEQPACKET
(我们希望有一个类似TCP的套接字,而不是原始套接字),协议是蓝牙协议L2CAP(
BTPROTO_L2CAP

我们希望确保it成功:

    if (ssock < 0) {
        perror("Opening L2CAP socket failed");
        return -1;
    }
设置SO_REUSEADDR选项将允许我们在必要时再次快速调用bind(可以省略此选项):

接下来,我们必须将套接字与刚才定义的源地址结构绑定。我们再次检查返回值,以确保它工作正常

    result = bind(ssock, (struct sockaddr*) &src_addr, sizeof(src_addr));
    if (result < 0) {
        perror("Binding L2CAP socket failed");
        return -1;
    }
现在我们可以告诉内核,我们的ssock是一个被动套接字,它将接受一个连接。第二个参数是backlog。如果您想了解更多,listen的主页包含您需要的所有信息

    result = listen(ssock, 10);
    if (result < 0) {
        perror("Listening on L2CAP socket failed");
        return -1;
    }
如果我们不希望任何其他设备连接,我们应该关闭服务器套接字。完成与设备的通信后,对csock执行相同的操作

    close(ssock);
    return csock;
}

C语言教程可以吗?或者只是寻找python?我在这里写了一个关于蓝牙文档的详细教程,它刚刚获得批准,但是如果你愿意,我可以在这里发布它作为答案。关于树莓pi和BLE没有什么特别的。只要看看Linux和BLE。linux中的蓝牙协议栈叫做Bluez。拉西:是的,我想这也会有帮助。非常感谢。我真的很想知道它是否是特定于RPi或者更像linux的东西。“昨天我发现了一些python for BLE的套接字编程教程。我将研究它们,然后根据需要修改。还有一件事,如果我读取一些文本文件中的传感器数据(因为linux中的所有内容都是文件).所以我应该通过BLE发送该文本文件。对吗?手机应用程序会读取该文本文件并对其进行处理。再次感谢您的指导。。
    setsockopt(ssock, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr));
    result = bind(ssock, (struct sockaddr*) &src_addr, sizeof(src_addr));
    if (result < 0) {
        perror("Binding L2CAP socket failed");
        return -1;
    }
    memset(&bt_sec, 0, sizeof(bt_sec));
    bt_sec.level = BT_SECURITY_MEDIUM;
    result = setsockopt(ssock, SOL_BLUETOOTH, BT_SECURITY, &bt_sec, sizeof(bt_sec));
    if (result != 0) {
        perrorno("Setting L2CAP security level failed");
        return -1;
    }
    result = listen(ssock, 10);
    if (result < 0) {
        perror("Listening on L2CAP socket failed");
        return -1;
    }
    memset(peer_addr, 0, sizeof(*peer_addr));
    socklen_t addrlen = sizeof(*peer_addr);
    csock = accept(ssock, (struct sockaddr*)peer_addr, &addrlen);
    if (csock < 0) {
        perror("Accepting connection on L2CAP socket failed");
        return -1;
    }
    printf("Accepted connection from %s", batostr(&peer_addr->l2_bdaddr));
    close(ssock);
    return csock;
}