我爱蓝牙网 - 52Bluetooth - 最具人气蓝牙技术交流网站

 找回密码
 立即注册

只需一步,快速开始

使用微信账号登录

qcc304x笔记之主从确定(find role)机制详解

2020-11-23 21:44| 发布者: csdn| 查看: 1214| 评论: 0|来自: csdn

摘要: 实际项目中,可能会碰到固定某一方为主机类似的需求!或者需要向别人解释,为什么左边首次配对的时候是主机,某次出仓的时候又变成了从机!这个时候就需要知道主从锁定的机制是怎样的了。(注:由于SDK在持续更新, ...
实际项目中,可能会碰到固定某一方为主机类似的需求!或者需要向别人解释,为什么左边首次配对的时候是主机,某次出仓的时候又变成了从机!这个时候就需要知道主从锁定的机制是怎样的了。

(注:由于SDK在持续更新,文中所述的有些接口可能会有些变化,所以仅供参考)

对耳配对流程(peer pair - LE)

当耳机上电起来之后,优先进行peer配对,此时耳机进入扫描和可发现模式,此时既能去发现设备,又能被别的设备发现。前面如何进发现的流程我就不说了,都是蓝牙的基本操作。这里重点看一下找到设备之后的流程:

/*peer配对相关消息的处理函数*/
peer_pair_le_handler
	/*扫描结果的上报消息*/
	LE_SCAN_MANAGER_ADV_REPORT_IND
	peer_pair_le_handle_advertisement_ind		
		PeerPairLe_HandleFoundDeviceScan
			/*如果有找到一个可配对的peer设备,就进入selecting状态,开始选择server与client*/
			peer_pair_le_set_state(PEER_PAIR_LE_STATE_SELECTING)
				/*这里会延时发送PEER_PAIR_LE_TIMEOUT_FROM_FIRST_SCAN消息,延时的时间长短根据判断条件,目前来说,奇地址会多两秒*/
				peer_pair_le_enter_selecting
					/*当延时时间到来,主动发起连接,一般主动发起连接一方,最后为client*/
					PEER_PAIR_LE_TIMEOUT_FROM_FIRST_SCAN
					peer_pair_le_handle_scan_timeout
						PEER_PAIR_LE_STATE_CONNECTING
						peer_pair_le_enter_connecting
							ConManagerCreateTpAcl

对于server端

对应server端,我们通过上面的分析,在进入selecting的过程中,发起连接的延时时间较长,所以是被连接的一方

/*对端发起的连接,有gatt底层上报上来,并根据当前的状态,最终确定为server*/
gattConnect_MessageHandler
	GATT_MANAGER_CONNECT_IND
	gattConnect_HandleConnectInd						
		GattConnect_ObserverNotifyOnConnection
			peer_pair_le_connect_callback.OnConnection
				peer_pair_le_GattConnect
					/*设置为gatt的server*/
					PEER_PAIR_LE_STATE_PAIRING_AS_SERVER

最后说明一下配对过程中,server端的整个的状态变化过程!

状态变化(peer_pair_le_set_state):0->1->2->3->5->6->7->9->12->13->1

对于client端

对应client端,我们通过上面的分析,在进入selecting的过程中,发起连接的延时时间较短,所以是主动发起连接的一方

/*由client端主动发起了连接,并成功建立了一个ACL通道,底层就会上来事件*/
ConManagerHandleConnectionLibraryMessages
	CL_DM_ACL_OPENED_IND
	ConManagerHandleClDmAclOpenedIndication
		conManagerNotifyObservers
			/*发送CON_MANAGER_TP_CONNECT_IND消息给到peer pair模块处理*/
			conManagerMsgTpConnectionInd
				/*处理comManager发来的事件*/
				peer_pair_le_handler
					CON_MANAGER_TP_CONNECT_IND
					/*这里的conn->incoming为0,所以最终设置为client角色*/
					peer_pair_le_handle_con_manager_connection
						PEER_PAIR_LE_STATE_PAIRING_AS_CLIENT

最后说明一下配对过程中,client端的状态变化过程!

状态变化(peer_pair_le_set_state):0->1->2->3->5->6->4->8->10->11->1

主从确定流程(peer find role)

当对耳配对完成之后,两边都进入find role连接状态(PEER_FIND_ROLE_STATE_CONNECTING_TO_DISCOVERED),并发起fine role服务连接,两边发起连接几乎是没有时差的,所以任意一边都有可能成为主动连接方。发起连接成功的一方变为server(成功创建了acl通道),被连接的一方为client(也可理解为主动发起连接失败,接收对方发起的连接)。注意,这与配对过程的server、client角色选择条件刚好相反!

对于server端

在find role连接过程中的server

/*发起关于find role的服务连接,如果是本地发起的连接,并成功建立了一个ACL通道,底层就会上来事件,并设置角色为server*/
ConManagerHandleConnectionLibraryMessages
	CL_DM_ACL_OPENED_IND
	ConManagerHandleClDmAclOpenedIndication
		conManagerNotifyObservers
			/*发送CON_MANAGER_TP_CONNECT_IND消息给到find role模块处理*/
			conManagerMsgTpConnectionInd
				/*处理comManager发来的事件*/
				peer_find_role_handler	
					CON_MANAGER_TP_CONNECT_IND
					/*如果是由本地端发起的连接,就设置为find role的server端*/
					peer_find_role_handle_con_manager_connection
						PEER_FIND_ROLE_STATE_SERVER_AWAITING_ENCRYPTION

在执行find role过程的server

server端进入PEER_FIND_ROLE_STATE_SERVER状态,计算score并发给client

peer_find_role_set_state		
	PEER_FIND_ROLE_STATE_SERVER
	peer_find_role_enter_server
		peer_find_role_update_server_score
			/*这里根据条件计算分值,分值高的最终将变成主机*/
			peer_find_role_calculate_score
				GattRoleSelectionServerSetFigureOfMerit
					/*将计算值发给client*/
					sendInternalFigureOfMeritChanged
						ROLE_SELECTION_SERVER_INTERNAL_FIGURE_UPDATED
						handleRoleSelectionServerFigureChanged

接收client发来的最终结果

/*上一步中我们已经将分值发给了client,这里接收由client比较大小之后的返回结果*/					
handleRoleSelectionServiceAccess
	HANDLE_ROLE_SELECTION_CONTROL
	roleSelectionControlAccess
		roleSelectionSendChangeRoleInd
			GATT_ROLE_SELECTION_SERVER_CHANGE_ROLE_IND
			peer_find_role_handle_change_role_ind
				/*处理client返回的结果,据此设置为主机或者从机*/
				peer_find_role_completed

最后说明一下find role过程中,server端的整个的状态变化过程!

状态变化(peer_find_role_set_state):0->1->2->3->4->5->6->7->8->10->15->16->1

对于client端

在find role连接过程中的client

/*对端发起的连接,由gatt底层上报上来,并根据当前的状态,最终确定为server*/
gattConnect_MessageHandler
	GATT_MANAGER_CONNECT_IND
	gattConnect_HandleConnectInd	
		GattConnect_ObserverNotifyOnConnection
			peer_find_role_connect_callback.OnConnection
				peer_find_role_GattConnect
					/*设置为find role的client*/
					PEER_FIND_ROLE_STATE_CLIENT

在执行find role过程的client

先进入PEER_FIND_ROLE_STATE_CLIENT_DECIDING状态,等待server发来的分值*/

peer_find_role_set_state
	PEER_FIND_ROLE_STATE_CLIENT_DECIDING
	peer_find_role_enter_client_deciding
        /*do nothing"*/
		PeerFindRole_DecideRoles

接收server发来的分值,进行比较,将比较结果返回给server

handleGattManagerMsg
	GATT_MANAGER_REMOTE_CLIENT_NOTIFICATION_CFM
	handleRoleSelectionNotification
		makeRoleSelectionClientFigureOfMeritIndMsg
			GATT_ROLE_SELECTION_CLIENT_FIGURE_OF_MERIT_IND
			peer_find_role_handle_figure_of_merit
				/*如果当前的状态为PEER_FIND_ROLE_STATE_CLIENT_DECIDING,则开始进行主从确定操作*/
				PeerFindRole_DecideRoles
					/*计算分值,并将主从选择结果发给server,分值大的为主机*/
					peerFindRole_CalculatePeerRoleOpcode
						/*计算分值*/
						peer_find_role_calculate_score
						/*把选择结果通知给对端*/
						GattRoleSelectionClientChangePeerRole
							GattRoleSelectionClientChangePeerRoleImpl

最后说明一下find role过程中,client端的整个的状态变化过程!

状态变化(peer_find_role_set_state):0->1->2->3->4->5->6->9->11->12->13->14->16->3->4->16->1

 

我们可以看到,配对期间的server与client状态,不影响最终的主从确定的结果,决定因素为peer_find_role_calculate_score()的计算值,当然该值为一些因变量的权重,本身已经包含了很多的条件因素

来源:https://blog.csdn.net/ylangeia/article/details/109462832
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

免责声明

1.本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
2.如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

发布主题 客服中心 搜索 官方QQ群

QQ|小黑屋|简约版|手机版|我爱蓝牙网 - 52Bluetooth ( 粤ICP备16101765号 )

GMT+8, 2021-3-2 10:40 , Processed in 0.080841 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部