利用ESP32实现蓝牙通信的方法

news2025/7/22 9:36:58

​大家好,我是ST!

上次给大家分享了如何使用ESP32实现UDP通信,今天跟大家聊聊如何使用ESP32实现蓝牙通信。

目录

一、蓝牙简介

二、miropython有关蓝牙的实现方法

三、我的实验代码

四、手机调试APP


一、蓝牙简介

蓝牙是一种无线通讯技术,可实现固定设备、移动设备之间的数据交换。一般将蓝牙3.0之间的BR/EDR蓝牙称为传统蓝牙,而将蓝牙4.0规范下的LE蓝牙称为低功耗蓝牙。目前,蓝牙技术已经应用到各个领域,并已经成为接入物联网的主要技术。如今,借助于ESP32平台,MicroPython中也能够使用蓝牙BLE协议进行通信。这对MicroPython平台而言,自然丰富了其生态,增强了其技能,反过来讲,蓝牙BLE能够在MicroPython中得以集成,借助Python语言的易用性,亦将大大降低其入门门槛。

二、miropython有关蓝牙的实现方法

在miropython官网中,提供蓝牙接口模块为bluetooth,下面简单介绍一下本次实验用到的一些方法。

网址:http://docs.micropython.org/en/v1.18/library/bluetooth.html

1)BLE.active([active, ]/)

可选地更改BLE无线电的活动状态,并返回当前状态。在此类上使用任何其他方法之前,必须使无线电处于活动状态。

2)BLE.config(*, param=value, ...)

获取或设置 BLE 接口的配置值。要获取一个值,参数名称应该作为字符串引用,并且一次只查询一个参数。要设置值,请使用关键字语法,一次可以设置一个或多个参数。

3)BLE.irq(handler, /)

为来自 BLE 堆栈的事件注册回调。如下官方给出的事件处理程序(部分截图):

4)BLE.gap_advertise(interval_us, adv_data=Non,*,resp_data=None,...)

以指定的时间间隔(以微秒为单位)开始广播。此间隔将向下舍入到最接近的 625us。要停止广播,请将interval_us设置为None。

adv_data和resp_data可以是实现缓冲协议的任何类型(例如bytes, bytearray, str)。adv_data包含在所有广播中,resp_data发送以回复主动扫描。

注意:如果adv_data(或resp_data)是None,那么传递给先前调用的数据gap_advertise将被重新使用。这允许广播公司仅使用gap_advertise(interval_us). 要清除广告有效载荷,请传递一个空的bytes,即b''。

5)BLE.gatts_register_services(services_definition, /)

用指定的服务配置服务器,替换任何现有的服务。services_definition是一个服务列表,其中每个服务是一个包含一个UUID和一个特征列表的双元素元组。每个特征都是两个或三个元素的元组,包含一个UUID、一个标志值和可选的描述符列表。每个描述符都是一个包含UUID和标志值的双元素元组。这些标志是下面定义的标志的位或组合。这些设置了特征(或描述符)的行为以及安全和隐私需求。返回值是一个元组列表(每个服务一个元素)(每个元素是一个值句柄)。按照定义的顺序,特征和描述符句柄被平展到同一个元组中。

以下官方示例注册了两个服务(Heart Rate, and Nordic UART):

HR_UUID = bluetooth.UUID(0x180D)HR_CHAR = (bluetooth.UUID(0x2A37), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY,)HR_SERVICE = (HR_UUID, (HR_CHAR,),)UART_UUID = bluetooth.UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E')UART_TX = (bluetooth.UUID('6E400003-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY,)UART_RX = (bluetooth.UUID('6E400002-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_WRITE,)UART_SERVICE = (UART_UUID, (UART_TX, UART_RX,),)SERVICES = (HR_SERVICE, UART_SERVICE,)( (hr,), (tx, rx,), ) = bt.gatts_register_services(SERVICES)

6)BLE.gatts_read(value_handle, /)

读取此句柄(已由gatts_write或远程客户端写入)的本地值。

7)BLE.gatts_notify(conn_handle, value_handle, data=None, /)

向已连接的客户端发送通知请求。

如果data不是None,那么该值将作为通知的一部分发送给客户端。本地值不会被修改。否则,如果data为None,则将发送当前本地值(与gatts_write设置的一样)。注意:无论客户端对该特性的订阅状态如何,通知都将被发送。

8)bluetooth.UUID(value, /)

使用指定的值创建一个UUID实例。取值为:

16位整数,例如0 x2908

128位的UUID字符串,例如:'6E400001-B5A3-F393-E0A9-E50E24DCCA9E'

三、我的实验代码

from machine import Pinfrom machine import Timerfrom time import sleep_msimport bluetoothBLE_MSG = ""class ESP32_BLE():    def __init__(self, name):        self.led = Pin(22, Pin.OUT)        self.timer1 = Timer(0) #创建定时器0对象        self.name = name        self.ble = bluetooth.BLE() #创建蓝牙对象        self.ble.active(True) #启动蓝牙        self.ble.config(gap_name=name) #给蓝牙设置一个名字        self.disconnected()        self.ble.irq(self.ble_irq) #蓝牙中断函数        self.register()        self.advertiser()    def connected(self):        self.led.value(0)  #点亮LED指示灯        self.timer1.deinit() #取消定时器    def disconnected(self):  #100ms调用一次 mode循环计时  lambda匿名函数              self.timer1.init(period=100, mode=Timer.PERIODIC, callback=lambda t: self.led.value(not self.led.value()))    def ble_irq(self, event, data):        global BLE_MSG  #替换外部的同名变量        if event == 1: #_IRQ_CENTRAL_CONNECT 手机链接了此设备            self.connected()        elif event == 2: #_IRQ_CENTRAL_DISCONNECT 手机断开此设备            self.advertiser() #向外发送信号,广播            self.disconnected()        elif event == 3: #_IRQ_GATTS_WRITE 手机发送了数据             buffer = self.ble.gatts_read(self.rx)            BLE_MSG = buffer.decode('UTF-8').strip()                def register(self):                service_uuid = '6E400001-B5A3-F393-E0A9-E50E24DCCA9E'        reader_uuid = '6E400002-B5A3-F393-E0A9-E50E24DCCA9E'        sender_uuid = '6E400003-B5A3-F393-E0A9-E50E24DCCA9E'        #创建一个元组        services = (            (                bluetooth.UUID(service_uuid), #服务ID,可以定义多个服务                (                    (bluetooth.UUID(sender_uuid), bluetooth.FLAG_NOTIFY), #服务具体类型                    (bluetooth.UUID(reader_uuid), bluetooth.FLAG_WRITE),  #服务具体类型                )            ),         )        ((self.tx, self.rx,), ) = self.ble.gatts_register_services(services)    def send(self, data):        self.ble.gatts_notify(0, self.tx, data + '\n')    def advertiser(self):        name = bytes(self.name, 'UTF-8')        adv_data = bytearray('\x02\x01\x02') + bytearray((len(name) + 1, 0x09)) + name        self.ble.gap_advertise(100, adv_data)  #100us发布一次广告        print(adv_data)        print("\r\n")def buttons_irq(pin):    led.value(not led.value())    print('LED is ON.' if led.value() else 'LED is OFF')    ble.send('LED is ON.' if led.value() else 'LED is OFF')if __name__ == "__main__":    ble = ESP32_BLE("ESP32BLE")    but = Pin(0, Pin.IN)    but.irq(trigger=Pin.IRQ_FALLING, handler=buttons_irq)    led = Pin(22, Pin.OUT)    while True:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        if BLE_MSG == 'read_LED':            led.value(not led.value())            print(BLE_MSG)            BLE_MSG = ""            print('LED is ON.' if led.value() else 'LED is OFF')            ble.send('LED is ON.' if led.value() else 'LED is OFF')        sleep_ms(100)

程序代码思路:蓝牙在未连接时,指示灯不断闪烁,当蓝牙被连接时,指示灯由闪烁变为常亮。当用户用手机APP发送“read_LED”时,指示灯翻转,并打印出接收到的消息。用户可通过手机APP设置提醒功能。ESP32可通过中断控制指示灯亮灭并提醒手机用户。

四、手机调试APP

IOS用户可下载LightBlue

安卓用户可下载BLE调试宝

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

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

相关文章

Linux篇【5】:Linux 进程概念(三)

目录 四、进程状态 4.1、各个操作系统下的进程状态: 4.1.1、进程的运行态: 4.1.2、进程的终止态(退出态): 4.1.3、进程的阻塞态: 4.1.4、进程的挂起态: 4.2、Linux 操作系统下的进程状态: 四、进…

30、Java高级特性——Java API、枚举、包装类、装箱和拆箱

目录 课前先导: 一、Java API 1、API 2、Java API 3、Java API常用包 二、枚举类型 1、枚举 2、枚举类 3、代码演示 3.1 创建枚举类 3.2 创建测试类 4、MyEclipse创建枚举类的快捷方式 三、包装类 1、八大基本数据类型包装类 2、包装类中的构造方…

Java并发编程之可见性分析 volatile

可见性 对于什么是可见性,比较官方的解释就是:一个线程对共享变量的修改,另一个线程能够立刻看到。 说的直白些,就是两个线程共享一个变量,无论哪一个线程修改了这个变量,则另外的一个线程都能够看到上一…

电脑可以通过蓝牙发送文件吗?电脑蓝牙怎么发送文件

蓝牙(bluetooth)是一种支持设备短距离通信的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。蓝牙技术让数据传输变得更加迅速高效,为无线通信拓宽道路。随着蓝牙技术的发展,…

甘露糖-聚乙二醇-羧酸|mannose-PEG-COOH|羧酸-PEG-甘露糖

甘露糖-聚乙二醇-羧酸|mannose-PEG-COOH|羧酸-PEG-甘露糖 首先合成了二,三分支的甘露糖簇分子.甘露糖经烯丙 苷化,乙酰基保护后,将其烯丙基的双键氧化得到带有羧基连接臂的甘露糖衍生物,然后再分别与1,6-己二胺和三(2-氨乙基)胺进行缩合反应,后脱掉保 护基,得到二分枝甘露糖簇…

Azide-PEG-Thiol,N3-PEG-SH,叠氮-聚乙二醇-巯基可用来制备金纳米颗粒

1、名称 英文:Azide-PEG-Thiol,N3-PEG-SH 中文:叠氮-聚乙二醇-巯基 2、CAS编号:N/A 3、所属分类:Azide PEG Thiol PEG 4、分子量:可定制,5k N3-PEG-SH、20k 叠氮-聚乙二醇-巯基、10k N3-PE…

嵌入式分享合集105

一、智能灯光控制系统(基于stm32) 带你走进物联网的世界说一个整天方案哦 这次是基于stm32的 当然你可以用esp “智能光照灯”使用STM32作为系统的MCU,由于单片机IO口驱动电流过小,搭配三极管放大电流,从而满足光照强…

全网监控 nginx 部署 zabbix6.0

Zabbix监控 文章目录Zabbix监控一、zabbix6.0部署1、部署zabbix 6.0版本(nginxphpzabbix)1、nginx配置2、php配置3、mariadb配置二、zabbix配置1、zabbix配置 (6.0)1、源码安装2、zabbix rpm2、zabbix(5.0安装) -- 补充3、故障汇总…

【Linux】翻山越岭——进程地址空间

文章目录一、是什么写时拷贝二、为什么三、怎么做区域划分和调整一、是什么 回顾我们学习C/C时的地址空间: 有了这个基本框架,我们对于语言的学习更加易于理解,但是地址空间究竟是什么❓我们对其并不了解,是不是内存呢&#xff1…

【创建微服务】创建微服务并使用人人开源代码生成器生成基本代码

创建项目微服务 —— 添加模块 添加依赖 使用 人人开源代码生成器 快速生成 crud 代码 —— https://gitee.com/renrenio 下载导入人人开源项目后,修改 application.yml 文件下的数据库连接配置: 2. 修改 generator.properties 配置文件下的 主路径、包…

CC1101RGPR射频收发器 Low-Power Sub-1GHz 射频收发器

CC1101RGPR射频收发器 Low-Power Sub-1GHz 射频收发器 CC1101RGPR是一种低成本的 sub-1 GHz 收发器专为超低功耗无线应用而设计。该电路主要用于ISM(工业、科学和医疗)和SRD(短程设备)频段315、433、868 和 915 MHz,但…

【891. 子序列宽度之和】

来源:力扣(LeetCode) 描述: 一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 。由于答案可能非常大,请返回对 109 7 取余 …

UNIAPP实战项目笔记40 设置和地址的页面布局

UNIAPP实战项目笔记40 设置和地址的页面布局 my-config.vue 设置页面布局 具体图片自己替换哈&#xff0c;随便找了个图片的做示例 代码 my-config.vue 页面部分 <template><view class"my-config"><view class"config-item" tap"go…

精益项目管理的流程

我们生活在一个企业家的世界&#xff0c;您可能有许多自己的想法等待实现&#xff0c;但想法在现实中实现是昂贵的。问题是您如何才能获得最大的收益&#xff1f;CEO和管理者如何在追逐梦想和实现目标的同时节省资金&#xff1f;了解初创公司如何进行精益项目管理&#xff0c;它…

第一个汇编程序

第一个汇编程序 文章目录第一个汇编程序1.汇编模拟程序&#xff1a;DOSBox使用2.汇编程序从写出到执行的过程3.程序执行过程跟踪1.汇编模拟程序&#xff1a;DOSBox使用 BOSBox软件常用基本语法&#xff1a; mount c: d:\masn ;挂载磁盘,挂载后用c:切换为C盘才能用debug等工具…

【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day09

大家好&#xff0c;我是陶然同学&#xff0c;软件工程大三明年实习。认识我的朋友们知道&#xff0c;我是科班出身&#xff0c;学的还行&#xff0c;但是对面试掌握不够&#xff0c;所以我将用这100多天更新Java面试题&#x1f643;&#x1f643;。 不敢苟同&#xff0c;相信大…

uni-app入门:WXML列表渲染与条件渲染

1.列表渲染 1.1wx:for 1.2wx:key 2.条件渲染 2.1wx:if 2.2 hidden 正文 WXML全称&#xff1a;wexin markup language,微信标签语言&#xff0c;可以理解为web中的html&#xff0c;今天来讲一下列表渲染&#xff0c;通过几个小案例掌…

艾美捷高纯度 Cholesterol胆固醇相关介绍

胆固醇在体内有着广泛的生理作用&#xff0c;但当其过量时便会导致高胆固醇血症&#xff0c;对机体产生不利的影响。现代研究已发现&#xff0c;动脉粥样硬化、静脉血栓形成与胆石症与高胆固醇血症有密切的相关性。 如果是单纯的胆固醇高则饮食调节是最好的办法&#xff0c;如果…

机器人虚拟仿真工作站考试

总共三个步骤&#xff1a; 创建工作台、加工零件、机器人臂 &#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 一、加工零件的创建 1、先打开sw软件&#xff0c;然后点击零件、创建进入到该软件内&#xff1a; 2、点击前视基础面&#xff08;点击后按esc&#x…

RabbitMQ初步到精通-第四章-RabbitMQ工作模式-WORK

第四章-RabbitMQ工作模式-WORK 1.模式介绍 1.1 work模式 Work模式与前面的Simple模式一致&#xff0c;也是消息经由生产者发到Exchange再到queue再被消费者消费。不同点在于SIMPL模式是一个队列对应的一个消费者&#xff0c;此模式会由一个队列对应两个消费者或大于两个消费者。…