基于Internet网络架构的无线传感器网络系统日期:2016-08-01 13:08:32 摘要: 由MD600G和无线传感器节点组成了基于Internet网络架构的无线传感器网络系统,实现了远程分布节点的过程行为实时数据跟踪和实时数据库生成。本系统不仅具有低功耗、低成本、分布式和自组织的特点,而且还实现了通信信息的无线透明传输和基于Internet可视化动态数据显示等功能。
引言 随着微机电系统(MicroElectroMechanism System, MEMS)、片上系统(System Networks, WSN)也以其低功耗、低成本、分布式和自组织等特点带来了信息感知的一场变革。无线传感器网络由部署在监测区域内大量的廉价微型传感器节点组成,通过无线通信方式形成一个多跳的自组织网络。 无线传感器网络可连接众多类型的传感器,可探测包括地震波、电磁场、温度、湿度、噪声、光强度、压力、土壤成分、移动物体的大小和速度等。基于MEMS的微传感技术和无线互联网技术为无线传感器网络赋予了广阔的应用前景,在航空、反恐、防爆、救灾、环境、医疗、保健、家居、工业、商业等领域有广泛的应用。本文以无线温度传感器节点和无线数据终端MD600G为例,介绍了基于MD600G的Internet无线传感器网络的设计,并给出了对温度数据的可视化处理等操作的实现。 1 基于Internet的无线传感器网原理 1.1 MD600G简介 智能无线数据终端MD600G可以用于数据中心和被监控设备间,实现数据的远程透明传输。MD600G的内部结构如图1所示,它有如下特点: ①基于ARM平台、8 MB数据缓存,内置Siemens MC35i GPRS无线模块; ②嵌入式Linux系统,包含TCP/IP协议栈以及ETCPTM协议,保证传输数据不丢失; ③提供独立RS232配置串口及标准RS232/485数据接口; ④符合电工电子产品低温GB/T2423.1、高温GB/T2423.2的要求,适于在气候条件恶劣的地区及户外使用; ⑤可以快速连接RTU、PLC、工控机等设备,实现数据透明传输,广泛应用于电力抄表、配电自动化、路灯监控、道路交通等行业。
图1 MD600G硬件结构图 1.2 无线传感器网络 由MD600G组成的基于Internet无线传感器网络原理图如图2所示。 无线传感器网络结构原理图 用户设备是自行开发的温度传感器节点。传感器节点采样的数据通过RS232/485接口传送到智能无线数据终端MD600G,MD600G对接收到的数据通过GPRS与Internet连接并进行无线数据透明传送,服务器mSever端通过Internet网将接收到的数据生成实时数据库,同时将这些实时数据以WEB页的形式动态显示和跟踪。 1.3 温度传感器节点 温度传感器节点模块主要由温度传感器DS18B20组成,并将其输出的温度数据送往单片机,然后单片机将这些数据进行相关处理,最后再送往后续的通信设备,并将温度数据进行数码管或液晶屏显示。这里采用了实时时钟电路DS1302来实现该系统的实时性。 2 软件设计 基于MD600G和Internet的无线传感器网的软件包括温度传感器节点的软件设计、MD600G与温度传感器节点的串口软件设计、服务器mSever端与Internet网的数据通信软件及mSever端温度数据可视化程序的设计等。 2.1 mSever端温度数据可视化程序设计 利用Visual C++强大的编译器以及网络与数据库的处理能力,开发出基于Windows平台的32位数据可视化应用程序。图3是mSever端温度数据可视化程序设计的原理图。 可视化界面的设计原理图 以下为可视化界面模块源码: void CDemoView::OnInitialUpdate() { CView::OnInitialUpdate(); CRect Rect; GetClientRect(Rect); m_Plot.Create(WS_CHILD|WS_VISIBLE,Rect,this,12000); m_Plot.SetSerie(0, PS_SOLID, RGB(255,0,0), 0.0, 40.0, "Temperature");//窗口 m_Plot.SetLegend(0, PS_SOLID, RGB(255,0,0), "Temperature");//背景方框 m_Plot.m_bAutoScrollX=TRUE; SetTimer(1,1000,NULL);//背景刷新时间 canSize=TRUE; } void CDemoView::OnTimer(UINT nIDEvent) { static BOOL pros={FALSE}; if(!pros) { pros=TRUE; CDemoDoc pDoc=GetDocument(); ASSERT_VALID(pDoc); y=pDoc->p.buffer; m_Plot.AddPoint(0,CTime::GetCurrentTime(),y); Invalidate(); pros=FALSE; } CView::OnTimer(nIDEvent); } void CDemoView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); if(canSize) { CRect Rect; GetClientRect(Rect); m_Plot.MoveWindow(Rect); } } void CDASocket::OnReceive(int ERRORCode) { //接收数据端的程序 char buff[64]; int ret=0; ret=Receive(buff,64);//AfxMessageBox("OK"); if(ret==ERROR) {TRACE("ERROR!");} else m_pDoc->Presscessding(buff); CAsyncSocket::OnReceive(nErrorCode); } 用Visual C++开发的mSever端温度数据可视化显示的界面,图中显示的是1个节点的温度变化实时曲线。
服务器mSever端温度数据可视化显示界面 2.2 mSever端Web访问程序设计 为了实现多个客户端可以同时访问数据中心服务器,规定客户端在打开服务器的Web页面时,首先提交客户端的IP地址,然后服务器端把客户端的IP地址收录入库,再将接收到的温度数据转发给指定的客户端。因此,当有多个客户端同时访问数据中心服务器时,服务器端只需要将各个客户端的IP地址收录入库,最后再循环不断地往各个客户端转发温度数据即可。 当客户端断开与服务器端的连接时,将向服务器提交断开请求,从服务器端的IP地址库中释放掉该客户端的IP地址,从而实现了服务器端IP地址库的动态更新。 2.3 节点温度采集软件设计 以下为温度传感器节点的温度采集部分代码: #include "Mini51B.h"//Mini51板头文件 #include "LCD1602.h"//液晶模块头文件 #include "ds18b20.h"//温度传感器头文件 #include "stdio.h"//C标准函数库,系统集成 #include "DS1302.h" #define uchar unsigned char uchar n,temp; uchar a[6]="000000"; //串口字符串 SYSTEMTIME RTC; void main(void) { float V; //记录温度浮点型 uchar str_buff[20];//字符缓冲区 SCON=0x50;//串口工作在方式1,波特率9600,//晶振为22.1184 MHz PCON=0; TMOD=0x20;//定时器1工作在方式2 TH1=0xfa; TL1=0xfa; IE=0x91;//1001 0001,EA=1,ES=1,EX0=1 IT0=1;//外部中断0为低电平触发方式 TR1=1;//定时器T1开始计数 ds18b20_init();//初始化温度传感器时钟测试 Initial_DS1302();//初始化时钟时间设定,执行一次后删除该部分 Write1302(DS1302_MINUTE, 0x11); Write1302(DS1302_HOUR,0x08); Write1302(DS1302_DAY,0x15); Write1302(DS1302_MONTH,0x04); Write1302(DS1302_YEAR,0x08); lcd1602_init(); lcd_put_xyns(2,1,14,"<>"); delay_ms(1000); while(1) { for(n=0;n<10;n++) { //100.5 s=5 s数据发送周期 V=ReadTemperature()/100.0; //温度部分 sprintf(str_buff,"%2.2f",V); //格式转换 lcd_put_xyns(1,1,11,"Temperatur="); lcd_put_xyns(12,1,5,str_buff); seg7_disp(V100); sprintf(a,"%2.2f",V);//送串口字符串 DS1302_GetTime(&RTC);//时间部分 DateToStr(&RTC); TimeToStr(&RTC); lcd_put_xyns(1,2,8,RTC.DateString); lcd_put_xyns(9,2,8,RTC.TimeString); delay_ms(500); } for(n=0;n<6;n++) { SBUF=a[n]; while(!TI); TI=0; } } } void external0() interrupt 0{//外部中断0发送数据 for(n=0;n<6;n++) { SBUF=a[n]; while(!TI); TI=0; } delay_ms(1100); } void receving() interrupt 4 {//串口中断程序接收数据 temp=SBUF; RI=0; } |