Python Raspberry pi蓝牙-发送数据
在发布这篇文章之前,我试着寻找一个简单的程序,使用BLE和rapsberry pi发送任何类型的数据。但我了解的更多细节是,我知道有一些BLE库支持在RPi上使用Python编程。我是python网络编程新手,正在寻找教程。每一个教程都是关于如何使用BLE连接RPi和某种手机的。他们没有展示如何制作py脚本来发送一些传感器数据或类似的东西。请指导。请参阅下面的材料,这些材料是从我针对该主题创建的SO文档条目中复制的 最后,您基本上有一个类似TCP的套接字,可以通过它发送任何数据。但我建议您使用ATT和GATT协议(参见蓝牙规范)。所有BLE设备都应该使用这些协议,但是如果发送方和接收方都是由您编程的,那么您可以使用自己的,可能更简单的协议 这不是特定于RPi的,没有必要,因为几乎每个Linux发行版都使用相同的蓝牙堆栈,称为Bluez。您需要Python Raspberry pi蓝牙-发送数据,python,bluetooth,bluetooth-lowenergy,Python,Bluetooth,Bluetooth Lowenergy,在发布这篇文章之前,我试着寻找一个简单的程序,使用BLE和rapsberry pi发送任何类型的数据。但我了解的更多细节是,我知道有一些BLE库支持在RPi上使用Python编程。我是python网络编程新手,正在寻找教程。每一个教程都是关于如何使用BLE连接RPi和某种手机的。他们没有展示如何制作py脚本来发送一些传感器数据或类似的东西。请指导。请参阅下面的材料,这些材料是从我针对该主题创建的SO文档条目中复制的 最后,您基本上有一个类似TCP的套接字,可以通过它发送任何数据。但我建议您使用A
libbluetooth dev
软件包来开发自己的应用程序
对于Python,您可以使用以下任一库:
开放式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;
}