ESP32蓝牙通信

  • 蓝牙协议基本概念
  • ESP32 蓝牙客户端和服务端
    • ESP32 作为服务器调试
    • ESP32 作为客户端调试

项目中需要用到ESP32的蓝牙通信,查资料知道。当esp32作为客户端 client时,可以连接多个设备,当作为服务器端server时,只能被一个设备连接(这是我的理解,若有误请之指出)。以下根据,esp-idf的例程的调试过程总结如下:

蓝牙协议基本概念

创建自定义表的时候,要符合蓝牙基本原理

->service1-> characterA->特性声明->特性数值->特性描述符-> characterB->特性声明->特性数值->特性描述符-> …………->  …………………………数据以属性(attribute)的方式存在,每条属性由四个元素组成:
->属性句柄
->属性类型(UUID表示的含义,温度、湿度、电量等)
->属性值
->属性的权限(读、写、通知)

【概述】

  • ESP32 作为 gatt_server ,手机app作为gatt_client,ESP32采集温湿度传感器的值,然后通过蓝牙协议将数据传到手机端(或者其它支持蓝牙的MCU端)

【数据收发】

  • ESP32被写数据:手机app给ESP32写数据,触发 ESP_GATTS_WRITE_EVT事件,将数据写入相应的 character_value 中去
  • ESP32被读数据:手机APP读取ESP32的数据,触发 ESP_GATTS_READ_EVT事件,读取相应的 character_value 的值

【源码中问题】

  • 比如,我想读取 特性A的 characterA_value 的实时的值,因此在代码中就需要开启一个任务,实时改变 characterA_value 的值。库函数中的这个函数可以改变 value 的值,esp_ble_gatts_set_attr_value(),因此需要在其他任务中调用这个函数。 注意: 调用这个函数时,必须保证蓝牙已经建立连接,否则调试会报错。
  • 源码中ESP_GATTS_READ_EVT事件下面是空的,为何手机还会读到数据?比如手机APP读 characterA_value 的值,characterA_value 的初值为 0x1234,则读到的值为value的初始值, 手机读取数据这个事发生以后,才会触发ESP_GATTS_READ_EVT事件。并不是读到的数是靠 事件底下的处理过程给的。

ESP32 蓝牙客户端和服务端

esp-idfbluetooth 例程 demo 说明:

程序路径: …\esp-idf-master\examples\bluetooth\bluedroid\ble

gatt_servergatt_client: gatt_server 广播 adv 数据, client 连接 server,client_demo 在连接成功 server_demo 后,会使能 server_demo 中的 notify 通知提示,连接成功之后,二者可以互相交换数据。

参考资料: ESP32-C3 学习测试 蓝牙 篇(四、GATT Server 示例解析)

gatt_server_service_table:使用预定义的 attribute table 创建了一个 GATT database ,他扮演和 gatt_server 相同的角色,可以被 gatt_client 连接,连接成功后通知消息,并且在连接成功后,可以交换数据。

参考资料: ESP32-C3 学习测试 蓝牙 篇(七、GATT 数据通信 — 发送自定义数据)

ESP32 作为服务器调试

可以实现,别的设备连接ESP32,并获取ESP32采集到的数据。ESP32 为服务器,其他设备为客户端

属性表解析:

只添加了一个服务:

【service】
UUID:0x00FF      UUID的值:primary service 0x28      权限:只读【特征A声明】UUID:0x2803       UUID的值:读、写、通知          权限:只读【特征A的值】UUID:0xFF01         UUID的值:‘'yonghaohao'’      权限:读写      最大字节:500【特征A的描述符】UUID:0x2902        UUID的值:0x00 0x00                权限:读写     最大字节: 4【特征B声明】UUID:0x2803     UUID的值:读           权限:只读【特征B的值】UUID:0xFF02         UUID的值:‘'yonghaohao'’      权限:读写      最大字节:500【特征C声明】UUID:0x2803      UUID的值:读           权限:只读【特征C的值】UUID:0xFF03         UUID的值:‘'yonghaohao'’      权限:读写      最大字节:500

总结属性表:

测试结果:

当手机APP向esp32写数据时,触发 ESP_GATTS_WRITE_EVT 事件,然而在源码中,这个事件下的处理部分是空的,但是测试的时候,手机可以收到数据,那么手机是如何接收到数据的呢?参考博客的分析: ESP32-C3 学习测试 蓝牙 篇(七、GATT 数据通信 — 发送自定义数据),确实存在以下问题。

总结:参考以上博客总结来看为以下几点:

ESP32 作为客户端调试

在GAP通信角色中,中心设备去扫描和连接外围设备。所以外围设备是server端,中心设备是 client 端。

过程:客户端扫描设备,搜索相关服务器的服务和特征,当搜索到感兴趣的服务器时,与服务器建立连接,并执行服务搜索。最后,客户端在找到的服务中查找特定的特征,若找到, 则获取特征值并注册该特征的通知。这是通过注册一个应用程序配置文件,并按照一些列事件俩配置所需的GAP个GATT参数来完成的。

client 连接 server ,会查找某个服务的 UUID,如在server中定义 serviceA_UUID = 0xFF01,则在 client 端需要根据 0xFF01 查找 server 端的是否有这个服务,查找时会触发事件 ESP_GATTC_DIS_SRVC_CMPL_EVT

参考资料:【ESP32蓝牙的Gatt Client的例子演练】

ESP32 作为客户端,他扫描连接外围设备, 并连接到一个预定义的服务,然后 客户端搜索可用特征并订阅已知特征,以便接受通知(notify)或指示(indicate)。该例程可以注册一个应用程序配置文件并且初始化一系列事件,这些时间可用于配置文件GP参数并处理扫描、连接外围设备和读写特征等事件。

NVS初始化:该库允许将 key-value 保存在闪存中,比如保存 wifi 的 SSID 和 password

GAP和GATT事件处理程序是用来捕获BLE堆栈生成事件并执行函数来配置应用程序参数的函数。GAP事件处理程序负责扫描和连接到服务器,GATT处理程序负责管理客户机连接到服务器后发送的时间,比如搜索服务和读写数据。

应用程序配置文件:是为一个或者多个服务器应用程序设计的功能进行分组的一种方式。如,可以将应用程序配置文件连接到心率传感器,并将另一个配置文件连接到温度传感器。每个应用程序配置文件创建一个GATT接口来连接到其他设备,代码中是 gattc_profile_inst

分别用两个设备,测试 gatt_client 和 gatt_server,注意,client 连接 server的代码中,device_name 和 service 以及 characteri 的 uuid 要对应:

为什么 client 可以直接写数据呢?在代码中找原因:

参考 Gatt_Client_Example_Walkthrough手册,找到了原因,手册中说, esp_ble_gattc_send_mtu_req()函数触发之后,会自动调用搜索服务的功能,然后就触发了 ESP_GATTC_DIS_SRVC_CMPL_EVT事件,然后就一步步触发相应的事件,最后调用 esp_ble_gattc_write_char()函数,写数据。

Gatt_Client_Example_Walkthrough 手册的路径:
gatt_client\tutorial

若不方便下载,请私信我获取;

【ESP32蓝牙通信】gatt_client 和 gatt_server 调试相关推荐

  1. STM32CubeIDE开发(二十五), 物联网应用之stm32的蓝牙通信设计

    一.蓝牙通信技术 蓝牙技术是一种点对点点对面的网络构架,他可以在限制的范围内以很快的速度传输网络数据,在物联网应用中,支持网状网络的物联网短距离无线通信.目前它还被广泛用于智能可穿戴设备.智能门锁.智 ...

  2. ESP32:蓝牙BLE控制M3508电机

    ESP32:蓝牙BLE控制M3508电机 先给各位朋友拜个年,祝大家新春快乐,事事顺利,身体健康啊! 还是熟悉的3508,内容概述: ESP32主控 蓝牙BLE通信 使用实时系统(FreeRTOS) ...

  3. 轻松易懂arduino低功耗BLE蓝牙通信

    今天我们介绍蓝牙通信的另一种方式--BLE(Bluetooth Low Energy,蓝牙低功耗).         什么是BLE         在<无线通信3:HC05/HC06经典蓝牙BT ...

  4. stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解)

    stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解) 首先看看效果吧 手机端发送一个数据在OLED屏幕上显示 其实蓝牙通信就是个蓝牙转串口的过程,手机 ...

  5. React Native BLE蓝牙通信

    由于项目需要,基于React Native 开发的App要跟BLE蓝牙设备通信. 在js.coach上搜索React Native BLE蓝牙组件,只找到三个组件: react-native-ble- ...

  6. 基于STM32F103C8T6的HC-06蓝牙通信

    文章目录 前言 注意看 ! 一.蓝牙通信流程 二.怎么实现蓝牙通信 1.了解蓝牙模块功能 2.了解蓝牙通信本质 3.进行AT命令调试 4.调试完成,连接通信 三.结尾 前言 注意看 ! 如果朋友们遇到 ...

  7. Android开发之蓝牙通信

    一.项目内容 使用蓝牙通信,实现通过蓝牙聊天功能 二.项目实现 1.添加蓝牙权限 <uses-permission android:name="android.permission.B ...

  8. windows -python3.7-pybluez蓝牙通信记录

    window添加pybluez需要手动下载一些文件. 共计3步.请耐心~ 2步配置完成,最后一部测试 ** 1. 第一步,直接添加pybluez库 pip install pybluez==0.22 ...

  9. 蓝牙聊天App设计3:Android Studio制作蓝牙聊天通讯软件(完结,蓝牙连接聊天,结合生活情景进行蓝牙通信的通俗讲解,以及代码功能实现,内容详细,讲解通俗易懂)

    前言:蓝牙聊天App设计全部有三篇文章(一.UI界面设计,二.蓝牙搜索配对连接实现,三.蓝牙连接聊天),这篇文章是:三.蓝牙连接聊天. 课程1:Android Studio小白安装教程,以及第一个An ...

最新文章

  1. python软件代码示例-用Python写一个模拟qq聊天小程序的代码实例
  2. 《科学+ 预见人工智能》——“工具”本质,理性批判
  3. Android中应用百度地图API开发地图APP实例-显示百度地图
  4. oracle 性别 函数索引优化,oracle优化记录4_改写函数索引列
  5. 玛氏携手阿里 天猫网罗全球快消三巨头
  6. HTML5移动端音乐播放器(启蒙篇)
  7. Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结
  8. Spring集成–使用RMI通道适配器
  9. 改变您一生的90/10原理
  10. 继续完善掼蛋游戏 其次说说朋友的情况
  11. Chrome 45 减少了内存占用
  12. win7下chm打不开
  13. 隐马尔可夫模型(Hidden Markov Model)
  14. 清理offset_kafka数据清理
  15. word 文档密码 html,Word文档密码解决打开方法
  16. 从四大云计算公司走向 看云行业趋势
  17. 乐高教育版45544零件---分类识别
  18. 计算机视觉相关网站整理
  19. 图片格式怎么转换?推荐三种实用的转换方法
  20. 树莓派4B安装Ubuntu Server20.04(18.04)连接wifi(对于ubuntu server 99%适用)

热门文章

  1. 【转】拍拍网2015年mysql最新开发规范
  2. QT中setLayout无效的问题
  3. Vue3CLI(脚手架)
  4. 淘宝扣多少分会封店?规则是什么?
  5. Twisted高级话题的学习
  6. ------布尔索引-----
  7. Pygame精灵和碰撞检测
  8. 如何创建Git仓库并上传个人本地代码
  9. photoshop-笔刷
  10. cgb2008-京淘day07