CC254x--BLE

BLE协议栈

BLE体系结构,着重了解GAP和GATT。


  • PHY物理层在2.4GHz的ISM频段中跳频识别。
  • LL连接层:控制设备的状态。设备可能有5中状态:就绪standby,广播advertising,搜索scanning,初始化initiating和连接connected广播者传播数据,使得浏览者可以接收到。initiator就是一个对广播者回复连接请求的设备。如果广播者接受请求,广播者和initiator初始者就会进入connected连接状态。一个处于连接状态的设备会有一个角色:master和slave。初始化这个连接的为master,接受这个连接请求的为slave
  •  HCI层为host和controller之间通过一个标准接口进行通信提供了一些方法。这一层可以通过一个软件API或者是硬件接口如UART,SPI和USB。
  •  L2CAP为上层数据提供封装服务。
  •  SM:定义了建立连接和KEY的方法。
  • GAP:直接与profile和app进行接触,解决设备的发现和连接相关的服务,此外GAP也会初始化安全相关的特色。
  • ATT:允许一个设备去显示一些数据,对于其他设备称之为“Attribute属性”,在ATT中,那些显示这些属性的设备被称为server,同等的另一个设备称为clientLL层的状态master和slave和ATT层的这两个状态无关
  • GATT层:是一个服务框架定义了对ATT应用的子程序。GATT指定了profile的结构。在BLE中,由profile或者是服务所使用的所有类型的数据都称为characteristic。发生于两个设备间通过BLE连接进行交换的数据都需经过GATT子程序处理。因此,app和profile会直接使用GATT。

要开发app,真正接触的是GAP和GATT,GAP用来建立连接,GATT用来数据传送

GAP

一个从设备只能链接一个主设备。


低功耗蓝牙设备定义了四类GAP角色:

  • 广播者
  • 观察者
  • 外围设备
  • 中央设备

GATT


建立连接的流程



应用数据传输流程



PROFILE、SERVICE、CHARACTERISTIC、UUID

蓝牙BLE有自己的协议标准,一个产品可以有很多服务service,一个蓝牙服务service包括一个或者多个characteristics,而每个characteristics都包含对应UUID、属性描述(如可读、可写、长度等)、属性值value、属性配置(代表订阅信息)等等。

每一个属性都有一个地址——句柄。为了简化后续的数据处理,一般framework会设置一个handle来对应一个characteristics。

服务是一种或多种特性的组合;特性则由一种或多种属性组成。

特征字主要包含writereadnotifyindicate等主要通信方式。

    • 对于蓝牙外设的write特征字,主设备(如手机)可以进行写操作;
    • 对于read,主设备则可以从中读取信息;
    • write和read对于蓝牙外设来说,其属于被动控制,即蓝牙外设被动接受主控制的通信控制。
    • 而notify和indicate则是蓝牙外设主动向主设备传输数据,前提是主设备要预先订阅对应的characteristics的信息更新。Notify数据后,主设备不需要应答响应,而indicate则需要应答响应。


属性

属性概述

2字节

2或6字节

0~512字节

属性句柄

属性类型

属性值


属性句柄

有效的句柄范围从0x0001~0xFFFF。0x0000为无效句柄,不能用于寻址属性。你可以根据自己在软件硬件或嵌入式方面的背景,把句柄相应地想象为内存地址、端口号、属性值对应的硬件寄存器地址。

属性类型

可以被公开的数据有许许多多的类型:温度、压强、体积、距离、功率、时间、充电状态、开关状态、状态机的状态等。所公开的数据的种类称作属性类型。为了区分如此多的数据类型,一串128位的数字被用来标识属性的类型。这个唯一的标识码就叫做通用唯一识别码(UUID)。

蓝牙UUID基数如下:

00000000-0000-1000-8000-00805F9B34FB

0x1800 ~ 0x26FF 用于服务类通用唯一识别码

0x2700 ~ 0x27FF 用于标识计量单位

0x2800 ~ 0x28FF 用于区分属性类型

0x2900 ~ 0x29FF 用于特征描述

0x2A00 ~ 0x7FFF 用于区分特性类型

属性值

属性值用于标识设备公开的状态信息。属性值的长度可以从0字节到最长512字节,但某些类型的属性值的长度则是固定的。属性值对属性协议来说并不重要,但它对于上层,包括通用属性规范和其之上的服务于规范来说有着相当重要的意义。

最小的属性数据库必须包含以下的六种属性:《GAP服务》的《首要服务》、《设备名》的《特性》、《设备名》的值、《外观》的《特性》、《外观》的值、《GATT服务》的《首要服务》。但这样的数据库没能公开足够的状态,故没有实用价值。

绑定

如果客户端想与其他设备建立长期通信关系,首先应连接该设备,找到一些能用的服务,然后启动一个安全连接。这些安全连接先是认证该设备为正确的设备,再对连接进行加密以确保机密。最后,设备交换一些配对信息——这是关键的一部:如果客户端存储了该配对信息,就与对端设备完成了“绑定”。

绑定的重要性在于,当客户端重新连接到该设备时,并不需要再次认证身份或交换配对信息,而只需要将部分的绑定信息用于连接加密。于是设备之间便建立了一个认证的、保密的数据连接。

绑定也提供了一些其他好处。设备绑定之后,服务器将为此客户端保存其配置数据。这种模式将使重连设备立刻收到通知,而不需要重新配置服务器。

这种方法的另一个主要优势是,客户端可以记住外围设备的属性句柄灯信息。也就是说,一旦中央设备了解了外围设备的服务集,并且完成了配置,就能记住相关的属性句柄。当中央设备重新连接到外围设备,它可以读取和写入这些属性句柄,而不用再做一次服务扫描。这减少了从连接到使用设备之间所需要的时间。

应注意,服务变更只与邦定的设备密切相关。如果中央设备没有和外围设备绑定,则不能缓存属性句柄,也收不到任何服务变更的通知。换言之,对两个未绑定设备来说,客户端必须在每次连接时刷新服务器对的整个服务列表和特性列表。

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

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

相关文章

DW 在onload运行recordset find.html时 发生了以下javascript错误

这两天打开Dreamweaver CS5,总是弹出一个错误,写着: 在onLoad运行RecordsetFind.htm时,发生了以下JavaScript错误: 在文件“RecordsetFind”中: findRsisnotdefined 在关闭Dreamweaver的时候也会弹出一个类…

Azure Container App(一)应用介绍

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 一,引言 容器技术正日益成为打包、部署应用程序的第一选择。Azure 提供了许多使用容器的选项。例如&#xff0…

CC254x--API

CC2541常用API 连接 定义广播数据 GAPRole_SetParameter(GAPROLE_ADVERT_DATA,…); 自定义扫描响应数据 GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA,…); 密码管理回调 ProcessPasscodeCB(); 状态管理回调 peripheralStateNotificationCB(); 通信控制 添加GATT服务 GATTServ…

mysql 分区信息查看

select partition_name part,partition_expression expr,partition_description descr,table_rows from INFORMATION_SCHEMA.PARTITIONS where TABLE_SCHEMASCHEMA() AND TABLE_NAMEmx_domain//查看分区信息 CREATE TABLE mx_domain (id int(10) NOT NULL AUTO_INCREMENT,name…

怎样配置键盘最方便,以及一些设计的思考

使用Emacs的人,如果肯折腾,肯定有重新映射键盘的经历。我原来经常看到的是把Ctrl和Capslock交换,但是我感觉没什么道理,因为Ctrl已经用的很熟练了,换了反而不方便,而且对其他程序影响太大。那么我们就要使用…

profile、服务、特征、属性之间的关系

一个profile有很多的服务,一个服务又有很多的特性,一个特性中又有几种属性条目组成。 profile(数据配置文件) 一个profile文件可以包含一个或者多个服务,一个profile文件包含需要的服务的信息或者为对等设备如何交互的…

面试突击32:为什么创建线程池一定要用ThreadPoolExecutor?

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 在 Java 语言中,并发编程都是依靠线程池完成的,而线程池的创建方式又有很多,但从大的分类…

Bootstrap datepicker 在弹出窗体modal中不工作

解决办法 在 show 方法后面 添加 下面一段代码 $(#modalCard).modal(show);—例子 打开 弹出窗体 //$(#modalCard).modal(hide); $(#modalCard).on(shown.bs.modal, function () { //$(.input-group.date).datetimepicker({ $(#dpReceiveDate).datetimepicker({ format: "…

学习Samba基础命令详解之大话西游01

服务名:smb配置目录:/etc/sabma/主配置文件:/etc/sabma/smb.conf# Global Settings 17行workgroup语法 workgtoup <工作组群>; 预设 workgroup MYGROUP 说明 设定 Samba Server 的工作组 例 workgroup workgroup 和WIN2000S设为一个组&#xff0c;可在网上邻居可中看到…

实例讲解getopt()函数的使用

[cpp] view plaincopy #include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]) { extern char *optarg;//保存选项的参数 extern int optind, opterr, optopt; int ch; printf("\n\n"); pri…

机器学习实战 | SKLearn最全应用指南

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 作者&#xff1a;韩信子ShowMeAI 教程地址&#xff1a;http://www.showmeai.tech/tutorials/41 本文地址&#xff1a;http…

windows 64位 安装mvn提示 不是内部或外部命令

在安装mvn的过程中当在mvn的目录下去执行mvn命令的时候是可以正常执行的&#xff0c;当设置好环境变量后执行后发现提示mvn不是内部命令。 原因是设置的MAVEN_HOME变量未被Path解析&#xff0c;解决办法是 直接把path中的%MAVEN_HOME%\bin 换成MAVEN_HOME的绝对路径&#xff0c…

Scheme语言入门

2019独角兽企业重金招聘Python工程师标准>>> Scheme语言入门 最早听说 LISP&#xff0c;是 Stallman 的 GNU Emacs 中将 LISP 作为嵌入语言&#xff0c;定制和增强 Emacs。GNU Emacs 是一个文本编辑器&#xff0c;文本就是一种符号&#xff0c;而 Lisp 正好就是针对…

题目四 艺术品

Dr.Kong设计了一件艺术品&#xff0c;该艺术品由N个构件堆叠而成&#xff0c;N个构件从高到低按层编号依次为1&#xff0c;2&#xff0c;……,N。艺术品展出后&#xff0c;引起了强烈的反映。Dr.Kong观察到&#xff0c;人们尤其对作品的高端部分评价甚多。 狂热的Dr.Kong一激动…

如何将docker 镜像上传到docker hub仓库

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 如何将docker 镜像上传到docker hub仓库 目录* 如何将docker 镜像上传到docker hub仓库 背景 1.注册docker hub账号 2.…

C# 类(14) 事件

using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace ConsoleApplication1 {//先在外面定义一个类.class MyClass{//委托是事件的前提,所以先定义一个委托public delegate void Mydelagate(int i);// 接着定义事件. public event…

ThinkPHP框架 _ 学习3

【路由解析】 通过url地址get参数找到指定的控制器&#xff0c;并进行对应方法调用请求 http://网址/index.php?m模块名称&c控制器&a方法 以上url地址信息代码不够优雅、不安全。 tp框架url地址可以由以下四种 http://网址/index.php?mXX&cXX&aXX 基本get模…

The slave I/O thread stops(equal MySQL server ids)

在学习replication时遇到了如下问题&#xff1a;显然看到Slave_IO_Running 为NO 表示有问题&#xff1b;到日志里查看&#xff0c;错误如下&#xff1a;position 98100121 17:09:03 [ERROR] The slave I/O thread stops because master and slave have equal MySQL server ids;…

pytest配置文件pytest.ini

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 说明&#xff1a; pytest.ini是pytest的全局配置文件&#xff0c;一般放在项目的根目录下是一个固定的文件-pytest.ini可以…

函数声明、引用

1.函数的声明 function 函数名(形参1&#xff0c;形参2&#xff0c;形参3....){ 函数体&#xff1b; return; } 2.函数的调用方式&#xff1a; func(1,2,3); 函数名(参数1&#xff0c;参数2&#xff0c;参数3); 3.return:&#xff0c;并返回一个函…