1.欢迎大家关注和订阅匠心之作,【精讲蓝牙协议栈】、【精讲BLE协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待!
2. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论
此文将会继续优化完善...
目录
前言
在蓝牙技术中,`Included Service` 是指一个服务内包含的其他服务。这种结构化的服务关系使得设备可以将相关的服务进行组织和管理,从而简化复杂设备或应用程序中的服务表示。例如,在一个心率监测设备中,主要服务可能是“心率测量服务”,而它可能包括一个“电池服务”,用于报告设备的电量状态。
1.服务类型定义
我们要明确一个概念,服务的类型只有2种,即首要服务和次要服务,引用(包含)服务只是一种方法,而不是一种服务类型,所以没有开启引用服务这个说法,这个要牢记!
1.1 首要服务
Primary Service :拥有基本功能的服务,可被其他服务包含,可以通过Primary Service Discovery 过程来发现。
1.2 次要服务
Secondary Service:仅用来被 Primary/0ther Secondary Service、高层协议引用的服务。
Notes:
1. 次要服务不需要被其他设备知道,只能被首要服务引用,只能被首要服务的<Include>进行包含引用。
2. 次要服务如果不被引用,那它的服务功能就是无法被使用的,其是被隐藏的,不会被公开。
2. included service概念
在蓝牙低功耗协议规范中,`Included Service` 通过 `Include` 属性定义。它定义了一个服务中包含的其他服务的句柄和类型。这使得客户端设备能够理解和访问这些嵌套的服务结构。一个 Included Service 是一种引用已存在服务的方法,具体办法为在服务定义的开始加上 Included Service 的引用,这样整个 Included Service 定义成为新服务定义的一部分,Included Service完全继承了其引用服务的所有功能和权限,包括 读、写、通知、指示等,类比理解Python通过import 某一个模块或函数 as 新函数(也有人类比理解Included Service: 其实是一个服务的子服务,被包含在父服务内。`Included Service` 可以用来共享和重用服务之间的功能,这都是为了更好的记忆啦)。
引用定义(Include Definitions)就相当于在写程序是要用别的文件中的函数, 可以通过#include"XXXXX.h"进行别的头文件的包含。同样当一个服务需要需要 用到别的服务里面的某些值的时候,也可以通过«Include»来完成。然而, «Include»一定是在服务声明之后的,那么服务声明有两种方式,首要服务可以引用另一个首要服务。首要服务也可以引用一个次要服务,从而使用次要服务公开的行为。次要服务可以引用一个次要服务或者首要服务。不过次要服务引用次 要服务情况很少,次要引用主要服务就更少了。那么包含服务«Include»的声明格式是怎么样的呢?如图所示:
从图中可以知道包含服务«Include»本身的 UUID=0x2802。它的属性值共有 3 个 部分组成:需要包含的服务的句柄、组结束的句柄和需要包含的服务的 UUID。 当然最后一个参数并不是一定有的,当 UUID 为 128bits 时,服务 UUID 将不 会作为声明值的一部分。
红色部分为一个服务必须包含的部分,蓝色为可选择的部分。
总结
include 是service 中可选择的部分,它只是一种用来引用已存在服务的方法,公开设备功能的服务成为首要服务。
3. 引用服务UUID详解
后台粉丝私信我,BLE(Bluetooth Low Energy)协议中的 "Include" 属性(包含服务项)是不是使用0x2803。但实际上0x2803 是 "Characteristic Declaration" 的 UUID。BLE 中有几个特定的 UUID,用于定义不同的服务和特征声明:
Primary Service (0x2800): 定义主要服务。
Secondary Service (0x2801): 定义次要服务。
Include (0x2802): 包含另一个服务的声明,通常用于包含服务的指针。
Characteristic Declaration (0x2803): 特征声明,描述一个特征的属性。
因此,如果你要定义一个包含服务项,应该使用 UUID 0x2802。服务和特征都是基于ATT架构的,这里给大家提供一个思维导图,便于大家理解!
例如,如果你要在 GATT(通用属性配置文件)中包含一个服务,可以这样定义:
Service UUID: 0x180A (Device Information Service)
Include UUID: 0x2802 (Include Declaration)
Characteristic UUID: 0x2A29 (Manufacturer Name String)
示例 GATT 结构:
Primary Service: UUID = 0x180A (Device Information Service)
Include: UUID = 0x2802 (points to another service)
Characteristic: UUID = 0x2A29 (Manufacturer Name String)
Properties: Read
Value: "Manufacturer Name"
这个结构中,包含服务的 UUID 是 0x2802,而特征声明的 UUID 是 0x2803。
4. included service 作用和好处
模块化设计: `Included Service` 允许开发者将服务分解为更小的模块,这样可以更灵活地重用和组合不同的服务。
简化设备交互: 通过包含服务,一个设备可以简化其交互结构。例如,某个主服务可以包括多个次服务,从而使得设备能够以一种更有组织的方式提供其所有功能。
提高效率: 如果多个服务有共同的特性或功能,可以通过包含服务的方式来避免重复定义,从而节省资源。
5. included service 实际应用
假设你有一个蓝牙设备,它是一个多功能健康监测设备。它可以监测心率、温度和电池状态。为了简化设计,你可以这样组织:
主服: 健康监测服务
Included Service: 心率服务
Included Service: 温度服务
Included Service: 电池服务
这种结构使得设备可以高效地提供多个相关功能,而不会使服务设计变得过于复杂。
总体而言,`Included Service` 是一种强大的工具,用于组织和优化蓝牙服务,使得设备设计更具模块化和可扩展性。