一、概述
W801 是一款集成了 Wi-Fi 和蓝牙功能的芯片,本文将介绍如何利用 W801 的蓝牙功能,实现手机 APP 通过蓝牙配置 W801 连接的 Wi-Fi 名称和密码(即配网功能)。
二、文档查看:
demo使用手册这里很清楚:
![](https://i-blog.csdnimg.cn/direct/d4516120ac294dd99e34daf2e4ba6424.png)
直接按这个步骤操作即可
三、工具准备
只需要手机下载nRF connect即可,文档说应用商店可以直接下载,我反正是没找到。。
这里也是搜索了一下,把nRF connect下载的文章贴上:
四、代码编写
1、打开蓝牙demo的任务
直接按文档操作,打开BT任务:
![](https://i-blog.csdnimg.cn/direct/e971739340c44b7cbc3d85a0b96d40b2.png)
打开TLS_CONFIG_BLE、关闭宏定义 TLS_CONFIG_BR_EDR
![](https://i-blog.csdnimg.cn/direct/24f8eaa4b46f48e4b954be8f9bc361c8.png)
看手册的操作过程我们可以看到,是w801作server端,找到服务端的文件,然后只找到demo初始化,再点进去server的初始化:
![](https://i-blog.csdnimg.cn/direct/cbfa007b66f14687ba95978615c54b7e.png)
![](https://i-blog.csdnimg.cn/direct/b68b9ca636a3474cac5effc8f7912517.png)
点进gatt_demo_svr_svcs,可以看到,接收处理是gatt_svr_chr_demo_access_func这个函数
![](https://i-blog.csdnimg.cn/direct/9f30e1bc0ef742b29c14c48e50ab7413.png)
2、修改蓝牙接收函数
程序原来只把数据的16进制打印了出来(print_bytes),我加了打印长度和字符,因为现在要实现的是发送wifi名字和密码
![](https://i-blog.csdnimg.cn/direct/53c027c8991540e2a3b94570201e95d9.png)
3、打印log测试
①改完后编译烧写程序,按手册步骤开蓝牙:
![](https://i-blog.csdnimg.cn/direct/049432119a0a4e89b2130ef6bf754c3a.png)
②然后手机端用nRF connect,找到设备:
![](https://i-blog.csdnimg.cn/direct/f7dfe67f95374cfe89f9e3bab27c776c.jpeg)
③连接设备:
![](https://i-blog.csdnimg.cn/direct/1f2922fc6d6640fba6b369ffe2860ac4.jpeg)
④点击这里发送
![](https://i-blog.csdnimg.cn/direct/e3947c55bd8c4147a45a5498080ba122.jpeg)
我是之前就保存了,第一次点new 然后选择text,在值那里输入就好。
![](https://i-blog.csdnimg.cn/direct/e299cf0e171e4387a1ae6d073fdf803f.jpeg)
⑥查看串口打印log
方框上边的是连接成功打印的内容,方框内就是我们刚编写的测试代码。
![](https://i-blog.csdnimg.cn/direct/8abb5c0010f145c4928d1a9e6d02d190.png)
4、连接wifi
接收到wifi的名称和密码后,我本来想直接调用demo_connect_net的,但是在wm_ble_server_api_demo.c文件直接引用wm_demo_console.h的话会报错,看了下原因是会有重复定义,所以我直接在wifi连接的wm_connect_net_demo.c里边重新再定义了一个链接函数。
内容跟demo_connect_net一样,只是做了换名手术:
![](https://i-blog.csdnimg.cn/direct/fa2cf258530245daba20261041907a2c.png)
然后在wm_demo.h里边定义
![](https://i-blog.csdnimg.cn/direct/dae62b76e1a344a2b377cef94ee1bdf7.png)
蓝牙数据的接收函数里,简单作了一下数据判断,然后收到密码的时候直接调用connect_net,连接wifi,wifi_name和wifi_password两个数组我做了全局
![](https://i-blog.csdnimg.cn/direct/9b16baaf879b4995a1e021eed7a32a3c.png)
五、实测
下载程序后像上边一样,先串口输入t-bt-on,再输入t-ble-server-on,打开蓝牙服务
手机再连接,然后发送wifi的名称和密码,发送的内容从上边的程序也可以看出来
我下边保存的wifiname的数据内容是: name"双引号里是你的wifi名称",password的数据内容是: password"双引号里是你的wifi密码"
![](https://i-blog.csdnimg.cn/direct/f041bfd843a341aab458d032f1ddcecd.jpeg)
发送之后,查看串口打印的信息,把名称和密码都打印了出来,然后开始连接网络,这里能看出来是成功了
![](https://i-blog.csdnimg.cn/direct/6d044a75cc5a484192fc7f11a78997b9.png)
六、后续思考
这里实现的只是很简单的跑通这个用途,可优化和细节的地方有很多,例如打开蓝牙可以通过按键,而不是用串口来输入命令(用串口来输入命令那还不如直接输入wifi的连接指令),接收到wifi的名称和密码后可发送接收成功到手机app,连接成功也可以发送成功信息,还可以在wifi连接成功后执行mqtt的任务。