Zephyr OS:通用 BLE API

Zephyr OS: General BLE API

我正在尝试编写一个小的 Zephyr OS 运行时系统,它使用 BLE 在我的两个 nrf52840dk 板之间进行通信。在过去的几天里,我一直在阅读 BLE 并熟悉 GATT servers/clients。

我希望 API 看起来像这样:

/* Send a message to conn */
void send(struct bt_conn *conn, void* data, u16_t len);

/* Callback which is invoked when a message is received from conn */
void recv(struct bt_conn *conn, void* data, u16_t len);

我设法做到的是通过将我的系统限制为两台设备来实现类似的效果,一台是 GATT 服务器,一台是 GATT 客户端。

服务器公开一个属性,客户端扫描并订阅。服务器可以 'send' 向客户端发送一条消息,通知它有关属性的更改,也可以通过向属性发出写请求的客户端发送消息。

客户端可以通过写入属性向服务器发送消息,同时它可以通过服务器接收消息,通知它订阅的属性有更新。

我认为诸如此类的原语必须存在于 GATT 层之下(在 HCI 层中?),但 Zephyr 文档在大多数地方都非常稀疏。接下来,我有两个问题。

编辑:我接受了 Youssif 的回答。他的回答连同下面的评论充分回答了我的问题。

我对 BLE 的理解是否正确,BLE 设备之间的大多数通信都是通过此类 GATT server/client 关系或通过 BLE 网状网络进行的?

您是正确的,因为大多数应用程序都将使用 GATT server/client 关系。这是因为在 2010 年推出低功耗蓝牙时(后来在 2011 年通过 CoreBluetooth 与 iPhone 4s 一起推出),这是唯一的通信方式。从那时起,BLE 的后续版本引入了更新的通信方法:-

  • LE L2CAP(在 2013 年 BT v4.1 中引入),其中较低级别的通信通道用于快速和直接的数据传输。
  • LE Mesh(2017 年推出),其中大部分通信基于 BLE 广告,因此理论上任何 v4.0 设备都可以支持它。

这两种方法的问题是相对复杂且供应商采用缓慢。因此,我的建议是继续使用 GATT examples/applications,直到您更加熟悉 BLE,然后再继续使用其他通信方法。

任何关于我可以在哪里阅读我上面描述的更通用 API 的信息的指针(或者如果它已经存在,指向它的指针)都会有所帮助。

你可能已经看过了,但是 Getting Started Gudie of Zephyr is quite useful. You can then use the Central HR example on one board and the Peripheral HR example on the other to get two way communication. Once this is done you can start customising your applications to match your needs. A list of all Bluetooth examples can be found here.

以下是 Zephyr 中 BLE 开发的更多资源:-

希望对您有所帮助。