如何恢复 esp32 连接到 gatt 服务器

How to restore esp32 connections to gatt server

我正在构建一些由 ESP32 控制的物联网设备。我想通过 Android 应用程序进行实时控制。因为 WiFi 太耗电了(我的设备是电池供电的) 我决定使用 BLE 连接,这应该是更合适的选择。

我有 Xamarin Android 应用程序,它充当 GATT 服务器,因为它允许在我的应用程序中连接和聚合多个设备。 ESP32 设备在我发布广告时连接到服务器并正确接收通知,例如当我单击按钮时。 问题是我不知道如何管理用户退出应用程序时的情况。 如何恢复连接?在 android 设备上的本地数据库中保存一些 deviceId 是没有问题的,但是谁能告诉我应该采取什么步骤来实现以下结果:

用户将应用程序连接到设备,退出应用程序或离开蓝牙范围,当他再次打开它时,连接恢复,用户可以向设备发送一些数据。

在 ESP32 上似乎没有重新连接选项,而在 android 上理论上有但是当设备不是服务器而是客户端时(autoconnect = true) 可能我做错了(设备应该是服务器,但可以连接到多个设备并达到实时控制的效果?)

如有任何建议,我将不胜感激:)

使用 BLE,您无法从外围设备发起连接。中央设备负责发起和维护连接。因此,您有两种选择来实现您想要的:-

选项 1:如您所说,切换角色,使 Android 设备成为连接的中心。这样你就可以设置 autoconnect = true 这可能是更简单的选择。

选项2:保持角色,但在ESP32端添加代码,以便在断开连接时,ESP32切换到连续扫描模式,搜索Android 设备,一旦找到它,它就会重新连接。如果你想在 ESP32 上节省电池,那么你可以让它进入睡眠状态,只定期唤醒以进行快速扫描,以防 Android 设备再次可用。

所以经过一些研究和 Youssif 的回答后,我确实尝试切换角色,让 esp32 充当服务器,android 应用程序充当客户端。 (尽管起初看起来有悖常理)

事实证明,作为 android ble 客户端,有更多选择,我认为这是更受支持的路径。 Shiny.NET 我用来管理整个 BLE 事物的库很有可能使这个过程变得非常愉快(如果你通过糟糕的文档)。

这是实现我预期结果的路径:

  1. 创建某种视图,用户可以在其中扫描 esp32 设备
  2. 从扫描结果中获取与您的 esp32 匹配的外围对象,另一方面需要对其进行编程以宣传其存在
  3. 连接,如果可行 - 与 esp32 配对
  4. 保存esp32的UUID并将其存储在例如sqllite db中
  5. 做你的东西读取,写入适当的特征,获取通知等(作为客户端,你仍然可以随时向服务器发送数据(只需要连接)
  6. 现在,如果你离开 BLE 的范围,没问题,你应该在内存中有外围设备连接(或自动连接)到设备在范围内的时间
  7. 重要的部分 - 如果你离开你的应用程序或以其他方式完全丢失来自你的 esp32 的任何连接和数据 - 使用保存的 esp UUID 再次连接,无需扫描(并且没有 esp32 广告)
  8. 一次连接到多个设备也是可能的,你需要有某种外围设备列表并管理它们的状态和响应,这确实更难但可行,好的 BLE 库肯定会让它更容易
  9. 就是这样,您拥有可以几乎实时发送和接收数据的 BLE 控制设备

我没有使用任何特定的术语,因为这不是重点。我的应用程序是用 C# Xamarin 编写的,但同样的路径适用于原始 android 应用程序,这些只是实现细节。