掌桥专利:专业的专利平台
掌桥专利
首页

基于Linux系统的协议栈数据传输方法、计算机设备和存储介质

文献发布时间:2023-06-19 13:45:04


基于Linux系统的协议栈数据传输方法、计算机设备和存储介质

技术领域

本申请涉及计算机技术领域,具体而言,涉及一种基于Linux系统的协议栈数据传输方法、计算机设备和存储介质。

背景技术

协议栈(Protocol stack)是上层的应用程序与底层的硬件之间进行通讯的方式,协议栈进行数据的封装、解析、读取等操作并将数据发送给对应硬件的驱动程序,从而使对应的硬件执行其功能,这就需要硬件厂商根据系统使用的协议栈,来提供源码或者针对特定场景下的驱动程序,不同的系统往往使用不同的协议栈。

发明内容

本申请的主要目的在于提供一种基于Linux系统的协议栈数据传输方法、计算机设备和存储介质。

根据本申请的一个方面,提供了一种基于Linux系统的协议栈数据传输方法,包括:

响应于内核监听到协议栈向驱动芯片控制器发送第一数据,内核向中间服务模块发送通知;

中间服务模块接收所述第一数据并转发所述第一数据到驱动芯片控制器。

在一种实施方式中,所述中间服务模块接收所述第一数据并转发所述第一数据到驱动芯片控制器,包括:

中间服务模块调用与所述协议栈对应的第一接口函数接收所述第一数据;

中间服务模块调用与所述驱动芯片控制器对应的第二接口函数发送所述第一数据给驱动芯片控制器。

在一种实施方式中,所述响应于内核监听到协议栈向驱动芯片控制器发送第一数据,包括:

所述协议栈发送第一数据给VHCI节点;

所述内核监听到所述VHCI节点收到第一数据,向中间服务模块发送通知。

在一种实施方式中,所述第一接口函数包括g_io_channel_read_chars接口函数,所述第二接口函数包括gbinder_client_transact接口函数。

在一种实施方式中,所述中间服务模块调用与所述驱动芯片控制器对应的第二接口函数发送所述数据给驱动芯片控制器,包括:

调用第二接口函数发送所述数据给hwbinder节点,以使得所述hwbinder节点将所述第一数据通过HIDL接口发送到所述驱动芯片控制器。

在一种实施方式中,在协议栈向驱动芯片控制器发送数据之前,所述方法还包括:在内核中预先注册登记VHCI节点和hwbinder节点。

在一种实施方式中,本申请的方法还包括驱动芯片控制器向协议栈发送第二数据的步骤,包括:

响应于内核监听到所述驱动芯片控制器向所述协议栈发送第二数据,内核向所述中间服务模块发送通知;

所述中间服务模块接收所述第二数据并转发所述第二数据到所述协议栈。

在一种实施方式中,所述中间服务模块接收所述第二数据并转发所述第二数据到所述协议栈,包括:

所述中间服务模块调用与所述驱动芯片控制器对应的第三接口函数接收所述第二数据;

所述中间服务模块调用与所述协议栈对应的第四接口函数发送所述第二数据给协议栈。

在一种实施方式中,所述响应于内核监听到所述驱动芯片控制器向所述协议栈发送第二数据,包括:

所述芯片控制器发送第二数据给所述hwbinder节点;

所述内核监听到所述hwbinder节点收到第二数据,向中间服务模块发送通知。

在一种实施方式中,所述第三接口函数包括gbinder_reader_read_hidl_vec接口函数,所述第四接口函数包括g_io_channel_read_chars接口函数。

在一种实施方式中,所述中间服务模块调用与所述协议栈对应的第四接口函数发送所述第二数据给协议栈,包括:

发送所述第二数据给所述VHCI节点,以使得所述VHCI节点将所述数据发送给协议栈。

在一种实施方式中,所述协议栈为Linux下的BlueZ蓝牙协议栈;所述驱动芯片控制器为蓝牙芯片控制器。

第二方面,本申请还提出了一种计算机设备,包括:存储器和处理器,所述存储器存储有计算机程序,所述处理器配置成执行所述计算机程序时实现前述任一权利要求的方法。

第三方面,本申请还提出了一种计算机可读存储介质,计算机可读存储介质中包含一个或多个程序指令,所述一个或多个程序指令用于执行如上述任一项所述的方法。

本发明通过设置中间服务模块,中间服务模块介于协议栈和驱动芯片控制器之间。由中间服务模块调用接口函数来传输数据,实现了与HIDL接口的IPC通信。采用本申请的方法,对于不同的驱动芯片控制器,依旧可以实现Linux下的协议栈和驱动芯片控制器之间正常双向传输数据,提高了系统对于不同蓝牙芯片的驱动兼容能力。

附图说明

构成本申请的一部分的附图用来提供对本申请的进一步理解,使得本申请的其它特征、目的和优点变得更明显。本申请的示意性实施例附图及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1是根据本申请实施例的一种基于Linux系统的协议栈数据传输方法的流程图;

图2是根据本申请实施例的协议栈和驱动芯片控制器双向数据传输示意图;

图3是根据本申请实施例的计算机设备的结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。

HCI:主机控制接口(Host Controller Interface),是蓝牙协议栈的重要部分,HCI提供了对控制器的统一接口,用来沟通Host(主机)和Controller(控制器),是蓝牙协议中软硬件之间的接口,它提供了一个调用下层BB、LM、状态和控制寄存器等硬件的统一命令,上、下两个模块接口之间的消息和数据的传递必须通过HCI的解释才能进行。HCI层以上的协议软件实体运行在主机上,而HCI以下的功能由蓝牙设备来完成,二者之间通过传输层进行交互。

VHCI:虚拟主机控制接口,主机与控制器之间的虚拟接口。

Host(主机)和Controller(控制器)之间的通信都以包的形式进行。Host(主机)和Controller(控制器)之间传输的数据分为命令包(COMMAND)、事件包(EVENT)和数据包(DATA)三种。其中数据包是双向的,命令包只能从主机发往控制器,事件包始终是控制器发向主机。主机发出的大多数命令包都会触发控制器产生相应的事件包作为响应。

对于蓝牙协议栈而言,数据包可分为基于ACL(Asynchronous Connectionless)传送的数据包和基于SCO(Synchronous Connection Oriented)传送的数据包。

蓝牙HAL:蓝牙的硬件适配层

Binder:框架/应用进程间的IPC(进程间通讯机制);

Hwbinder:框架/供应商进程间的IPC;

HIDL:接口描述语言,Android Framework与Android HAL实现之间的接口;

Controller:控制器。

对于Linux系统而言,其蓝牙协议栈BlueZ需要适配的蓝牙厂商能够提供针对BlueZ的蓝牙驱动,并注册供BlueZ使用的HCI接口,而底层驱动更多的依赖厂商支持。

本申请提出了一种基于Linux系统的协议栈数据传输方法,包括下述步骤:

响应于内核监听到协议栈向驱动芯片控制器发送第一数据,内核向中间服务模块发送通知;

中间服务模块接收所述第一数据并转发所述第一数据到驱动芯片控制器。

具体的,参考图1所示,说明本发明方法的具体实现过程,包括:

步骤S102,协议栈发送第一数据给VHCI节点;

步骤S104,内核监听到所述VHCI节点收到第一数据,向中间服务模块发送通知;

步骤S106,中间服务模块调用与所述协议栈对应的第一接口函数接收第一数据;

步骤S108,中间服务模块调用与所述驱动芯片控制器对应的第二接口函数发送第一数据给驱动芯片控制器。

本发明通过设置中间服务模块,中间服务模块介于协议栈和驱动芯片控制器之间。由中间服务模块调用接口函数来传输数据。实现了两者之间的数据的双向的传输。采用本申请的方法,不会因为驱动芯片控制器更换就会造成协议栈与驱动芯片控制器之间数据交互的困难,提高了系统对于不同蓝牙芯片的驱动兼容能力,包括能够兼容安卓的BlueDroid协议栈的蓝牙硬件的驱动。

参见附图2,显示了本发明的中间服务模块的具体操作过程。

首先在Linux系统的内核中预先注册登记VHCI节点和hwbinder节点。

协议栈向驱动芯片控制器发送第一数据时,例如第一数据包括数据包、命令包,内核监听到协议栈向驱动芯片控制器发送第一数据,向中间服务模块发送通知;

中间服务模块调用与协议栈对应的第一接口函数接收所述第一数据,调用与驱动芯片控制器对应的第二接口函数发送第一数据给驱动芯片控制器。

具体的,在一个实施例中,协议栈发送第一数据给VHCI节点;

内核监听到VHCI节点接收到第一数据,向中间服务模块发送通知消息;

中间服务模块接收到通知后,调用对应的g_io_channel_read_chars接口函数接收第一数据,并调用gbinder_client_transact接口函数发送第一数据给hwbinder节点,以使得hwbinder节点将第一数据发送给对应驱动芯片控制器的HIDL接口。

其中,HIDL接口通过HAL与驱动芯片控制器交互HCI数据,从而驱动底层蓝牙芯片控制器。

在上述实施例中,以g_io_channel_write_chars与g_io_channel_read_chars为例说明了第一和第二接口函数。这仅是示意性的,还可以采用其它函数,例如ioctl配合读写参数实现第一和第二接口函数;或标准套接字借口write()与read()实现第一和第二接口函数。

容易理解,在驱动芯片控制器接收到命令包和数据包后,会产生对应的数据包和事件包。

相应的,本发明的方法还包括驱动芯片控制器向协议栈发送第二数据的步骤,包括:

响应于内核监听到驱动芯片控制器向协议栈发送第二数据,内核向中间服务模块发送通知;

中间服务模块接收第二数据并转发第二数据到所述协议栈。

继续参考图2,内核监听到驱动芯片控制器向协议栈发送第二数据,例如第二数据包括数据包和事件包,向中间服务模块发送通知;

中间服务模块调用与驱动芯片控制器对应的第三接口函数接收第二数据,调用与协议栈对应的第四接口函数发送第二数据给协议栈。

具体的,在一个实施例中,芯片控制器向协议栈发送第二数据时,芯片控制器发送第二数据给hwbinder节点,内核监听到hwbinder节点收到第二数据,向中间服务模块发送通知;

中间服务模块接收到通知后,调用对应的gbinder_reader_read_hidl_vec接口函数接收第二数据;

调用g_io_channel_read_chars接口函数发送第二数据给VHCI节点,以使得VHCI节点将第二数据发送给协议栈,从而完成Linux下的协议栈与蓝牙硬件的交互

中间服务模块和驱动芯片控制器采用Android标准接口服务HIDL实现设备驱动免适配,相比其他厂家适配HAL层驱动,解耦程度更高,接口版本化兼容性更佳。

第二方面,本申请还提供了一种计算机设备,包括处理器10、存储器11,以及实现操作计算机设备所需的输入装置12和输出装置13;计算机设备中处理器10的数量可以是一个或多个,处理器10、存储器11、输入装置12和输出装置13可以通过总线或其他方式连接。

存储器11作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及功能模块,如与本发明实施例方法对应的程序指令/模块。处理器10通过运行存储在存储器11中的软件程序、指令以及模块,从而执行计算机设备的各种功能应用以及数据处理,即实现上述实施例的方法。

存储器11可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器11可进一步包括相对于处理器10远程设置的存储器,这些远程存储器可以通过网络连接至计算机设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

输入装置12可用于接收输入的数字或字符信息,以及产生与计算机设备的用户设置以及功能控制有关的键信号输入。输出装置13可包括显示屏等显示设备。

容易理解,本发明的实施例七还提供一种包含计算机可执行指令的存储介质,计算机可执行指令在由计算机处理器执行时用于执行前述方法。

通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(RandomAccess Memory,RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

技术分类

06120113793039