蓝牙学习-GAP

GAP - Generic Access Profifile

GAP提供设备发现和建立安全连接的功能。GAP的功能分为客户端功能和服务端功能。

配置可被发现

所有的蓝牙端设备都可配成“discoverable”,这样别的蓝牙设备在扫描(inquiry scan)时可判断此设备是可被发现的。配置成可被发现需调用:gap_discoverable_control(1)。如果想用个特殊的名字,可调用:gap_set_local_name。如果想要省电,在被发现和连接后可以关闭此状态:gap_discoverable_control(1)。伪代码如下:

int main ( void ) {
  . . .
  // make discoverable
  gap_discoverable_control(1) ;
  btstack_run_loop_execute( ) ;
  return 0 ;
}
void packethandler ( uint8_t packettype , uint8_t ∗packet , uint16_tsize ) {
  . . .
  switch (state) {
     case W4_CHANNEL_COMPLETE:
     // if connection is successful , make device undiscover able
     gap_discoverable_control(0) ;
   . . .
} }

发现远端设备

蓝牙主设备在需要发现外围设备的使用使用hci_inquiry命令,发现设备的回调有以下几种类型:

* HCI_EVENT_INQUIRY_RESULT
* HCI_EVENT_INQUIRY_RESULT_WITH_RSSI
* HCI_EVENT_EXTENDED_INQUIRY_RESPONSE

返回值包括:address(6字节,mac地址),classOfDevice(2字节),repetitionMode(1字节),clockOffset(2字节),rssi(1字节),EIR(Extended Inquiry Result)

*注意:默认的rssi和EIR是不上报的。蓝牙协议2.1和更高版本,hci_write_inquiry_mode(0,标准上报;1,带RSSI上报,2,RSSI和EIR)命令用来控制查询的返回内容。

配对设备

默认的蓝牙通信是没有身份认证的。手机在使用蓝牙连接外设的时候可以要求使用身份认证服务(类似于拨号上网服务),建立身份认证的过程就叫配对。蓝牙提供两种配对机制:

1,使用PIN码(16字节的ASCII)进行身份验证(2.0之前),两端均默认设置了PIN码。此方法对嵌入式设备不太友好,没有使用全部的IO能力。
     HCI EVENT PIN CODE REQUEST:
     hci_event_pin_code_request_get_bd_addr(packet, bd_addr)
     hci_send_cmd(&hci_pin_code_request_reply, &bd_addr, 4, "0000");

注意:“0000”就是预设的PIN码

2,使用SSP(Secure Simple Pairing)进行身份验证(2.1后),此方法对嵌入式设备更好。
     设备会首先沟通他们之间的IO能力然后处理配对的有效性。如果蓝牙设备支持SSP,蓝牙协议栈会默认使用SSP配对。但是基于蓝牙协议栈的具体实现,默认SSP配对的逻辑可能会被通知用户进行配对确认的实现代替。

当配对成功后两个设备都会生成link key。这个link key会被存储在设备的持久化存储空间里。下次重启连接就可以直接使用这个link key。


专用型绑定

不同于常规绑定,专用型绑定会在绑定动作完成后断开连接。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容