# Ai-Thinker-BluFi-c3
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210311182721338.png)
# 一、前言
前面已经给大家带来了如何实现小程序WiFi+蓝牙控制ESP32-C3模组的原理,
- [小程序WiFi+蓝牙控制ESP32-C3模组文章](https://xuhong.blog.csdn.net/article/details/114676681)
借助小程序的浪潮,我们再开源一波,这篇给大家再开源一个小程序配网的代码;
--------------------
# 二、 Blufi乐鑫自研的蓝牙配网协议
BluFi 是一款基于蓝牙通道的 Wi-Fi 网络配置功能,适用于 ESP32。它通过安全协议将 Wi-Fi 配置和证书传输到 ESP32,然后 ESP32 可基于这些信息连接到 AP 或建立 SoftAP。
BluFi 流程的关键部分包括数据的分片、加密、校验和验证。
用户可按需自定义用于对称加密、非对称加密和校验的算法。这里我们采用 DH 算法进行密钥协商、128-AES 算法用于数据加密、CRC16 算法用于校验和验证。
## ESP32 配网流程
1. ESP32 开启 GATT Server 功能,发送带有特定 adv data 的广播。你可以自定义该广播,该广播不属于 BluFi Profile。
2. 使用手机 APP 搜索到该特定广播,手机作为 GATT Client 连接 ESP32。你可以决定使用哪款手机 APP。
3. GATT 连接建立成功后,手机向 ESP32 发送“协商过程”数据帧(详情见 BluFi 传输格式 )。
4. ESP32 收到“协商过程”数据帧后,会按照使用者自定义的协商过程来解
5. 析。
6. 手机与 ESP32 进行密钥协商。协商过程可使用 DH/RSA/ECC 等加密算法进行。
7. 协商结束后,手机端向 ESP32 发送“设置安全模式”控制帧。
8. ESP32 收到“设置安全模式”控制帧后,使用经过协商的共享密钥以及配置的安全策略对通信数据进行加密和解密。
9. 手机向 ESP32 发送“BluFi 传输格式”定义的 SSID、Password 等用于 Wi-Fi 连接的必要信息。
10. 手机向 ESP32 发送“Wi-Fi 连接请求”控制帧,ESP32 收到之后,识别为手机已将必要的信息传输完毕,准备连接 Wi-Fi。
11. ESP32 连接到 Wi-Fi 后,发送“Wi-Fi 连接状态报告”控制帧到手机,以报告连接状态。至此配网结束。
## 流程图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210412111840454.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hoODcwMTg5MjQ4,size_16,color_FFFFFF,t_70#pic_center)
---------------------
# 三、相关代码
## 3.1 蓝牙快速配网
这里是采用上述的BluFi原理做的一款小程序,效果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210413105116429.png)
功能特性如下:
1. 标准的乐鑫BluFi协议,支持ESP32和ESP32-C3模组配网,仅支持2.4G频段AP热点连接,支持双频路由器配网;
2. 跨平台特性,无关Android和IOS平台,真正实现一套代码多复用;
3. 过滤搜索蓝牙设备,筛选其他非BluFi协议的蓝牙设备,实现快速选择设备配网;
----------------
## 3.2 蓝牙本地控制
1. 乐鑫物联网操作框架 esp-idf 的 freeRtos 实时操作系统熟悉,包括任务创建/消息队列/进程间通讯;
2. 微信小程序开发基础,包括MQTT库/低功耗蓝牙API接口使用,包括搜索/连接/通讯;
3. 使用乐鑫封装 RMT 驱动层单线驱动WS2812B,实现彩虹等效果;
4. 对ESP32/C3芯片的外设开发熟悉,对BLE API接口使用熟悉,包括自定义广播/名字/自定义UUID;
<font size=4>**蓝牙控制代码**
设置蓝牙广播名字
```c
esp_ble_gap_set_device_name(TEST_DEVICE_NAME);
```
设置服务UUID
```c
gl_profile_tab[0].service_id.is_primary = true;
gl_profile_tab[0].service_id.id.inst_id = 0x00;
gl_profile_tab[0].service_id.id.uuid.len = ESP_UUID_LEN_16;
gl_profile_tab[0].service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_A;
```
主动通知上位机数据发生改动:
```c
case ESP_GATTS_READ_EVT:
{
esp_gatt_rsp_t rsp;
memset(&rsp, 0, sizeof(esp_gatt_rsp_t));
rsp.attr_value.handle = param->read.handle;
rsp.attr_value.len = 3;
rsp.attr_value.value[0] = red;
rsp.attr_value.value[1] = green;
rsp.attr_value.value[2] = blue;
esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, ESP_GATT_OK, &rsp);
break;
}
```
上位机主动发送数据到此并做出对应的处理:
```c
case ESP_GATTS_WRITE_EVT:
{
if (!param->write.is_prep)
{
ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, value len %d, value :", param->write.len);
esp_log_buffer_hex(GATTS_TAG, param->write.value, param->write.len);
//发送数据到队列
struct __User_data *pTmper;
sprintf(user_data.allData, "{\"red\":%d,\"green\":%d,\"blue\":%d}", param->write.value[0], param->write.value[1], param->write.value[2]);
pTmper = &user_data;
user_data.dataLen = strlen(user_data.allData);
xQueueSend(ParseJSONQueueHandler, (void *)&pTmper, portMAX_DELAY);
ESP_LOGI(GATTS_TAG, "%02x %02x %02x ", param->write.value[0], param->write.value[1], param->write.value[2]);
}
example_write_event_env(gatts_if, &a_prepare_write_env, param);
break;
}
```
<font size=4>**WiFi控制代码**
设置MQTT远程连接的参数
```c
/*
* @Description: MQTT参数连接的配置
* @param:
* @return:
*/
void TaskXMqttRecieve(void *p)
{
//连接的配置参数
esp_mqtt_client_config_t mqtt_cfg = {
.host = "www.xuhong.com", //连接的域名 ,请务必修改为您的
.port = 1883, //端口,请务必修改为您的
.username = "admin", //用户名,请务必修改为您的
.password = "xuhong123456", //密码,请务必修改为您的
.client_id = deviceUUID,
.event_handle = MqttCloudsCallBack, //设置回调函数
.keepalive = 120, //心跳
.disable_auto_reconnect = false, //开启自动重连
.disable_clean_session = false, //开启 清除会话
};
client = esp_mqtt_client_init(&mqtt_cfg);
esp_mqtt_client_start(client);
vTaskDelete(NULL);
}
```
服务器下发的处理数据,送往消息队列处理:
```
//服务器下发消息到本地成功接收回调
case MQTT_EVENT_DATA:
{
printf("TOPIC=%.*s \r\n", event->topic_len, event->topic);
printf("DATA=%.*s \r\n\r\n", event->data_len, event->data);
//发送数据到队列
struct __User_data *pTmper;
sprintf(user_data.allData, "%s", event->data);
pTmper = &user_data;
user_data.dataLen = event->data_len;
xQueueSend(ParseJSONQueueHandler, (void *)&pTmper, portMAX_DELAY);
break;
}
```
## 2.3 外设驱动
七彩灯WS2812B的驱动代码初始化:
```c
/**
* @description: 封装一层设置RGB灯效果
* @param {uint16_t} Red 入参 红色
* @param {uint16_t} Green 入参 绿色
* @param {uint16_t} Blue 入参 蓝色
* @return {*}
*/
void set_rgb(uint16_t Red, uint16_t Green, uint16_t Blue)
{
for (int i = 0; i < 24; i++)
{
strip->set_pixel(strip, i, Red, Green, Blue);
}
red = Red;
green = Green;
blue = Blue;
strip->refresh(strip, 10);
}
/**
* @description: 初始化LED
* @param {*}
* @return {*}
*/
void init_led()
{
rmt_config_t config = RMT_DEFAULT_CONFIG_TX(4, RMT_TX_CHANNEL);
// set counter clock to 40MHz
config.clk_div = 2;
ESP_ERROR_CHECK(rmt_config(&config));
ESP_ERROR_CHECK(rmt_driver_install(config.channel, 0, 0));
// install ws2812 driver
led_strip_config_t strip_co
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
嵌入式优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人单片机开发经验充足,深耕嵌入式领域,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明,项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要嵌入式物联网单片机相关领域开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注嵌入式领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【建议小白】: 在所有嵌入式开发中硬件部分若不会画PCB/电路,可选择根据引脚定义将其代替为面包板+杜邦线+外设模块的方式,只需轻松简单连线,下载源码烧录进去便可轻松复刻出一样的项目 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能
资源推荐
资源详情
资源评论
收起资源包目录
一个微信小程序-支持蓝牙快速配网+WiFi双控制ESP32-C3模组应用示范(皆可应用在毕设/课设/大作业/实训/竞赛/项目) (1236个子文件)
round.gif 259KB
mqtt.min.js 249KB
bn.js 85KB
aes.js 62KB
buffer.js 48KB
blueConnect.js 18KB
util.js 17KB
index.js 11KB
index.js 11KB
device.js 10KB
md5.min.js 9KB
index.js 9KB
index.js 8KB
index.js 8KB
index.js 8KB
index.js 8KB
index.js 8KB
index.js 8KB
index.js 7KB
index.js 7KB
index.js 7KB
index.js 7KB
index.js 7KB
index.js 7KB
index.js 7KB
index.js 6KB
index.js 6KB
index.js 6KB
index.js 6KB
index.js 6KB
index.js 5KB
search.js 5KB
index.js 5KB
index.js 5KB
index.js 5KB
index.js 5KB
index.js 4KB
index.js 4KB
index.js 4KB
transition.js 4KB
transition.js 4KB
index.js 4KB
index.js 4KB
index.js 4KB
utils.js 4KB
utils.js 4KB
base64-js.js 4KB
dh.js 4KB
index.js 4KB
index.js 4KB
index.js 4KB
index.js 4KB
index.js 3KB
index.js 3KB
transition.js 3KB
index.js 3KB
index.js 3KB
index.js 3KB
index.js 3KB
index.js 3KB
index.js 3KB
index.js 3KB
index.js 3KB
color_util.js 3KB
index.js 3KB
index.js 3KB
index.js 3KB
utils.js 3KB
utils.js 3KB
index.js 3KB
index.js 3KB
index.js 3KB
index.js 3KB
index.js 3KB
utils.js 3KB
index.js 3KB
index.js 3KB
dialog.js 3KB
dialog.js 3KB
utils.js 3KB
utils.js 3KB
index.js 3KB
index.js 3KB
index.js 2KB
miller-rabin.js 2KB
toast.js 2KB
toast.js 2KB
index.js 2KB
index.js 2KB
blueDevices.js 2KB
blueWifi.js 2KB
generatePrime.js 2KB
dialog.js 2KB
index.js 2KB
utils.js 2KB
index.js 2KB
index.js 2KB
index.js 2KB
utils.js 2KB
ieee754.js 2KB
共 1236 条
- 1
- 2
- 3
- 4
- 5
- 6
- 13
资源评论
阿齐Archie
- 粉丝: 3w+
- 资源: 2467
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Wkhtmltopdf python 包装器将 html 转换为 pdf.zip
- Windows 事件日志文件 (.evtx) 的纯 Python 解析器.zip
- jQuery实现一个加购物车飞入动画
- bootstrap企业网站前端模板下载
- 矩阵作业-包含Eigen安装相关内容
- CSS3几何透明层文本悬停变色特效代码.zip
- CSS3实现的九宫格图片鼠标悬停去除遮罩层特效源码.zip
- MQTT协议的原理、特点、工作流程及应用场景
- Ruby语言教程从介绍入门到精通详教程跟代码.zip
- PM2.5-Prediction-Based-on-Random-Forest-Algorithm-master.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功