如何恢复与 gatt 服务器的 esp32 连接

时间:2021-08-01 21:45:09

标签: android arduino bluetooth-lowenergy esp32

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

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

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

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

我会感谢任何建议:)

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

所以经过一些研究和 Youssif 的回答后,我确实尝试切换角色并使 esp32 作为服务器和 android 应用程序作为客户端。 (尽管一开始似乎违反直觉)

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

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

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

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