基本概念
RSSI(Received Signal Strength Indicator)是接收信号的强度指示。
接收包RSSI是指无线模块发送信息后,接收端的无线模块接收到数据后,当前接收数据的信号强度的寄存器值,也就是接收模块获取到发送模块当前发送的信号强度。dbm是无线信号的强度单位。一般在 -90 ~ 0之间。
一般情况下:
-50~0之间信号强度很好,使用感知好。
-70~-50之间信号强度好。使用感知略差,但体验上无明显影响。
-70以下 信号就不是太好了,使用上感知就不好。为什么测量出来的dbm值都是负数?
答:首先我们需要知道的是无线信号dbm都是负数,最大是0。因此测量出来的dbm值肯定都是负数。dbm值只在一种情况下为0,那就是在理想状态下经过实验测量的结果,一般我们认为dbm为0是其最大值,意味着接收方把发射方发射的所有无线信号都接收到了,即无线路由器发射多少功率,接收的无线网卡就获得多少功率。当然这是在理想状态下测量的,在实际中即使将无线网卡挨着无线路由器的发射天线也不会达到dbm为0的效果。所以说不要盲目的认为负数就是信号不好。关于蓝牙协议栈的分层结构说明,参考:
蓝牙协议栈分层_蓝牙协议栈有几层组成?各层的协议有哪些?_wwwlyj123321的博客-CSDN博客
这篇文章可以作为入门来看。
其中:
GAP层(Generic access profile)通用访问文件层
GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接等。
GATT(Generic attribute profile )通用属性配置文件层
GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑,但互联互通就会出问题,也正是因为有了GATT和各种各样的应用profile,BLE摆脱了ZigBee等无线协议的兼容性困境,成了出货量最大的2.4G无线通信产品。GATT服务器和客户端
通俗地说吧,Server(服务器)就是数据中心,Client(客户端)就是访问数据者。特别说明,它与主/从设备是独立的概念:一个主设备既可以充当Server,又可以充当Client;从设备亦然。
服务器宣传它的存在,因此它可以被其他设备发现并包含客户端可以读取的数据。客户端扫描附近的设备,当它找到它正在寻找的服务器时,它会建立连接并监听传入的数据。这称为点对点通信(还有其他可能的通信模式,如广播模式和网状网络)。
句柄(Handle)就是服务数据在数据中心的地址,当所有的服务数据组织起来后,它总得有个先后顺序,某个服务的位置就是它的句柄。还是上面的类比,如果想去图书馆借阅《现代操作系统》,需要查明该书在哪一层楼,哪个房间,这就是该书的Handle。
配置文件、服务、特征、描述符
GATT配置文件规格规定了交换配置文件数据的架构。此架构定义了配置文件所用的基本元素,例如服务和特征。
该层级的最高层是配置文件(profile)。配置文件由实现用例所需的一个或多个服务组成。服务由特征或有关其它服务的引用组成。每一个特征包括一个值,还可能包括有关该值的可选信息。服务、特征以及特征的组件(即特征值和特征描述符)构成了配置文件数据,并全部存储在服务器的属性中。
总结来说就是,蓝牙中,定义了一个ATT属性协议,规定了怎样去访问对端设备的数据。
数据存储在属性服务器的“属性”里,供客户端进行读写操作。
属性里存储了好多配置文件,每个配置文件就是各种服务的集合,服务里又有好多特征值。
比如,传感器的温度、湿度数据,就是特征值,这些特征值组成一个服务(即从机能够提供的功能),再往上组成一个配置文件,都存在属性服务器里。
这里注意下,什么是特征的描述符?简答来说就是对该特征的一些描述信息等等。
具体参考:蓝牙 服务,特性,描述符,属性条目_蓝牙特征表_zhuimeng_ruili的博客-CSDN博客
服务存在于从机中,每个服务代表从机的一个能力;
特征的数值就是我们最终要操作的数据。
蓝牙的UUID
可参考:蓝牙小知识:UUID 是什么 - 物联网技术分享
UUID是“Universally Unique Identifier”的简称,通用唯一识别码的意思。对于蓝牙设备,每个服务都有通用、独立、唯一的UUID与之对应。
比如,设备名称的UUID为0x2A00,是固定的,蓝牙协议里规定的。
当然,也可以自定义。具体见上方参考文章。
MTU
最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸。是包或帧的最大长度,一般以字节记。如果MTU过大,可能会发送失败,因为它不能处理过大的包。如果太小,因为协议一定要在包(或帧)上加上包头,那实际传送的数据量就会过小,这样也划不来。大部分情况下系统会提供给用户一个默认值,该值一般对用户是比较合适的。
透传
透传是一种透明传输,是一种形象的说法。它指的是,数据从发送端发出,不管中间经过多少设备,最终到达目的地时,依然是原封不动的,这就好像数据是直接从发送端设备到达目的地设备,中间所经过的路径对于发送方和接收方来说,就好像是不存在的一样。所以,将其形象地称之为透明传输,即透传。
这中间的所有设备总和,对数据不进行任何改变,只是单纯地转发出去。
那么就有个问题,既然只是单纯地转发,为什么还要多经过一道透传模块,而不直接发送给目的地呢?
透传一般都是无线设备用来读取远程的数据。在物物相连的物联网时代,要想实现智能设备的数据透传就需要仰仗无线透传模块的力量,可实现发送方和接收方数据的长度和内容完全一致,不需对数据做任何处理,相当于一条数据线或者串口线。
其实,就可以理解成,因为无线设备没有数据线连接,所以要想将数据发送到远程,就只能通过无线透传模块。这也是透传的主要应用。
比如:我有个蓝牙从机,已经实现了功能,现在我想通过串口给从机发命令让它工作,但是,从机又没法直接连上数据线,此时,就要通过一个透传模块,该模块可以和从机通信,我串口向无线透传模块发指令,透传模块再将指令转发给从机,从而将串口的数据,以透明传输的方式发送给从机,这时候,透传模块只是为了实现数据的传输而存在,就相当于是透明的,只是一根数据线而已,就是串口直接将数据发送给从机的。
句柄
英文是 handle
句柄(Handle)是一个用来标识对象或者项目的标识符,可以用来描述窗体、文件等,值得注意的是句柄不能是常量 。
Windows之所以要设立句柄,根本上源于内存管理机制的问题,即虚拟地址。简而言之数据的地址需要变动,变动以后就需要有人来记录、管理变动,因此系统用句柄来记载数据地址的变更。在程序设计中,句柄是一种特殊的智能指针,当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。
句柄(handle)是C++程序设计中经常提及的一个术语。它并不是一种具体的、固定不变的数据类型或实体,而是代表了程序设计中的一个广义的概念。句柄一般是指获取另一个对象的方法——一个广义的指针,它的具体形式可能是一个整数、一个对象或就是一个真实的指针,而它的目的就是建立起与被访问对象之间的唯一的联系。
简而言之,就是通过特定的句柄,去访问某个对象。
nRF52832
nRF52832是一款蓝牙芯片。其实就可以看做一个普通的单片机芯片,只是这个单片机芯片集成了一个功能完善的蓝牙模块。
蓝牙可以分为主机和从机,其实都是一块芯片,当程序里实现主机的功能(典型如扫描)时,就可以作为主机,当程序里实现了从机的功能(典型如广播)时,就可以作为从机。不要以为芯片还分为什么主机芯片和从机芯片。芯片里已经集成了主机和从机等各种功能,去相应实现一下再烧录即可。