蓝牙4.0 - 扫描和发现

来源:互联网 发布:雷军编程水平 编辑:程序博客网 时间:2024/06/01 11:05

1  扫描

1.1   扫描类型

扫描有两种类型:被动扫描(passive scanning)和主动扫描(active scanning)。在被动扫描模式下,Link Layer(链接层)只接收广播包,不发送请求包。在主动扫描下,Link Layer(链接层)除了监听广播包外,还可根据不同的封包类型要求对方发送附加信息。

1.2   扫描参数设置

1)      LE_Scan_Type            扫描类型

2)      LE_Scan_Interval         扫描时间间隔(扫描频率)

3)      LE_Scan_Window        扫描时间窗口(扫描时间)

4)      Own_Address_Type     自身设备地址类型(公有设备地址、私有地址)

5)   Scanning_Filter_Policy 扫描过滤策略

 

LE_Scan_Type                                                                                              Size:1 Bytes

参数描述

0x00

Passive scanning(被动扫描),不会发送扫描请求包(SCAN_REQ)(Default)

0x01

Active scanning(主动扫描),可发送扫描请求包(SCAN_REQ)

0x02 – 0xFF

Reserved for future use

LE_Scan_Interval                                                                                          Size:2 Bytes

参数描述

0xXXXX

范围:0x0004 – 0x4000

默认:0x0010(10ms)

时间 = N * 0.625ms

时间范围:2.5ms – 10.24s

LE_Scan_Window                                                                                           Size:2 Bytes

参数描述

0xXXXX

范围:0x0004 – 0x4000

默认:0x0010(10ms)

时间 = N * 0.625ms

时间范围:2.5ms – 10.24s

LE_Scan_Window表示一次扫描事件里实际扫描所占用的时间,这个时间要小于等于LE_Scan_Interval,如果LE_Scan_Window等于LE_Scan_Interval,那就表示所有的时间都用于扫描。所有LE_Scan_Interval的值决定了扫描的频率,LE_Scan_Window的值决定了扫描的时间长度。

Own_Address_Type                                                                                       Size:1 Bytes

参数描述

0x00

Public Device Address (Default),公有设备地址

0x01

Random Device Address,私有设备地址

0x02 – 0xFF

保留

Scanning_Filter_Policy                                                                                           Size:1 Bytes

参数描述

0x00

接受所有的广播包(默认)

对于定向广播包,忽略不是本设备地址的广播包。

0x01

只接受来自白名单设备的广播包(默认)

对于定向广播包,忽略不是本设备地址的广播包。

0x02 – 0xFF

保留

1.3   可发现模式(Discoverable  Mode)

对于查询来说,一个蓝牙设备总是处于可发现和不可发现这两种模式的其中一种。可发现模式又可分为:有限可发现模式(LimitedDiscoverable Mode)和普通可发现模式。

2   TI CC2540扫描的实现

2.1   角色设置

GAPRole_StartDevice(……);      // 广播者、从设备角色

GAPCentralRole_StartDevice(……);  // 集中器角色(主设备)

GAPObserverRole_StartDevice(……); // 发现者角色

 

它们最终都是通过调用:GAP_DeviceInit(……)来实现角色的初始化。

2.2   启动(终止)扫描

参数

描述

GAPObserverRole_StartDiscovery

(uint8 mode, uint8 activeScan, uint8 whiteList)

功能

开始扫描设备

参数:mode

寻找设备的发现模式:

DEVDISC_MODE_NONDISCOVERABLE:  No discoverable setting

DEVDISC_MODE_GENERAL:          General Discoverable devices

DEVDISC_MODE_LIMITED :         Limited Discoverable devices

DEVDISC_MODE_ALL:              Not filtered

参数:activeScan

扫描类型:主动扫描或被动扫描

参数:whiteList

是否启用白名单过滤策略

 

参数

描述

GAPObserverRole_CancelDiscovery

 

功能

终止扫描

2.3   扫描事件(消息通知)

2.3.1  GAP_DEVICE_INFO_EVENT

当收到一个新的广播包时(由于蓝牙控制器会过滤掉重复的广播包,只有不一样的广播包才会发送到Host层,所以在一次扫描过程中,Host层每收到一个广播包就是扫描到一个新的设备),TI蓝牙协议栈会以OSAL消息的形式发送一个 GAP_DEVICE_INFO_EVENT 事件。

当收到一个扫描请求回应包时,同样也会发送一个GAP_DEVICE_INFO_EVENT 事件。

GAP_DEVICE_INFO_EVENT事件所携带数据格式下表所示:

gapDeviceInfoEvent                                          GAP_DEVICE_INFO_EVENT

参数

描述

hdr

GSP_MSG_EVENT and status

opcode

GAP_DEVICE_INFO_EVENT

eventType

广播类型

addrType

地址类型

Add

地址

Rssi

接收信号强度:RSSI

dataLen

数据长度

pEvtDat

广播数据或扫描回应数据

2.3.2  GAP_DEVICE_DISCOVERY_EVENT

当扫描过程结束时(由 TGAP_GEN_DISC_SCAN 和 TGAP_LIM_DISC_SCAN 指定的时间),会收到GAP_DEVICE_DISCOVERY_EVENT 事件。

GAP_DEVICE_DISCOVERY_EVENT事件所携带数据格式下表所示:

gapDevDiscEvent_t                                        GAP_DEVICE_DISCOVERY_EVENT

参数

描述

Hdr

GAP_MSG_EVENT and status

opcode

GAP_DEVICE_DISCOVERY_EVENT

numDevs

Number of devices found during scan

pDevList

array of device records

 

0 0
原创粉丝点击