Biu~笔记:高通蓝牙ADK(29)--peer通讯

Biu~ 想必大家做TWS开发的时候都有想要发送自定义数据给peer的时候,而在之前6.x的ADK中,小编也有带大家如何使用这个功能,但在新的ADK中这有点不一样了。以前,这些数据是通过avrcp传输,而现在,数据是直接通过L2cap传输;以前的数据是简单的放在avrcp协议包里面,而现在数据会用Marshal打包好发送。Marshal的机制本身是有点难理解,加上现在代码是模块化编程和用了些高级的编程手法,导致溯源一些变量、函数或参数时有点困难。但只要理解好了,修改起来也是非常简单的。

       首先,我们要先知道怎么发送,怎么接收,这个在之前的博文有简单的提了一下,现在我们详细说说其中的几个关键函数。

       appPeerSigMarshalledMsgChannelTx

第一个参数task:这个为了接受发送确认信息的,很少用,但如果确认是否发送成功可以在这个task中等confirm

第二个参数channel:每个channel都有对应的handler处理函数,处理这个channel收到的消息

第三个参数msg:指针指向具体要发送的数据

第四个参数type:用来指示上一个参数的数据类型,peer收到时会根据这个参数对msg进行解码(unmarshal)

这个函数是对应用层的API,一些channel会根据自身数据的方便使用而去封装成各种各样的函数。

 

        PEER_SIG_MARSHALLED_MSG_CHANNEL_RX_IND这是一个event,在收到peer发来的数据后,会生成这个event到channel对应的handler中处理。这里就涉及到另外一个绑定(注册)函数

        appPeerSigMarshalledMsgChannelTaskRegister

第一个参数task:要绑定的handler,这个channel收到的数据都会到这里处理

第二个参数channel:要绑定的channel

第三个参数type_desc:这一个是个数组,里面包含了所有这个channel传输数据类型的声明,系统unmarshal时就会根据这个来解析数据,同时这些数据类型会和上面那个函数中的type,一一对应

第四个参数num_type_desc:指示第三个参数的数组有多少个

这个函数就是告诉Marshal系统,将channel绑定对应的handler处理函数,和这个channel会传输什么样的数据。

Tips:搜索PEER_SIG_MARSHALLED_MSG_CHANNEL_RX_IND就可以找到很多不同channel的handler。

要想知道peer通讯的数据哪里发哪里收,通过这两个函数就可以跟踪到具体位置了。

 

例如:key sync功能中,channel PEER_SIG_MSG_CHANNEL_KEY_SYNC 绑定到keySync_HandleMessage





这时A发送key同步确认给B,用到type是MARSHAL_TYPE_key_sync_cfm_t



如果处理了,A的handler keySync_HandleMessage 就会收到PEER_SIG_MARSHALLED_MSG_CHANNEL_TX_CFM这个event

那么B就会在他的keySync_HandleMessage 收到PEER_SIG_MARSHALLED_MSG_CHANNEL_RX_IND 这个event,同时他的处理是按发送过来的type进行数据解析

 


        Peer之间的通讯就这么简单,但里面还有些复杂的东西。下篇就带大家深入了解一下,这里面type和type_desc是怎么使用的,只有了解完这两个东西,才能进阶地使用peer通讯。谢谢大家浏览,我们下期再见。

  

        简单是长期努力的结果,而不是起点

                                                            —— 不是我说的


 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论