我需要 ESP32 上的自动“身份验证”。我想通过蓝牙将特定手机连接到固件内的 ESP 来实现它。例如:我进入 ESP32 蓝牙连接的范围内,手机自动连接到该网络,ESP32 看到这一点,接收所连接设备的 MAC 地址和有关该设备的其他不可变数据(如果有),然后生成哈希值数据并将其与内存中存储的数据进行比较,如果哈希值相同,则将标志设置为 True;如果没有设备或连接了其他设备,则标志的值为 False;
我需要 ESP32 上的自动“身份验证”。我想通过蓝牙将特定手机连接到固件内的 ESP 来实现它。例如:我进入 ESP32 蓝牙连接的范围内,手机自动连接到该网络,ESP32 看到这一点,接收所连接设备的 MAC 地址和有关该设备的其他不可变数据(如果有),然后生成哈希值数据并将其与内存中存储的数据进行比较,如果哈希值相同,则将标志设置为 True;如果没有设备或连接了其他设备,则标志的值为 False;
在网上摸索了很长时间,我找到了一个更适合自己的解决方案。文章中描述了其实现:https://microkontroller.ru/esp32-projects/ispolzovanie-bluetooth-low-energy-ble-v-esp32-dl ya-soedineniya -s-fitnes-brasletom/ 发布于 01/30/2022由管理员新
感谢作者!
代码:
说明:ESP32模块程序的主要思想是使其成为蓝牙客户端,不断扫描蓝牙设备的电波,当它找到我们的服务器(健身手环)时,它会检查其硬件ID,如果是如果正确,则它将通过向引脚 13 发送适当的信号来打开灯。
乍一看,一切似乎很简单,但这里的问题是,所有 BLE 服务器的范围约为 10 米,这对于我们的项目来说是比较大的 - 毕竟,在这样的范围内,房间里的灯会在以下情况下打开:我们在另一个房间。
为了缩小 BLE 服务器的范围,我们将使用配对选项。仅当 BLE 服务器和 BLE 客户端之间的距离不超过 3-4 米时,它们才被视为已连接(“配对”)。这个距离已经非常适合我们的项目了。也就是说,在 ESP32 模块的程序中,我们不仅会扫描空间中是否存在 BLE 服务器,还会连接到它并与其“配对”。只要我们的 BLE 服务器和客户端保持“配对”,交流灯就会保持亮起状态。一旦它们之间的距离超过“配对”半径,灯就会关闭。
文章最后给出了该程序的完整代码,但这里我们将简单看一下它的主要片段。
在程序代码中连接必要的库后,我们在程序中指示我们之前使用 nRF connect 应用程序获得的 BLE 地址、服务和特征 UUID。接下来,在设置函数中,我们初始化串行通信并启用 ESP 模块中的 BLE 来扫描电波。扫描完成后,将为每个检测到的设备调用 MyAdvertishedDeviceCallbacks 函数。
当我们使用固定电源为 ESP32 模块供电时,我们将使用主动扫描空气;当使用电池供电时,我们将关闭它以节省功耗。继电器的触发触点连接到模块的引脚13,因此对于该引脚,我们将工作模式设置为数据输出。在 MyAdvertizedDeviceCallbacks 函数中,我们将显示在串行通信监视器窗口中检测到的 BLE 设备的名称和其他信息。我们需要检测到的设备的硬件 ID - 我们会将其与预定值(即与我们需要的值)进行比较。因此,我们将使用 Server_BLE_Address 变量来获取设备地址,然后将 BLEAddress 类型转换为字符串。在循环函数内,我们将扫描空气 3 秒,并将扫描结果放置在foundDevices 对象中,该对象是 BLEScanResults 类的对象。如果我们在扫描过程中检测到一台或多台设备,我们将检查这些设备的 BLE 地址是否与我们需要的地址匹配。如果地址匹配,但设备之前尚未“配对”,我们将尝试使用 connectToserver 函数将它们“配对”。我们还将在串行通信监视窗口中显示一些信息以供调试之用。在 connectToserver 函数中,我们将使用 UUID 来连接/“配对”我们的 BLE 服务器和客户端。我们的客户端是ESP32模块,因此我们使用createClient()函数在程序中创建它,然后连接到BLE服务器地址。接下来,我们使用 UUID 值搜索服务和特征并尝试连接。当连接成功建立时,该函数将返回true,如果连接未建立,则返回false。请注意,无需知道服务和特征 UUID 即可与服务器“配对”;我们在此将其用于教育目的。如果连接成功建立,那么我们将向引脚13施加高电平,并使用break命令将控制权转移到循环函数之外。逻辑变量paired将被设置为true。设备“配对”成功并将引脚 13 设置为高电平后,我们需要检查设备是否在我们的范围内。由于我们的设备已经“配对”,扫描 BLE 设备将无法再看到该设备。只有当佩戴手环的用户离开我们的操作区域时,我们才能通过扫描找到它。因此,我们需要检查这一事实,如果我们发现 BLE 服务器超出了 ESP32 模块的范围,我们将引脚 13 设置为低电平并将配对变量设置为 false。
重新编写上面的代码后,可以大大简化并加快速度。我附上带有评论的编辑版本: