在发布此贴之前,我试图寻找一种简单的程序,可以使用Rapsberry Pi通过BLE发送任何类型的数据。但是,随着我深入了解,我知道有一些BLE库支持在RPi上使用Python进行编程。我对Python网络编程很陌生,所以我正在寻找教程。每个教程都是关于如何连接RPi和某种手机使用BLE,它们并没有展示如何制作一个py脚本来发送一些传感器数据或类似的东西。请指导。
在发布此贴之前,我试图寻找一种简单的程序,可以使用Rapsberry Pi通过BLE发送任何类型的数据。但是,随着我深入了解,我知道有一些BLE库支持在RPi上使用Python进行编程。我对Python网络编程很陌生,所以我正在寻找教程。每个教程都是关于如何连接RPi和某种手机使用BLE,它们并没有展示如何制作一个py脚本来发送一些传感器数据或类似的东西。请指导。
libbluetooth-dev
包来开发自己的应用程序。 int get_l2cap_connection () {
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
)。 ssock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
if (ssock < 0) {
perror("Opening L2CAP socket failed");
return -1;
}
bluetooth.h
中定义为BDADDR_ANY
。为了将其复制到地址结构中,我们可以使用bacpy
函数。我们还需要设置地址族、地址类型和通道ID。 memset(&src_addr, 0, sizeof(src_addr));
bacpy(&src_addr.l2_bdaddr, BDADDR_ANY);
src_addr.l2_family = AF_BLUETOOTH;
src_addr.l2_bdaddr_type = BDADDR_LE_PUBLIC;
src_addr.l2_cid = htobs(CID_ATT);
设置SO_REUSEADDR选项将允许我们在必要时快速调用bind(这可以省略):
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;
}