esp32c3开发板通过micropython的ubluetooth库连蓝牙设备

ESP32-C3开发板是一款高性能、低功耗的微控制器,搭载了Espressif自家的RISC-V处理器。通过MicroPython,一种面向微控制器的精简版Python编程语言,开发者可以轻松地为ESP32-C3编写代码。MicroPython的ubluetooth库使得ESP32-C3能够通过蓝牙与各种设备进行通信。

使用ubluetooth库,ESP32-C3可以作为蓝牙主机或从机,实现与蓝牙设备的配对、连接和数据传输。开发者可以利用这个库来创建蓝牙低功耗(BLE)应用,如智能家居设备、健康监测设备等。通过简单的Python代码,ESP32-C3可以发送和接收蓝牙信号,实现设备间的无线通信。这使得ESP32-C3成为一个多功能、易于编程的蓝牙解决方案,适合各种物联网项目。

首先学习一下蓝牙通讯的机制

蓝牙通讯介绍

蓝牙通信是一种无线通信技术,用于在短距离内(通常在10米以内)连接不同的电子设备,如手机、平板电脑、笔记本电脑、耳机、扬声器等。蓝牙通信的机制主要包括以下几个方面:

1. 频率和调制

蓝牙通信使用2.4 GHz的工业、科学和医疗(ISM)频段。为了避免与其他无线设备的干扰,蓝牙采用了频率跳跃扩频(FHSS)技术。在通信过程中,蓝牙设备会在79个不同的频率通道上进行跳变,每秒跳变1600次,从而减少干扰和提高通信的稳定性。

2. 设备配对和连接

蓝牙设备之间的通信需要先进行配对和连接:

  • 配对:两个设备通过交换密钥建立信任关系。配对过程通常需要用户确认,以确保安全性。
  • 连接:配对成功后,设备可以建立稳定的连接,进行数据传输。

3. 主从设备

蓝牙通信采用主从模式:

  • 主设备:控制连接和数据传输的设备,可以同时连接多个从设备。
  • 从设备:被主设备控制的设备,通常只能连接一个主设备。

4. 服务和特征

蓝牙低功耗(BLE)协议中,设备通过服务和特征来交换数据:

  • 服务:一组相关的特征集合,代表设备的某种功能或数据类型。
  • 特征:具体的数据点,可以被读取、写入或通知。

5. 广播和扫描

  • 广播:设备通过广播包发送信息,其他设备可以通过扫描接收这些信息。
  • 扫描:设备监听周围的广播包,以发现可连接的蓝牙设备和服务。

6. 数据传输协议

蓝牙通信使用多种协议层来确保数据的可靠传输:

  • 物理层(PHY):负责实际的无线信号传输。
  • 链路层(LL):管理设备的连接状态、数据包的发送和接收。
  • 主机控制接口(HCI):提供主机和控制器之间的通信接口。
  • 逻辑链路控制和适配协议(L2CAP):负责数据的分段、重组和错误控制。
  • 属性协议(ATT):在BLE中用于服务的发现和数据的读写操作。

7. 安全机制

蓝牙通信包括多种安全措施:

  • 加密:使用AES加密算法保护数据传输。
  • 认证:通过配对过程中的PIN码或OOB(Out of Band)数据进行设备身份验证。
  • 授权:确保只有经过授权的设备才能访问特定的服务和特征。

8. 功耗管理

特别是对于BLE,功耗管理是一个关键因素:

  • 低功耗模式:设备可以在不需要通信时进入休眠状态,减少能量消耗。
  • 连接间隔:调整主从设备之间的连接间隔,平衡数据传输速率和能耗。

总之,蓝牙通信通过一系列复杂的协议和技术,实现了设备间的短距离、低功耗、安全的无线数据传输。

实践

micropython的蓝牙配置参见:bluetooth — 低功耗蓝牙 — MicroPython 1.22 文档

准备好esp32c3开发板,进入micropython交互环境,输入如下代码:

蓝牙测试代码1

这段代码没通过。。。。 

import ubluetooth
import utime
import machineclass BLEServer:def __init__(self):self.ble = ubluetooth.BLE()self.ble.active(True)self.ble.irq(self.ble_irq)self.register_service()self.connected = Falsedef register_service(self):# 创建一个UUID为"12345678-1234-5678-1234-56789abcdef0"的服务service_uuid = ubluetooth.UUID('12345678-1234-5678-1234-56789abcdef0')service = self.ble.gatts_register_services([(service_uuid, ((ubluetooth.UUID('12345678-1234-5678-1234-56789abcdef1'), ubluetooth.FLAG_READ),))])self.service_handle = service[0]self.char_handle = service[1]# 设置Characteristic的初始值self.ble.gatts_write(self.char_handle, b'Hello, BLE!')def ble_irq(self, event, data):if event == 1:# Central设备连接self.connected = Trueprint("Device connected")elif event == 2:# Central设备断开连接self.connected = Falseprint("Device disconnected")# 重置广告,以便再次被发现self.ble.gap_advertise(100, adv_data=self.ble.config('mac') + b'\x02\x01\x06' + b'\x11\x07' + ubluetooth.UUID('12345678-1234-5678-1234-56789abcdef0').bytes)def start_advertising(self):# 开始广告,以便Central设备可以发现这个Peripheralself.ble.gap_advertise(100, adv_data=self.ble.config('mac') + b'\x02\x01\x06' + b'\x11\x07' + ubluetooth.UUID('12345678-1234-5678-1234-56789abcdef0').bytes)def main():ble_server = BLEServer()ble_server.start_advertising()while True:if ble_server.connected:# 可以在这里添加逻辑来处理连接状态passutime.sleep(1)if __name__ == "__main__":main()

但是这段代码有问题,

蓝牙测试代码2

后来用了这段文心生成的代码,这段代码ok:

# 文心的例子
import ubluetooth
import machine
import time
from micropython import const
IRQ_CENTRAL_CONNECT = const(1)
IRQ_CENTRAL_DISCONNECT = const(2)# 初始化蓝牙
ble = ubluetooth.BLE()
ble.active(True)# 定义服务UUID
# SERVICE_UUID = '12345678-1234-5678-1234-56789abcdef0'
# CHARACTERISTIC_UUID = '12345678-1234-5678-1234-56789abcdef1'# 创建BLE服务和特性
def ble_init():NUS_UUID = 'AE25A5C1-4601-143C-12BB-8BC45A18749C'RX_UUID = 'AE25A5C2-4601-143C-12BB-8BC45A18749C'TX_UUID = 'AE25A5C3-4601-143C-12BB-8BC45A18749C'BLE_NUS = ubluetooth.UUID(NUS_UUID)BLE_RX = (ubluetooth.UUID(RX_UUID), ubluetooth.FLAG_WRITE)BLE_TX = (ubluetooth.UUID(TX_UUID), ubluetooth.FLAG_NOTIFY | ubluetooth.FLAG_READ)BLE_UART = (BLE_NUS, (BLE_TX, BLE_RX,))SERVICES = (BLE_UART, )((tx, rx),) = ble.gatts_register_services(SERVICES)# 获取特性的句柄以发送通知# char_handle = _char_handle[0]# 启动广播ble.gap_advertise(100, bytearray(b'ESP32-C3 BLE Test'))return tx# BLE中断处理函数
def ble_irq(event, data):if event == IRQ_CENTRAL_CONNECT:print("BLE device connected")elif event == IRQ_CENTRAL_DISCONNECT:print("BLE device disconnected")# 可以选择在这里重新开始广播# 注册BLE中断处理函数
ble.irq(ble_irq)# 初始化BLE并获取特性句柄
char_handle = ble_init()# 发送通知的数据
notification_data = 'Hello, ESP32-C3 BLE!'
ble.gatts_notify(1, char_handle, notification_data)
ble.gatts_write(char_handle, notification_data)
print("Notification sent:", notification_data)

代码保持整体框架,做了一些小修改,比如 UUID部分重新写了,比如加上IRQ_CENTRAL_CONNECT等常量,最后发送信息加上了write

ble.gatts_notify(1, char_handle, notification_data)
ble.gatts_write(char_handle, notification_data)

手机安装蓝牙测试app:BLE调试助手

 在华为手机的“应用市场”,查找“BLE调试助手”,安装该app应用。

打开“BLE调试助手”,找到开发板的蓝牙。小窍门,开发板的蓝牙,一般没有诸如“oppo”、小米、amazfit等字样,而且如果手机和开发板距离较近,信号会比较强,比如-50db左右

蓝牙通讯测试

在开发板发送数据,比如:

notification_data = 'Hello, ESP32-C3 BLE!'
ble.gatts_notify(1, char_handle, notification_data)notification_data = '123456'
ble.gatts_notify(1, char_handle, notification_data)

这段代码可以让esp32c3发送信息,然后用手机app“BLE调试助手”接收,接收信息截图

最后六位数字,31-36,就是发送的数字1-6的ASCII编码。 

注意:不知道是否没有清空缓冲的原因,每点一次“接收”,都会再接收最后一次的信息。比如里面的连续多次31、32 ,就是测试时发送了“12”两个字母,但是点了多次接收导致的。

后来明白了,

ble.gatts_notify(1, char_handle, notification_data)

这个是通知信息,只发送一次


ble.gatts_write(char_handle, notification_data)

这个是发送信息,可以一直接收。

注意:将手机app里的HEX选项去掉,就能看到字符串而不是ascii编码了。

调试

这句有报错:>>> char_handle = ble_init()

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 10, in ble_init ValueError: need more than 1 values to unpack

按照一言的提示,查看封包情况:

services = ((ubluetooth.UUID(SERVICE_UUID),((ubluetooth.UUID(CHARACTERISTIC_UUID), ubluetooth.FLAG_NOTIFY | ubluetooth.FLAG_READ),),),
)result = ble.gatts_register_services(services)
print(result)  # 打印结果以查看结构

输出:

((16,),)

感觉这个封包有问题啊,调整一下:

services = ((ubluetooth.UUID(SERVICE_UUID),((ubluetooth.UUID(CHARACTERISTIC_UUID), ubluetooth.FLAG_NOTIFY | ubluetooth.FLAG_READ),),),)((_srv_handle), ((_char_handle), _ ),), ) = ble.gatts_register_services(services)

封包和解包这里太头疼了,直接用下面的代码:

    NUS_UUID = 'AE25A5C1-4601-143C-12BB-8BC45A18749C'RX_UUID = 'AE25A5C2-4601-143C-12BB-8BC45A18749C'TX_UUID = 'AE25A5C3-4601-143C-12BB-8BC45A18749C'BLE_NUS = ubluetooth.UUID(NUS_UUID)BLE_RX = (ubluetooth.UUID(RX_UUID), ubluetooth.FLAG_WRITE)# BLE_TX = (ubluetooth.UUID(TX_UUID), ubluetooth.FLAG_NOTIFY)ELE_TX = (ubluetooth.UUID(TX_UUID), ubluetooth.FLAG_NOTIFY | ubluetooth.FLAG_READ)BLE_UART = (BLE_NUS, (BLE_TX, BLE_RX,))SERVICES = (BLE_UART, )((tx, rx),) = ble.gatts_register_services(SERVICES)# 获取特性的句柄以发送通知# char_handle = _char_handle[0]char_handle = tx

学习蓝牙配置的时候这句报错ble.config('rxbuf')

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: unknown config param

文心回复:

在您提供的错误信息中,ble.config('rxbuf') 调用导致了 ValueError: unknown config param 错误。这意味着 ble.config 函数不接受 'rxbuf' 作为有效的配置参数。

在MicroPython的BLE(蓝牙低功耗)模块中,ble.config() 函数用于配置BLE堆栈的某些参数。但是,可用的配置参数取决于您的ESP32固件版本和MicroPython的版本。通常,这些参数包括如扫描响应时间、广播间隔等BLE相关的设置。

'rxbuf' 看起来像是尝试配置接收缓冲区的大小,但这通常不是通过 ble.config() 函数来实现的。在MicroPython中,BLE接收缓冲区的大小可能由BLE堆栈内部管理,并且不直接暴露给应用程序进行配置。

发现代码中竟然没有这个变量ubluetooth.IRQ_GAP_CONNECTED

ubluetooth.IRQ_GAP_CONNECTED

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'module' object has no attribute 'IRQ_GAP_CONNECTED'

怪不得这里代码调不通呢。

原来是为了减小esp32等开发板空间占用,micropython竟然没有把这些常量设进去,用什么需要手工加什么,加上:

from micropython import const

IRQ_CENTRAL_CONNECT = const(1)

IRQ_CENTRAL_DISCONNECT = const(2)

这段代码用这些常量:

def ble_irq(event, data):if event == IRQ_CENTRAL_CONNECT:print("BLE device connected")elif event == IRQ_CENTRAL_DISCONNECT:print("BLE device disconnected")

检查代码,发现抄错一个字母

怪不得会有报错啊。。。。

# BLE_TX = (ubluetooth.UUID(TX_UUID), ubluetooth.FLAG_NOTIFY)
    ELE_TX = (ubluetooth.UUID(TX_UUID), ubluetooth.FLAG_NOTIFY | ubluetooth.FLAG_READ)

把B写成E了

改过来。

services = ble.gatts_register_services(service_definition())这句报错

>>> services = ble.gatts_register_services(service_definition())

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

OSError: [Errno 12] ENOMEM

仔细看这段代码:

def service_definition():# 用户描述字符串user_description = "This is a sample characteristic"return ((SERVICE_UUID, ((CHARACTERISTIC_UUID, ubluetooth.FLAG_READ | ubluetooth.FLAG_WRITE | ubluetooth.FLAG_NOTIFY | ubluetooth.FLAG_INDICATE),# 为描述符提供UUID和初始值(用户描述)(DESCRIPTOR_UUID, user_description.encode('utf-8')),  # 编码为字节串)),)

发现return这里少一个逗号:)),

加上一个逗号,pass

在microptyhon里,元组等结构的逗号不能省略

def service_definition():# 用户描述字符串user_description = "This is a sample characteristic"return ((SERVICE_UUID, ((CHARACTERISTIC_UUID, ubluetooth.FLAG_READ | ubluetooth.FLAG_WRITE | ubluetooth.FLAG_NOTIFY | ubluetooth.FLAG_INDICATE),# 为描述符提供UUID和初始值(用户描述)(DESCRIPTOR_UUID, user_description.encode('utf-8')),  # 编码为字节串), ),)

char_handle = services[1][0]这句报错

service_handle = services[0]

char_handle = services[1][0]

desc_handle = services[1][1] # If you included the descriptor

看了一下,services的返回信息是:

services

((16, 19),)

所以这段代码需要修改成:

services = ble.gatts_register_services(service_definition())
# service_handle = services[0]
char_handle = services[0][0]
desc_handle = services[0][1]  # If you included the descriptor

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

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

相关文章

CTF攻防世界小白刷题自学笔记16

1.Broadcast&#xff0c;难度&#xff1a;1&#xff0c;方向&#xff1a;Crypto&#xff08;密码学&#xff09; 题目来源:2019_Redhat 题目描述:粗心的Alice在制作密码的时候&#xff0c;把明文留下来&#xff0c;聪明的你能快速找出来吗&#xff1f; 给一下题目链接&#…

企业供配电及用电一体化微电网能源管理系统

企业能源管理痛点 信息孤岛 1.保护类、监测类、控制类、治理类、重要负荷等子系统多、分散、独立 2.数据异构、融合困难、数据分析困难 3.用户无法通过一套系统完整的了解整个企业的供电、配电、用电情况&#xff1b; 资源浪费 1.服务器资源浪费 2.应用软件浪费 3.数据…

windows实现VNC连接ubuntu22.04服务器

最近弄了一个700块钱的mini主机&#xff0c;刷了ubuntu22.04系统&#xff0c;然后想要在笔记本上通过VNC连接&#xff0c;这样就有了一个linux的开发环境。最后实现的过程为&#xff1a; 安装vnc服务器 安装 VNC 服务器软件&#xff1a; sudo apt update sudo apt install t…

强化学习数学原理学习(四)

前言 今天是时序差分学习 正文 首先,明确一点,时序差分也是无模型的情况下的强化学习方法,TD学习是蒙特卡洛思想和动态编程&#xff08;DP&#xff09;思想的结合。最基础的时序差分学习估计状态值&#xff0c;而后续提出的Sarsa和Q-learning方法则直接对动作值进行估计。 …

【Redis 探秘】Redis 性能优化技巧

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

RTSP播放器EasyPlayer.js播放器在webview环境下,PC和安卓能够正常播放,IOS环境下播放器会黑屏无法播放

流媒体技术分为顺序流式传输和实时流式传输两种。顺序流式传输允许用户在下载的同时观看&#xff0c;而实时流式传输则允许用户实时观看内容。 流媒体播放器负责解码和呈现内容&#xff0c;常见的播放器包括VLC和HTML5播放器等。流媒体技术的应用场景广泛&#xff0c;包括娱乐…

C语言零基础入门

一、输入输出 &#xff08;1&#xff09;scanf scanf 是C语言中的一个标准库函数&#xff0c;用于从标准输入&#xff08;通常是键盘&#xff09;读取数据。scanf 函数定义在 <stdio.h> 头文件中。 #include <stdio.h>int main(void) {//读取整数 int num;print…

经典的网络安全技术

以我的理解&#xff0c;“黑客”大体上应该分为“正”、“邪”两类&#xff0c;正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善&#xff0c;而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事情&#xff0c;因为邪派黑客…

D73【 python 接口自动化学习】- python 基础之正则表达式

day73 正则表达式-元字符匹配 学习日期&#xff1a;20241119 学习目标&#xff1a;正则表达式--133 正则表达式-元字符匹配 学习笔记&#xff1a; 元字符匹配 数量匹配 实践操作 总结 字符串的r标记表示&#xff0c;字符串内转移字符无效&#xff0c;作为普通字符使用正则…

实验一 顺序结构程序设计

《大学计算机&#xfe63;C语言版》实验报告 实验名称 实验一 顺序结构程序设计 实验目的 &#xff08;1&#xff09;掌握C语言中常量和变量的概念。 &#xff08;2&#xff09;掌握C语言中常见的数据类型。 &#xff08;3&#xff09;掌握C语言中变量的定义和赋值方法。 …

在Linux上如何利用NTP使客户端和服务端的时间同步

对于服务端 一、先在服务端安装相关配置-----yum install chrony -y-----并启动 二、进入chrony的文件里----在第三行修改为阿里云时间服务地址 三、在服务端重启chrony 四、进行测试------chronyc sources -v 五、进入chrony的文件里添加客户端的ip地址---在第26行&#…

IDEA2023 SpringBoot整合Web开发(二)

一、SpringBoot介绍 由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。SpringBoot提供了一种新的编程范式&#xff0c;可以更加快速便捷…

[C语言]第十三节 指针一基础知识到高级技巧的全景探索

目录 13.1. 内存和地址 13.1.1. 内存和地址 13.2. 指针变量和地址 13.2.1 取地址操作符&#xff08;&&#xff09; 13.1.2 指针变量和解引⽤操作符&#xff08;*&#xff09; 13.1.3 指针变量的⼤⼩ 13.3. 指针变量类型 13.3.1 指针的解引⽤ 13.3.2 指针-整数 13…

hhdb数据库介绍(9-24)

计算节点参数说明 failoverAutoresetslave 参数说明&#xff1a; PropertyValue参数值failoverAutoresetslave是否可见是参数说明故障切换时&#xff0c;是否自动重置主从复制关系默认值falseReload是否生效否 参数设置&#xff1a; <property name"failoverAutor…

基于Java Springboot网络相册系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

未来已来:少儿编程竞赛聚焦物联网,激发创新潜力

随着人工智能与物联网技术&#xff08;IoT&#xff09;的快速发展&#xff0c;少儿编程教育正在迎来新的变革浪潮。近年来&#xff0c;各类少儿编程竞赛纷纷增加了物联网相关主题&#xff0c;要求学生结合编程知识和硬件设备设计智能家居、智慧城市等创新项目。这一趋势不仅丰富…

什么是客户关系管理

客户关系管理&#xff08;CRM&#xff09;是一套用于管理企业与现有客户及潜在客户互动的策略和技术。提升客户满意度、优化销售流程、增强客户忠诚度是其核心目标。通过系统化的方法&#xff0c;CRM帮助企业收集、分析并利用客户数据&#xff0c;从而制定更有效的市场营销策略…

C# MethodTimer.Fody 使用详解

总目录 前言 NET开发过程中&#xff0c;经常会使用Stopwatch 来测量方法的执行所需时间&#xff0c;以便了解代码的执行效率。这里介绍一个开源库&#xff1a;MethodTimer.Fody。它可以辅助我们更为方便快速的完成方法执行效率的测量。 一、MethodTimer.Fody 是什么&#xff1…

sourceInsight常用设置和功能汇总(不断更新)(RGB、高亮、全路径、鼠标、宏、TODO高亮)

文章目录 必开配置设置背景颜色护眼的RGB值&#xff1f;sourceInsight4.0中如何设置选中某个单词以后自动高亮的功能&#xff1f;sourceinsight中输入设置显示全路径&#xff1f; 常用sourceInsight4.0中文乱码怎么解决&#xff0c;注意事项是什么&#xff1f;如何绑定鼠标中键…

东土科技孵化的“网联汽车高速通信技术”前沿产品亮相2024WICV大会

2024世界智能网联汽车大会&#xff08;WICV&#xff09;于近日在北京召开。本次大会发布了由中国汽车工程学会组织全球200余位专家&#xff0c;联合评审遴选出未来十年对于智能网联汽车发展具有重要影响的十大技术趋势&#xff0c;包括“面向高级别自动驾驶的超级人工智能”“网…