1

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

我最好使用的 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 客户端。

服务器公开客户端扫描和订阅的一个属性。服务器可以通过通知客户端属性的更改来向客户端“发送”消息,并且可以通过客户端向属性发出写入请求来发送消息。

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

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

  • 我对 BLE 的理解是否正确,BLE 设备之间的大多数通信都是通过此类 GATT 服务器/客户端关系或通过 BLE 网状网络进行的?
  • 任何指向关于我在哪里可以阅读上面描述的更通用 API 的信息的指针(或者如果它已经存在,指向那个的指针)都会有所帮助。

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

4

1 回答 1

0

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

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

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

这两种方法的问题在于相对复杂性和供应商采用缓慢。因此,我的建议是继续使用 GATT 示例/应用程序,直到您更熟悉 BLE,然后继续使用其他通信方法。

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

您可能已经看过这个,但是 Zephyr 的入门 Gudie非常有用。然后,您可以在一个板上使用Central HR 示例,在另一个板上使用Peripheral HR 示例来获得双向沟通。完成此操作后,您可以开始自定义应用程序以满足您的需求。可以在此处找到所有蓝牙示例的列表。

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

我希望这有帮助。

于 2020-05-13T06:55:06.443 回答