ESP32学习笔记 -- 使用蓝牙BluFi进行设备配网

时间:2023-03-14 15:16:01 买帖  | 投诉/举报

篇首语:本文由小编为大家整理,主要介绍了ESP32学习笔记 -- 使用蓝牙BluFi进行设备配网相关的知识,希望对你有一定的参考价值。

嵌入式软件工程师使用ESP32进行物联网开发,有些内容是必须要学习的,比如网络通信TCP/IP、UDP,应用层协议HTTP,MQTT,设备升级操作OTA,设备配网操作BluFi和SmartConfig,还有一系列物联网相关的知识点,如下图前几天在微信群里面讨论的:

 今天来分享一下,如何通过蓝牙BluFi进行ESP32设备配网。

首先回答一下,为什么要进行配网?这是因为,现在很多联网设备都是没有屏幕和键盘的,比如天猫精灵、小爱同学这些智能音箱,还有一些可联网的灯具,等等。要让这些设备知道家里路由器的账号和密码,就不能像带屏设备一样直接输入,而是要通过一些特定的方法,把路由器的账号和密码告知这些待联网的设备。

现在很多WiFi SOC,基本上都支持SmartConfig这种配网方式,这种方式是基于UDP来传递路由器的WiFi配置信息的。而玩过ESP32的工程师都知道,ESP32支持WIFI和蓝牙双模,所以,ESP32支持使用蓝牙(BluFi)来传输WiFi配置信息,而且这种方式更加安全稳定可靠。

关于ESP32的蓝牙配网BluFi使用文档,官方已经有比较详细的描述,在官方的ESP32-IDF框架里面,也提供了参考的例程。参考例程的路径如下:esp-idf/examples/bluetooth/blufi

官方参考文档链接:

https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/blufi.html

文档对新手初学者来说不太友好,因为里面涉及了很多基本的概念,比如数据分片,对称/非对称加密,校验和验证,BLE蓝牙广播,蓝牙连接与数据传输过程,BLE GATT客户端和服务器。

官方文档提供了一个BluFi配网流程图,整个流程大致可以分为4个阶段,这四个阶段如下图所示:

 第①阶段:ESP32发出特定的数据广播,手机搜索出这个特定广播并与ESP32建立蓝牙连接,蓝牙连接建立后手机获取GATT服务,此时,BLE通信链路已建立。

第②阶段:基于①阶段建立的蓝牙链路,进行通信密钥协商,这个协商过程是基于非对称加密的DH算法,得出一对密钥,这对密钥是提供给第③阶段使用的。

第③阶段:第②阶段协商过程结束后得出的密钥,可以用于第③阶段WiFi配置信息的传输加密,这些配置信息包括ESP32的工作模式,安全模式,WiFi账号和密码,其他信息,等等。

第④阶段:第③阶段结束后,ESP32已经完成了基本的信息配置,最后向手机报告自身的连接状态,此时配网完成,配网过程结束,ESP32与手机的蓝牙连接依旧保持。

ESP32使用BluFi进行配网,由于BLE蓝牙的数据载荷限制,一个数据帧传输的数据量比较有限,因此,BluFi在传输配网信息过程中,需要遵循一定的数据格式,这些数据格式,在官方文档里面有很详细的描述,如下图所示。

 以上这些数据格式的分包和组包,在ESP32提供的BluFi Demo里面已经有参考代码,开发者可以适当参考一下整个分包和组包的过程,而对于应用开发来说,这些过程是封装好的,应用层不需要过于关心,大概了解即可。

ESP32对数据传输的安全性和稳定性是比较重视的,为了保证数据安全,在密钥协商的时候,用了非对称加密DH算法,在WiFi配置数据传输的时候,用了对称加密AES-128。为了保证数据完整,使用了CRC校验和算法。还有一系列保证身份安全和防止重放攻击的算法。

开发者可以根据自身的实际需要,在BluFi代码里面使用不同的加解密算法,如下图所示。

 分析一下BluFi的源代码,app_main是源码入口函数,在这个函数里面,主要进行了前期的一些必要初始化工作,包括NVS初始化,WIFI使用默认参数初始化,BLE使用默认参数初始化,获取BluFi的版本,以及注册相关的回调函数,具体如下图所示。

 WiFi事件和IP事件处理,这两个处理函数在用到WiFi联网的时候,几乎是必须的,因为应用层需要时刻关注WiFi的连接和断连情况,以及IP的获取情况,以便判断网络是否出现异常,在进行WiFi初始化的时候,需要注册这两个事件回调函数,如下图所示。

 WiFi事件处理函数wifi_event_handler和IP事件处理函数ip_event_handler,由于代码篇幅太长,具体实现请查看源码工程。

BluFi工程里面还有一个重要的事件回调函数,是用来处理BluFi事件的,包括BluFi初始化完成事件,蓝牙连接成功和断开连接事件,配置WiFi工作模式事件,获取WiFi账号密码事件,使用BLE传输用户数据事件,等等,具体实现如下图所示。

 开发者还可以使用BLE链路来传输收发一些用户数据,在示例工程里面,我们把ESP32接收到的手机端收据,完整地回传到手机端,代码函数接口如下图所示。

 整个工程源码已经上传到Gitee,可以使用以下命令进行下载:

git clone https://gitee.com/embediot/esp32_test_demo.git

以上是关于ESP32学习笔记 -- 使用蓝牙BluFi进行设备配网的主要内容,如果未能解决你的问题,请参考以下文章