蓝牙服务功能

前言

这阵子用到蓝牙比较多,想写一个专栏专门讲解蓝牙协议及其应用,本篇是第二篇文章,讲解蓝牙服务。

参考网上各大神文章,及瑞萨的文章,参考GPT,并且加入了一些本人的理解。

图片部分源自网络,侵删。

有纰漏请指出,转载请说明。

学习交流请发邮件 1280253714@qq.com

蓝牙服务

在蓝牙低功耗(BLE)中,服务(Service)是指一组相关的特征(Characteristics)的集合,用于定义蓝牙设备之间的数据交换和功能。每个BLE设备可以提供一个或多个服务,每个服务可以包含一个或多个特征。

BLE服务通过唯一的服务UUID(Universally Unique Identifier)来标识,UUID是一个128位的标识符,用于唯一标识一个特定的BLE服务。常见的BLE服务包括:

1. Generic Access Service (GAP):GAP服务是BLE设备中必须提供的一个基本服务,用于管理设备的连接和广告。它包含了设备名称、外观、连接参数等信息。

2. Generic Attribute Service (GATT):GATT服务是BLE设备中定义的一种通用属性协议,用于在设备之间传输和管理属性数据。GATT服务包含了一个或多个特征,每个特征包含了一个或多个属性值。

3. Battery Service:电池服务用于获取BLE设备的电池电量信息。它包含了一个电池电量特征,可以通过读取该特征的值来获取设备的电池电量。

4. Heart Rate Service:心率服务用于获取BLE设备的心率数据。它包含了一个心率测量特征,可以通过读取该特征的值来获取设备的心率数据。

5. Environmental Sensing Service:环境传感服务用于获取BLE设备的环境传感数据,如温度、湿度、光照等。它包含了多个环境传感特征,每个特征对应一种环境传感数据。

6. Health Thermometer Service:健康温度计服务用于获取BLE设备的体温数据。它包含了一个体温测量特征,可以通过读取该特征的值来获取设备的体温数据。

这些是一些常见的BLE服务,不同的设备可能会提供不同的服务和特征,以实现各种不同的功能和应用。通过BLE服务,设备可以实现数据的传输、监测和控制等功能。

服务、特性、属性(读、写、通知)

Service、Characteristic、Property

 

UUID

UUID (Universally Unique Identifier)用于标识蓝牙服务以及通讯特征访问属性,不同的蓝牙服务和属性使用不同的访问方法,就像人们语言交流一样,语言相同才能正常交流(找到正确的UUID,才能使用正确的功能)。 简单理解UUID就是编号,对应不同服务的一个唯一的编号,用于区分不同的服务及服务特性的个体。服务和特性都有各自的UUID。他很像网络应用中的端口号,例如80是HTTP协议的端口,他提供的是HTTP服务。

服务与特性都有一个唯一对应的UUID,每个特性有read、write、notification等属性。我们真正使用蓝牙服务的时候,实际是针对不同属性的特性进行操作。使用过程是:通过蓝牙通信完成与设备的连接,查找到对应的服务,定位到该服务下的某个特性,并根据特性的属性完成具体操作。

16位UUID和128位UUID是两种不同的标识符。

/// @name 16bit Service UUIDs in air format.
/// @sa https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx
///@{
/** Alert Notification Service */
#define ADV_UUID_ALERT_NOTIFICATION_SERVICE         "\x11\x18"
/** Battery Service */
#define ADV_UUID_BATTERY_SERVICE                    "\x0F\x18"
/** Blood Pressure */
#define ADV_UUID_BLOOD_PRESSURE_SERVICE             "\x10\x18"
/** Current Time Service */
#define ADV_UUID_CURRENT_TIME_SERVICE               "\x05\x18"
...

蓝牙16位UUID和128位UUID是用于标识蓝牙设备和服务的唯一标识符。它们之间的区别如下:

1. 长度:16位UUID是16个十六进制字符,而128位UUID是128个十六进制字符。

2. 唯一性:128位UUID的唯一性比16位UUID更高。由于16位UUID的长度较短,可能存在冲突的可能性较大,而128位UUID的长度更长,因此冲突的概率更低。

3. 可用性:由于16位UUID的数量有限,因此在蓝牙设备和服务中使用16位UUID的选择较少。而128位UUID的数量非常大,因此可以更灵活地用于标识各种不同的设备和服务。

4. 可读性:由于16位UUID的长度较短,因此它们通常是由蓝牙SIG(蓝牙特别兴趣小组)分配的预定义UUID。这些预定义UUID通常有一个易于记忆和辨识的名称,例如“蓝牙音频设备”或“蓝牙键盘”。而128位UUID通常是由开发者自己创建的,因此可能没有易于记忆和辨识的名称。

总的来说,16位UUID适用于一些常见的蓝牙设备和服务,而128位UUID适用于更复杂和特定的蓝牙设备和服务。

DA14531 服务的创建与处理

如下,蓝牙可以有多个服务,每个服务有其UUID,每个服务有多个特征值,每个特征值都有其UUID。

// Service 1 of the custom server 1
static const att_svc_desc128_t custs1_svc1                      = DEF_SVC1_UUID_128;static const uint8_t SVC1_CTRL_POINT_UUID_128[ATT_UUID_128_LEN]       = DEF_SVC1_CTRL_POINT_UUID_128;
static const uint8_t SVC1_LED_STATE_UUID_128[ATT_UUID_128_LEN]        = DEF_SVC1_LED_STATE_UUID_128;
static const uint8_t SVC1_ADC_VAL_1_UUID_128[ATT_UUID_128_LEN]        = DEF_SVC1_ADC_VAL_1_UUID_128;
static const uint8_t SVC1_ADC_VAL_2_UUID_128[ATT_UUID_128_LEN]        = DEF_SVC1_ADC_VAL_2_UUID_128;
static const uint8_t SVC1_BUTTON_STATE_UUID_128[ATT_UUID_128_LEN]     = DEF_SVC1_BUTTON_STATE_UUID_128;
static const uint8_t SVC1_INDICATEABLE_UUID_128[ATT_UUID_128_LEN]     = DEF_SVC1_INDICATEABLE_UUID_128;
static const uint8_t SVC1_LONG_VALUE_UUID_128[ATT_UUID_128_LEN]       = DEF_SVC1_LONG_VALUE_UUID_128;// Service 2 of the custom server 1
static const att_svc_desc128_t custs1_svc2                      = DEF_SVC2_UUID_128;static const uint8_t SVC2_WRITE_VAL_1_UUID_128[ATT_UUID_128_LEN]      = DEF_SVC2_WRITE_VAL_1_UUID_128;
static const uint8_t SVC2_WRITE_VAL_2_UUID_128[ATT_UUID_128_LEN]      = DEF_SVC2_WRITE_VAL_2_UUID_128;

如下,Generic Access、Generic Attribute、Device Information,其实都是16位的UUID,是由蓝牙SIG(蓝牙特别兴趣小组)分配的预定义UUID。这些预定义UUID通常有一个易于记忆和辨识的名称。

 

DA14531 通过消息ID选择进入服务的回调

void user_catch_rest_hndl(ke_msg_id_t const msgid,void const *param,ke_task_id_t const dest_id,ke_task_id_t const src_id)
{switch(msgid){case CUSTS1_VAL_WRITE_IND:{struct custs1_val_write_ind const *msg_param = (struct custs1_val_write_ind const *)(param);switch (msg_param->handle){case SVC1_IDX_CONTROL_POINT_VAL:user_svc1_ctrl_wr_ind_handler(msgid, msg_param, dest_id, src_id);break;case SVC1_IDX_LED_STATE_VAL:user_svc1_led_wr_ind_handler(msgid, msg_param, dest_id, src_id);break;

DA14531 通过param参数来对回调函数进行处理 

void user_svc1_led_wr_ind_handler(ke_msg_id_t const msgid,struct custs1_val_write_ind const *param,ke_task_id_t const dest_id,ke_task_id_t const src_id)
{uint8_t val = 0;memcpy(&val, &param->value[0], param->length);if (val == CUSTS1_LED_ON){GPIO_SetActive(GPIO_LED_PORT, GPIO_LED_PIN);}else if (val == CUSTS1_LED_OFF){GPIO_SetInactive(GPIO_LED_PORT, GPIO_LED_PIN);}
}

蓝牙测距

最后介绍一种BLE的特殊功能,这是一种蓝牙特殊的功能

蓝牙测距离可以通过以下几种方式实现:

1. RSSI(接收信号强度指示)测距法:蓝牙设备在通信过程中,可以通过测量接收到的信号强度来估计距离。根据信号强度和距离之间的经验关系,可以通过RSSI值来估计设备之间的距离。

2. TOF(飞行时间)测距法:蓝牙设备可以通过测量信号的传播时间来计算设备之间的距离。这种方法需要设备支持TOF功能,并且需要在设备之间进行时间同步。

3. 视角测距法:蓝牙设备可以通过测量设备之间的视角来估计距离。这种方法利用了三角测量原理,通过测量设备之间的角度和已知的基线长度来计算距离。

需要注意的是,以上方法都是基于估计和计算的,实际测距的精确度会受到多种因素的影响,如信号干扰、障碍物等。因此,在实际应用中,需要根据具体情况选择合适的方法,并进行实时的校准和误差修正。

苹果的Air Tag就用到了这个功能

AirTag是一种由苹果公司推出的追踪设备,可以帮助用户找到丢失的物品。它的工作原理基于以下几个方面:

1. 蓝牙技术:AirTag内置蓝牙芯片,可以与用户的iPhone或其他苹果设备进行通信。当用户将AirTag附在物品上时,可以通过蓝牙与手机进行配对。

2. 寻找功能:当用户无法找到附有AirTag的物品时,可以通过iPhone上的"寻找"应用程序,发出寻找信号。AirTag会发出声音,帮助用户找到物品的位置。

3. 精确定位:苹果的寻找网络是一个由数亿个苹果设备组成的网络,可以帮助用户定位丢失的物品。当AirTag与其他苹果设备接触到时,它会匿名地发送位置信息给用户,以帮助用户找到物品。

4. 安全性:AirTag具有隐私保护功能,以防止被他人滥用。如果AirTag与用户的设备分离超过一定时间,它会发出警报,以提醒用户可能有人追踪他们的位置。此外,AirTag还支持"丢失模式",可以让用户设置联系信息,以便其他人可以联系到他们。

总的来说,AirTag通过蓝牙技术与用户的设备进行通信,并利用苹果的寻找网络帮助用户找到丢失的物品。它提供了精确的定位功能,并具有隐私保护功能,以确保用户的安全。

参考文章

全面且简单明了的蓝牙服务及UUID介绍_蓝牙主服务通道_tanqth的博客-CSDN博客

DA145XX Tutorial Create a Custom GATT Profile — DA145XX Tutorial Create a Custom GATT Profile

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

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

相关文章

Systrace分析App性能学习笔记

学习Gracker Systrace系列文章,总结使用Systrace分析App性能的方法。推荐想通过Systrace学习Framework的同学,去看原文。 文章目录 概述Systrace使用流程Systrace 文件生成图形方式(不推荐)命令行方式 Systrace分析快捷键使用帧状态线程状态查看线程唤醒…

Qt打开及创建项目,运行程序(1)

安装之后, 1.文件->新建文件或项目 2.Application->Qt Widgets Application 3.自己设置名称和路径 4.这一步非常非常重要,要选择编译器,(MinGW是可以在Qt里用,如果想与VS交互,要选择MSVC&#xff09…

Android签名查看

查看签名文件信息 第一种方法: 1.打开cmd,执行keytool -list -v -keystore xxx.keystore,效果如下图: 第二种方法: 1.打开cmd,执行 keytool -list -v -keystore xxxx.keystore -storepass 签名文件密码&#xff0…

YOLOV7改进-空洞卷积+共享权重的Scale-Aware RFE

代码 1、先把文件复制到common.py中 2、yolo.py添加类名 3、下半部分进行添加修改 4、cfg-training:新建配置文件 加了一行,后面对于序号1 5、这里选择12层替代

QT 第五天 TCP通信与数据库

一、数据库增删改查 QT core gui sqlgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your comp…

人工智能和大数据:跨境电商如何实现定制化营销?

在跨境电商竞争激烈的市场中,如何精准地满足消费者的需求并提供个性化的购物体验成为了商家们面临的重要挑战。幸运的是,人工智能和大数据技术的崛起为跨境电商带来了新的机遇,使得定制化营销成为可能。本文将探讨人工智能和大数据在跨境电商…

医院空调冷热源设计方案VR元宇宙模拟演练的独特之处

作为一个备受关注的技术-元宇宙,毋庸置疑的是,因为建筑本身契合了时尚、前卫、高端、虚拟、科幻、泛在、协作、互通等元素特征,因此在建筑行业更需要元宇宙,以居民建筑环境冷热源设计来说,元宇宙会打破既定的现实阻碍和…

AI绘画:StableDiffusion实操教程-斗罗大陆2-江楠楠-常服(附高清图下载)

前段时间我分享了StableDiffusion的非常完整的教程:“AI绘画:Stable Diffusion 终极宝典:从入门到精通 ” 尽管如此,还有读者反馈说,尽管已经成功安装,但生成的图片与我展示的结果相去甚远。真实感和质感之…

Linux系统——MySQL安装(CentOS7 超详细演示)

Linux系统安装MySQL MySQL8.0.26-Linux版安装1. 准备一台Linux服务器2. 下载Linux版MySQL安装包3. 上传MySQL安装包4. 创建目录,并解压5. 安装mysql的安装包6. 启动MySQL服务7. 查询自动生成的root用户密码8. 修改root用户密码9. 创建用户10. 并给root用户分配权限11. 通过Data…

超高真空度精密控制解决方案设计中百度“文心一言”的具体应用

摘要:本文采用国产版本ChatGPT百度“文心一言”作为一种辅助工具,针对超高真空度精密控制装置的开发进行了初期的技术路线设计,对话调研的重点是了解可调节式微流量进气阀门和可用于连接非线性输出信号型真空计的PID控制器。总体而言&#xf…

DevEco Studio开发工具无法预览的问题处理

预览如上图报错信息 解决办法: 1. 首先打开 "SDK管理" 下载后即可解决

【完整代码】2023数学建模国赛C题代码--蔬菜类商品的自动定价与补货决策

C 题 蔬菜类商品的自动定价与补货决策 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此,商超通常会根据各商品的历史销售和需 求情况每天进…