蓝牙学习-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。


专用型绑定

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

你可能感兴趣的:(蓝牙学习-GAP)