CC2640 建立连接(connection)

本文解析了蓝牙连接过程中advertiser与observer的角色与交互流程。详细介绍了advertiser发送广播包后,如何预留Rx窗口等待observer发送连接请求的过程。

1、连接图示

根据蓝牙spec规定,advertiser发送完一个广播包之后150us(T_IFS),advertiser必须开启一段时间的射频Rx窗口,以接收来自observer的数据包。

Observer可以在这段窗口时间里给advertiser发送连接请求。

 

 

注:图中M代表手机,S代表设备B,M->S表示手机将数据包发给设备B,即手机开启Tx窗口,设备B开启Rx窗口;S->M正好相反,表示设备B将数据包发给手机,即设备B开启Tx窗口,手机开启Rx窗口。

手机在收到A1广播包ADV_IND后,以此为初始锚点(这个锚点不是连接的锚点),T_IFS后给Advertiser发送一个connection request命令,即A2数据包,告诉advertiser我将要过来连你,请做好准备。

参考:http://www.mamicode.com/info-detail-2275982.html

### CC2640蓝牙配对请求发起方法及配置步骤 #### 1. 蓝牙配对的基础概念 蓝牙设备之间的通信通常需要经过配对过程来建立安全连接。对于CC2640芯片而言,其基于TI-RTOS框架开发的应用程序可以通过调用SimpleBLEPeripheral库中的API实现配对功能[^1]。 #### 2. 主机端发起配对请求的前提条件 为了成功发起配对请求并完成绑定操作,需满足以下前提条件: - **硬件初始化**:确保CC2640模块已正确初始化,并能够正常运行。 - **固件支持**:使用的固件版本应支持GAP(Generic Access Profile)、GATT(Generic Attribute Profile)以及SM(Security Manager Protocol)。这些协议是实现蓝牙低功耗配对的核心部分[^1]。 - **软件环境搭建**:开发者应在IAR Embedded Workbench或其他兼容IDE中加载官方提供的SDK,并根据需求修改默认设置。 #### 3. 发起配对的具体步骤 以下是通过代码实现主机端发起配对的主要流程: ##### (1) 设置安全性参数 在应用程序启动阶段定义安全性参数结构体`gapBondMgrCfg_t`,并通过函数`GAP_Bond_Mgr_Set_Parameters()`将其传递给安全管理器。此步骤用于指定加密密钥长度、认证方式等细节[^1]。 ```c // 定义全局变量存储安全性参数 static gapBondMgrCfg_t myBonds; void configure_security_parameters(void){ memset(&myBonds, 0, sizeof(myBonds)); // 设定最大键值数量 myBonds.bondings = MAX_NUM_OF_BONDS; // 启用MITM保护模式(Man-In-The-Middle) myBonds.mitmMode = TRUE; GAP_Bond_Mgr_Set_Parameters(&myBonds); } ``` ##### (2) 注册事件回调处理函数 当远程设备响应配对请求时,系统会触发特定事件通知应用层。因此,在项目初期应当注册一个自定义的事件处理器以便捕获此类消息[^1]。 ```c bStatus_t SimpleBLECentral_ProcessEvent(uint8 event, void *pBuf){ switch(event){ case GAP_DEVICE_INIT_DONE_EVENT:{ // 初始化完成后执行某些动作... break; } case HCI_LE_ENCRYPTION_CHANGE_V1_EVENT:{ uint8 status = ((hciEvt_LeEncryptionChange_v1_t *) pBuf)->status; if(status == SUCCESS){ Display_print1(dispHandle, 0, 0,"Pairing succeeded!"); }else{ Display_print1(dispHandle, 0, 0,"Failed to pair."); } break; } default: break; } return SUCCESS; } ``` ##### (3) 执行实际的配对命令 一旦发现目标外设后即可尝试与其建立联系。借助于HCI指令集里的`LL_Create_Connection()`或者高层封装后的接口如`GAP Central Role API`可以轻松达成目的。 ```c uint8 connIndex = simpleBLECentralConnIdx; if(GapRole_GetParameter(GAPROLE_STATE,&state)==SUCCESS && state==GAPROLE_STARTED){ uint16 intervalMin = DEFAULT_SCAN_INTERVAL_MIN; uint16 intervalMax = DEFAULT_SCAN_WINDOW_MAX; uint8 ownAddrType = DEFAULT_OWN_ADDR_TYPE; uint8 peerAddrType = ADDRMODE_PUBLIC;// 或ADDRMODE_RANDOM取决于对方类型 uint8 peerAddress[B_LEN_ADDRESS]={ TARGET_DEVICE_MAC_BYTE5, TARGET_DEVICE_MAC_BYTE4, TARGET_DEVICE_MAC_BYTE3, TARGET_DEVICE_MAC_BYTE2, TARGET_DEVICE_MAC_BYTE1, TARGET_DEVICE_MAC_BYTE0}; uint8 initiatorFilterPolicy = INIT_FILT_USE_PEER_ADDR_ONLY; uint8 channelMap = CHANNEL_ALL_CHANNELS; uint8 scanInterval = SCAN_INT_DEFAULT; uint8 scanWindow = SCAN_WIND_DEFAULT; GapCentralRole_StartDeviceDiscoveryRequest(connIndex,intervalMin,intervalMax,ownAddrType,peerAddrType,(uint8*)peerAddress,initiatorFilterPolicy,channelMap,scanInterval,scanWindow); }else{ Display_print1(dispHandle, 0, 0,"Cannot start discovery due to invalid role state."); } ``` 以上片段展示了如何利用中央角色开启扫描寻找潜在伙伴的过程;找到之后再进一步发送正式邀请进入下一步协商环节直至最终形成稳定关联关系为止。 #### 注意事项 在整个过程中需要注意几个方面的问题以免影响整体效果: - 时间窗口控制得当才能既保证效率又兼顾能耗表现; - 不同厂商生产的终端可能遵循略有差异的标准所以最好提前查阅文档确认兼容情况; - 如果涉及到个人隐私数据传输则务必启用强验证机制防止非法访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值