基于虚拟设备的数据集中器开发方法、装置及存储介质与流程

文档序号:16529398发布日期:2019-01-05 10:37阅读:253来源:国知局
基于虚拟设备的数据集中器开发方法、装置及存储介质与流程

本发明涉及虚拟技术领域,尤其涉及基于虚拟设备的数据集中器开发方法、装置及存储介质。



背景技术:

目前,数据集中器的开发大多都是基于传统的java,c/c++来实现,具有开发周期短、移植性强等优点。然而,在对上述技术的研究和实践过程中,本发明的发明人发现,上述技术对于时刻变化的终端设备来说都存在一个共同的弊端:可扩展性较差。当有新类型终端加入时,我们不得不重新对程序进行编码、编译以适应其加入,当开发的代码量达到一定数量级、逻辑达到一定复杂程度时,这种修改是不可想象的。另,相对于单个终端设备的运行情况,上位机可能更关心多个终端设备所组成的整体设备的运行情况。因此,仅仅通过传统的技术为上位机提供已定制的终端设备数据是远远不够的,必须考虑不同终端设备以及终端设备之间组合的可扩展性问题。



技术实现要素:

本发明实施例所要解决的技术问题在于,提供基于虚拟设备的数据集中器开发方法、装置及存储介质,能够使得上层无需关心底层设备的构成,为上层数据的采集提供简单方便的接口,同时,使用lua语言编写的脚本无需编译,可直接运行,大大增强了系统的可移植性,从而克服传统集中器可扩展性较差、终端设备无法组合使用等问题。

为解决上述问题,本发明的一个实施例提供一种基于虚拟设备的数据集中器开发方法,适于在计算设备中执行,包括:

将lua开发包编译至数据集中器的操作系统中,并在所述数据集中器应用程序的框架上建立lua脚本的框架;

在所述数据集中器与上位机之间建立统一的通信协议;

启动所述数据集中器,并加载lua虚拟机,当上层消息传入时,通过c++语言和lua脚本对相关数据进行解析,得到解析数据,并把所述解析数据分发到终端设备;

接收所述终端设备根据所述解析数据回传的数据,并通过lua脚本将所述数据封装成虚拟设备数据,再通过c++语言将所述虚拟设备数据返回给上层。

进一步地,所述在所述数据集中器应用程序的框架上建立lua脚本的框架,具体为:

在所述数据集中器上搭建注册lua虚拟机;

根据所述数据集中器的资源分配调用接口;

根据所述数据集中器的所述调用接口对所述lua脚本的函数进行封装。

进一步地,所述通信协议包括:

读命令协议;该命令由40至6136位二进制数据组成,前8位固定格式0x01代表读命令,9至16位代表需要读取的点数,其最大可容纳数为28-1,即255个点,从第17位开始,每24位二进制数代表一个点的标识,直到标识数与描述的点数相符合;

读返回命令协议;该命令由72至14296位二进制数据组成,前8位固定格式0x11代表读返回命令,9至16位代表读取返回的点数,其最大可容纳数为28-1,即255个点,从第17位开始,每56位二进制数代表一个点的键值对,其中前24位为该点的标识,后32位为该点的数值,直到该键值对数目与描述的点数相符合;

写命令协议;该命令由72至14296位二进制数据组成,前8位固定格式0x02代表写命令,9至16位代表要写入的点数,其最大可容纳数为28-1,即255个点,从第17位开始,每56位二进制数代表一个点的键值对,其中前24位为该点的标识,后32位为该点的数值,直到该键值对数目与描述的点数相符合;

写返回命令协议;该命令由24位二进制数据组成,前8位固定格式0x12代表写返回命令,9至16位代表要写入的点数,其最大可容纳数为28-1,即255个点,17至24位代表写入结果,其中0x01表示更新成功,0x02表示更新失败;其中,

点的标识以0x640000作为分界分成2种设备,其中,0x0至0x63ffff描述为终端设备,0x640000至0xffffff描述为虚拟设备。

进一步地,所述通过c++语言和lua脚本对相关数据进行解析,为使用c++编译的应用程序对lua脚本接口的调用。

进一步地,所述通过lua脚本将所述数据封装成虚拟设备数据,指通过lua脚本对使用c++编译的应用程序接口的回调。

本发明的一个实施例还提供了一种基于虚拟设备的数据集中器开发装置,包括:

lua脚本的框架建立模块,用于将lua开发包编译至数据集中器的操作系统中,并在所述数据集中器应用程序的框架上建立lua脚本的框架;

通信协议建立模块,用于在所述数据集中器与上位机之间建立统一的通信协议;

解析模块,用于启动所述数据集中器,并加载lua虚拟机,当上层消息传入时,通过c++语言和lua脚本对相关数据进行解析,得到解析数据,并把所述解析数据分发到终端设备;

封装模块,用于接收所述终端设备根据所述解析数据回传的数据,并通过lua脚本将所述数据封装成虚拟设备数据,再通过c++语言将所述虚拟设备数据返回给上层。

进一步地,所述通过c++语言和lua脚本对相关数据进行解析,为使用c++编译的应用程序对lua脚本接口的调用。

进一步地,所述通过lua脚本将所述数据封装成虚拟设备数据,指通过lua脚本对使用c++编译的应用程序接口的回调。

本发明的一个实施例还提供了一种基于虚拟设备的数据集中器开发装置,包括处理器、存储器以及存储在所述存储器中且被配置为由所述处理器执行的计算机程序,所述处理器执行所述计算机程序时实现如上述的基于虚拟设备的数据集中器开发方法。

本发明的一个实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质包括存储的计算机程序,其中,在所述计算机程序运行时控制所述计算机可读存储介质所在设备执行如上述的基于虚拟设备的数据集中器开发方法。

实施本发明实施例,具有如下有益效果:

本发明实施例提供的基于虚拟设备的数据集中器开发方法、装置及存储介质,所述方法适于在计算设备中执行,通过将lua开发包编译至数据集中器的操作系统中,并在所述数据集中器应用程序的框架上建立lua脚本的框架,以及在所述数据集中器与上位机之间建立统一的通信协议后,在集中器上运行lua虚拟机,并通过lua脚本编写一系列的规则,对上位机提供的虚拟设备进行解析,并映射到相关的终端设备上,最后对终端设备数据进行封装,作为虚拟设备数据提交到上位机。本发明使得上层无需关心底层设备的构成,为上层数据的采集提供简单方便的接口,同时,使用lua语言编写的脚本无需编译,可直接运行,大大增强了系统的可移植性。

附图说明

图1为本发明第一实施例提供的一种基于虚拟设备的数据集中器开发方法的流程示意图;

图2为本发明第一实施例中的数据集中器架构图;

图3为本发明第一实施例中的数据集中器应用程序架构图;

图4为本发明第一实施例中的c++代码调用lua脚本流程图;

图5为本发明第一实施例中的lua脚本流程图;

图6为本发明第一实施例中的配置文件vdevconfig;

图7为本发明第一实施中的lua脚本文件;

图8为本发明第一实施例中的通信协议的读命令协议表;

图9为本发明第一实施例中的通信协议的读返回命令协议表;

图10为本发明第一实施例中的通信协议的写命令协议表;

图11为本发明第一实施例中的通信协议的写返回命令协议表;

图12为本发明第二实施例提供的基于虚拟设备的数据集中器开发装置的结构示意图。

具体实施方式

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

需要说明的是,lua是一个小巧的脚本语言。它是由robertoierusalimschy、waldemarceles和luizhenriquedefigueiredo共同开发的,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。同时,lua由标准c编写而成,几乎在所有操作系统和平台上都可以编译,运行。因此,将lua语言引入到使用传统语言编写的应用程序中,可加强程序的可扩展性,使程序无须因为终端的改变而重新编译。

本发明第一实施例,请参阅图1-12。

如图1所示,所述基于虚拟设备的数据集中器开发方法,适于在计算设备中执行,包括:

s101、将lua开发包编译至数据集中器的操作系统中,并在所述数据集中器应用程序的框架上建立lua脚本的框架;

s102、在所述数据集中器与上位机之间建立统一的通信协议;

s103、启动所述数据集中器,并加载lua虚拟机,当上层消息传入时,通过c++语言和lua脚本对相关数据进行解析,得到解析数据,并把所述解析数据分发到终端设备;

s104、接收所述终端设备根据所述解析数据回传的数据,并通过lua脚本将所述数据封装成虚拟设备数据,再通过c++语言将所述虚拟设备数据返回给上层。

在本实施例中,如图2-3所示,对于步骤s101,本实施例将lua语言移植到arm平台,该平台的操作系统使用ubuntu,通过交叉编译器进行交叉编译,使得lua脚本能在平台上运行。

其中,所述在所述数据集中器应用程序的框架上建立lua脚本的框架,具体为:

在所述数据集中器上搭建注册lua虚拟机;

根据所述数据集中器的资源分配调用接口;

根据所述数据集中器的所述调用接口对所述lua脚本的函数进行封装。

在本实施例中,如图8-11所示,对于步骤s102,本实施例定义了一系列通信协议,使得所述数据集中器与上位机之间能顺利进行数据生成和解析。其中,所述通信协议包括:

读命令协议;该命令由40至6136位二进制数据组成,前8位固定格式0x01代表读命令,9至16位代表需要读取的点数,其最大可容纳数为28-1,即255个点,从第17位开始,每24位二进制数代表一个点的标识,直到标识数与描述的点数相符合;

读返回命令协议;该命令由72至14296位二进制数据组成,前8位固定格式0x11代表读返回命令,9至16位代表读取返回的点数,其最大可容纳数为28-1,即255个点,从第17位开始,每56位二进制数代表一个点的键值对,其中前24位为该点的标识,后32位为该点的数值,直到该键值对数目与描述的点数相符合;

写命令协议;该命令由72至14296位二进制数据组成,前8位固定格式0x02代表写命令,9至16位代表要写入的点数,其最大可容纳数为28-1,即255个点,从第17位开始,每56位二进制数代表一个点的键值对,其中前24位为该点的标识,后32位为该点的数值,直到该键值对数目与描述的点数相符合;

写返回命令协议;该命令由24位二进制数据组成,前8位固定格式0x12代表写返回命令,9至16位代表要写入的点数,其最大可容纳数为28-1,即255个点,17至24位代表写入结果,其中0x01表示更新成功,0x02表示更新失败;

其中,点的标识以0x640000作为分界分成2种设备,其中,0x0至0x63ffff描述为终端设备,0x640000至0xffffff描述为虚拟设备。

也就是说,在读命令中,以01开头的命令解析为读取数据,通常是上位机向集中器发送的命令,02表示读取的节点数,后面紧跟每个节点的标识,各节点标识使用24位数表示(如图8所示)。在读返回命令中,以11开头的命令解析为读取数据返回,通常是集中器向上位机发送的命令,02表示读取的节点数,后面紧跟每个节点的标识以及数据,各节点标识使用24位数表示,数据使用32位数表示(如图9所示)。在写命令中,以02开头的命令解析为写入数据,通常是上位机向集中器发送的命令,02表示写入的节点数,后面紧跟每个节点的标识以及需要写入的数据,各节点标识使用24位数表示,数据使用32位数表示(如图10所示)。在写返回命令中,以12开头的命令解析为写入数据返回,通常是集中器向上位机发送的命令,02表示写入的节点数,01为写入结果,其中01表示成功,02表示失败(如图11所示)。

在本实施例中,对于步骤s103,所述通过c++语言和lua脚本对相关数据进行解析,为使用c++编译的应用程序对lua脚本接口的调用。

如图4所示,本实施例采用线程方式对lua脚本进行读取,c++代码与lua脚本之间统一定义doread函数作为数据获取函数,dowrite函数作为数据更新函数,方便以后lua脚本的修改不影响c++代码的运行,程序的具体步骤如下:

首先对请求的设备进行判断,若设备为普通的终端设备则对该设备进行通常的读写操作,若设备为虚拟设备,则开启新线程对请求命令进行解析并执行;

根据请求的不同将命令分为数据读取和更新两种;

对于读取操作,程序首先调用lua_getglobal函数获取lua脚本中相对应的执行函数名,本实施例采用doread作为读取函数,对于具有多个数据项需要读取的虚拟设备,使用doread_0,doread_1等分开读取;然后通过lua_pushinteger函数为lua脚本定义传入参数,并使用lua_pcall函数指定参数个数以及返回值个数;最后调用lua_tonumber函数获取脚本返回值;

对于写入操作,程序首先调用lua_getglobal函数获取lua脚本中相对应的执行函数名,本实施例采用dowrite作为写入函数,对于具有多个数据项需要写入的虚拟设备,使用dowrite_0,dowrite_1等分开写入;然后通过lua_pushinteger函数为lua脚本定义传入参数,并使用lua_pcall函数指定参数个数以及返回值个数;最后调用lua_toboolean函数获取脚本返回值,返回调用成功或失败;

程序根据读取或写入操作的返回值执行后续操作。

在本实施例中,对于步骤s104,所述通过lua脚本将所述数据封装成虚拟设备数据,指通过lua脚本对使用c++编译的应用程序接口的回调。

如图5-7所示,lua脚本需要实现的程序相对简单,因此,可以提供给一些具有一定编程基础的用户,他们可以按照自己的想法编写lua脚本以及相关的终端设备配置文件,以组合不同终端设备成为一个虚拟设备。同时,由于步骤s103中c++代码与lua脚本间定义了一系列读写规则,因此,无需重新编译集中器程序即可使用该脚本代码,实现lua脚本的步骤如下:

定义配置文件vdevconfig。如图6所示,配置文件中定义了2种类型的虚拟设备,类型一为窗帘,在窗帘类型下,我们定义了一个具体的虚拟设备窗帘1,该设备所指向的lua脚本为chuanglian.lua,对于该虚拟设备的所有读写操作都会使用其自身定义的lua脚本里面的函数。对于标签vdev下的各子标签point,每个point使用不同的读写函数,根据其偏移量的变化分别为:第一个point标签使用doread_0和dowrite_0函数,以此类推。里面的属性read_params和write_params则分别是需要传入lua脚本的读取和更新点参数,同一个point标签下调用的读写函数所读取或修改的数据项相同,如同为电流值或电压值。

编写lua脚本。如图7所示,首先,脚本的命名必须与配置文件中虚拟设备所指向的文件名相对应,然后根据c++代码中定下的函数读写规则,在脚本中定义读写函数doread_x和dowrite_y,其中,x与y代表偏移量,由配置文件vdevconfig中point标签所决定。为了更好地让集中器应用程序了解到所读写的数据,可以通过数组point_name对数据进行描述,数组的大小应当与配置文件中point标签的多少相对应,最后通过get_point_name函数返回该偏移量下的数据描述。

至此,在数据集中器系统上添加支持虚拟设备基本完成。

本实施例提供的一种基于虚拟设备的数据集中器开发方法,通过将lua开发包编译至数据集中器的操作系统中,并在所述数据集中器应用程序的框架上建立lua脚本的框架,以及在所述数据集中器与上位机之间建立统一的通信协议后,在集中器上运行lua虚拟机,并通过lua脚本编写一系列的规则,对上位机提供的虚拟设备进行解析,并映射到相关的终端设备上,最后对终端设备数据进行封装,作为虚拟设备数据提交到上位机。本发明使得上层无需关心底层设备的构成,为上层数据的采集提供简单方便的接口,同时,使用lua语言编写的脚本无需编译,可直接运行,大大增强了系统的可移植性。

本发明第二实施例,请参阅图12。

如图12所示,本发明的一个实施例还提供了一种基于虚拟设备的数据集中器开发装置,包括:

lua脚本的框架建立模块201,用于将lua开发包编译至数据集中器的操作系统中,并在所述数据集中器应用程序的框架上建立lua脚本的框架。

在本实施例中,如图2-3所示,本实施例将lua语言移植到arm平台,该平台的操作系统使用ubuntu,通过交叉编译器进行交叉编译,使得lua脚本能在平台上运行。

其中,所述在所述数据集中器应用程序的框架上建立lua脚本的框架,具体为:

在所述数据集中器上搭建注册lua虚拟机;

根据所述数据集中器的资源分配调用接口;

根据所述数据集中器的所述调用接口对所述lua脚本的函数进行封装。

通信协议建立模块202,用于在所述数据集中器与上位机之间建立统一的通信协议。

在本实施例中,如图8-11所示,本实施例定义了一系列通信协议,使得所述数据集中器与上位机之间能顺利进行数据生成和解析。其中,所述通信协议包括:

读命令协议;该命令由40至6136位二进制数据组成,前8位固定格式0x01代表读命令,9至16位代表需要读取的点数,其最大可容纳数为28-1,即255个点,从第17位开始,每24位二进制数代表一个点的标识,直到标识数与描述的点数相符合;

读返回命令协议;该命令由72至14296位二进制数据组成,前8位固定格式0x11代表读返回命令,9至16位代表读取返回的点数,其最大可容纳数为28-1,即255个点,从第17位开始,每56位二进制数代表一个点的键值对,其中前24位为该点的标识,后32位为该点的数值,直到该键值对数目与描述的点数相符合;

写命令协议;该命令由72至14296位二进制数据组成,前8位固定格式0x02代表写命令,9至16位代表要写入的点数,其最大可容纳数为28-1,即255个点,从第17位开始,每56位二进制数代表一个点的键值对,其中前24位为该点的标识,后32位为该点的数值,直到该键值对数目与描述的点数相符合;

写返回命令协议;该命令由24位二进制数据组成,前8位固定格式0x12代表写返回命令,9至16位代表要写入的点数,其最大可容纳数为28-1,即255个点,17至24位代表写入结果,其中0x01表示更新成功,0x02表示更新失败;

其中,点的标识以0x640000作为分界分成2种设备,其中,0x0至0x63ffff描述为终端设备,0x640000至0xffffff描述为虚拟设备。

也就是说,在读命令中,以01开头的命令解析为读取数据,通常是上位机向集中器发送的命令,02表示读取的节点数,后面紧跟每个节点的标识,各节点标识使用24位数表示(如图8所示)。在读返回命令中,以11开头的命令解析为读取数据返回,通常是集中器向上位机发送的命令,02表示读取的节点数,后面紧跟每个节点的标识以及数据,各节点标识使用24位数表示,数据使用32位数表示(如图9所示)。在写命令中,以02开头的命令解析为写入数据,通常是上位机向集中器发送的命令,02表示写入的节点数,后面紧跟每个节点的标识以及需要写入的数据,各节点标识使用24位数表示,数据使用32位数表示(如图10所示)。在写返回命令中,以12开头的命令解析为写入数据返回,通常是集中器向上位机发送的命令,02表示写入的节点数,01为写入结果,其中01表示成功,02表示失败(如图11所示)。

解析模块203,用于启动所述数据集中器,并加载lua虚拟机,当上层消息传入时,通过c++语言和lua脚本对相关数据进行解析,得到解析数据,并把所述解析数据分发到终端设备。

在本实施例中,所述通过c++语言和lua脚本对相关数据进行解析,为使用c++编译的应用程序对lua脚本接口的调用。

如图4所示,本实施例采用线程方式对lua脚本进行读取,c++代码与lua脚本之间统一定义doread函数作为数据获取函数,dowrite函数作为数据更新函数,方便以后lua脚本的修改不影响c++代码的运行,程序的具体步骤如下:

首先对请求的设备进行判断,若设备为普通的终端设备则对该设备进行通常的读写操作,若设备为虚拟设备,则开启新线程对请求命令进行解析并执行;

根据请求的不同将命令分为数据读取和更新两种;

对于读取操作,程序首先调用lua_getglobal函数获取lua脚本中相对应的执行函数名,本实施例采用doread作为读取函数,对于具有多个数据项需要读取的虚拟设备,使用doread_0,doread_1等分开读取;然后通过lua_pushinteger函数为lua脚本定义传入参数,并使用lua_pcall函数指定参数个数以及返回值个数;最后调用lua_tonumber函数获取脚本返回值;

对于写入操作,程序首先调用lua_getglobal函数获取lua脚本中相对应的执行函数名,本实施例采用dowrite作为写入函数,对于具有多个数据项需要写入的虚拟设备,使用dowrite_0,dowrite_1等分开写入;然后通过lua_pushinteger函数为lua脚本定义传入参数,并使用lua_pcall函数指定参数个数以及返回值个数;最后调用lua_toboolean函数获取脚本返回值,返回调用成功或失败;

程序根据读取或写入操作的返回值执行后续操作。

封装模块204,用于接收所述终端设备根据所述解析数据回传的数据,并通过lua脚本将所述数据封装成虚拟设备数据,再通过c++语言将所述虚拟设备数据返回给上层。

在本实施例中,所述通过lua脚本将所述数据封装成虚拟设备数据,指通过lua脚本对使用c++编译的应用程序接口的回调。

如图5-7所示,lua脚本需要实现的程序相对简单,因此,可以提供给一些具有一定编程基础的用户,他们可以按照自己的想法编写lua脚本以及相关的终端设备配置文件,以组合不同终端设备成为一个虚拟设备。同时,本实施例中的c++代码与lua脚本间定义了一系列读写规则,因此,无需重新编译集中器程序即可使用该脚本代码,实现lua脚本的步骤如下:

定义配置文件vdevconfig。如图6所示,配置文件中定义了2种类型的虚拟设备,类型一为窗帘,在窗帘类型下,我们定义了一个具体的虚拟设备窗帘1,该设备所指向的lua脚本为chuanglian.lua,对于该虚拟设备的所有读写操作都会使用其自身定义的lua脚本里面的函数。对于标签vdev下的各子标签point,每个point使用不同的读写函数,根据其偏移量的变化分别为:第一个point标签使用doread_0和dowrite_0函数,以此类推。里面的属性read_params和write_params则分别是需要传入lua脚本的读取和更新点参数,同一个point标签下调用的读写函数所读取或修改的数据项相同,如同为电流值或电压值。

编写lua脚本。如图7所示,首先,脚本的命名必须与配置文件中虚拟设备所指向的文件名相对应,然后根据c++代码中定下的函数读写规则,在脚本中定义读写函数doread_x和dowrite_y,其中,x与y代表偏移量,由配置文件vdevconfig中point标签所决定。为了更好地让集中器应用程序了解到所读写的数据,可以通过数组point_name对数据进行描述,数组的大小应当与配置文件中point标签的多少相对应,最后通过get_point_name函数返回该偏移量下的数据描述。

至此,在数据集中器系统上添加支持虚拟设备基本完成。

本实施例提供的一种基于虚拟设备的数据集中器开发装置,通过将lua开发包编译至数据集中器的操作系统中,并在所述数据集中器应用程序的框架上建立lua脚本的框架,以及在所述数据集中器与上位机之间建立统一的通信协议后,在集中器上运行lua虚拟机,并通过lua脚本编写一系列的规则,对上位机提供的虚拟设备进行解析,并映射到相关的终端设备上,最后对终端设备数据进行封装,作为虚拟设备数据提交到上位机。本发明使得上层无需关心底层设备的构成,为上层数据的采集提供简单方便的接口,同时,使用lua语言编写的脚本无需编译,可直接运行,大大增强了系统的可移植性。

本发明的一个实施例还提供了一种基于虚拟设备的数据集中器开发装置,包括处理器、存储器以及存储在所述存储器中且被配置为由所述处理器执行的计算机程序,所述处理器执行所述计算机程序时实现如上述的基于虚拟设备的数据集中器开发方法。

本发明的一个实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质包括存储的计算机程序,其中,在所述计算机程序运行时控制所述计算机可读存储介质所在设备执行如上述的基于虚拟设备的数据集中器开发方法。

以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和变形,这些改进和变形也视为本发明的保护范围。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)或随机存储记忆体(randomaccessmemory,ram)等。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1