gpt4 book ai didi

linux - Bluez:广告服务/gatt 服务器示例?

转载 作者:IT王子 更新时间:2023-10-29 00:14:55 27 4
gpt4 key购买 nike

目标

我正在开发一个运行 Linux 的简单设备。它支持 BLE,我目前使用的是 bluez 5.8。

我想使用 iPhone 在这个设备上触发一个 Action 。

已经有效的:

  • 我可以让 iPhone“看到”设备。
  • iPhone 也连接到设备。

我在 Linux 上像这样设置蓝牙设备(感谢 this question ):

# activate bluetooth
hciconfig hci0 up
# set advertise data: "hello world"
hcitool -i hci0 cmd 0x08 0x0008 48 45 4c 4c 4f 57 4f 52 4c 44
# start advertising as connectable
hciconfig hci0 leadv 0

iOS 代码很简单:

- (int) scanForPeripherals
{
if (self->centralManager.state != CBCentralManagerStatePoweredOn) {
return -1;
}
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], CBCentralManagerScanOptionAllowDuplicatesKey, nil];
[self.centralManager scanForPeripheralsWithServices:nil options:options];
return 0;
}

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
if (central.state == CBCentralManagerStatePoweredOn) {
NSLog(@"Starting scan");
[self scanForPeripherals];
}
}

- (void) centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
NSLog(@"didDiscoverPeripheral");
/*
* Retain the peripheral to avoid the error:
* CoreBluetooth[WARNING]: state = connecting> is being dealloc'ed while connecting
*/
self.activePeripheral = peripheral;
[centralManager connectPeripheral:peripheral options:nil];
}

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
NSLog(@"Connected to peripheral");

/* discover all services */
[peripheral discoverServices:nil];
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
NSLog(@"Discovered services");
for (CBService *service in peripheral.services) {
NSLog(@"Discovered service %@", service);
}
}

在 iPhone 上运行此代码时,我得到此日志:

2013-12-19 12:53:22.609 Test2[18518:60b] Starting scan
2013-12-19 12:53:29.945 Test2[18518:60b] didDiscoverPeripheral
2013-12-19 12:53:31.230 Test2[18518:60b] Connected to peripheral

所以看起来 iPhone 连接正常,但没有看到任何服务。

我错过了什么

  • 我需要宣传一个简单的 BLE 服务,但我找不到任何关于如何在 bluez 中执行此操作的文档。
  • 我想我需要像 gatt 服务器这样的东西来接收我要宣传的服务的读/写特征。我在 bluez 中看到了 plugins/gatt-example.c 文件,但我完全不知道如何使用它:没有文档。

我应该提到我看到了这个问题:Creating a gatt server ,但答案提出了太多问题(例如,bluez的GATT api在哪里?如何设置GATT数据库?如何注册读/写事件?)

编辑:我使用的命令仅设置 BLE 设备以通告一些数据,但 iOS 报告连接已被接受。 bluez 的哪一部分正在接受传入连接?

最佳答案

最终,我找到了所有问题的答案。

我将从回答最后一个问题开始:

我使用的命令仅设置 BLE 设备以通告一些数据,但 iOS 报告连接已被接受。 bluez 的哪一部分正在接受传入连接?

这个是 answered on the bluez mailing-list , 回应我。

总结:内核在 HCI 级别接受 BLE 连接。如果您想从用户空间使用该连接,则需要使用带有 ATT channel ID(即 4)的 l2cap 套接字。

Bleno has a good example of using an L2CAP socket .

L2CAP套接字的工作原理基本上是这样的:

/* create L2CAP socket, and bind it to the local adapter */
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) {
/* now select and accept() client connections. */
select(l2cap_socket + 1, &afds, NULL, NULL, &tv);
client_socket = accept(l2cap_socket, (struct sockaddr *)&l2cap_address, &len);

/* you can now read() what the client sends you */
int ret = read(client_socket, buffer, sizeof(buffer));
printf("data len: %d\n", 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_GROUP
0100: from handle 0001
ffff: to handle ffff
0028: with UUID 2800

此请求是任何 BLE 外设请求服务列表的方式。

然后,您可以使用您的设备提供的服务列表(根据 GATT 协议(protocol)格式化)来回答此请求。

再次,see the implementation of this in Bleno .

关于linux - Bluez:广告服务/gatt 服务器示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20682294/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com