ESP之经典蓝牙库BluetoothSerial介绍和实例演示

ESP之经典蓝牙库BluetoothSerial介绍和实例演示

1.概述

目前ESP32内置了双模蓝牙(蓝牙4.0版本之前都是经典蓝牙,4.0版本成为BLT低功耗蓝牙转为物联网开发。双模指的就是这款芯片两种模式都支持)。
这篇文章介绍ESP32蓝牙的经典模式使用方法,那么就有疑问了,既然有新版本的蓝牙为什么还要介绍旧版本的蓝牙使用那,这就和使用场景有关了,经典蓝牙库简单,BLT库复杂。如果只是实现首发数据那么经典蓝牙更合适。如果对功耗有要求那么可以使用BLT库开发。

2.蓝牙库介绍

经典蓝牙模式开发使用BluetoothSerial库,这个库在Arduino中已经存在,不需要单独下载,下面就来介绍下这个库常用的函数,以及如何使用这些库开发程序。

2.1.主从机模式介绍

不同的蓝牙设备之间的连接他们都有一个身份,这个身份就是主机还是从机。
下面介绍下两个身份的区别:
主机身份:
主机身份可疑主动搜索从机的蓝牙地址,并且和他们建立连接。一个主机可以同时连接多个从机。

从机身份
从机模式不能搜索其他设备的蓝牙不能主动建立连接,只能被搜索。从设备和主机建立连接后可以和主设备收发数据,从设备可以允许多个主设备配对,但只能允许一台主机连接。

2.2.常用库介绍

1.获取自身蓝牙地址

每个设备的蓝牙都有一个唯一的mac地址,它由6个字节组成。使用esp_bt_dev_get_address()函数可以获取本机的蓝牙mac地址。

获取本机蓝牙mac地址示例

#include "esp_bt_main.h"
#include "esp_bt_device.h"
#include "esp32-hal.h"
#include "BluetoothSerial.h"void setup() {//设置蓝牙波特率Serial.begin(115200);//开启蓝牙btStart();//初始化蓝牙协议esp_bluedroid_init();//开启蓝牙协议esp_bluedroid_enable();
}void loop() {//获取本机蓝牙地址auto address = esp_bt_dev_get_address();if(address){for(int i=0; i<6; i++){// 格式化输出蓝牙6个字节内容Serial.printf("%02X", address[i]);if(i<5){Serial.print(":");}}Serial.println();delay(1000);}
}

在Arduino上查看查看蓝牙地址信息时候,需要将波特率调整为115200
在这里插入图片描述

2.建立连接和收发信息函数
函数名称解释
BluetoothSerial(void)构造函数
bool begin(String localName=String(), bool isMaster=false)初始化蓝牙,从机初始化完后就可以接受主机的连接了;localName:蓝牙的名称,如果为空的话,默认为ESP32;isMater:是否是主机,默认是从机,从机可以被主机连接
bool hasClient(void)是否有设备已经连接
bool disconnect()关闭当前的spp连接
bool isclosed()spp连接是否已经关闭
bool isReady(bool checkMaster=false, int timeout=0); voidend(void)/spp信道是否可用,如果checkMaster为true还会同时检测本机是否是主机,不是的话也会返回false
voidend(void)关闭蓝牙功能
bool unpairDevice(uint8 t remoteAddress[])解除指定地址的蓝牙设备的配对
3.收发数据函数
函数名称解释
int available(void)有多少数据可以读
void setTimeout(int timeoutMS)设置读写的超时时间,默认是0,马上返回
int peek(void)读缓冲区第一字节,如果读取错误,返回—1
int read(void)读取一个字节,如果读取错误,返回—1
size t write(uint8 t c)发送一个字节
size_t write(const uint8_t *buffer, size t size)最多发送size字节,返回成功发送的字节 数
size_t print()
size_t printf()
size_t println()三个print系列的函数都是返回实际发送的字节
void flush()将数据从缓冲区强制送入信道
size t readBytes(char *buffer, size_t length)字节方式读取数据
size t readBytesUntil(char terminator, char *buffer, size t length)字节方式读取数据
String readstring()字符串方式读取数据
String readStringUntil(char terminator)字符串方式读取数据

3.ESP32作为从机示例

3.1.最简单的从机发送和接收数据例子

这个例子将ESP32设置为从机,程序中没有使用SPP协议,他不需要密码验证就可以配对连接。

#include "BluetoothSerial.h"BluetoothSerial SerialBT;  //定义一个蓝牙对象void setup() {Serial.begin(115200);SerialBT.begin("ESP32Fish");  //蓝牙的名字叫ESP32Fish, 从机模式Serial.println("The device started, now you can pair it with bluetooth!");
}void loop() {char buf[129];//判断是否接收到数据if(SerialBT.available()){auto sz = SerialBT.readBytes(buf, 128); //从蓝牙接收数据if(sz){buf[sz] = 0;Serial.println(buf);strcat(buf, " - Slave");SerialBT.write((uint8_t*)buf, strlen(buf));  //从蓝牙发送数据}}delay(20);
}

1.将程序复制到ArduinoIDE,然后将程序上传到ESP32.
2.这个时候需要拿出手机,开发蓝牙设置搜索名称为ESP32Fish蓝牙设备,然后配对。
3.配对成功后,在windows电脑上通过浏览器搜索Bluetooth Serial Tool 蓝牙调试工具并安装。
4.打开Bluetooth Serial Tool工具:

  • 点击Refresh刷新
  • 然后选择蓝牙名称
  • 点击Connect连接
  • 输入内容
  • 点击发送
    在这里插入图片描述
    查看ArduinoIDE窗口接收到了消息
    在这里插入图片描述

3.2.SPP开启SSP验证最简单例子

开启SSP验证在配对的时候就需要输入验证码才能连接。
下面是开启SSP的函数

//启用SSP认证,配对的时候会主机会产生一个密码发送给从机,我们从机手动确认,主机侧也得确认
void enableSSP();
//设置配对认证请求回调函数
void onConfirmRequest(ConfirmRequestCb cb);
//设置配对认证结果回调函数
void onAuthComplete(AuthCompleteCb cb);
//是否同意连接,true:同意 false:不同意
void confirmReply(boolean confirm);typedef std: function<void(uint32_t num val)> ConfirmRequestCb;typedef std: function<void(boolean success)> AuthCompleteCb; 

关于配对的一些提示:
如果你两台设备配对过了,你的从机改了认证方式,改了蓝牙名,实测两台设备之前还是处于配对状态。

开启SSP验证示例代码

#include "BluetoothSerial.h"BluetoothSerial SerialBT;  //定义一个蓝牙对象//认证请求回调
void BTConfirmRequestCallback(uint32_t numVal)
{//numVal是主机发来的识别码Serial.printf("recv pin: %d \r\n", numVal);//这里要对这个识别码进行判断,是否和主机一样或是是否是我们从机内置的密码//然后再判断是否确定连接,我们这里直接确认了SerialBT.confirmReply(true);//SerialBT.confirmReply(false);  //如果要拒绝就用这句
}//认证结果回调函数
void BTAuthCompleteCallback(boolean success)
{if (success)Serial.println("Pairing success!!");elseSerial.println("Pairing failed, rejected by user!!");
}void RecvData(const uint8_t *buffer, size_t size)
{if(size > 0){Serial.write(buffer, size);  //打印出来SerialBT.write(buffer, size);SerialBT.println(" - Slave");}
}void setup() {SerialBT.enableSSP(); //在begin之前调用SerialBT.onConfirmRequest(BTConfirmRequestCallback);SerialBT.onAuthComplete(BTAuthCompleteCallback);Serial.begin(115200);SerialBT.onData(RecvData);   //注册接收回调函数SerialBT.begin("ESP32Fish");  //蓝牙的名字叫ESP32Fish, 从机模式Serial.println("The device started, now you can pair it with bluetooth!");
}void loop() {
}

上传程序后,删除之前的配对信息,然后重新配对,就会提示输入code码。

在这里插入图片描述

4.ESP32作为主机示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877132.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法学习day23

一、k个一组翻转链表 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 思路&#xff1a; 1.首先得到链表的长度size&#xff1b;然后在size>k的范围里面进行翻转长度为k的链表。 2.while(size>k) 在这个循环中&#xf…

【C++BFS算法】886. 可能的二分法

本文涉及的点 CBFS算法 LeetCod886. 可能的二分法 给定一组 n 人&#xff08;编号为 1, 2, …, n&#xff09;&#xff0c; 我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人&#xff0c;那么他们不应该属于同一组。 给定整数 n 和数组 dislikes &#xff0c;其…

电脑桌面记事本便签哪个好,有哪些好用的桌面备忘记事工具推荐

在寻找高效办公的道路上&#xff0c;我们经常需要记住许多重要的事情&#xff0c;然而人的记忆力终究有限&#xff0c;这时候就需要依赖一些工具来帮助我们进行提醒。一款好的电脑桌面记事本便签、桌面日程安排软件就像是一位得力助手&#xff0c;它不仅能够帮助我们合理规划时…

项目经理的开源工具指南:优化您的选择过程

国内外主流的10款开源项目管理系统对比&#xff1a;PingCode、Worktile、禅道、Teambition、Gogs、码云 Gitee、Jira、Redmine、ProjectLibre、OpenProject。 在选择合适的开源项目管理系统时&#xff0c;很多团队面临诸多挑战&#xff1a;功能是否全面&#xff1f;易用性如何&…

Excel模拟计算演示-以矩阵乘计算密度为例

Excel模拟计算演示-以矩阵乘计算密度为例 1.参考链接2.CUDA_Occupancy_Calculator截图3.矩阵乘计算密度模拟计算的操作步骤及效果 安装好CUDA之后,/usr/local/cuda-12.1/tools/CUDA_Occupancy_Calculator.xls里会看到"TABLE(,B17)"这样的表达式,原来是模拟计算的结果…

3V升5V输出800mA可驱动10MA驱动蜂鸣片芯片AH6910

135-3806-7573今天&#xff0c;我们将深入解析一款名为AH6910的芯片&#xff0c;这款芯片以其独特的3V至5V宽电压输入范围、800mA的高输出电流能力&#xff0c;以及能够轻松驱动低至10mA需求的蜂鸣片&#xff0c;成为了众多电子项目中的优选元件。######一、AH6910芯片概述 AH…

RIP路由协议

RIP-路由信息协议V1/V2/NG NG版为ipv6专用 距离矢量型IGP路由协议&#xff0c;使用跳数作为度量&#xff0c;支持等开销负载均衡&#xff1b;基于UDP&#xff0c;520端工作&#xff0c;基于UDP V1和V2的区别&#xff1a; 1、v1为有类别协议--不支持VLSM/CIDR&#xff0c;即使使…

ic进阶|性能篇02:一文带你了解一种特殊的并行技术-展开!

本期文章让我们聊聊一种数字ic设计技术——展开&#xff0c;展开用于产生一个一次迭代就相当于原有结构的多次迭代的新电路结构。其相当于之前聊过的折叠技术的反向操作&#xff0c;折叠使用一个功能单元通过多次迭代来完成原有电路结构一次迭代的操作&#xff0c;相对于通过时…

中电金信:云原生时代IT基础设施管理利器——基础设施即代码(IaC)

在数字化转型、零售业务快速发展、信创建设驱动下&#xff0c;应用架构、技术架构、基础架构都已向云原生快速演进&#xff0c;银行业IT基础设施管理产生了非常大的变化&#xff0c;当前银行业&#xff0c;正在开展新一轮的核心应用系统重构、基础平台统一建设等重点任务&#…

Playwright 的使用

Playwright 的特点 支持当前所有主流浏览器&#xff0c;包括 Chrome 和 Edge &#xff08;基于 Chromiuns&#xff09;, Firefox , Safari 支持移动端页面测试&#xff0c;使用设备模拟技术&#xff0c;可以让我们在移动Web 浏览器中测试响应式的 Web 应用程序 支持所有浏览…

x264编解码库 -介绍和使用示例

目录 1&#xff1a;X264简单介绍 1.1&#xff1a;编译x264 1.2&#xff1a;x264简单介绍 1.3&#xff1a;x264的优势 1.4&#xff1a;x264与FFmpeg的关系 1.5&#xff1a;x264 编解码原理 1.6 进一步学习资源 2&#xff1a;demo效果 3&#xff1a;完整代码 4&#xff1a;附件…

6 网络

6 网络 1、概念2 IP地址3、套接字4、TCP协议4.1 TCP协议的基本特征4.2 建立连接4.4 终止连接4.5 编程模型 5、UDP协议5.1 UDP协议的基本特性5.2 常用函数5.3 UDP通信模型 6、域名解析 1、概念 计算机网络是实现资源共享和信息传递的计算机系统 ISO/OSI网络协议模型 TCP/IP协…

C语言进阶 10. 字符串

C语言进阶 10. 字符串 文章目录 C语言进阶 10. 字符串10.1. 字符串10.2. 字符串变量10.3. 字符串输入输出10.4. 字符串数组10.5. 单字符输入输出10.6. 字符串函数strlen()10.7. 字符串函数strc()10.8. 字符串函数strcpy()10.9. 字符串搜索函数10.10. PAT10-0. 说反话 (20)10-1.…

idea中导入外部依赖并打包到jar包中

前言&#xff1a; 很多时候在我们写项目对接三方的时候都需要导入三方jar包&#xff0c;而这时候我们用平常的pom里面写依赖发现导入不了&#xff08;直接把jar包放在本地导入的话打包的话也不会将该依赖打包进我们项目的jar包&#xff09;&#xff0c;我在网上找了几种方法 …

Linux网络-ss命令

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注我&#xff0c;我尽量把自己会的都分享给大家&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux服务器作为一个常用的网络服务器&#xff0c;主要的作用就是向客户端提供网络…

【C++】C++11中R字符串的作用

在 C11 中添加了定义原始字符串的字面量 1.定义和基本使用 定义方式为&#xff1a; R"xxx(原始字符串)xxx"其中 () 两边的字符串可以省略&#xff0c;R只会处理括号中的字符串。 原始字面量 R 可以直接表示字符串的实际含义&#xff0c;而不需要额外对字符串做转义…

谷歌团队新技术Alchemist:使用扩散模型对材料属性进行参数控制

Alchemist是由谷歌团队和麻省理工学院联合研发的一项创新技术&#xff0c;它利用扩散模型对材料属性进行精细的参数控制。这项技术的核心在于能够对真实图像中的物体材料属性进行调整&#xff0c;包括粗糙度、金属感、反照率和透明度等。Alchemist的实现依赖于先进的文本到图像…

【时时三省】(C语言基础)循环语句while(2)

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 getchar和scanf的作用 示例: int main ( ) &#xff5b; char password[20] ( 0 ) ; printf ( "请输入密码&#xff1a;> " )&#xff1b; scanf ( " &#xff05;s…

Sping项目只能勾选17和21 (已解决) 导致的后续Invalid bound statement (not found):

问题发现 今天创建项目的时候发现 idea初始化spring的时候选择不了Java8 解决方案:替换URL为 https://start.aliyun.com/ 将IDEA页面创建Spring项目&#xff0c;其实是访问spring initializr去创建项目。故我们可以通过阿里云国服去间接创建Spring项目。 将https://start.spr…

使用 VMware vCenter Server(vSphere Client)迁移 ESXi 虚拟机

我需要将虚拟机 k8s-dev-node4从 ESXi 主机 192.168.1.161 迁移到 ESXi 主机 192.168.1.162 上&#xff0c;使用 VMware vCenter Server&#xff08;vSphere Client&#xff09;在浏览器上可视化操作&#xff0c;将这个需求变的非常简单。 1、选中需要迁移的虚拟机&#xff0c…