ESP32的SDK开发之blufi一键配网

2023-05-16

 

 

        ESP32 是集成 2.4 GHz Wi-Fi 和蓝牙双模的单芯片方案,采用台积电 (TSMC) 超低功耗的 40 纳米工艺,拥有最 佳的功耗性能、射频性能、稳定性、通用性和可靠性,适用于各种应用和不同功耗需求。

        ESP32这款模块可以说在物联网开发硬件中性价比极高的,开发应用可以说无所不能了,这里就不一一介绍了。

        ESP32支持一键配网方式有3中,airkiss、smartconfig、blufi,本文主要讲讲blufi这种方式。

        由于加密和检验过程较为繁琐,暂时采用无检验无加密的方式实现。

        blufi是基于低功耗蓝牙BLE实现的一种配网方式,下面来详细解答一下乐鑫官方blufi的协议,官方说明文档。

传输格式

DescriptionValue
LSB - Type1
Frame Control1
Sequence Number1
Data Length1
Data${Data Length}
MSB - CheckSum2

1、Type

类型域,占 1 byte。分为 Type 和 Subtype(子类型域)两部分, Type 占低 2 bit,Subtype 占高 6 bit。

Type(低 2 bit):=0,为控制命令,=1,为数据命令

Subtype (高 6 bit):根据低2位的Type命令选择相应的Subtype,具体见官方说明文档。

2、Frame Control

帧控制域,占 1 byte,每个 bit 表示不同含义,具体见官方说明文档。

3、Sequence Control

序列控制域。帧发送时,无论帧的类型是什么,序列 (Sequence) 都会自动加 1,用来防止重放攻击 (Replay Attack)。每次重现连接后,序列清零。

4、Length

Data 域的长度,不包含 CheckSum。

5、Data

不同的 Type 或 Subtype,Data 域的含义均不同。请参考官方说明文档。

6、CheckSum

此域为 2 byte 的校验,用来校验『序列 + 数据长度 + 明文数据』。

软件实现:位置:blufilibrary->java->blufi.espressif->BlufiClientlmpl.java->getPostBytes()

 

具体软件实现操作

1、ESP32进入blufi模式

     串口打印

[0;32mI (12509942) BLUFI_EXAMPLE: BD ADDR: 30:ae:a4:f1:ee:7e
[0m
[0;32mI (12509952) BLUFI_EXAMPLE: BLUFI VERSION 0102
[0m
[0;32mI (12509952) BLUFI_EXAMPLE: BLUFI init finish
[0m
[0;32mI (12515562) BLUFI_EXAMPLE: BLUFI ble connect
[0m

2、蓝牙连接成功

     串口打印

[0;32mI (12515562) BLUFI_EXAMPLE: BLUFI ble connect
[0m

3、手机发送将要连接的AP的password,具体说明请参考官方说明文档。

  1.      Byte[0]=0x01;      //加载命令,0x01为数据命令,0x00为控制命令
  2.      Byte[0]=(0x03<<2) |  Byte[0];      //加载数据帧,0x03表示发送AP的password
  3.      Byte[1]=0x00;      //加载帧控制域,无检验,无加密
  4.      Byte[2]=sequence++;     //序列控制域,没发送一次加1
  5.      Byte[3]=8;     //数据长度
  6.      Byte[4]='p';     //data1,密码
  7.      Byte[5]='a';     //data2,密码
  8.      Byte[6]='s';     //data3,密码
  9.      Byte[7]='s';     /data4,/密码
  10.      Byte[8]='w';     //data5,密码
  11.      Byte[9]='o';     //data6,密码
  12.      Byte[10]='r';     //data7,密码
  13.      Byte[11]='d';     //data8,密码
  14.      Byte[12]=checksumLSB;     //data7,检验低位,无检验可以不要
  15.      Byte[13]=checksumHSB;     //data8,检验高位,无检验可以不要

串口打印

协议出错,error code 1表示检验出错

[0;31mE (12704272) BT_BTC: btc_blufi_recv_handler checksum error 7478, pkt 0262
[0m
[0;31mE (12704272) BLUFI_EXAMPLE: BLUFI report error, error code 1
[0m

发送成功

[0;32mI (12978592) BLUFI_EXAMPLE: Recv STA PASSWORD password
[0m

4、手机发送将要连接的AP的SSID,具体说明请参考官方说明文档。

  1.      Byte[0]=0x01;      //加载命令,0x01为数据命令,0x00为控制命令
  2.      Byte[0]=(0x02<<2) |  Byte[0];      //加载数据帧,0x02表示发送AP的SSID
  3.      Byte[1]=0x00;      //加载帧控制域,无检验,无加密
  4.      Byte[2]=sequence++;     //序列控制域,没发送一次加1
  5.      Byte[3]=4;     //数据长度
  6.      Byte[4]='m';     //data1,密码
  7.      Byte[5]='y';     //data2,密码
  8.      Byte[6]='A';     //data3,密码
  9.      Byte[7]='P';     /data4,/密码
  10.      Byte[8]=checksumLSB;     //data7,检验低位,无检验可以不要
  11.      Byte[9]=checksumHSB;     //data8,检验高位,无检验可以不要

串口打印

协议出错,error code 1表示检验出错

[0;31mE (12704272) BT_BTC: btc_blufi_recv_handler checksum error 7478, pkt 0262
[0m
[0;31mE (12704272) BLUFI_EXAMPLE: BLUFI report error, error code 1
[0m

发送成功

[0;32mI (13109342) BLUFI_EXAMPLE: Recv STA SSID myAP
[0m

5、ESP32模组开始连接AP,具体说明请参考官方说明文档。

  1.      Byte[0]=0x00;      //加载命令,0x01为数据命令,0x00为控制命令
  2.      Byte[0]=(0x03<<2) |  Byte[0];      //加载控制帧,0x03表示连接AP
  3.      Byte[1]=0x00;      //加载帧控制域,无检验,无加密
  4.      Byte[2]=sequence++;     //序列控制域,每发送一次加1
  5.      Byte[3]=7;     //数据长度,控制帧无需data
  6.      Byte[4]='m';     //data1,密码,控制帧无需data
  7.      Byte[5]='y';     //data2,密码,控制帧无需data
  8.      Byte[6]='A';     //data3,密码,控制帧无需data
  9.      Byte[7]='P';     /data4,/密码,控制帧无需data
  10.      Byte[8]=checksumLSB;     //data7,检验低位,无检验可以不要
  11.      Byte[9]=checksumHSB;     //data8,检验高位,无检验可以不要

串口打印

协议出错,error code 1表示检验出错

[0;31mE (12704272) BT_BTC: btc_blufi_recv_handler checksum error 7478, pkt 0262
[0m
[0;31mE (12704272) BLUFI_EXAMPLE: BLUFI report error, error code 1
[0m

发送成功,如果wifi名称和密码正确,服务器没问题,后续就会有下面的串口打印,同时模组会把模组的mac地址和连接的AP名称反馈回来,如下图是安卓客户端的界面

[0;32mI (13528252) BLUFI_EXAMPLE: BLUFI requset wifi connect to AP
[0m
I (13528382) wifi: n:1 1, o:1 0, ap:255 255, sta:1 1, prof:1
I (13529382) wifi: state: init -> auth (b0)
I (13529382) wifi: state: auth -> assoc (0)
I (13529392) wifi: state: assoc -> run (10)
I (13529632) wifi: connected with guichuankeji, channel 1
I (13529632) wifi: pm start, type: 1

[0;32mI (13530432) event: sta ip: 192.168.1.100, mask: 255.255.255.0, gw: 192.168.1.1[0m
[0;31mE (13530432) MQTT_EXAMPLE: Start MQTT_TCP……[0m
[0;32mI (13530432) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE[0m
[0;32mI (13532642) MQTT_CLIENT: Sending MQTT CONNECT message, type: 1, id: 0000[0m
[0;32mI (13532942) MQTT_EXAMPLE: MQTT_EVENT_CONNECTED[0m
[0;32mI (13532952) MQTT_EXAMPLE: sent subscribe successful, msg_id=35098[0m
[0;32mI (13533122) MQTT_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=35098[0m

到这里表示配网成功……

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32的SDK开发之blufi一键配网 的相关文章

  • 笔记:VSCode C/C++ 格式化修改设置

    VSCode安装C C 43 43 插件后 xff0c 就有了格式化代码的能力 xff0c 这个功能很好用 xff0c 一般来说不用改就可以用的很嗨皮 为啥要改默认设置 xff0c 只因不喜欢函数内大括号独占一行 xff0c 如此一屏显示的
  • NEMA 协议:GPRMC数据格式

    NEMA协议的由来 NMEA协议是为了在不同的GPS xff08 全球定位系统 xff09 导航设备中建立统一的BTCM xff08 海事无线电技术委员会 xff09 标准 xff0c 由美国国家海洋电子协会 xff08 NMEA The
  • 大小端(网络字节序)等概念

    1 大小端定义 大端存储模式 xff1a 是指数据的低位字节序保存在内存的高地址中 xff0c 而数据的高位字节序保存在内存的低地址中 小端存储模式 xff1a 是指数据的低位字节序保存在内存的低地址中 xff0c 而数据的高位字节序保存在
  • [李景山php]RHEL\CentOS 7\ubuntu16.04 下 MySQL 连接数被限制为214个

    问题 项目中 xff0c 由于连接数过多 xff0c 提示 Too many connections xff0c 需要增加连接数 我在 etc my cnf中修改了 max connections 61 2000 但是 xff0c 实际连接
  • 关系型数据库和非关系型数据库的特性以及各自的优缺点

    数据库 类型特性优点缺点关系型数据库 SQLite Oracle mysql1 关系型数据库 xff0c 是指采用了关系模型来组织 数据的数据库 xff1b 2 关系型数据库的最大特点就是事务的一致性 xff1b 3 简单来说 xff0c
  • 采用libuv的epoll方式实现的异步高性能libcurl发送数据的方法

    Libcurl较为基本的用法是easyinterface xff0c 它是最简单的同步接口 xff0c 容易理解 xff0c 实现代码简单 xff0c 但是性能低下 curl multi perform 43 select xff1a 可以
  • 各种浏览器语言包、国际化如何配置

    size 61 large 如果web项目使用了国际化多语言包 xff0c 切换浏览器语言包可以切换语言 xff1a color 61 red Firefox如何中英文切换 color 首先得下载语言包 xff0c 网址 xff1a url
  • libcurl采用curl_multi_perform() + curl_multi_wait()方式实现异步高性能l发送数据的方法

    前两篇文章 c c 43 43 调用libcurl库发送http请求的两种基本用法 采用libuv的epoll方式实现的异步高性能libcurl发送数据的方法 讲述了采用libcurl发送数据的基础方法和高性能方法 xff0c 基础方法较为
  • 网络库libevent、libev、libuv对比

    Libevent libev libuv 三个网络库 xff0c 都是c 语言实现的异步事件库Asynchronousevent library xff09 异步事件库本质上是提供异步事件通知 xff08 Asynchronous Even
  • 记flume部署过程中遇到的问题以及解决方法(持续更新)

    项目需求是将线上服务器生成的日志信息实时导入kafka xff0c 采用agent和collector分层传输 xff0c app的数据通过thrift传给agent xff0c agent通过avro sink将数据发给collector
  • c++11多线程编程(一):创建线程的三种方法

    c 43 43 11线程库 原始的c 43 43 标准仅支持单线程编程 xff0c 新的c 43 43 标准 xff08 c 43 43 11或c 43 43 0x xff09 于2011年发布 xff0c 引入了新的线程库 编译器要求 L
  • c++11多线程编程(六):事件处理

    本节讨论在多线程环境下的事件处理 有时 xff0c 线程需要等待某事件发生 xff0c 比如一个条件变为true xff0c 或者某任务被另一个线程完成 例如 xff0c 我们创建一个基于网络的应用程序 xff0c 处理如下的任务 xff1
  • C++11智能指针(六):unique_ptr介绍与例子

    本节介绍下c 43 43 11提供的智能指针实现 std unique ptr lt gt 什么是std unique ptrunique ptr lt gt 是c 43 43 11提供的智能指针实现之一 xff0c 用于防止内存泄漏 un
  • RabbitMQ图解

    RabbitMQ是一个消息队列软件 xff0c 称为消息代理或队列管理器 简单地说 xff0c 这是一个可以定义队列的软件 xff0c 应用程序可以连接到队列并将消息传输到队列中 消息可以包括任何类型的信息 例如 xff0c 它可以具有从另
  • RabbitMQ C 客户端收发数据实例解析

    rabbitmq c客户端 xff0c github地址 xff1a https github com alanxz rabbitmq c rabbitmq c是一个C语言操作的AMQP客户端库 xff0c 用来与RabbitMQ brok
  • php curl知识点

    如果不支持https可以试试关掉ssl curl setopt ch CURLOPT SSL VERIFYHOST 0 curl setopt ch CURLOPT SSL VERIFYPEER 0 编译curl的时候开启ssl with
  • 大小端字节序知识详解

    计算机硬件有两种储存数据的方式 xff1a 大端字节序 xff08 big endian xff09 和 小端字节序 xff08 little endian xff09 举例 xff1a 数值0x2211使用两个字节储存 xff1a 高位字
  • URL转义及编码

    js对文字进行编码涉及3个函数 xff1a escape encodeURI encodeURIComponent xff0c 相应3个解码函数 xff1a unescape decodeURI decodeURIComponent url
  • 从C到C++高级过渡

    当做速学笔记使用 简写 基础篇 环境设置 g 43 43 有些系统默认是使用 C 43 43 98 xff0c 我们可以指定使用 C 43 43 11 来编译 main cpp 文件 xff1a g span class token ope
  • 收藏!了解UART总线工作原理看这一篇就够了!

    原文 xff1a 玩转单片机 2019 08 24 16 50 29 越学到后面 xff0c 基础知识更加不能忘记 xff0c 温故而知新 还记得当年的打印机 xff0c 鼠标和调制解调器吗 xff1f 他们都有巨大笨重的连接器和粗电缆 x

随机推荐

  • extern "C"在DLL导出函数时有什么作用?

    extern是c c 43 43 语言中表明函数和全局变量作用范围的关键字 该关键字告诉编译器 xff0c 其声明的函数和变量可以在本模块或其他模块中使用 通常 xff0c 在模块的头文件中对本模块提供给其他模块引用的函数和全局变量以关键字
  • MPU6050六轴传感器的原理及编程说明

    一 xff0e 简介 MPU6050 是 InvenSense 公司推出的整合性 6 轴运动处理组件 xff0c 其内部整合了 3 轴陀螺仪和 3 轴加速度传感器 xff0c 并且含有一个IIC 接口 xff0c 可用于连接外部磁力传感器
  • mysql-mysqlbinlog的使用详解

    一 背景 二进制日志在MySQL数据库中有着至关重要的作用 xff0c 而读取二进制日志的工具就显得同样重要了 xff0c 官方的mysqlbinlog就是读取二进制日志的工具 xff0c 这里就结合官网和自己的实践整理一下 xff08 P
  • mongo-db相关方法

    一 参数 名称 描述 db adminCommand 针对 admin数据库运行命令 db aggregate 运行不需要基础集合的管理 诊断管道 db cloneDatabase hostname 不推荐使用 当针对MongoDB 4 0
  • Django-django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found 3.7.17)

    运行Django报错 xff0c 原因是因为SQLite版本过低 xff0c 需要升级 下载源码包 xff1a wget https www sqlite org 2021 sqlite autoconf 3350500 tar gz xf
  • TIDB-Error 1105: Out Of Memory Quota问题解决

    一 背景 复杂sql查询报错 二 原因 单条s q l使用内存默认为1G 三 解决 tiup cluster edit config tidb test server configs tidb mem quota query 4294967
  • Kafka-offset链接kafka链接不上

    是在kafka的broker配置server properties的listeners改为listeners 61 PLAINTEXT kafka ip 9092 kafka ip要写具体IP xff0c 不要写localhost
  • python-加密解密

    一 安装对应的库 pip span class token function install span pycryptodome 二 加密和解密的步骤 span class token comment 加密 span def cry pas
  • Js闭包理解、运用

    br onClick function br var pageNum 61 sourcePageNum br return function node br getChildSources node pageNum br pageNum 6
  • 关于C++ 的无名对象

    include lt iostream gt using namespace std class A public explicit A int val m val val cout lt lt 34 call 1 34 lt lt end
  • pt工具的使用(7) pt-archiver的使用

    一 描述 pt archiver 是归档表的工具 xff0c 在 sql 中写入高效归档和清除作业 目标是在不对 OLTP 查询产生太大影响的情况下 xff0c 将旧数据从表中蚕食掉 xff0c 从而实现低影响 仅向前的作业 您可以将数据插
  • linux-node_exporter突然挂掉(couldn‘t get dbus connection)

    一 背景 突然收到一台机器挂掉的告警 xff0c 去上面查看发现机器正常 xff0c uptime正常 xff0c 没有重启情况 xff0c UID 20029的用户是tidb su tidb的时间较长 xff0c node exporte
  • pt工具的使用(1) pt工具的安装

    PT工具是使用Perl语言编写和执行的 xff0c 所以需要系统中有Perl环境 rpm qa perl DBI perl DBD MySQL perl Time HiRes perl IO Socket SSL 检查是否已经安装pt工具所
  • 使用move_base进行路径规划

    本文所实现的效果来自 ROS入门实例 xff0c 对初学者会有一定帮助 move base是ROS环境下一个重要的功能包 xff0c 可以使机器人在指定框架内移动到目标位置 xff0c 是实现后续导航功能的基础 xff0c 很多人想学习gm
  • iperf3-带宽测试工具的详细使用说明

    软件简介 xff1a iperf3 是一个 TCP UDP 和 SCTP 网络带宽测量工具 是用于主动测量 IP 网络上可达到的最大带宽的工具 它支持调整与时序 xff0c 协议和缓冲区有关的各种参数 对于每个测试 xff0c 它都会报告测
  • 用示波器 查看波特率是多少?

    在做涉及串口操作的应用时 xff0c 要看看串口数据是否正常 xff0c 如果串口通信有问题 xff0c 也可以用示波器来诊断 示波器可以通过高低电平来检测哪里有数据 xff0c 哪里没数据 xff0c 判断哪个模块出问题了 示波器具体用法
  • VS C++ 实现发布订阅模式(Publish/Subscribe)——基于旧版PX4 uORB模式

    源码已经上传至我的 span class token punctuation span Gitee span class token punctuation span span class token punctuation span ht
  • 【TCP专题】TCP连接建立

    今天开始 xff0c 我们整理一些关于TCP协议的知识 这块的内容写起来是非常费劲的 xff0c 因为本身TCP协议就不是一个简单的协议 xff0c 它能获得如今的地位 xff0c 和其复杂且出色的表现是分不开的 什么是面向连接 众所周知
  • cmake中添加引用动态链接和静态链接库

    动态库的添加 xff1a span class hljs keyword link directories span span class hljs envvar PROJECT SOURCE DIR span lib span class
  • ESP32的SDK开发之blufi一键配网

    ESP32 是集成 2 4 GHz Wi Fi 和蓝牙双模的单芯片方案 xff0c 采用台积电 TSMC 超低功耗的 40 纳米工艺 xff0c 拥有最 佳的功耗性能 射频性能 稳定性 通用性和可靠性 xff0c 适用于各种应用和不同功耗需