本发明涉及用电监测系统,更具体地说是指用电监测系统及其方法。
背景技术:
随着科技和社会的发展,在满足生产、生活所必需的用电条件下,人们都在尽力减少电能的消耗,提高用户的电能利用率和减少供电网络的电能损耗,这就需要进行用电监测,以确保用电安全以及低功耗等功能。
当前,用电监测主要采用用电安全检测仪器进行监测,大部分用电安全检测仪器多采用模拟电子装置,设备老化,软硬件升级改造速度缓慢,部分用电安全检测仪器的用电场所仅通过单纯的熔丝检测方式功能工作,传统的用电安全检测仪器仪表在精准监测用电参数方面存在精度低、不易操作、智能化程度较低、自我监测能力较弱、无软件平台及服务器后台处理等缺点。
因此,有必要设计一种用电监测系统,实现用电监测过程中的低功耗、性能高、成本低以及自动化的效果。
技术实现要素:
本发明的目的在于克服现有技术的缺陷,提供用电监测系统及其方法。
为实现上述目的,本发明采用以下技术方案:用电监测系统,包括采集单元、转换单元、服务器以及移动终端,其中,所述采集单元,用于采集初始数据;所述转换单元,用于将初始数据进行转换,形成用电数据;所述服务器,用于对所述用电数据进行解析以及封装,形成数据包,并发送数据包;所述移动终端,用于接收数据包,针对数据包进行处理,并设定相应的峰值,当数据包内的数据超过设定峰值时,则进行预警,并显示用电数据。
其进一步技术方案为:所述采集单元包括温度传感器、电压传感器、电流传感器、二氧化碳传感器以及gps传感器中至少一个。
其进一步技术方案为:所述转换单元包括看门狗模块、计量模块以及接口模块;其中,所述看门狗模块,用于对系统上电或者按下复位按键时,对系统进行复位;所述计量模块,用于将采集单元采集的初始数据进行转换,获取电压、电流及电量消耗数据,形成用电数据;所述接口模块,用于将用电数据进行显示并输出至服务器。
其进一步技术方案为:所述服务器包括校验模块、处理模块以及第一通信模块;
所述校验模块,用于对用电数据进行校验,检验数据是否满足条件;
所述处理模块,用于对用电数据进行解析和封装,形成数据包;
所述第一通信模块,用于发送数据包。
其进一步技术方案为:所述移动终端包括数据获取模块、预警模块以及第二通信模块;
所述第二通信模块,用于接收数据包;
所述数据获取模块,用于从数据包内读取数据,并对数据进行解析,判断数据是否超过设定峰值,并显示数据;
所述预警模块,用于当数据超过设定峰值时,发送报警信号进行预警通知。
其进一步技术方案为:所述数据获取模块包括数据显示子模块以及解析子模块;
所述解析子模块,用于从数据包内读取数据,并对数据进行解析,判断数据是否超过设定峰值;
所述数据显示子模块,用于显示数据。
其进一步技术方案为:所述移动终端还包括账户管理模块以及存储模块;
所述账户管理模块,用于观察员登录名以及登录密码的显示、判定处理、对获取的数据包进行数据库信息匹配;
所述存储模块,用于将解析获取的数据进行存储。
本发明还提供了用电监测方法,所述方法包括:
服务器连接采集单元,采集单元获取初始数据,并对初始数据进行转换,获取用电数据;
服务器对用电数据进行解析和封装处理后,形成数据包并发送;
构建网络拓扑关系,并将网络拓扑关系中的网关组织设备互连;
移动终端接收数据包,针对数据包进行处理,并设定相应的峰值,当数据包内的数据超过设定峰值时,则进行预警,并显示用电数据。
其进一步技术方案为:移动终端接收数据包,针对数据包进行处理,并设定相应的峰值,当数据包内的数据超过设定峰值时,则进行预警,并显示用电数据的步骤中,具体是采用on_pushbutton_clicked()槽函数,在槽函数中采用soltreadfile_database()调用函数从数据库读取数据,对数据进行解析处理后,将数据由soltreadfile_database()函数暂存,并向数据库进行存储。
其进一步技术方案为:服务器连接采集单元,采集单元获取初始数据,并对初始数据进行转换,获取用电数据的步骤中,所述初始数据包括电压、电流、功率、二氧化碳浓度以及温度中至少一个数据。
本发明与现有技术相比的有益效果是:本发明的用电监测系统,通过服务器接收采集单元采集的电压、电流、功率、二氧化碳浓度、温度参数数据,解析数据、封装数据、通过以太网将采集的数据发送给移动终端,移动终端接收到数据进行相应的处理,根据电压、电流传感器的参数变化,当数据超过设定峰值时,则进行相应的预警,可以了解用电的情况;数据显示在移动终端的界面,达到对相关设备的监测和控制;实现用电监测过程中的低功耗、性能高、成本低以及自动化的效果。
下面结合附图和具体实施例对本发明作进一步描述。
附图说明
图1为本发明具体实施例提供的用电监测系统的结构框图;
图2为本发明具体实施例提供的看门狗模块的电路原理图;
图3为本发明具体实施例提供的lcd接口子模块的电路原理图;
图4为本发明具体实施例提供的jtag接口子模块的电路原理图;
图5为本发明具体实施例提供的用电监测系统的参数计算方法表;
图6为本发明具体实施例提供的用电监测系统的架构框图;
图7为本发明具体实施例提供的用电监测系统的功能示意图;
图8为本发明具体实施例提供的用电监测方法的流程图;
图9为本发明具体实施例提供的用电监测系统的网络拓扑结构框图。
具体实施方式
为了更充分理解本发明的技术内容,下面结合具体实施例对本发明的技术方案进一步介绍和说明,但不局限于此。
如图1~9所示的具体实施例,本实施例提供的用电监测系统,可以运用在于商场或者工厂等耗电严重的地方,一方面解决了人为检测的不安全性,另一方面解决了传统检测仪器的局限性。不但使工厂、商场节约了人力检测成本,而且监测精度更为准确实时,而且极大地提高了用电监测仪器的智能化水平。并在一定程度上减少了事故的发生率,将因用电安全事故造成的损失降到最低。用电监测系统在事故发生初期,及时有效地监控,是降低事故发生概率的有效途径。在工农业生产生活用电环境中,配备一套良好的用电监测系统,对促进生产,提高生产安全都具有极其重要的现实意义。
如图1所示,本实施例提供了用电监测系统,其包括采集单元1、转换单元2、服务器3以及移动终端4,其中,采集单元1,用于采集初始数据;转换单元2,用于将初始数据进行转换,形成用电数据;服务器3,用于对所述用电数据进行解析以及封装,形成数据包,并发送数据包;移动终端4,用于接收数据包,针对数据包进行处理,并设定相应的峰值,当数据包内的数据超过设定峰值时,则进行预警,并显示用电数据。
更进一步地,在某些实施例中,上述的采集单元1包括温度传感器、电压传感器、电流传感器、二氧化碳传感器以及gps传感器中至少一个。
服务器3通过rs485串口接收采集单元1采集的电压、电流、功率、二氧化碳浓度、温度等参数数据,然后解析数据、封装数据、通过以太网将采集的数据发送给移动终端4,移动终端4接收到数据进行相应的处理,根据电压、电流等传感器的参数变化,根据实际需求设置相应的峰值,当超过设定峰值时,则进行相应的预警,并及时通知检测人员进行处理;通过检测到电压、电流传感器等数据变化,可以了解用电的情况;通过接收服务器3发送过来的数据,将数据显示在移动终端4的界面,达到对相关设备的监测和控制。
采用高集成度监测模块采集的用电参数信息,具有一定的稳定性和实时性。用电安全检测仪通过网络通信,完成客户端和服务端的交互,一定程度上解决了传统检测设备与软件平台的不足。
更进一步地,在某些实施例中,上述的转换单元2包括看门狗模块、计量模块以及接口模块;其中,看门狗模块,用于对系统上电或者按下复位按键时,对系统进行复位;计量模块,用于将采集单元1采集的初始数据进行转换,获取电压、电流及电量消耗数据,形成用电数据;接口模块,用于将用电数据进行显示并输出至服务器3。
上述的看门狗模块包括振荡器x1、x2以及电容c7、c8、c9、c10;看门狗模块起着复位的作用,是用电安全检测仪的重要部分,在系统上电或者用户按下复位按键会发生复位。
上述的计量模块为jsy-mk-211型单相交直流计量模块采用微电子技术与专用大规模集成电路,应用数字采样处理技术。该模块技术能精确地测量额定频率为50hz或60hz单相交流电网中的电压、电流、功率、功率因数、电量及总量等电参数。该模块内置1路rs485通讯接口、1路ttl电平接口、modbus-rtu通讯协议方便与各种amr系统联接,具有可靠性好、体积小、重量轻、外形美观、安装方便等优点。jsy-mk-211型单相交直流计量模块可广泛应用于节能改造、电力、通信、铁路、交通、环保、石化、钢铁等行业中,用于监测交流或直流设备的电压、电流及电量消耗情况。此模块中主机一般只有rs-232接口,此时可通过rs-232/rs-485转换器后连接485网络。
上述的接口模块包括lcd接口子模块以及jtag接口子模块,分别如图3与图4所示,lcd的接口有多种,分类很细,主要看lcd的驱动方式和控制方式,目前手机上的彩色lcd的连接方式一般有mcu模式、rgb模式、spi模式、vsync模式、mddi模式、dsi模式、mcu模式,其中只有tft模块才有rgb接口,系统在前期调试阶段需要用到lcd接口子模块显示输出的数据,同时也为后期需求留空间,在系统首次进行linux系统移植的时候,是通过jtag接口子模块进行的,另外进行芯片调试的时候也会使用jtag接口。
更进一步地,在某些实施例中,上述的服务器3包括校验模块、处理模块以及第一通信模块;校验模块,用于对用电数据进行校验,检验数据是否满足条件;处理模块,用于对用电数据进行解析和封装,形成数据包;第一通信模块,用于发送数据包。
对于服务器3还需要进行软件设计,其中包括bootloader启动模块、根文件系统制作模块、线程池设计模块、环境设计模块、驱动模块以及串口设计模块。
对于上述的bootloader启动模块,通常在第一次安装内核与根文件系统的时候使用下载模式,下载模式局限性高,要求目标机器必须有串口或者可以下载的端口。bootloader启动的第二种方式是flash启动方式,这是目前通用的方式,将要启动的bootloader是存储在flash芯片上,在flash芯片的低端或者顶端存放bootloader,这种方式方便、局限性小。bootloader在启动的时候会对中断、串口、cpu、存储器进行相应的初始化。当初始化到网络设备的时候,开始循环读取串口信息,并在终端将信息打印出来,也会读取串口的命令,进行相应的写操作。
对于上述的根文件系统制作模块,整个的linux系统中,首先是启动bootloader,接下来是linux内核,最后是根文件系统,在bootloader启动时初始化相关操作,在linux内核阶段,相应系统服务以及内核驱动程序会被启动。linux系统是操作文件的,操做过程需要文件系统,也就是说,linux系统是离不开文件系统,linux启动时,第一个必须挂载的是根文件系统,若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动,成功之后可以自动或手动挂载其他的文件系统,根文件系统制作的流程为制作根文件系统、准备环境、编译busybox、建立文件结构框图以及创建配置文件;制作根文件系统设计使用busybox工具,操作流程如下:编译busybox得到系统使用的常用命令;下载yaffs2源代码。在环境准备时候建立一个目录存放生成的文件,编译busybox,构建出bin、sbin、usr目录,建立文件的框架后,并添加相应的库;创建配置文件;在终端输入makemenuconfig增加文件系统的内核对yaffs2文件系统的支持;将系统烧录到开发板中。
对于上述的线程池设计模块而言,linux对多线程有很好的支持,使用多线程可以提高程序的响应,更有效的使用多处理器,占用较少的资源来完成复杂的工作,改进多线程技术设计并实现了线程池操作,具体创建三个线程,分别如下:第一个线程为数据采集线程,其主要的功能是将结果数据发送至下一个线程;第二个线程为处理数据线程,其主要的功能为数据解析和数据校验;第三个线程为socket网路通信线程,循环的等待客户端的请求。如有数据到来,则将其发送到pc端。整个处理流程是:tcp服务器3端和tcp客户端连接;将第二个线程处理的数据发送给客户端;进入下一个循环中,继续执行第三个线程的任务;循环接收数据。
循环接收数据代码如下:
while(flag)
{
read(zyq_fd,buffer,count);//接收数据
cur_module=get_current_module();//绑定模式
cur_module->exec_list_lock();
list<exec_unit_t>*exec_list=cur_module->get_exec_list();
if(exec_list->begin()!=exec_list->end()){//查找
iter=exec_list->begin();
tmp=*iter;
exec_list->erase(exec_list->begin());
cur_module->exec_list_unlock();//下一个模式
if(tmp.cb!=null){
tmp.cb(tmp.btn);}}else{
cur_module->exec_list_unlock();
usleep(1000*10);}}//延时
returnnull;}}
在初始化时包含了采集线程和通讯线程,具体为硬件初始化、网络初始化、采集线程以及通讯线程。
线程池核心代码如下:
void*route(void*arg)
{threadpool_t*pool=(threadpool_t*)arg;
inttimeout=0;printf("%#xthreadstarting...\n",(int)pthread_self());
while(1){condition_lock(&pool->ready);timeout=0;
pool->idle++;//等待任务队列有任务到来或线程销毁通知
while(pool->first==null&&pool->quit==0)
{structtimespects;
clock_gettime(clock_realtime,&ts);
ts.tv_sec+=2400;
intret=condition_timedwait(&pool->ready,&ts);
if(ret==etimedout){
printf("%#xthreadtimeout!\n",(int)pthread_self());
timeout=1;break;}}//等待到条件,空闲线程数量减少
pool->idle--;if(pool->first!=null){//从队头取任务进行执行
task_t*t=pool->first;pool->first=t->next;//防止run函数执行的时间太长condition_unlock(&pool->ready);
t->run(t->arg);
condition_lock(&pool->ready);
free(t);}
//等待到线程池销毁通知,并且任务都执行完毕
if(pool->quit==1&&pool->first==null){
pool->counter--;
if(pool->counter==0)
condition_signal(&pool->ready);
//跳出循环之前,要记得解锁
condition_unlock(&pool->ready);break;}
//超时处理
if(timeout==1&&pool->first==null)
{pool->counter--;
condition_unlock(&pool->ready);
break;}
condition_unlock(&pool->ready);}
returnnull;}
voidthreadpool_init(threadpool_t*pool,intthreads)
{condition_init(&pool->ready);
pool->first=null;
pool->last=null;
pool->counter=0;
pool->idle=0;
pool->max_threads=threads;
pool->quit=0;}。
对于上述的环境设计模块,服务器3的开发环境为redhat5,开发工具为vim编辑器。服务器3c程序设计包括套接字配置相关选项、连接请求处理、bind()和listen()函数参数填充、accept()函数参数填充、数据发送。具体设计如下所示:
首先建立套接字配置相关选项,核心代码如下:
ser.sin_family=af_inet;//ipv4设置
ser.sin_port=port;//端口设置
当客户端连接请求到来后,进行相应的处理。核心代码如下:
intres=connect(*ser_fd,(structsockaddr*)&ser,sizeof(ser));//连接请求
填充bind()和listen()函数参数,bind函数会绑定套接字文件描述符。listen()函数会监听端口。核心代码如下:
tcpret=listen(ser_fd,1);//监听端口
当服务器3接收到客户端的连接后,执行accept()函数,循环发送接收数据。核心代码如下:
while(1)
{res=write(fd,tx_buffer,8);}
将接收的数据拼接,并通过网络发送至pc端。核心代码如下:
sprintf(buf,"%d+",voltage_data);//接收数据拼成字符串1
sprintf(buf,"%d+",voltage_data);//接收数据拼成字符串
sprintf(buf1,"%d+",current_data);
sprintf(buf1,"%d+",power_data);接收数据拼成字符串2
sprintf(buf1,"%d+",energy_data);接收数据拼成字符串3
sprintf(buf1,"%d",pf_data);接收数据拼成字符串4
write(ser_fd,buf,strlen(buf));//接收数据拼成字符串发送客户端
对于上述的驱动模块,一个嵌入式系统分为三个空间,分别为硬件空间、内核空间、用户空间、设备驱动程序是用代码来控制硬件设备,实现交互。驱动代码就是对用户空间提供接口函数,对硬件空间直接操作,硬件的使能是依靠驱动程序来完成的,在linux内核中,通过驱动程序来进行和底层硬件的交互,例如初始化、读写等操作。其中也包括了业务逻辑,驱动程序有自己的规则。本系统设计并实现了lcd驱动程序。内核中的lcd驱动采用framebuffer技术实现的,通过视频输出设备从帧缓冲区驱动视频显示设备,显示图像。在驱动lcd的时候由于不能直接操作相应的内存地址,所以需要使用mmap()函数映射一段虚拟空间到用户空间中去,用户空间就可以访问framebuffer设备的内存区域。具体的代码设计流程如下:初始化函数中初始化lcd控制器,设置显示模式和颜色,分配缓冲区,intsize=sizeof(structs3c6410_lcd_regs);填充fb_info结构体,如下所示:
s3c6410_lcd=frambuffer_alloc(0,null);//创建结构体
s3c6410_fd_check_var(t_var,s3c6410_lcd);//增加可变参数
s3c6410_fd_set_par(s3c6410_lcd);//增加固定参数
对lcd寄存器进行适当的控制;如下所示:
write(pro_reg->lcdcon0,s3c6410_lcd_regs->lcdcon0)。
注册和缓冲区的配置,并且分配显卡,显示图像,如下所示:
s3c_lcd->screen_base=dma_alloc_writecombine(null,s3c_lcd->
fix.smem_ken,&s3c_lcd->fix.smem_start,gfp_kernrl);
s3c6410_lcd_regs->lcdsaddr0=(s3c_lcd->fix.smem_start>>1);
s3c6410_lcd_regs->lcdsaddr2=(500*30/15);
lcd启动和关闭设置,如下所示:
s3c6410_lcd_regs->lcdcon0=s3c6410_lcd_regs->lcdcon0|(3<<0);
fb_ops结构体成员,其中fb_ioctl实现了用户到内核的请求,fb_setcolreg实现设置色度。
加载模块;将cfb_fillrect、cfb_copyarea、cfb_imageblit三个文件编译成模块,在驱动加载的时候一起加载。
对于上述的串口设计模块,系统检测参数计算参数如下:总功率、电压、电流、功率因素、二氧化碳浓度、频率、有功总电能与温度,具体如图5所示。依据如下步骤所示:
发送数据:01030048000645de;
接收数据:01030cxxxxxxxxxxxxxxxxxxxxxxxx3f17;
串口发送命令核心代码如下:
抄读数据:
voidread_data(void)
{if((clock.second%2)==1)//2秒读一次
{tx_buffer[0]=read_id;//抄读模块的id号
tx_buffer[1]=0x03;
tx_buffer[2]=0x00;
tx_buffer[3]=0x48;
tx_buffer[4]=0x00;
tx_buffer[5]=0x06;
crcnow.word16=chkcrc(tx_buffer,6);
tx_buffer[6]=crcnow.byte[1];//crc效验低字节在前
tx_buffer[7]=crcnow.byte[0];
send_data(8);//发送8个数据,请根据单片机类型自己编程}
回应数据解析:
voidanalysis_data(void){
unsignedchari;unioncrcdata{
unsignedintword16;unsignedcharbyte[2];}crcnow;
if(comm[1].status==2)//接收完成
{if(rx_buffer[0]==read_id)
//确认id正确
{crcnow.word16=chkcrc(rx_buffer,comm[1].nrx-2);
//comm[1].nrx接长度
if((crcnow.byte[0]==rx_buffer[comm[1].nrx-1])&&(crcnow.byte[1]
==rx_buffer[comm[1].nrx-2]))//crc效验{
//voltage_data=(((rx_buffer[3]))<<8)|rx_buffer[4];
//voltage_data为unsignedint型
current_data=(((unsignedint)(rx_buffer[5]))<<8)|rx_buffer[6];
//current_data为unsignedint型
power_data=(((unsignedint)(rx_buffer[7]))<<8)|rx_buffer[8];
//power_data为unsignedint型
energy_data=(((unsigned
long)(rx_buffer[9]))<<24)|(((rx_buffer[10]))<<16)|
(((rx_buffer[11]))<<8)|rx_buffer[12];
//energy_data为unsignedlong型
pf_data=(((unsignedint)(rx_buffer[13]))<<8)|rx_buffer[14];
//pf_data为unsignedint型}}comm[1].status=0;
//切换回接收数据状态}}
crc校验:
unsignedintchkcrc(unsignedchar*buf,unsignedcharlen){
unsignedcharhi,lo;unsignedinti;unsignedintcrc;crc=0xffff;
for(i=0;i<len;i++){
crc=calccrc(*buf,crc);buf++;}
hi=(crc%256);lo=(crc/256);
crc=(((unsignedint)(hi))<<8)|lo;returncrc;}
unsignedintcalccrc(unsignedcharcrcbuf,unsignedintcrc)
{unsignedchari;
unsignedcharchk;
crc=crc^crcbuf;
for(i=0;i<8;i++){
chk=(unsignedchar)(crc&1);
crc=crc>>1;
crc=crc&0x7fff;
if(chk==1)crc=crc^0xa001;
crc=crc&0xffff;}
returncrc;}。
更进一步地,在某些实施例中,上述的移动终端4包括数据获取模块、预警模块以及第二通信模块;第二通信模块,用于接收数据包;数据获取模块,用于从数据包内读取数据,并对数据进行解析,判断数据是否超过设定峰值,并显示数据;预警模块,用于当数据超过设定峰值时,发送报警信号进行预警通知。
另外,上述的数据获取模块包括数据显示子模块以及解析子模块;解析子模块,用于从数据包内读取数据,并对数据进行解析,判断数据是否超过设定峰值;数据显示子模块,用于显示数据。
当数据到来的时候,首先将数据显示。核心代码如下:
ui->lineedit->settext(*s);//电压
s->remove(s->right(1));
ui->lineedit_2->settext(*s);//电流
s->remove(s->right(1));
ui->lineedit_3->settext(*s);/功率
s->remove(s->right(1));
ui->lineedit_4->settext(*s);/功耗
s->remove(s->right(3));
ui->lineedit_5->settext(*s);//二氧化碳
ui->lineedit_6->settext(*s);//功率因素
qdatetimecurrent_date_time=qdatetime::currentdatetime();//刷新频率
ui->lineedit_7->settext(current_date)。
当点击开始按钮触发on_pushbutton_clicked()槽函数,在槽函数中调用函数会调soltreadfile_database()函数从数据库读取数据,在tcp连接模块连接成功后需把解析处理后的数据存入数据库中,解析处理后的数据由soltreadfile_database()函数暂存,并向数据库进行存储。核心代码如下:
qtimer*timer_zyq=newqtimer(myobject);
connect(timer_zyq,signal(timeout()),myobject,slot(timerdone()));
timer->start(1000,true);//触发定时器
boolok=file->open(qiodevice::readwrite);
qtextstreamin(file);
qstringtext=in.readall();//读取显示
qstring::const_iteratorit=text.begin();//定位到开头位置
qstring*s=newqstring[20];
qcharch=39;
inti=0,count=0;//i表示跳跃行数
staticintn=0;
it+=n;
for(it=it;it!=text.end();it++)
{
if(*it==″||*it=='\t'||*it=='"')
{i++;
continue;}。
上述的移动终端4还包括账户管理模块以及存储模块;账户管理模块,用于观察员登录名以及登录密码的显示、判定处理、对获取的数据包进行数据库信息匹配;存储模块,用于将解析获取的数据进行存储。
移动终端4的程序是在上位机实现,其开发环境为windows10操作系统,开发的工具为qt4.8,qt完整的调试功能,满足了开发所需要条件。对于上述的账户管理模块而言,当用户在文本框中输入登录名和密码能够被获取到,然后交给判定函数去判断。采用变量name用户名pwd密码用来接收和存储观察员的用户名和密码;当获取到输入的信息为空的时候会输出错误提示信息,判空操作是使用函数isempty()函数进行判断的;当成功获取了登录者输入的信息,需要和数据库存入的数据进行匹配,成功则正常登录,否则,失败登录。
更进一步地,在某些实施例中,上述的移动终端4还包括数据库连接模块以及tcp连接模块;具体的,数据库采用odbc的方式进行连接,数据库连接模块的连接判断参数如下:主机ip为127.0.0.1;数据库的名字为sa;密码为1;端口为1433;database为sql20050。在连接之前会进行相应的设置,具体设置如下:p地址设置的函数为sethostname();数据库名设定的函数为setusername();端口设定的函数为setport();数据库登录密码设定的函数为setpassword();数据库名设定的函数为etdatabasename()。当ip地址、数据库名、数据的登录名、密码、数据库名字匹配成功的时候,odbc数据就会连接到指定的数据中。对于上述的tcp连接模块而言,包括连接界面设计子模块以及连接成功处理子模块,其中,连接界面是对服务器3地址和端口的显现,方便观察员查看并且进行相应的处理操作。其核心代码如下:
this->setwindowtitle(tr("ipadreelink"))。
上述的连接成功处理子模块而言,在接收到服务器3的连接请求后,客户端会进行连接,当成功连接后,会进行相应的处理。连接tcp服务器3端所做的步骤为:初始化tcp_link为0、取消已有的连接、通过connecttohost()函数连接用户输入的端口和ip地址、触发readmessage()函数对服务器3的数据进行读取和解析。核心代码如下:
strcpy(carbon_dioxide,strstr(bocksize,"+"));
tcp_bocksize[len-strlen(carbon_dioxide)]=0;
strcpy(carbon_dioxide,strstr(bocksize,"z"));//得到二氧化碳浓度
tcp_bocksize[len-strlen(carbon_dioxide)]=0;
strcpy(user_power,strstr(bocksize,"y"));得到功率
tcp_bocksize[len-strlen(power)]=0;
strcpy(electricity,strstr(bocksize,"x"));//得到电流
tcp_bocksize[len-strlen(electricity)]=0;
voltage=tcp_bocksize;//得到电压
本系统采用的是c/s模型,此类模型是目前应用较为广泛的模型。通过在同一局域网内在pc端处理大量的数据,完成后再交给服务器3去处理。减轻了服务器3的压力,使得服务器3有更多的时间去处理网络传输。简而言之,c/s模型能够很好的平衡服务器3和客户端的传输能力。c/s模型在局域网中是比较有优势的,访问的速度较快。但是远程访问采用这种模式的话是不可取的。例如,移动设备访问过程中,因为本身的操作系统可能不一样,兼容性不是很好。同样的,后期的维护也比较困难。
本系统在开发移动终端4的时候主要用到的是qt编程技术,进行界面的搭建以及数据的上传与下载,移动终端4在windows上开发,服务器3在linux上开发,qt跨平台性很好的解决了两者因为不同语言而出现的矛盾。除此以外,qt的图形化界面很好的解决了本系统在移动终端4的显示需求。其完整的调试功能,满足了开发所需要的条件。
本系统使用了socket网络通信技术,这个技术在服务器3和移动终端4的交互中采用,socket网络通信技术应用的是tcp/ip协议。tcp/ip协议的工作过程为:tcp/ip协议顺序传输多个数据包,在发送数据的时候在传输层、网络层、数据链路层,分别加上各自的协议头。在接收数据的时候在数据链路层,网络层,传输层分别去掉本层的协议头,这样到用户层就只剩下数据部分。
本系统还实用modbus协议进行通信,modbus协议在一根通讯线上采用主从应答方式的通信连接方式。首先,主计算机的信号寻址到一台唯一地址的终端设备,终端设备发出的应答信号以相反的方向传输给主机。在一根单独的通信线上信号沿着相反的两个方向传输所有的通信数据流。modbus协议只允许在主机和终端设备之间通讯,而不允许独立的终端设备之间的数据交换,这样各终端设备不会在它们初始化时占据通讯线路,而仅限于响应到达本机的查询信号。
如图6所示,用电监测系统的功能设计分为四层,其中数据采集层(采集单元1)通过modbus通信协议进行通信、采集数据,数据通信层采用socket建立s3c6410服务器3和移动终端4的通讯连接并进行网络通信将采集层采集的数据通过以太网发送至pc端,用户层的功能是显示接收到的数据并报警。
另外,用电信息的采集、校验、处理、通信等功能,以图形化的方式呈现服务器3发送来的用电参数数据,通过数据分析做出相应的预警处理,实现对用电安全的智能化监测。
上述的用电监测系统,通过服务器3接收采集单元1采集的电压、电流、功率、二氧化碳浓度、温度参数数据,解析数据、封装数据、通过以太网将采集的数据发送给移动终端4,移动终端4接收到数据进行相应的处理,根据电压、电流等传感器的参数变化,当数据超过设定峰值时,则进行相应的预警,可以了解用电的情况;数据显示在移动终端4的界面,达到对相关设备的监测和控制;实现用电监测过程中的低功耗、性能高、成本低以及自动化的效果。
如图7所示,本实施例还提供了用电监测方法,该方法包括:
s1、服务器3连接采集单元1,采集单元1获取初始数据,并对初始数据进行转换,获取用电数据;
s2、服务器3对用电数据进行解析和封装处理后,形成数据包并发送;
s3、构建网络拓扑关系,并将网络拓扑关系中的网关组织设备互连;
s3、移动终端4接收数据包,针对数据包进行处理,并设定相应的峰值,当数据包内的数据超过设定峰值时,则进行预警,并显示用电数据。
上述的s1步骤,服务器3连接采集单元1,采集单元1获取初始数据,并对初始数据进行转换,获取用电数据的步骤中,所述初始数据包括电压、电流、功率、二氧化碳浓度以及温度中至少一个数据。
对于上述的s2步骤,在进行之前,还需要进行一些准备工作,通常在第一次安装内核与根文件系统的时候使用下载模式,下载模式局限性高,要求目标机器必须有串口或者可以下载的端口。bootloader启动的第二种方式是flash启动方式,这是目前通用的方式,将要启动的bootloader是存储在flash芯片上,在flash芯片的低端或者顶端存放bootloader,这种方式方便、局限性小。bootloader在启动的时候会对中断、串口、cpu、存储器进行相应的初始化。当初始化到网络设备的时候,开始循环读取串口信息,并在终端将信息打印出来,也会读取串口的命令,进行相应的写操作。整个的linux系统中,首先是启动bootloader,接下来是linux内核,最后是根文件系统,在bootloader启动时初始化相关操作,在linux内核阶段,相应系统服务以及内核驱动程序会被启动。linux系统是操作文件的,操做过程需要文件系统,也就是说,linux系统是离不开文件系统,linux启动时,第一个必须挂载的是根文件系统,若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动,成功之后可以自动或手动挂载其他的文件系统,根文件系统制作的流程为制作根文件系统、准备环境、编译busybox、建立文件结构框图以及创建配置文件;制作根文件系统设计使用busybox工具,操作流程如下:编译busybox得到系统使用的常用命令;下载yaffs2源代码;在环境准备时候建立一个目录存放生成的文件,编译busybox,构建出bin、sbin、usr目录,建立文件的框架后,并添加相应的库;创建配置文件;在终端输入makemenuconfig增加文件系统的内核对yaffs2文件系统的支持;将系统烧录到开发板中。
对于上述的线程池设计模块而言,linux对多线程有很好的支持,使用多线程可以提高程序的响应,更有效的使用多处理器,占用较少的资源来完成复杂的工作,改进多线程技术设计并实现了线程池操作,具体创建三个线程,分别如下:第一个线程为数据采集线程,其主要的功能是将结果数据发送至下一个线程;第二个线程为处理数据线程,其主要的功能为数据解析和数据校验;第三个线程为socket网路通信线程,循环的等待客户端的请求。如有数据到来,则将其发送到pc端。整个处理流程是:tcp服务器3端和tcp客户端连接;将第二个线程处理的数据发送给客户端;进入下一个循环中,继续执行第三个线程的任务;循环接收数据。在初始化时包含了采集线程和通讯线程,具体为硬件初始化、网络初始化、采集线程以及通讯线程。服务器3的开发环境为redhat5,开发工具为vim编辑器。服务器3c程序设计包括套接字配置相关选项、连接请求处理、bind()和listen()函数参数填充、accept()函数参数填充、数据发送。当服务器3接收到客户端的连接后,执行accept()函数,循环发送接收数据。
还需要进行服务器3的驱动设计,包括初始化函数中初始化lcd控制器,设置显示模式和颜色,分配缓冲区,intsize=sizeof(structs3c6410_lcd_regs);填充fb_info结构体;对lcd寄存器进行适当的控制;注册和缓冲区的配置,并且分配显卡,显示图像;lcd启动和关闭设置;fb_ops结构体成员;加载模块;将cfb_fillrect、cfb_copyarea、cfb_imageblit三个文件编译成模块,在驱动加载的时候一起加载。
对于上述的s3步骤,主要是为了将服务器3、移动终端4、转换单元2以及采集单元1通过网络连接,建立节能云平台,进行用电的监测。
更进一步地,在某些实施例中,上述的s4步骤,移动终端4接收数据包,针对数据包进行处理,并设定相应的峰值,当数据包内的数据超过设定峰值时,则进行预警,并显示用电数据的步骤中,具体是采用on_pushbutton_clicked()槽函数,在槽函数中采用soltreadfile_database()调用函数从数据库读取数据,对数据进行解析处理后,将数据由soltreadfile_database()函数暂存,并向数据库进行存储。
在s4步骤进行之前,还需要进行账户的处理,用户在文本框中输入登录名和密码能够被获取到,然后交给判定函数去判断。采用变量name用户名pwd密码用来接收和存储观察员的用户名和密码;当获取到输入的信息为空的时候会输出错误提示信息,判空操作是使用函数isempty()函数进行判断的;当成功获取了登录者输入的信息,需要和数据库存入的数据进行匹配,成功则正常登录,否则,失败登录。
此外,还需要对移动终端4与数据库的连接,数据库采用odbc的方式进行连接,数据库连接模块的连接判断参数如下:主机ip为127.0.0.1;数据库的名字为sa;密码为1;端口为1433;database为sql20050。在连接之前会进行相应的设置,具体设置如下:p地址设置的函数为sethostname();数据库名设定的函数为setusername();端口设定的函数为setport();数据库登录密码设定的函数为setpassword();数据库名设定的函数为etdatabasename()。当ip地址、数据库名、数据的登录名、密码、数据库名字匹配成功的时候,odbc数据就会连接到指定的数据中。对于上述的tcp连接模块而言,包括连接界面设计子模块以及连接成功处理子模块,其中,连接界面是对服务器3地址和端口的显现,方便观察员查看并且进行相应的处理操作。
在接收到服务器3的连接请求后,客户端会进行连接,当成功连接后,会进行相应的处理。连接tcp服务器3端所做的步骤为:初始化tcp_link为0、取消已有的连接、通过connecttohost()函数连接用户输入的端口和ip地址、触发readmessage()函数对服务器3的数据进行读取和解析。
上述的用电监测方法,通过服务器3接收采集单元1采集的电压、电流、功率、二氧化碳浓度、温度参数数据,解析数据、封装数据、通过以太网将采集的数据发送给移动终端4,移动终端4接收到数据进行相应的处理,根据电压、电流等传感器的参数变化,当数据超过设定峰值时,则进行相应的预警,可以了解用电的情况;数据显示在移动终端4的界面,达到对相关设备的监测和控制;实现用电监测过程中的低功耗、性能高、成本低以及自动化的效果。
上述仅以实施例来进一步说明本发明的技术内容,以便于读者更容易理解,但不代表本发明的实施方式仅限于此,任何依本发明所做的技术延伸或再创造,均受本发明的保护。本发明的保护范围以权利要求书为准。