前面的蓝牙部分都是基础说明,示例分析,本文就来改他一改

目录

  • 前言
  • 一、示例更换说明
    • gatt_server_service_table
  • 二、示例测试
    • 2.1 广播包
      • 2.1.1 设备名称
    • 2.2 服务与特征值
    • 2.3 读写操作
      • 2.3.1 通知 notify
      • 2.3.2 值 value
  • 三、示例修改(添加一个characteristic)
    • 3.1 UUID 定义
    • 3.2 枚举 定义
    • 3.3 添加属性表
  • 结语

前言

又隔了一段时间没接着玩 ESP32-C3 ,又把自己的蓝牙文章重新看了一遍才可以继续进行……

嗯…… 看完忽然想了好多问题,尤其是针对上一篇文章的示例,在想到蓝牙初始化,通讯的时候,那些流程细节,虽然知道基本的步骤,但是每一个本质上是进行了哪些细节操作还是完全没头绪啊,有时候使用这种完全不知道本质的代码,感觉心慌慌,嗯……

算了,先不烦这些,认清目标:

我们不是来研究蓝牙协议的,我们是来使用 ESP32-C3 跑蓝牙协议,用来 数据传输通讯的。我们要会用 ESP—IDF 提供的示例框架,根据自己的实际需求修改代码,这就是我们最终的目的 !(熟悉蓝牙协议栈的朋友就随意了 (灬ꈍ ꈍ灬))

最终我们要实现一个小示例,通过蓝牙通讯,把传感器的数据发送给手机,然后手机也可以控制开发板上的LED灯。

我们在上文说过蓝牙应用程序开发,就是开发 service 和 characteristic。通过API,添加自己需要的characteristic 和 service。

所以今天,我们势必得在示例基础上动一动,就先在现有 Service 的基础上,添加一个额外的characteristic。

ESP32-C3 入门专栏目录:【导航】ESP32-C3 入门教程目录 【快速跳转】
❤️
ESP32-C3学习 蓝牙 篇系列博文连接:

❤️
测试使用的开发板:
自己画一块ESP32-C3 的开发板(第一次使用立创EDA)(PCB到手)

❤️
测试使用的开发环境:
ESP32-C3 VScode开发环境搭建(基于乐鑫官方ESP-IDF——Windows和Ubuntu双环境)

❤️
蓝牙篇系列相关博文:
ESP32-C3 学习测试 蓝牙 篇(一、认识 ESP-IDF 的蓝牙框架、简单的了解蓝牙协议栈)
ESP32-C3 学习测试 蓝牙 篇(二、蓝牙调试APP、开发板手机连接初体验)
ESP32-C3 学习测试 蓝牙 篇(三、认识蓝牙 GATT 协议)
ESP32-C3 学习测试 蓝牙 篇(四、GATT Server 示例解析)


一、示例更换说明

在我们前面几篇文章,都是从 GATT Server 示例说起的,本来也是计划从 GATT Server 示例来做以后测试的修改框架。

但是自己想增加一个 characteristic 的时候,发现无从下手。正好在上一篇文章《ESP32-C3 学习测试 蓝牙 篇(四、GATT Server 示例解析)》后又小伙伴留言问过,官方是不是推推荐 gatt_server_service_table ?

gatt_server_service_table

所以还是回头看了自己蓝牙篇的第一篇文章,看了下这两个的比较(当时属于概括,也没有什么特别说明):

于是乎还是得找到官方自己的示例说明,仔细看了一下示例说明,官方对 GATT Server 示例其实有说明,推荐了 gatt_server_service_table 示例,如下图:

在乐鑫官方论坛我也找到过类似的问题,其中有说明 GATT Server 是一种根据事件串行创建服务、特征值和描述符的,创建多服务或者特征值时不太方便,如下图:

.

所以我们需要使用示例 gatt_server_service_table 作为我们的测试修改的示例,我们正常的新建一个示例,先简单看看示例框架:

/*gatt_server_service_table  示例初始化gatts_table_creat_demo.c
*/
void app_main(void)
{esp_err_t ret;/* Initialize NVS. */ret = nvs_flash_init();ESP_ERROR_CHECK( ret );ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);ret = esp_bluedroid_init();ret = esp_bluedroid_enable();ret = esp_ble_gatts_register_callback(gatts_event_handler);ret = esp_ble_gap_register_callback(gap_event_handler);ret = esp_ble_gatts_app_register(ESP_APP_ID);esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(500);}
}

初始化流程是和上一篇文章分析的 GATT Server 示例是一样的, 所以这里我们就不再次分析了。

❤️ 在ESP-IDF 中 GATT Server 的示例中,官方提供了一个 方便添加修改特征值和服务的示例 gatt_server_service_table 以供开发者使用。

.

二、示例测试

新的例程,不管三七二十一,先跑起来看看,程序正常便宜烧录,然后通过手机蓝牙助手可以看到设备:

我们前面已经有几篇文章的基础,所以本文不用讲太多理论,我们直接用图文说明几个地方。

2.1 广播包

Server 设备还没有连接的时候,会一直发送广播包,我们在手机端可以点击设备查看广播包等信息。

在 gatt_server_service_table 示例程序中广播包的定义用数组raw_adv_data表示,如下图:

这里在额外放一下 GATT Server 示例 的广播包,除了前面3个字节,后面都对不上,这里暂时我也不明白 = =!

2.1.1 设备名称

对于我们上一篇文章说明的 GATT Server 示例 ,我们直接修改宏定义就可以改变设备名称:

但是对于本文 gatt_server_service_table 示例来说,修改宏定义并不能改变设备名称:

说明: 这里我们是看表象,或许本质上,只是个关联设置问题,但是我们现在目的是快速使用,里面的本质这些我们暂时不考虑。

在广播包中会包含一些设置好的信息,其中就有设备名称,在我们的 gatt_server_service_table 示例中,可以看到广播包中有关于设备名称的部分:

所以,如果我们需要修改设备名称,我们直接在这个数组里面修改,但是不要忘了长度,修改示例如下:

2.2 服务与特征值

我们点击连接设备,可以看到 gatt_server_service_table 示例中的 Service 与 characteristic ,如下图:

对于这些不同的 characteristic ,我结合程序做了个示意图说明:

.

2.3 读写操作

读写操作在上一篇文章中,我们已经测试过了,换了一个示例,其实读写的简单测试还是一样的,这里针对几个地方再分别介绍一下。

2.3.1 通知 notify

通知,也算是一种可传递的消息,在我们介绍 GATT 协议的时候讲过,如果 characteristic 具有 notify 或 indicate 操作功能时,必须为其添加响应的CCCD(characteristic descriptor),这一点在程序中创建 characteristic 的时候就有体现:

对于通知的发送,是通过esp_ble_gatts_send_indicate 函数发送,如下图:

我们可以修改一下通知的值,测试一下看看:

接收不全? 看了下输出日志,应该是太长了,提示最大应该是20字节:

再改一次,这次OK:

.

这里还有一个地方需要说明,esp_ble_gatts_send_indicate 函数的最后一个参数,当为 false 时候,不需要得到回复,为 true 时,需要得到回复。

2.3.2 值 value

每一个 characteristic 都有自己的 value ,对于示例来,与 characteristic 的 value 关联的地方如下图:

既然知道了位置,那么和通知一样,我们简单修改测试一下:


.

❤️ 这里说明一下,在上面通知部分,我们看到测试示例的日志输出的提示为 attribute value too long, 我们以前说过 characteristic 的条目的实现都是通过 attribute 来表达的,所以对于notify 的最大长度为 20, 对于 characteristic value 来说也是一样的,最大长度为20。

上面的示例修改,如果数据长度超过20会有问题,手机端读取不到。

这个还有个小疑问, value 的长度大小可不可以自行设定?哪里设定?

这个问题后面如果有需要用到或者学到了再来解答,暂时先提出来。

三、示例修改(添加一个characteristic)

经过上面的基础测试,我们开始在示例结构上添加一个新的 characteristic 。

这里的步骤我就直接使用图文说明,我会把添加的文件名称,代码位置都截图出来:

3.1 UUID 定义

3.2 枚举 定义

3.3 添加属性表


.

完成编译,忽然发现好简单= =!

通过手机查看一下效果:

测试过后,读写操作都正常。

最后还是得感叹一下,使用 gatt_server_service_table 添加 characteristic 真的是太方便了。

结语

本文我们更换了一下蓝牙 GATT 学习的示例程序,通过进一步的的程序测试,让我们更加的熟悉了 ESP-IDF 提供的示例框架,也知道了如何添加 characteristic。

当然这只算是我们修改的开始,我们接下来要在此基础上学会添加 Service,通过我们自己添加的 Service和 characteristic 传输我们自己的应用数据,
然后把以前传感器驱动整合进工程,最后实现我们小目标:通过蓝牙通讯,把传感器的数据发送给手机,然后手机也可以控制开发板上的LED灯等设备。

路要一步一步走,饭要一口一口吃,本文就到这把,谢谢!

ESP32-C3 学习测试 蓝牙 篇(五、添加 characteristic)相关推荐

  1. ESP32-C3 学习测试 蓝牙 篇(四、GATT Server 示例解析)

    了解了蓝牙 GATT 相关概念,趁热打铁,分析一下官方示例 GATT Server 的应用程序架构. 目录 前言 一.GATT Server 示例分析 1.1 初始化 1.2 回调函数 gatts_e ...

  2. ESP32-C3 学习测试 蓝牙 篇(二、蓝牙调试APP、开发板手机连接初体验)

    等了好久终于等到今天,盼了好久终于把蓝牙测试 = =! ESP32-C3 专栏好久没更新了,这次抽点时间把蓝牙的准备工作做完. 目录 前言 1.蓝牙手机调试工具 2.ESP-IDF中示例的选择 3.E ...

  3. 深度学习基础入门篇[五]:交叉熵损失函数、MSE、CTC损失适用于字识别语音等序列问题、Balanced L1 Loss适用于目标检测

    [深度学习入门到进阶]必看系列,含激活函数.优化策略.损失函数.模型调优.归一化算法.卷积模型.序列模型.预训练模型.对抗神经网络等 专栏详细介绍:[深度学习入门到进阶]必看系列,含激活函数.优化策略 ...

  4. shell脚本学习之基础篇五:函数

    shell脚本中的函数 函数的作用 函数的定义 函数的调用 函数的返回值 函数的传参 函数中的变量 函数的递归 函数的作用 在编写shell脚本的时候,经常会发现在多个地方使用了同一段代码,如果只是一 ...

  5. 学习->C++篇五:模板与STL简介

    目录 1. 函数模板 2. 类模板 3.模板的语法 (1)非类型模板参数 (2)   模板的特化 (3)模板的分离编译 4.STL简介 1. 函数模板 模板是泛型编程的基础,一个模板就是一个创建类或函 ...

  6. Linux学习笔记---命令篇

    Linux学习笔记-命令篇 本笔记是根据尚硅谷的Linux视频,经过自己的总结得出来的笔记,分为两个大章节,一-四章讲的是Linux的文件目录结构.vim编辑器.网络配置和系统管理.进程和服务.第二个 ...

  7. OpenCV学习系列教程第五篇:测试和提高代码的效率

    Opencv-Python学习系列教程第五篇 来自opencv-python官方学习文档,本人谨做翻译和注释,以及一些自己的理解 本文由作者翻译并进行代码验证,转载请注明出处~ 官方文档请参阅:htt ...

  8. 为啥linux分区是nvme0n1,NAS 篇五:尝试达成最终目标: 黑裙+万兆网卡+Nvme 存储空间的实现与测试...

    NAS 篇五:尝试达成最终目标: 黑裙+万兆网卡+Nvme 存储空间的实现与测试 2020-01-18 18:49:23 46点赞 248收藏 80评论 创作立场声明:1. 本系列文章讨论NAS与局域 ...

  9. MicroPython开发ESP32入门笔记 -- 蓝牙篇

    文章目录 前言 一. ESP32 和 Micropython 简介 二.蓝牙模组通讯原理简介 三.手机端和ESP32蓝牙通讯 1. ESP32蓝牙呼吸灯代码 2. 手机端准备 总结 前言 博主之前学习 ...

  10. 计算机英语感想1500,英语学习心得1500字五篇

    学了这么多年的英语,不能说有多么好的学习方法,但是也算是摸爬滚打过来的,总结了一些学习的经验,希望能使大家在学英语的道路上走得轻松一些,这里给大家分享一些关于英语学习心得,供大家参考. 英语学习心得1 ...

最新文章

  1. 【SICP练习】136 练习3.67
  2. hangfire 过期记录_时隔数月后我又有减肥的想法(饮食日记录)
  3. java自然排序_Java中的自然排序顺序字符串比较 - 是内置的吗?
  4. poj1068解题报告(模拟类)
  5. cocos 2dx 一 核心类关系
  6. ASP.NET MVC3 Razor视图引擎-基础语法
  7. [包计划] node-fs-extra
  8. OpenTSDB 安装
  9. Flask-SQLAlchemy一般方法总结
  10. iOS事件机制,以及不同手势使用touchesBegan等表现
  11. vue3.0和vue2的区别
  12. android 同步list数据,android SharedPreferences保存list数据
  13. Erlang中的record与宏
  14. 100个常用的 JS 代码
  15. matlab神经网络
  16. Python制作词云
  17. 睡眠障碍,正在“杀死”3亿中国人
  18. 在php中调用api接口,如何调用51ditu的api接口并在PHP中应用
  19. 微信小程序九宫格抽奖大转盘
  20. java编程根据订单编号查询订单状态_Java微信订单查询

热门文章

  1. Spring Cloud Loadbalancer
  2. V神以太坊:协议设计中的“封装复杂性” vs. “系统复杂性”
  3. 在手机与计算机之间进行文件传输的方式,电脑与手机快速传输文件的方法
  4. 怎么避免从删库到跑路
  5. IDEA中 Maven name group、artifact、package区别
  6. 基于springboot网上商城交易平台源码
  7. 安装无人值守称重系统费用
  8. 李白打酒递归java_李白打酒----递归理解
  9. Spring MVC 详解
  10. 大白菜U盘重装Win10系统教程