蓝牙技术在音频网关中的应用
(3)连接管理器程序
这是AG软件的中间层,也由用户编制。引入连接管理器,主要是为了减少高层应用程序的指令数量,为高层应用程序和低层协议栈之间提供一个通用接口。连接管理器级主要是处理高层的请求信息,传送至BlueStack,并接收BlueStack的处理结果,进行相应处理后,通知高层应用程序级。
3.2 消息及处理机制
(1)消息
整个协议栈的Bluestack实现是消息驱动的,因此层与层之间使用消息传递方法。从图3的结构可看出,只有相邻层有接口关系。在嵌入式音频网关应用程序中,涉及到两大类消息:CM消息和BlueStack消息。前者在客户机和连接管理器之间进行传递,如图4所示为消息传递示意图;后者为连接管理器和BlueStack协议栈之间传递的消息。
消息使用服务原始模型。一般地,在服务原语后加上扩展名_REQ、_IND、_RES(or _RSP)和_CFM,分别表明原语是一个服务请求、指示、响应还是证实。CM消息格式为CM_原语_扩展名,如SCO连接请求消息为CM_SCO_CONNECT_REQ。BlueStack原语类型有四种:DM_PRIM、RFC_PRIM、SDP_PRIM及L2CAP_PRIM。在AG应用中,用到前三种。BlueStack消息格式为DM(RFC、SDC或SDS)_原语_扩展名,如SCO连接请求消息为DM_SCO_CONNECT_REQ。
(2)消息传递
各应用层之间的消息传递通过消息队列来完成。消息的处理是通过某项任务进行的。第一个任务都有一个消息队列,消息被提交给所属某一任务的消息队列。实现任务和消息队列之间的捆绑是静态的。消息队列n,归属于任务n。在此AG应用中,我们定义了两个任务:一是AG任务,任务号为1,队列号也为1;另一是CM任务,任务号为0,队列号也为0。因此,AG客户机将所要传递给CM的消息提交到队列0中,而CM传递给AG客户机的消息送入队列1中。
在软件中,一个服务原语是一个结构。结构名一般采用原语_T。结构成员包括这些原语的类型及相关的载荷数据,如CM的查询请求服务结构定义如下:
在软件中,一个服务原语是一个结构。结构名一般采用原语_T。结构成员包括这些原语的类型及相关的载荷数据,如CM的查询请求服务结构定义如下:
typedef struct{
uint8 max_response; //可被接收的最大查询响应数
Delay inq_timeout; //用户提供的查询处理超时时长
uint32 class_of_device; //设备类型
uint16 remote_name_request_enabled; //标志位指示是否完成远程名的请求
}CM_INQUIRY_REQ_T;
以下给出了消息的提交。其中,宏MAKE_MSG表示创建该消息,msg为该消息结构的指针,将消息送入队列用MessagePut函数来完成。
*AG客户机
MAKE_MSG(CM_INQUIRY_REQ);
msg->max_responses=num_responses;
msg->inq_timeout=D_SEC(timeout);
msg->class_of_device=CoD_filter;
《蓝牙技术在音频网关中的应用(第2页)》