项目十 基于WSN技术的智能仓储环境监测与智能控制系统设计与实现总结.docx
《项目十 基于WSN技术的智能仓储环境监测与智能控制系统设计与实现总结.docx》由会员分享,可在线阅读,更多相关《项目十 基于WSN技术的智能仓储环境监测与智能控制系统设计与实现总结.docx(103页珍藏版)》请在冰豆网上搜索。
项目十基于WSN技术的智能仓储环境监测与智能控制系统设计与实现总结
项目十基于WSN技术的智能仓储环境监测与智能控制系统设计与实现
一、教学目标
1、掌握WSN网关通信的相关应用。
2、掌握WSN实现了信息的采集、信息传输和信息处理模式。
3、掌握WSN实现仓储环境监控智能化技术方法。
二、教学内容
10.1设备简介
10.1.1WSN网关
图10-1WSN网关图
供电电源:
DC5V,信号获取接口:
USB,上位机通信接口:
以太网口,操作系统:
Linux。
网关通过USB与协调器连接,并通过协调器与各Zigbee节点进行信号通讯。
10.1.2协调器
图10-2协调器图
供电方式:
USB供电。
该设备为网关与各传感器节点的中继,负责转发Zigbee信号。
10.1.3温湿度传感器模块
图10-3温湿度传感模块图
供电方式:
DC5V,通讯协议:
Zigbee。
集成模块:
温湿度传感器。
该节点可采集温湿度数据,并通过Zigbee协议传输到网关,上位机通过访问网关获取温湿度数据。
10.1.4电磁继电器模块
图10-4电磁继电器模块图
供电方式:
DC5V,继电器控制路数:
4路,与网关通信协议:
Zigbee。
该继电器可控制四路电源,在京胜世纪的实验台中,控制了两路灯光、一路风扇和一路电磁门。
10.2类的设计与实现
在本部分实训中我们要用到数据库来存储当前各个节点的信息,以面向对象的思想为例,我们需要先编写几对数据库操作的基础类和将节点信息保存的对象类。
10.2.1DBConnection.cs类
这个类文件是要对数据库进行连接操作,登录到本地的数据库。
引用命名空间。
该命名空间是SQLServer .NET数据提供者,是SQLServer专用的内置.NET提供者,引用该命名空间后就可以获得最好的性能和对基础功能的最直接访问。
usingSystem.Data.SqlClient;
添加变量
privatestringstr;
privateSqlCommandsqlcom;
privateSqlConnectionconn;
在构造函数中写入连接数据库方法
///
///连接数据库的方法
///
publicDBConnection()
{
//定义了要连接的数据库的位置,数据库的名称,登录帐号和密码
this.str="Server=localhost;DataBase=SmartShelfD;uid=sa;pwd=123";
this.conn=newSqlConnection(str);
this.sqlcom=newSqlCommand();
this.sqlcom.Connection=this.conn;
this.conn.Open();
}
上边定义了两个全局变量,分变是字符型str,变量量为数据库连接字符串内容:
Server表示正在访问的数据库服务器名称,其格式是“计算机名\实例名”,如果是本地的数据库服务器并且使用的是SQLServer的默认实例名,则可以使用(Local)或.来表示。
DataBase表示数据库名称,即该项目所要连接的数据库名;Uid表示数据库服务器的登录名称;Pwd表示数据库服务器的密码。
返回数据连接方法
///
///返回数据连接方法
///
///
publicSqlConnectionGetConnection()
{
returnthis.conn;
}
10.2.2DBOperate.cs类
该类的作用是对程序中的要用到的对数据库的操作进行统一,涉及到对数据库的操作时,如对数据库的增删改操作,都可以直接调用该类,相应的方法。
传入相应的参数即可。
添加引用
usingSystem.Data.SqlClient;
usingSystem.Data;
定义变量
SqlCommandsqlcom;
SqlConnectionconn;
默认构造方法
///
///构造函数
///
///
publicDBOperate(DBConnectiondbc)
{
sqlcom=newSqlCommand();
sqlcom.Connection=dbc.GetConnection();
}
编写执行方法
///
///执行sql语句
///
///
publicvoidExecuteSQL(stringsql)
{
this.sqlcom.CommandText=sql;
try
{
this.sqlcom.ExecuteNonQuery();
}
catch{}
}
///
///获取数据表格的方法
///
///
///sql语句
publicDataTableGetDataTable(stringsql)
{
this.sqlcom.CommandText=sql;
SqlDataAdaptersda=newSqlDataAdapter(this.sqlcom);
DataSetds=newDataSet();
DataTabledt=newDataTable();
try
{
sda.Fill(ds);
dt=ds.Tables[0];
}
catch{}
returndt;
}
///
///执行SQL语句,获取string类型数据
///
///SQL语句
///获取到的string类型数据
publicstringGetString(stringsql)
{
stringresultStr="";
this.sqlcom.CommandText=sql;
try
{
resultStr=this.sqlcom.ExecuteScalar().ToString();
}
catch(SqlExceptione)
{}
finally
{
this.sqlcom.Dispose();
}
returnresultStr;
}
publicintGetInt(stringsql)
{
intresultInt=0;
this.sqlcom.CommandText=sql;
try
{
resultInt=Convert.ToInt32(this.sqlcom.ExecuteScalar().ToString());
}
catch(SqlExceptione)
{
System.Windows.Forms.MessageBox.Show(e.Message);
}
finally
{
this.sqlcom.Dispose();
}
returnresultInt;
}
本资源是基于SQLServer开发的,所以可以使用using指令可以引用SQLServer专用的.NET数据库提供者:
usingSystem.Data.SqlClient;
提取数据库中数据的4步:
1)连接数据源
2)打开连接
3)发出一个SQL查询命令
4)执行命令语句
SqlConnection是一个用于SQL.NET数据提供者的连接对象名称,表示SQLServer数据库的一个打开的连接。
SqlConnection对象表示与SQLServer数据源的一个唯一的会话。
对于客户端/服务器数据库系统,它等效于到服务器的网络连接。
SqlConnection与SqlDataAdapter和SqlCommand一起使用,可以在连接MicrosoftSQLServer数据库时提高性能。
"Server=localhost;DataBase=AccessControl;uid=sa;pwd=123"
Server=localost,表示正在访问的SQLServer名称,其格式是“计算机名\实例名”。
计算机名(localhost)是一个非常方便的SQLServer简短名称,它表示运行在当前机器上的服务器实例。
DataBase=AccessControl,指定数据库的名称。
uid=sa;pwd=123,表示登录数据库的用户名和密码,这是SQLServer和Windows的标准内置安全。
this.conn.Open();打开数据库的连接。
CommandText属性获取或设置要对数据源执行的SQL语句或存储过程。
ExecuteNonQuery()方法,对连接执行SQL语句并返回受影响的行数。
SqlDataAdapter类表示用于填充DataSet和更新SQLServer数据库的一组数据命令和一个数据库连接。
SqlDataAdapter是DataSet和SQLServer之间的桥接器,用于检索和保存数据。
DataSet是ADO.NET结构的主要组件,它是从数据源中检索到的数据在内存中的缓存。
DataSet由一组DataTable对象组成。
try-catch语句由一个try块后跟一个或多个catch子句构成,这些子句指定不同的异常处理程序。
try块包含可能导致异常的保护代码。
该块一直执行到引发异常或成功完成为止。
例如,下列强制转换null对象的尝试引发NullReferenceException异常:
objecto2=null;
try
{
inti2=(int)o2;//错误
}
10.2.3ObjCargoNode.cs类
该类是对节点信息与数据库中的进行操作进行的修改。
节点加入网络后,段地址会存储到数据库中。
对当前节点的识别也需要读取数据库中已输入的节点信息。
添加命名空间
usingSystem.Data;
定义变量
privateintcargo;
privatestringiEEEAddress;
privatestringshortAddress;
privateintnodeType;
构造函数
publicObjCargoNode()
{
}
publicObjCargoNode(intcargo)
{
this.cargo=cargo;
DataTabledtb=Program.dbo.GetDataTable(string.Format("selectCargo,IEEEAddress,ShortAddress,NodeTypefromCargoNodewhereCargo='{0}'",this.cargo));
DataRowrow=dtb.Rows[0];
this.cargo=Convert.ToInt32(row["Cargo"].ToString());
this.iEEEAddress=row["IEEEAddress"].ToString();
this.shortAddress=row["ShortAddress"].ToString();
this.nodeType=Convert.ToInt32(row["NodeType"].ToString());
}
属性
publicintCargo
{
get
{
returnthis.cargo;
}
}
publicstringIEEEAddress
{
get
{
returnthis.iEEEAddress;
}
}
publicstringShortAddress
{
get
{
returnthis.shortAddress;
}
set
{
this.shortAddress=value;
}
}
publicintNodeType
{
get
{
returnthis.nodeType;
}
}
方法
publicvoidInsert()
{
Program.dbo.ExecuteSQL(string.Format("updateCargoNodesetShortAddress='{0}'whereIEEEAddress='{1}'",this.shortAddress,this.iEEEAddress));
}
10.3功能设计与实现
该部分实训内容主要是通过程序和wsn的网关进行通信,这里我们需要学习关于wsn网关通信的相关应用。
该模块程序中的代码,在后面会分解出来应用。
向窗体中添加一个TabControl控件,在TabPages属性添加6个成员。
控件
Name属性
Text属性
UseVisualStyleBackColor属性
TabPage
tpConnect
建立连接
True
TabPage
tpPing
Ping指令
True
TabPage
tpConfigRead
Config_Read指令
True
TabPage
tpConfigWrite
Config_Write指令
True
TabPage
tpSensorRead
Sensor_Read指令
True
TabPage
tpSensorWrite
Sensor_Write指令
True
10.3.1创建建立连接
1、建立连接TabPage窗体属性,窗体如图10-5所示。
图10-5Zigbee节点连接实验图
向窗体添加1个SplitContainer控件,2个GroudBox控件,8个Label控件,9个TextBox控件,4个Button控件。
更改窗体和控件属性:
2、设置窗体属性
窗体
StartPosition属性
MaximizeBox属性
MinimizeBox属性
FormBorderStyle属性
Text属性
frmGoodsOut
CenterParent
False
False
FixedSingle
Zigbee节点连接实验
3、设置Lable控件属性
控件
Name属性
Text属性
T1通道Socket
Lable
lblIPAddressT1
IP地址
Lable
lblPortT1
端口号
Lable
lblAppIDT1
AppID
Lable
lblPasswordT1
Password
T2通道Socket
Lable
lblIPAddressT2
IP地址
Lable
lblPortT2
端口号
Lable
lblAppIDT2
AppID
Lable
lblPasswordT2
Password
4、设置TextBox属性
控件
Name属性
Text属性
TextBox
txtIPAddressT1
192.168.1.230
TextBox
txtPortT1
4000
TextBox
txtAppIDT1
1001
TextBox
txtPasswordT1
Kingvc@zigvine
TextBox
txtIPAddressT2
192.168.1.230
TextBox
txtPortT2
4000
TextBox
txtAppIDT2
1001
TextBox
txtPasswordT2
Kingvc@zigvine
5、设置显示信息内容的TextBox属性
控件
Name属性
Dock属性
Multiline属性
ReadOnle属性
ScorllBars属性
TextBox
txtMessageConnect
Fill
True
True
Vertical
6、设置GroupBox控件属性
控件
Name属性
Text属性
GroupBox
gbSocket_T1
T1通道Socket
GroupBox
gbSocket_T2
T2通道Socket
7、设置Button按钮事件
控件
Name属性
Text属性
UseVisualStyleBackColor属性
Button
btnConnectSocketT1
SocketT1连接
True
Button
btnConnectT1
T1通道连接
True
Button
btnConnectSocketT2
SocketT2连接
True
Button
btnConnectT2
T2通道连接
True
8、窗体后台代码:
1)定义变量
//定义一个函数结构的委托
privatedelegatevoidShowMessageDel(TextBoxtxt,stringmsg);
privatedelegatevoidShowMessageDelOfTempLabel(Labellbl,stringvalue);
//实例化T1数据包消息类
privateGRIP_MessagemessageT1=newGRIP_Message();
//实例化T2数据包消息类
privateGRIP_MessagemessageT2=newGRIP_Message();
//定义T1Socket通讯接口
privateSocketsocketT1;
//定义T2Socket通讯接口
privateSocketsocketT2;
//定义T1通道流水号
privateUInt16sequenceIDT1;
//定义T2通道流水号
privateUInt16sequenceIDT2;
privateinttime;
//定义一个线程
privateThreadthread;
//sessionID为连接后网关随机分配的一个标识ID
privatestringsessionID="";
2)构造函数
///
///构造函数
///
publicfrmZigBee()
{
InitializeComponent();
}
3)编写方法
Socket发送消息方法
///
///Socket发送消息方法
///
///要发送的字节数组
///Socket实例
///已发送的长度
privatevoidSendMsg(byte[]msgSend,Socketsocket,intlenSend)
{
//需对发送的字节长度有明确认识,发送一段字节后需要加上该段字节的长度
while(lenSend{
lenSend+=socket.Send(msgSend,lenSend,msgSend.Length-lenSend,SocketFlags.None);
}
}
Socket接收信息的方法
///
///Socket接收消息方法
///
///要接收的字节数组
///Socket实例
///已接收的长度
privatevoidRecvMsg(byte[]msgRecv,Socketsocket,intlenRecv)
{
while(lenRecv{
lenRecv+=socket.Receive(msgRecv,lenRecv,msgRecv.Length-lenRecv,SocketFlags.None);
}
}
在控件中显示信息的方法
//
///在控件中显示消息的方法
///
///
///
privatevoidShowMessage(TextBoxtxt,stringmsg)
{
if(txt.InvokeRequired)
{
ShowMessageDelsmd=newShowMessageDel(ShowMessage);
txt.Invoke(smd,txt,msg);
}
else
{
txt.Text+="\r\n【"+DateTime.Now.ToString("yyyy-MM-ddhh-mm-ss")+"】"+msg;
}
}
在Label控件中显示消息的方法
///
///在Label控件中显示消息的方法
///
///控件名称
///要显示的值
privatevoidShowTempValue(Labellbl,stringvalue)
{
if(lbl.InvokeRequired)
{
ShowMessageDelOfTempLabelsmd=newShowMessageDelOfTempLabel(ShowTempValue);
lbl.Invoke(smd,lbl,value);
}
else
{
lbl.Text=value;
}
}
线程方法
///