机器设备数据采集方法以及采集系统与流程

文档序号:14490741阅读:1071来源:国知局
机器设备数据采集方法以及采集系统与流程

本发明涉及机器设备数据的处理技术领域,具体来说,是涉及一种机器设备数据采集方法以及采集系统。



背景技术:

机器设备的数据采集在市场上有多种方法:现在常用的方式是选用arduino采集数据。arduino是用来建电子类产品的一个开源的平台,和esp8266结合就可以把本身采集到的数据发到指定的地方。使用arduino采集传感器数据然后通过at指令命令esp8266发送的架构,如图1所示。

这种架构最大的弊端就在于数据采集者与发送者不是同一个设备,于是需要两个mcu(微控制单元)之间进行交互,工作量巨大,还很容易出错。

同时,在使用各种mcu进行数据采集与发送时,存在以下三个方面的难点:(1)采样的数据源源不断地产生,属于高频事件,而发送的频率却是很低,如何解决采样速率与发送速率频率不一致的问题,使得数据的采样和发送达到平衡状态;(2)如果发生网络情况不顺畅时,如何保证数据的传输的完整,不丢失数据;(3)采样频率往往比较高,这意味着发送操作占用时间必须足够短,否则会使得下一次采样时间延后。只有解决了以上三个方面的难点,才能保证网络传输的速度与稳定性。



技术实现要素:

本发明的目的是克服现有技术中的不足之处,提供一种机器设备数据采集方法,能够平衡采集速率与发送速率,保证发送操作占用较短的事件,并且在发生网络情况不顺畅时仍能够保证数据的传输完整,确保不会丢失数据。

本发明的另一目的是提供一种基于上述机器设备数据采集方法的数据采集系统。

为了上述目的,本发明把esp8266刷成nodemcu,使用nodemcu做主控制器。nodemcu是一个32位cpu、1~8mb闪存、80kbram与一块wifi射频芯片的结合体,兼有强大的运算能力、持久化存储能力和wifi功能。由于其自带wifi功能而且价格低廉,非常适合作为设备传感器数据无线采集终端。同时,本发明采用更为轻量、高效的,也更适用于嵌入式系统的脚本语言lua来取代传统的嵌入式语言c或c++,用lua语言给nodemcu编程。架构如图2所示。

本发明直接把传感器与nodemcu相连,那么nodemcu就可以一边采集数据一边发送数据,nodemcu同时作为数据采集者和发送者,即使有交互也是在同一个mcu内部,共享同一片内存,线程(协程)的调度也容易得多,不仅节约了硬件也节约了软件。

本发明一种机器设备数据采集方法,该方法是使用nodemcurrent作为主控制器一边采集数据,并同时通过tcp协议进行数据传输的方法,具体包括:

(一)采集数据,包括:

(1.1)在nodemcu的内存中建立一个列队,采集线程以固定的频率采集传感器数据并塞入队列的尾部,形成队尾;

(1.2)当队尾达到预先设定的大小后,就把当前队尾全部写入文件名为qf_x(x=0,1,2,3,……)的文件中,然后把当前内存中的队尾清空;

(二)wifi重连,设置成每间隔一定时间t1重新连接一下wifi;

(三)传送数据,包括:

(3.1)读取待发送数据:在队列内部维护一个cache(缓存文件),当需要获取待发送的数据时,调用peekpacket函数,判断cache是否为空:

(3.1.1)当cache不为空时,直接返回cache中的数据;

(3.1.2)当cache为空时,确认当前内存中是否有文件名为qf_x的文件:

(3.1.2.1)如果有,则把编号最小的qf_x文件的内容读出来赋值给cache,并清除该编号最小的qf_x文件的,然后返回cache中的数据;

(3.1.2.2)如果没有,则把内存中的整个队尾赋值给cache,并清除当前队尾,然后返回cache中的数据;

(3.2)判断数据是否发送成功:设有一个socket文件用于表示当前的tcp连接,预先设置一个时长为t2的定时器,

(3.2.1)如果在t2时间内,tcp送达数据到服务器并收到服务器的确认消息,则取消定时并判断为数据发送成功,进入步骤(3.3);

(3.2.2)如在t2时间内,未收到确认消息,则判断为超时发送,断定tcp已断开,清空socket文件并新建一个socket,结束本次数据发送;

(3.3)清空cache文件,结束本次数据发送。

其中,步骤(3.1.2.1)中,当把编号最小的qf_x文件的内容读出来赋值给cache,并清除该编号最小的qf_x文件后,将剩余的qx_x文件按0,1,2,3,……的顺序重新编号。

其中,所述步骤(1.2)中,当队尾达到预先设定的大小是以2kb为上限,优选是设定成1kb。步骤(1.2)中,当队尾达到1kb后,就把当前队尾全部写入文件名为qf_x(x=0,1,2,3,……)的文件中,然后把当前内存中的队尾清空。

其中,所述wifi重连,设置成每间隔60s重新连接一下wifi。

其中,所述t2为一个不大于10000ms的时长,作为一种可选择的时长,t2可以为5000ms。

一种基于上述的机器设备数据采集方法的数据采集系统,包括:配置模块、列队模块、确认移除模块、发送模块、任务模块、初始化模块。

配置模块,用于测试加速器与传感器是否存在,然后进行基本的配置,最终返回一个对象,配置模块最终返回的对象包含若干个方法用来读取传感器内部的数值,所读取的传感器内部的数据即为原始寄存器数据。

列队模块,用于把闪存中所有“qf_”开头的文件删除,然后建立一个依赖于文件系统的队列,最后返回一个对象代表这个队列,列队模块返回的对象中包含了把传感器数据塞入队尾的函数、从队首取出数据包的函数和获取队列长度的函数。例如,maxbufsz表示内存中队列最大长度,达到这个长度后就会写入文件,同时,maxbufsz也决定了每个数据包的长度。

确认移除模块,用于在队列内部维护一个缓存文件,将内存中编号最小的“qf_x”文件的内容或整个队尾赋值给该缓存文件,当需要发送数据时,返回该缓存文件中的数据,并在确认数据发送成功后,清空该缓存文件。确认移除模块使得系统实现了可重复读取和确认移除的功能。

发送模块,用于创建一个独立的wifi重连流程,每间隔t1时间重连wifi,同时根据预先设置的一个时长为t2的定时器进行tcp超时重连工作,发送模块最终返回一个对象,所述发送模块返回的对象提供了一个用于发送数据的函数和获取当前发送状态的函数。

任务模块,用于创建所有的任务并返回一个对象,所述任务模块返回的对象包含了启动任务的函数、停止任务的函数和获得当前状态的函数。

初始化模块,用于初始化整个系统。

其中,所述t1为60s;所述t2为一个不大于10000ms的时长。

本发明由于采用了上述技术方案,与现有技术相比,具有以下有益效果:本发明机器设备数据采集系统,可以利用低成本的开源硬件建成了一个高效的数据采集和发送系统;具有灵活且可延伸的硬件采集系统,可跟据需要扩大采集数据类别;能够保持数据的完整性,数据完整无失地被传输到终点;在网络暂时中断的情况下,数据会最大程度的保存在产品外存模块里,网络恢复时,外存数据会继续发送到终端;解决了单方向数据发送而保证终点接收方收到数据;采用使用产品内存和外存的设计解决了数据采集频率和数据发送频率不一致的问题。

附图说明

通过以下本发明的实施例并结合附图的描述,示出本发明的其它优点和特征,该实施例以实例的形式给出,但并不限于此,其中:

图1为现有技术中机器设备的数据采集系统的数据传输示意图。

图2为本发明一种机器设备的数据采集系统的数据传输示意图。

图3为本发明一种机器设备的数据采集系统的系统架构结构示意图。

具体实施方式

本发明一种机器设备的数据采集系统,使用nodemcu做主控制器,使用lua语言为nodemcu进行编程。

所述系统机器设备数据采集系统,包括:配置模块、列队模块、确认移除模块、发送模块、任务模块、初始化模块。

配置模块(i2cdevs模块),是用于测试adxl345与bmp280是否存在,然后进行基本的配置,最终返回一个对象,配置模块最终返回的对象包含若干个方法用来读取传感器内部的数值,所读取的传感器内部的数据即为原始寄存器数据。

列队模块(queue模块),是用于把闪存中所有“qf_”开头的文件删除,然后建立一个依赖于文件系统的队列,最后返回一个对象代表这个队列,列队模块返回的对象中包含了把传感器数据塞入队尾的函数、从队首取出数据包的函数和获取队列长度的函数。例如,maxbufsz表示内存中队列最大长度,达到这个长度后就会写入文件,同时,maxbufsz也决定了每个数据包的长度。

确认移除模块(requeue模块),是用于在队列内部维护一个缓存文件,将内存中编号最小的“qf_x”文件的内容或整个队尾赋值给该缓存文件,当需要发送数据时,返回该缓存文件中的数据,并在确认数据发送成功后,清空该缓存文件。确认移除模块使得系统实现了可重复读取和确认移除的功能。

发送模块(sender模块),是用于创建一个独立的wifi重连流程,每间隔t1时间重连wifi,同时根据预先设置的一个时长为t2的定时器进行tcp超时重连工作,发送模块最终返回一个对象,所述发送模块返回的对象提供了一个用于发送数据的函数和获取当前发送状态的函数。

任务模块(work模块),是用于创建所有的任务并返回一个对象,所述任务模块返回的对象包含了启动任务的函数、停止任务的函数和获得当前状态的函数。

初始化模块(init模块),是用于初始化整个系统。

采集是一个高频的事情,但每次采集的数据很少;而发送是一个低频的事情,但每次发送的数据很多。nodemcu中必须维护一个列队,以平衡采集速率与发送速率。使用一个队列,每次采集向队列尾部塞入一点数据,每次发送从队列头部取出大块数据。

nodemcu在运行时,提供给用户的内存只有30kb左右,这30kb还要存放lua代码,真正可用的只有15~20kb左右的内存,如果网络断开或者非常不稳定,那么上述的队列会快速增长,以至于内存无法容纳该队列,从而会导致数据传输不完整、丢失数据。

在队列中采用持久化存储(闪存),内存中只保留一个最大1kb的队尾,采样数据追加到队尾;当队尾达到1kb后,就把当前队尾全部写入文件名为qf_0的文件,然后吧内存中的队尾清空;当队尾再次达到1kb后,把队尾写入文件名为qf_1的文件;以此类推,队尾每达到1kb后,形成一个文件名为qf_x(x=0,1,2,3,……)的文件。当需要获取待发送的数据时,确认当前是否有文件名为qf_x的文件;如果当前没有,则直接把内存中的“队尾”(其实就是整个列队)返回,然后清空队尾;如果当前有,则把编号最小的“qf_x”文件的内容读出来返回,然后删除该已经读出来返回的编号最小的“qf_x”文件。

以上方法的实现要求网络必须有主动确认机制,所以只可能使用tcp协议。当且仅当nodemcu收到了服务器的确认信息时,才能把队列开头部分删除。这样就要求队列必须拥有回退能力,即:当数据从队列头部取出后,可以重新塞回头部,好像没有发生过取出操作似的。

当发送失败时,队列必须拥有确认取出能力:即:每次从队列头部取出的数据都是一样的,直到调用remove函数,队列头部的数据才会真正从队列中被移除,当发送成功时才从队列中移出当前头部。

为实现队列的“确认取出”功能,在队列外部再套一层壳,使得队列增加peekpacket的能力,成为可重复读的队列。队列内部维护一个cache,当调用peekpacket时,如果cache不为空,则直接返回cache;如果cache为空,则从队列头部移出数据,赋值给cache,然后返回cache。同时,队列有removepacket方法,当调用之后,cache被清空。因为“可重复读的队列”的存在,“网络”模块就不再需要保证每次发送必须成功,只需要当成功时设置一个标志位供“发送线程”查询即可。

nodemcu上进行数据发送时必须使用异步加回调的方式。因为同步的网络发送操作通常很耗时,而且tcp的发送操作所需时间还取决于网速。使用异步加回调的方式,编程困难会稍微增加,因为逻辑上完整的、连续的流程要被拆分成分散的、断续的片段。这也会增加代码出现错误的可能性。

网络模块提供一个send方法,发送线程可以把从列队中读出的待发送数据传入send方法,告诉网络模块尽力发送。网络模块内部持有一个socket,表示当前的tcp连接。当send方法被调用时,网络模块就调用socket.send方法,同时注册socket.send方法的“发送成功”回调函数onsent,并设置一个时长为5000ms的定时器,超时回调函数为ontimeout。如果在5000ms内,tcp送达数据到服务器并收到了服务器的确认消息,那么onsent方法被调用,在onsent方法内部,取消定时器,并标识当前发送状态为sent;相反地,如果在5000ms内,未收到确认消息,那么可以断定tcp已断开,于是ontimeout被调用,在ontimeout内部,清除当前socket(因为断定已断开,需要重连),并标识当前发送状态为timeout。下次发送前,如果发现socket为空,那么先重新创建socket再发送。从而做到tcp层面上的超时重连机制。

不过仅做到tcp层面上的超时重连机制还不够,还需要保证wifi层面上的重连。经过试验发现,nodemcu对于wifi状态的检测不太靠谱,即使通过wifi.sta.status()得知当前状态为sta_gotip,也不一定是连接状态。因此,一个折中的办法就是每60秒重新连接一下wifi。因此本发明数据采集系统的架构中增加了一个独立的wifi重连线程。

当系统开始运行后,采集线程就会以固定的频率采集传感器数据并塞入队列尾部。

如果网络足够通畅,那么数据就会从队列头部及时移出,使得队列的长度一直保持在1kb之内,而不会触发文件操作。因此,正常状态下,队列都只用到了ram,速度快而且不会对flash闪存造成寿命压力。

当网络不太通畅时,队列长度就会增加,可能会把队列头部写入文件中,产生qf_0、qf_1、qf_2、……qf_x等文件;当网络恢复时,就会依次读取qf_0、qf_1、qf_2、……qf_x等文件。文件命令策略可以很简单,比如维持两个变量index和count,index表示当前靠近队列头部的文件编号,count表示队列文件的个数,可以把index理解为读指针(即:待读文件编号),那么(index+count)就是写指针(即:待写文件编号)。index和count初始化时都为零。当要写入一个文件时,新的文件的编号就是(index+count)。当写入一个文件后,index不变,count++。而当读取一个文件后,index++,count–。这么做当然没有任何问题,唯一的缺点就是index值可能会变得非常大,例如可能产生qf_123456这种文件,当然,index值变得非常大并没有任何问题。但是,如果希望index不要变得太大,解决的方法可以采用:当某个文件被读取后,如果count=0,就把index改为0。

当网络通畅时,所有数据都是来自nodemcu的同一个端口(也就是nodemcu内部的同一个socket)。如果网络发送超时,那么nodemcu就会新建一个socket,于是可以发现数据来自了另一个端口。由于wifi重连线程的存在,每60秒网络就会中断一次,这会触发队列写入flash闪存的操作,重连后会导致数据又换了一个端口。

虽然本发明已依据较佳实施例在上文中加以说明,但这并不表示本发明的范围只局限于上述的结构,只要本技术领域的技术人员在阅读上述的说明后可很容易地发展出的等效替代结构,在不脱离本发明之精神与范围下所作之均等变化与修饰,皆应涵盖于本发明专利范围之内。

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