最终,我找到了所有问题的答案。
我将从回答最后一个问题开始:
我仅使用命令设置BLE设备来通告一些数据,但iOS报告已接受连接。 bluez的哪一部分接受传入连接?
这一次是回答的bluez邮件列表上,以响应我。
简介: 内核在HCI级别接受BLE连接。如果要从用户空间使用该连接,则需要使用具有ATT通道ID(为4)的l2cap套接字。
Bleno有一个使用L2CAP套接字的很好的例子。
L2CAP套接字的工作原理基本上是这样的:
l2cap_socket = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);hci_device_id = hci_get_route(NULL);hci_socket = hci_open_dev(hci_device_id);memset(&l2cap_address, sizeof(l2cap_address));l2cap_address.l2_family = AF_BLUETOOTH;l2cap_address.l2_bdaddr = hci_device_address;l2cap_address.l2_cid = htobs(ATT_CID);bind(l2cap_socket, (struct sockaddr*)&l2cap_address, sizeof(l2cap_address));listen(l2cap_socket, 1);while (1) { select(l2cap_socket + 1, &afds, NULL, NULL, &tv); client_socket = accept(l2cap_socket, (struct sockaddr *)&l2cap_address, &len); int ret = read(client_socket, buffer, sizeof(buffer)); printf("data len: %dn", ret); for (i = 0; i < ret; i++) { printf("%02x", ((int)buffer[i]) & 0xff); } printf("n"); close(client_socket);}如何宣传服务?
我意识到我需要对上一个问题的答案才能回答这个问题。
一旦您可以通过L2CAP套接字读取数据,一切都会变得更有意义,例如,如果您的Android手机可以读取数据
gatt.discoverServices(),则上面的小程序将读取(即接收):
10 0100 ffff 0028
这基本上意味着:
10: READ_BY_GROUP0100: from handle 0001ffff: to handle ffff0028: with UUID 2800
此请求是任何BLE外围设备将请求服务列表的方式。
然后,您可以使用设备提供的服务列表(根据GATT协议格式化)来回答此请求。
再次,请参见Bleno中的实现。



