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



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

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

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

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

我将感谢任何建议:)

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

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

选项2:维持角色,但在ESP32端添加代码,这样在断开连接时,ESP32切换到连续扫描模式,搜索Android设备,一旦找到就会重新连接。如果你想在ESP32上节省电池,那么你可以让它进入睡眠状态,只在Android设备再次可用的情况下周期性地醒来做一个快速扫描。

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

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

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

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

我没有使用任何具体的术语,因为这不是重点。我的应用程序是用c# Xamarin编写的,但同样的路径是原生android应用程序,这些只是实现细节。

最新更新