蓝牙学习---GAP

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


这篇文章主要是了解GAP和GAP的初始化

我们需要知道的是GAP和GAP的初始化

一、GAP是什么?

GAP(Generic Access Profile, 通用访问规范),该profile保证不同的Bluetooth产品可以互相的发现对方并建立连接。同时描述了设备如何成为广播者和观察者,并且实现无需连接的数据传输。还定义了不同类型的地址来实现隐私性和可解析性。
GAP处于Nordic的主协议层。在这里插入图片描述

1.1 GAP的作用

GAP定义了蓝牙设备的如何发现和建立其他设备的安全的(或不安全)连接。GAP定义了设备如何彼此发现、建立连接以及如何实现绑定,同时描述了设备如何成为广播者和观察者,并且实现无需连接的传输。同时,GAP定义了如何用不同类型的地址来实现用不同的类型的地址来实现隐私性和可解析性。它处理一些一般模式的业务(如询问、命名和搜索)和一些安全的问题(如担保),同时还处理一些有关连接的业务(如链路建立、信道和连接建立)。GAP规定的是一些一般性的运行任务。因此,它具有强制性,并作为其它蓝牙应用范围的基础。
规定了三个方面:GAP角色、模式(可发现模式,连接模式,安全模式)和规程、安全问题。
模式:描述的是设备的工作状态,当一个设备被配置为按照某种方式操作一段较长的时间,称为模式。
规程:规程描述的是在有限的时间内进行特定的操作,如连接参数更新规程,它是在较短的时间内执行了连接参数更新的操作。

1.2GAP角色

BLE协议栈的GAP层负责处理设备的接入方式和过程,包括设备发现,链路建立,链路终止,启动安全功能,设备配置。GAP层通常扮演以下四种角色中的一种。
· 外围设备(Peripheral):广播发送者,是可连接的设备,连接后成为从设备
· 中央设备(Central):扫描广播启动连接,连接后成为主设备
· 播报设备(Broadcaster):广播发送者,不是可连接的设备
· 观察设备(Observer):扫描广播启动连接,连接后成为主设备
那么为什么GAP要分为4种角色?因为蓝牙标准制定的考虑,BLE主打低功耗,所以在BLE体系中,为了更大可能的优化设备,节省功耗,所有层都采用了非对称的设计,对于物理层的无线电装置,可以是以下3种形式:
· 芯片只有发射机:只能发射无线信号,不能接收无线信号,硬件成本低。
· 芯片只有接收机:只能接收无线信号,不能发射无线信号,硬件成本低。
· 芯片同时具有接收机和发射机:既可以接收无线信号,也可发射无线信号,硬件成本较高。
这样,当某个应用只需要在设备之间单向传输数据时,其中一个设备可以作为广播者,采用只有发射机的芯片,另外一个设备可以作为观察者,并且用了尽量少的硬件资源,所以功耗会更低,理论造价也会更低。
当然,我们也可以用同时具有接收机和发射机的设备实现这些功能,实际产品中,用这种方式的更多,但是因为只需实现单项传输,广播者多了用不到的接收机,观察者多了用不上的发射机,这会增加电流的消耗和硬件成本。
所以,蓝牙标准的制定考虑的足够多,从功耗、成本、以及各种应用场景都做了全面的考虑。
但是,需要注意的是,实际应用当中,绝大部分用户会采用同时具备接收机和发射机的方案,这使得芯片厂商更乐于推出同时具有收发器的芯片,如Nordic的TI的蓝牙BLE芯片方案,都是同时具备接收机和发射机的。

1.3 GAP安全模式

安全模式是针对服务的,对于广播者和观察者,它们仅是一个对外广播数据,一个扫描、获取广播数据,他们没有服务,所以不需要安全模式。对于外围设备和中心设备,安全模式也是可选的,不是必须的,它取决于服务对安全性的需求。
安全模式1包含四个等级,安全模式2包含两个等级。
安全模式1:通过不同级别的加密保证安全
等级1:无安全性(无认证无加密)
等级2:带加密的未认证配对
等级3:带加密的认证配对在这里插入代码片
等级4:带加密的LE安全连接配对
安全模式2:通过不同级别的数字签名保证安全
等级1:带数据签名的未认证配对
等级2:带数据签名的认证配对

跟模式1相比,不做数据加密,而是进行数据签名。这种模式,链路不进行加密。数据签名和数据加密,可以通过这个帖子有个感性的认识。简单的讲,加密是将数据明文转成密文,而签名则不改动数据本身,但是伴随数据额外提供一份事先约定好的信息,接收方一看到这个额外信息就知道是指定的发送方发来的消息,于是确认这个消息的真实性。这个额外信息,就是“签名”。如果没有这个签名,假如第三方攻击者混入通信链路,发出伪造消息,接收方就无法判断消息真伪。

1.4 GAP服务

GAP层定义了GAP服务,它的作用是用来确定设备的信息,GAP服务包含了5个特征:设备名称、外观特征、外围设备的首选连接参数、中心设备地址解析和可解析私有地址。对于每一个GAP角色,当其包含GAP服务时,对GAP的特征的需求也是不一样的,对于设备名称和外观特征,外围设备和中心设备是强制包含的,对于外围设备首选连接参数,外围设备是可选择是否包含的,而中心设备是不能包含的,对于中心设备地址解析和可解析私有地址是有条件包含的。

二、GAP初始化

2.1GAP初始化

BLE工程中,我们将GAP相关的初始化封装在gap_params_init()函数中,方便主函数调用。

#define DEVICE_NAME                     "BLE_Template"                     // 设备名称字符串 
#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(100, UNIT_1_25_MS)   // 最小连接间隔 (0.1 秒) 
#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(200, UNIT_1_25_MS)   // 最大连接间隔 (0.2 秒) 
#define SLAVE_LATENCY                   0                                  // 从机延迟 
#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)    // 监督超时(4 秒) 
//GAP参数初始化,该函数配置需要的GAP参数,包括设备名称,外观特征、首选连接参数
static void gap_params_init(void)
{
    ret_code_t              err_code;
	  //定义连接参数结构体变量
    ble_gap_conn_params_t   gap_conn_params;
    ble_gap_conn_sec_mode_t sec_mode;
    //设置GAP的安全模式
    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
    //设置GAP设备名称
    err_code = sd_ble_gap_device_name_set(&sec_mode,(const uint8_t *)DEVICE_NAME,strlen(DEVICE_NAME));
    //检查函数返回的错误代码
	APP_ERROR_CHECK(err_code);
																			
    //如果需要设置外观特征,在这里使用如下的代码设置 
     err_code = sd_ble_gap_appearance_set(BLE_APPEARANCE_GENERIC_PHONE);
     APP_ERROR_CHECK(err_code); 
																					
    //设置首选连接参数,设置前先清零gap_conn_params
    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;//最小连接间隔
    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;//最小连接间隔
    gap_conn_params.slave_latency     = SLAVE_LATENCY;    //从机延迟
    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT; //监督超时
    //调用协议栈API sd_ble_gap_ppcp_set配置GAP参数
    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
    APP_ERROR_CHECK(err_code);																				
}
		

2.2 详细解析

  • 设置连接的安全模式
    ble_gap_conn_sec_mode_t sec_mode;
    //设置GAP的安全模式
    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);

nRF52832处理器的协议栈库函数中通过ble_gap_conn_sec_mode_t 结构体来设置安全等级。

typedef struct
{
  uint8_t sm : 4;                     /**安全模式有(1or2),0模式是不允许做任何工作 */
  uint8_t lv : 4;                     /**< Level (1, 2, 3 or 4), 0 for no permissions at all. */

} ble_gap_conn_sec_mode_t;
/*设置模式没有访问权限,0模式0水平*/
#define BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(ptr)          do {(ptr)->sm = 0; (ptr)->lv = 0;} while(0)
/*设置为无需密码保护,开放性链接,1模式1水平*/
#define BLE_GAP_CONN_SEC_MODE_SET_OPEN(ptr)               do {(ptr)->sm = 1; (ptr)->lv = 1;} while(0)
/*需要加密链接,无MITM保护,1模式2水平*/
#define BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(ptr)        do {(ptr)->sm = 1; (ptr)->lv = 2;} while(0)
/*加密链接和MITI保护.*/
#define BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(ptr)      do {(ptr)->sm = 1; (ptr)->lv = 3;} while(0)
/*签名或者加密,无MITM保护*/
#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_NO_MITM(ptr)     do {(ptr)->sm = 2; (ptr)->lv = 1;} while(0)
/*MITI保护签名或者加密链接*/
#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_WITH_MITM(ptr)   do {(ptr)->sm = 2; (ptr)->lv = 2;} while(0)

MITM(Man in the Middle)中间人攻击是指第三方设备混入BLE通信链路之间,伪造通信数据迷惑双方。假如设备A和设备B在通信之始,设备M注意到二者要进行通信,设备M截取设备A发起的连接请求,伪装成设备B跟其建立连接进行通信,通信完毕后再伪装成设备A向设备B发起连接请求,建立连接后重复设备A在前面发送的数据。这样设备A就一直以为在跟设备B进行通信,设备B也同样,却不知二者中间还藏着一个第三者。

  • 蓝牙设备名称设置
//设置GAP设备名称
    err_code = sd_ble_gap_device_name_set(&sec_mode,(const uint8_t *)DEVICE_NAME,strlen(DEVICE_NAME));
    //检查函数返回的错误代码
	APP_ERROR_CHECK(err_code);

在 GAP 规范中,可以配置蓝牙广播的名称。协议栈提供看了函数 sd_ble_gap_device_name_set 实现
这个功能,这个函数是一个 SoftDevice API 函数,SoftDevice API 函数是经过封装后的函数,无法查看
源函数源码,大家只要通过帮助文档查找函数意义。
参数:①指定名称的设备写入安全特性
②设备名称
这里的 DEVICE_NAME 应用的名称在手机扫描接收的时候显示广播信号时可见的,大家可以直接
修改自己的名称,符号自己的要求,比如设置 DEVICE_NAME 为:

#define DEVICE_NAME                     "BLE_Template"                     // 设备名称字符串 

③设备名称长度

  • 设置外观特征
       err_code = sd_ble_gap_appearance_set(BLE_APPEARANCE_);
       APP_ERROR_CHECK(err_code)

在这里插入图片描述

  • 设置连接参数
#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(100, UNIT_1_25_MS)   // 最小连接间隔 (0.1 秒) 
#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(200, UNIT_1_25_MS)   // 最大连接间隔 (0.2 秒) 
#define SLAVE_LATENCY                   0                                  // 从机延迟 
#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)    // 监督超时(4 秒) 
		//定义连接参数结构体变量
    ble_gap_conn_params_t   gap_conn_params;
		//设置首选连接参数,设置前先清零gap_conn_params
    memset(&gap_conn_params, 0, sizeof(gap_conn_params));

    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;//最小连接间隔
    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;//最小连接间隔
    gap_conn_params.slave_latency     = SLAVE_LATENCY;    //从机延迟
    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT; //监督超时
    //调用协议栈API sd_ble_gap_ppcp_set配置GAP参数
    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
    APP_ERROR_CHECK(err_code);

连接间隔 在一个 BLE 连接中跳频机制需要被使用,这样两个设备之间可以在一个特定的通道上进行数据收发,在一个特定的时间之后会跳到一个新的通道上,LL 层负责通道切换。这个遇见设备收发数据被称作是连接事件。尽管没有应用程序数据需要收发,两个设备之间仍然会交换链路层数据来保持连接。连接间隔是两个连接事件之间的时间,使用一个单元值为 1.25ms 的步进。连接间隔从最小值 6(7.5ms)到最大值 3200(4.0s)。不同的应用也许需要不同的连接间隔,一个长时间的连接间隔将会节约更多的能量,因为设备可以在两个连接
事件之间睡眠更长的时间。但是他会导致数据发送不及时,如果有数据要发送那么他只能够在下一次连接事件到来时才能被发送。

从机潜伏周期 这个参数描述了从机跳过连接事件的次数。这使外围设备具有一定的灵活性,如果它不具有任何数据传送,它可以选择跳过连接事件,并保持睡眠,从而提供了一些积蓄力量。这一决定取决于外围设备。也可以成为从设备延迟,从设备能够忽略主设备的链接事
件的最大值。比如:从设备延迟为 6 的话,那么从设备每隔 6 个锚点可以监听到主设备发送来的数据包,如果从设备延迟为 0,从设备在每个锚点都可以监听主设备的数据包。

监督超时 这是两个成功的连接事件之间间隔的最大值。如果超过这个时间还未出现成功的连接事件,那么设备将会考虑失去连接,返回一个未连接状态。这个参数值使用 10ms的步进。监督超时时间从最小 10(100ms)到最大 3200(32.0s)。同时超时时间必须大于有效连接事件。有效连接事件时间 = 连接间隔 X (1 + 从机延迟值)。

这个请求包含刚才讲的四个参数: 最小连接间隔、最大连接间隔、从机潜伏周期、连接超时时间。这些值代表了外围设备针对连接的期望参数,连接间隔是以范围的形式提供的。当中央设备接收到这个请求,他有权利决定是接受还是拒绝这些参数。

总结

这个讲述了GAP的一些参数和初始化, GAP 实际上定义了蓝牙设备的基本需·求,包括广播功能、广播名称设置、连接加密等级等功能。

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焦不得

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值