版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
WSN技術(shù)的智能倉儲環(huán)境監(jiān)測與智能控制系統(tǒng)設(shè)計(jì)
與實(shí)
一、教學(xué)目標(biāo)
1、掌握WSN網(wǎng)關(guān)通信的有關(guān)應(yīng)用。
2、掌握WSN實(shí)現(xiàn)了信息的采集、信息傳輸與信息處理模式。
3、掌握WSN實(shí)現(xiàn)倉儲環(huán)境監(jiān)控智能化技術(shù)方法。
二、教學(xué)內(nèi)容
10.1設(shè)備簡介
10.1.1WSN網(wǎng)關(guān)
圖10-1WSN網(wǎng)關(guān)圖
供電電源:DC5V,信號獲取接口:USB,上位機(jī)通信接口:以太網(wǎng)口,操作系統(tǒng):Linux?
網(wǎng)關(guān)通過USB與協(xié)調(diào)器連接,并通過協(xié)調(diào)器與各Zigbee節(jié)點(diǎn)進(jìn)行信號通訊。
10.1.2協(xié)調(diào)器
圖10-2協(xié)調(diào)器圖
供電方式:USB供電。該設(shè)備為網(wǎng)關(guān)與各傳感器節(jié)點(diǎn)的中繼,負(fù)責(zé)轉(zhuǎn)發(fā)Zigbee信號。
10.1.3溫濕度傳感器模塊
圖10-3溫濕度傳感模塊圖
供電方式:DC5V,通訊協(xié)議:Zigbee。集成模塊:溫濕度傳感器。
該節(jié)點(diǎn)可采集溫濕度數(shù)據(jù),并通過Zigbee協(xié)議傳輸?shù)骄W(wǎng)關(guān),上位機(jī)通過訪問網(wǎng)關(guān)獲取
溫濕度數(shù)據(jù)。
10.1.4電磁繼電器模塊
圖10-4電磁繼電器模塊圖
供電方式:DC5V,繼電器操縱路數(shù):4路,與網(wǎng)關(guān)通信協(xié)議:Zigbee。
該繼電器可操縱四路電源,在京勝世紀(jì)的實(shí)驗(yàn)臺中,操縱了兩路燈光、一路風(fēng)扇與一路
電磁門。
10.2類的設(shè)計(jì)與實(shí)現(xiàn)
在本部分實(shí)訓(xùn)中我們要用到數(shù)據(jù)庫來存儲當(dāng)前各個(gè)節(jié)點(diǎn)的信息,以面向?qū)ο蟮乃枷霝槔?
我們需要先編寫幾對數(shù)據(jù)庫操作的基礎(chǔ)類與將節(jié)點(diǎn)信息儲存的對象類。
10.2.1DBConnection.cs類
這個(gè)類文件是要對數(shù)據(jù)庫進(jìn)行連接操作,登錄到本地的數(shù)據(jù)庫。
引用命名空間。該命名空間是SQLServer.NET數(shù)據(jù)提供者,是SQLServer專用的內(nèi)置.NET
提供者,引用該命名空間后就能夠獲得最好的性能與對基礎(chǔ)功能的最直接訪問。
usingSystem.Data.SqlClient;
添加變量
privatestringstr;
privateSqlCommandsqlcom;
privateSqlConnectionconn;
在構(gòu)造函數(shù)中寫入連接數(shù)據(jù)庫方法
///<summary>
///連接數(shù)據(jù)庫的方法
///</summary>
publicDBConnection()
{
〃定義了要連接的數(shù)據(jù)庫的位置,數(shù)據(jù)庫的名稱,登錄帳號與密碼
this.str=,,Server=localhost;DataBase=SmartShelfD;uid=sa;pwd=123n;
this.conn=newSqlConnection(str);
this.sqlcom=newSqlCommand();
this.sqlcom.Connection=this.conn;
this.conn.Open();
}
上邊定義了兩個(gè)全局變量,分變是字符型str,變量量為數(shù)據(jù)庫連接字符串內(nèi)容:Server
表示正在訪問的數(shù)據(jù)庫服務(wù)器名稱,其格式是“計(jì)算機(jī)名'實(shí)例名”,假如是本地的數(shù)據(jù)庫
服務(wù)器同時(shí)使用的是SQLServer的默認(rèn)實(shí)例名,則能夠使用(Local)或者.來表示。DataBase
表示數(shù)據(jù)庫名稱,即該項(xiàng)目所要連接的數(shù)據(jù)庫名;Uid表示數(shù)據(jù)庫服務(wù)器的登錄名稱;Pwd
表示數(shù)據(jù)庫服務(wù)器的密碼。
返回?cái)?shù)據(jù)連接方法
///〈summary〉
///返回?cái)?shù)據(jù)連接方法
///〈/summary〉
///<returns></retums>
publicSqlConnectionGetConnection()
{
returnthis.conn;
}
10.2.2DBOperate.es類
該類的作用是對程序中的要用到的對數(shù)據(jù)庫的操作進(jìn)行統(tǒng)一,涉及到對數(shù)據(jù)庫的操作
時(shí),如對數(shù)據(jù)庫的增刪改操作,都能夠直接調(diào)用該類,相應(yīng)的方法。傳入相應(yīng)的參數(shù)即可。
添加引用
usingSystem.Data.SqlClient;
usingSystem.Data;
定義變量
SqlCommandsqlcom;
SqlConnectionconn;
默認(rèn)構(gòu)造方法
///<summary>
///構(gòu)造函數(shù)
///</summary>
///<paramname=,'dbcH></param>
publicDBOperate(DBConnectiondbc)
(
sqlcom=newSqlCommand();
sqlcom.Connection=dbc.GetConnection();
)
編寫執(zhí)行方法
///<summary>
///執(zhí)行sql語句
///</summary>
///<paramname="sqr'x/param>
publicvoidExecuteSQL(stringsql)
(
try
(
this.sqlcom.ExecuteNonQueryO;
}
catch{}
}
///<summary>
///獲取數(shù)據(jù)表格的方法
///</summary>
///<paramname="sqln></param>
///<returns>sql語句〈/returns〉
publicDataTableGetDataTable(stringsql)
(
SqlDataAdaptersda=newSqlDataAdapter(this.sqlcom);
DataSetds=newDataSet();
DataTabledt=newDataTable();
try
(
sda.Fill(ds);
dt=ds.Tables[O];
}
catch{}
returndt;
///<summary>
///執(zhí)行SQL語句,獲取string類型數(shù)據(jù)
///〈/summary〉
///<paramname二“sql”>SQL語句</param>
///〈returns〉獲取到的string類型數(shù)據(jù)〈/returns〉
publicstringGetString(stringsql)
(
stringresultStr="u;
try
(
resultStr=this.sqlcom.ExecuteScalar().ToString();
}
catch(SqlExceptione)
{)
finally
(
this.sqlcom.Dispose();
)
returnresultStr;
)
publicintGetlnt(stringsql)
(
intresultlnt=0;
try
(
resultlnt=Convert.ToInt32(this.sqlcom.ExecuteScalar().ToString());
)
catch(SqlExceptione)
(
System.Windows.Forms.MessageBox.Show(e.Message);
}
finally
(
this.sqlcom.Dispose();
)
returnresultlnt;
}
本資源是基于SQLServer開發(fā)的,因此能夠使用using指令能夠引用SQLServer專用
的.NET數(shù)據(jù)庫提供者:usingSystem.Data.SqlClient;
提取數(shù)據(jù)庫中數(shù)據(jù)的4步:
1)連接數(shù)據(jù)源
2)打開連接
3)發(fā)出一個(gè)SQL查詢命令
4)執(zhí)行命令語句
541(2011慎8211是一個(gè)用于5(314£T數(shù)據(jù)提供者的連接對象名稱,表示SQLServer數(shù)據(jù)
庫的一個(gè)打開的連接。SqlConnection對象表示與SQLServer數(shù)據(jù)源的一個(gè)唯一的會話。
關(guān)于客戶端/服務(wù)器數(shù)據(jù)庫系統(tǒng),它等效于到服務(wù)器的網(wǎng)絡(luò)連接。SqlConnection與
SqlDataAdapter與SqlCommand一起使用,能夠在連接MicrosoftSQLServer數(shù)據(jù)庫時(shí)提
高性能。
"Server=localhost;DataBase=AccessControl;uid=sa;pwd=123"
Server=locak)st,表示正在訪問的SQLServer名稱,其格式是“計(jì),算機(jī)名'實(shí)例名計(jì)算機(jī)名
(localhost)是一個(gè)非常方便的SQLServer簡短名稱,它表示運(yùn)行在當(dāng)前機(jī)器上的服務(wù)器實(shí)
例。DataBase=AccessControl,指定數(shù)據(jù)庫的名稱。uid=sa;pwd=123,表示登錄數(shù)據(jù)庫的用戶
名與密碼,這是SQLServer與Windows的標(biāo)準(zhǔn)內(nèi)置安全。
this.conn.Open();打開數(shù)據(jù)庫的連接。CommandText屬性獲取或者設(shè)置要對數(shù)據(jù)源執(zhí)行的
SQL語句或者存儲過程。ExecuteNonQuery()方法,對連接執(zhí)行SQL語句并返回受影響的
行數(shù)。SqlDataAdapter類表示用于填充DataSet與更新SQLServer數(shù)據(jù)庫的一組數(shù)據(jù)命令
與一個(gè)數(shù)據(jù)庫連接。SqlDataAdapter是DataSet與SQLServer之間的橋接器,用于檢索與
儲存數(shù)據(jù)。DataSet是ADO.NET結(jié)構(gòu)的要緊組件,它是從數(shù)據(jù)源中檢索到的數(shù)據(jù)在內(nèi)存中
的緩存。DataSet由一組DataTable對象構(gòu)成。
try-catch語句由一個(gè)try塊后跟一個(gè)或者多個(gè)catch子句構(gòu)成,這些子句指定不一致的
特殊處理程序。
try塊包含可能導(dǎo)致特殊的保護(hù)代碼。該塊一直執(zhí)行到引發(fā)特殊或者成功完成為止。比
如,下列強(qiáng)制轉(zhuǎn)換null對象的嘗試引發(fā)NullReferenceException特殊:
objecto2=null;
try
(
inti2=(int)o2;〃錯(cuò)誤
}
10.2.3ObjCargoNode.cs類
該類是對節(jié)點(diǎn)信息與數(shù)據(jù)庫中的進(jìn)行操作進(jìn)行的修改。節(jié)點(diǎn)加入網(wǎng)絡(luò)后,段地址會存儲
到數(shù)據(jù)庫中。對當(dāng)前節(jié)點(diǎn)的識別也需要讀取數(shù)據(jù)庫中已輸入的節(jié)點(diǎn)信息。
添加命名空間
usingSystem.Data;
定義變量
privateintcargo;
privatestringiEEEAddress;
privatestringshortAddress;
privateintnodeType;
構(gòu)造函數(shù)
publicObjCargoNode()
publicObjCargoNode(intcargo)
(
this.cargo=cargo;
DataTabledtb=Program.dbo.GetDataTable(string.Format(Hselect
Cargo,IEEEAddress,ShortAddress,NodeTypefromCargoNodewhereCargo-{0}*",this.cargo));
DataRowrow=dtb.Rows[0J;
this.cargo=Convert.ToInt32(row["CargoH].ToString0);
this.iEEEAddress=row[,'IEEEAddress"l.ToString();
this.shortAddress=row[nShortAddress"].ToString();
this.nodeType=Convert.ToInt32(row[nNodeType*'].ToString());
)
屬性
publicintCargo
{
get
(
returnthis.cargo;
)
}
publicstringlEEEAddress
(
get
(
returnthis.iEEEAddress;
)
)
publicstringShortAddress
(
get
{
returnthis.shortAddress;
)
set
this.shortAddress=value;
publicintNodeType
get
(
returnthis.nodeType;
}
}
方法
publicvoidInsert()
(
Program.dbo.ExecuteSQL(string.Format(nupdateCargoNodeset
ShortAddress="{0}'whereIEEEAddress=,{1this.shortAddress,this.iEEEAddress));
}
10.3功能設(shè)計(jì)與實(shí)現(xiàn)
該部分實(shí)訓(xùn)內(nèi)容要緊是通過程序與wsn的網(wǎng)關(guān)進(jìn)行通信,這里我們需要學(xué)習(xí)關(guān)于wsn
網(wǎng)關(guān)通信的有關(guān)應(yīng)用。該模塊程序中的代碼,在后面會分解出來應(yīng)用。
向窗體中添加一個(gè)TabControl控件,在TabPages屬性添加6個(gè)成員。
控件Name屬性Text屬性UseVisualStyleBac
kColor屬性
TabPagetpConnect建立連接True
TabPagetpPingPing指令True
TabPagetpConfigReadConfigRead指令True
TabPagetpConfigWriteConfig_Write指令True
TabPagetpSensorReadSensor_Read指令True
TabPagetpSensorWriteSensor_Write指令True
10.3.1創(chuàng)建建立連接
1、建立連接TabPage窗體屬性,窗體如圖10-5所示。
TextBox
控化
更掾
2、設(shè)置窗體屬性
StartPositionMaximizeBoxMinimizeBoxFormBorderStyle
窗體Text屬性
屬性屬性屬性屬性
Zigbee節(jié)
frmGoodsOutCenterParentFalseFalseFixedSingle點(diǎn)連接實(shí)
驗(yàn)
3、設(shè)置Labie控件屬性
控件Name屬性Text屬性
T1通道Socket
LableIbllPAddressTlIP地址
LableIblPortTl端口號
LableIblAppIDTlAppID
LableIblPasswordTlPassword
T2通道Socket
LablelblIPAddressT2IP地址
LablelblPortT2端口號
LablelblAppIDT2AppID
LablelblPasswordT2Password
4、設(shè)置TextBox屬性
控件Name屬性Text屬性
TextBoxtxtIPAddressTI192.168.1.230
TextBoxtxtPortTl4000
TextBoxtxtAppIDTl1001
TextBoxtxtPasswordTlKingvcSzigvine
TextBoxtxtIPAddressT2192.168.1.230
TextBoxtxtPortT24000
TextBoxtxtAppIDT21001
TextBoxtxtPasswordT2KingvcSzigvine
5、設(shè)置顯示]言息內(nèi)容的TextBox屬性
控件Name屬性Dock屬性MultilineReadOnle屬ScorllBars
屬性性屬性
TextBoxtxtMessageConnectFillTrueTrueVertical
6、設(shè)置GroupBox控件屬性
控件Name屬性Text屬性
GroupBoxgbSocket_TlT1通道Socket
GroupBoxgbSocket_T2T2通道Socket
7、設(shè)置Button按鈕事件
控件Name屬性Text屬性UseVisualStyleBackColor
屬性
ButtonbtnConnectSocketTlSocketTl連接True
ButtonbtnConnectTlT1通道連接True
ButtonbtnConnectSocketT2SocketT2連接True
ButtonbtnConnectT2T2通道連接True
8、窗體后臺代碼:
1)定義變量
〃定義一個(gè)函數(shù)結(jié)構(gòu)的委托
privatedelegatevoidShowMessageDel(TextBoxtxt,stringmsg);
privatedelegatevoidShowMessageDelOfTempLabel(LabelIbl,stringvalue);
〃實(shí)例化T1數(shù)據(jù)包消息類
privateGRIP_MessagemessageTl=newGRIP_Message();
〃實(shí)例化T2數(shù)據(jù)包消息類
privateGRIP_MessagemessageT2=newGRIP_Message();
//定義TISocket通訊接口
privateSocketsocketTl;
//定義T2soeket通訊接口
privateSocketsocketT2;
〃定義T1通道流水號
privateUIntl6sequencelDTl;
〃定義T2通道流水號
privateUIntl6sequenceIDT2;
privateinttime;
〃定義一個(gè)線程
privateThreadthread;
//sessionlD為連接后網(wǎng)關(guān)隨機(jī)分配的一個(gè)標(biāo)識ID
privatestringsessionlD=
2)構(gòu)造函數(shù)
///<summary>
///構(gòu)造函數(shù)
///</summary>
publicfrmZigBee()
{
InitializeComponent();
)
3)編寫方法
Socket發(fā)送消息方法
///<summary>
///Socket發(fā)送消息方法
///</summary>
///<paramname="msgSencT>要發(fā)送的字節(jié)數(shù)組v/param>
///<paramname="socket”>Socket實(shí)例</param>
///<paramname="1enSend”>已發(fā)送的長度</param>
privatevoidSendMsg(byte[]msgSend,Socketsocket,intlenSend)
(
//需對發(fā)送的字節(jié)長度有明確認(rèn)識,發(fā)送一段字節(jié)后需要加上該段字節(jié)的長度
while(lenSend<msgSend.Length)
(
lenSend+=socket.Send(msgSend,lenSend,msgSend.Length-lenSend,
SocketFlags.None);
)
)
Socket接收信息的方法
///<summary>
///Socket接收消息方法
///</summary>
///<paramname="msgRecv”>要接收的字節(jié)數(shù)組</param>
///<paramname="socket”>Socket實(shí)例v/param>
///<paramname="lenRecv”>已接收的長度v/param>
privatevoidRecvMsg(byte[]msgRecv,Socketsocket,intlenRecv)
(
while(lenRecv<msgRecv.Length)
(
lenRecv+=socket.Receive(msgRecv,lenRecv,msgRecv.Length-lenRecv,
SocketFlags.None);
)
}
在控件中顯示信息的方法
//<summary>
///在控件中顯示消息的方法
///</summary>
III<paramname=,,txt',></param>
///<paramname="msgnx/param>
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控件中顯示消息的方法
///<summary>
///在Label控件中顯示消息的方法
///</summary>
///<paramname=控件名稱v/param>
///<paramname="value”>要顯示的值</param>
privatevoidShowTempValue(LabelIbl,stringvalue)
(
if(Ibl.InvokeRequired)
(
ShowMessageDelOfTempLabelsmd=new
ShowMessageDelOfTempLabel(ShowTempValue);
lbl.Invoke(smd,Ibl,value);
)
else
{
Ibl.Text=value;
}
)
線程方法
///<summary>
〃/T2通道線程執(zhí)行方法
///</summary>
privatevoidRun()
{
try
(
while(true)
(
#region解析消息頭
〃定義一個(gè)byte類型的6位數(shù)組
bytelJmsgRecvHeadBytes=newbyte[61;
〃接收到的消息頭的長度
intlenRecv=0;
//Socket接收消息的方法
RecvMsg(msgRecvHeadBytes,this.socketT2,lenRecv);
〃實(shí)例化一個(gè)消息頭類
GRIP_MessageHeadmsgHeadRecv=newGRIP_MessageHead();
〃對接收到的消息頭進(jìn)行轉(zhuǎn)換
msgHeadRecv.GetHeadBytesOfKecive(msgRecvHeadBytes,0,6);
#endregion
#region心跳包
if(msgHeadRecv.MessageCommand==
(UIntl6)GRIP_Message_CommandID.NWM_HEARTBEAT)
(
try
(
〃消息的長度為16位無符號整數(shù)
UIntl6messageLength=0;
〃心跳報(bào)消息體「信息為空
UIntl6messageCommand=
(UIntl6)GRIP_Message_CommandID.NWM_HEARTBEAT_RESP;
〃獲取獲取流水號
UIntl6sequencelD=msgHeadRecv.SequencelD;
〃實(shí)例化一個(gè)消息頭類
GRIP_MessageHeadmsgHeadSend=new
GRIP_MessageHead(messageLength,messageCommand,sequencelD);
〃按照本地字節(jié)轉(zhuǎn)換發(fā)送的信息
byte[]msgSend=msgHeadSend.GetHeadBytesOfSend();
〃發(fā)送信息方法
SendMsg(msgSend,this.socketT2,0);
〃MessageBox.Show("【T2通道心跳包】發(fā)送成功)
)
catch(Exceptionex)
{
MessageBox.Show("【T2通道心跳包】錯(cuò)誤:"+ex.Message);
}
)
#endregion
#regionStatus_Report
〃推斷消息頭返回命令字是否正確
if(msgHeadRecv.MessageCommand==
(Ulntl6)GRIP_Message_CommandlD.NWM_STATUS_REPORT)
(
try
(
〃定義一個(gè)消息頭字節(jié)長度的byte數(shù)組
byte[JmsgBodyRecvBytes=new
bytefmsgHeadRecv.MessageLength];
〃定義消息體長度變量
intlenBodyRecv=0;
//Socket接收信息方法接收信息
RecvMsg(msgBodyRecvBytes,this.socketT2,lenBodyRecv);
〃實(shí)例化節(jié)點(diǎn)報(bào)告命令
GRIP_MessageBody_Status_ReportmsgBodyRecv=new
GRIP_MessageBody_Status_Report();
//按照本地字節(jié)與網(wǎng)絡(luò)字節(jié)的順序轉(zhuǎn)換接收到的消息體
msgBodyRecv.ConvertReciveBytes(msgBodyRecvBytes);
UIntl6status=0;
〃實(shí)例化節(jié)點(diǎn)報(bào)告命令響應(yīng)
GRIP_MessageBody_Status_Report_RespmsgBodySend=
newGRIP_MessageBody_Status_Report_Resp(status);
//實(shí)例化消息頭類,并將響應(yīng)參數(shù)傳入
GRIP_MessageHeadmsgHeadSend=new
GRIP_MessageHead(msgBodySend.BodyLength,
(UIntl6)GRIP_Message_CommandID.NWM_STATUS_REPORT_RESP,
msgHeadRecv.SequencelD);
〃獲取發(fā)送的數(shù)據(jù)包的byte數(shù)組
byte[]msgSend=
this.messageT2.GetSendMessage(msgHeadSend,msgBodySend);
intlenSend=0;
〃發(fā)送消息
SendMsg(msgSend,this.socketT2,lenSend);
if(this.sessionlD==msgBodyRecv.SessionlD)
(
this.ShowMessage(this.txtMessagePing,"\r\n");
this.ShowMessage(this.txtMessagePing,'*[Status_Report]
指令成功)
this.ShowMessage(this.txtMessagePing,u[Status_Report]
IEEEAddress:”+msgBodyRecv.Node.IEEEAddress);
this.ShowMessage(this.txtMessagePing,'IStatus_Report]
ShortAddress:"+msgBodyRecv.Node.ShortAddress.ToString(uX4n));
this.ShowMessage(this.txtMessagePing,u
[?Status_Report]Cause:n+msgBodyRecv.Cause);
lhis.ShowMessage(this.txtMessagePing,H[Status_Report]
SessionlD:”+msgBodyRecv.SessionlD);
this.ShowMessage(this.txtMessagePing,n[Status_Report]
DeviceName:"+msgBodyRecv.DeviceName);
this.ShowMessage(this.txtMessagePing,u[Status_Report]
DeviceType:"+msgBodyRecv.DeviceType);
this.ShowMessage(this.txtMessagePing,n[Status_Report]
Status:"+msgBodyRecv.Status);
this.ShowMessage(this.txtMessagePing,u[Status_Report]
PanlD:0+msgBodyRecv.PanID+”——"+msgBodyRecv.PanID.ToString(',X4,'));
this.ShowMessage(this.txtMessagePing,u[Status_Report]
ParentlEEEAddress:"+msgBodyRecv.ParentNode.IEEEAddress);
this.ShowMessage(this.txtMessagePing,u[Status_Report]
ParentShortAddress:"+msgBodyRecv.ParentNode.ShortAddress.ToString(,,X4,'));
this.ShowMessage(this.txtMessagePing,"[Status_Report]
SensorEnable:"+msgBodyRecv.SensorEnable);
this.ShowMessage(this.txtMessagePing,'IStatus_Report]
SensorClass:"+msgBodyRecv.SensorClass);
this.ShowMessage(this.txtMessagePing,'*[Status_Report]
SensorType:"+msgBodyRecv.SensorType.ToString("X4"));
this.ShowMessage(this.txtMessagePing,
this.ShowMessage(this.txtMessagePing,H
[Status_Report_Resp]指令成功");
)
)
catch(Exceptionex)
(
this.ShowMessage(this.txtMessagePing,n[Status_Report]指
令失敗錯(cuò)誤:"+ex.Message);
#endregion
#regionSensor_Report
if(msgHeadRecv.MessageCommand==
(UIntl6)GRIP_Message_CommandID.NWM_SENSOR_REPORT)
(
try
(
〃定義一個(gè)消息體長度的byte數(shù)組
byte[JmsgBodyRecvBytes=new
bytefmsgHeadRecv.MessageLength];
〃接收消息體的長度變量
intlenBodyRecv=0;
〃接收消息體
RecvMsg(msgBodyRecvBytes,this.socketT2,lenBodyRecv);
〃實(shí)例化節(jié)點(diǎn)報(bào)告命令
GRIP_MessageBody_Sensor_ReportmsgBodyRecv=new
GRIP_MessageBody_Sensor_Report();
//將消息體按照本地字節(jié)與網(wǎng)絡(luò)字節(jié)的順序轉(zhuǎn)換
msgBodyRecv.ConvertReciveBytes(msgBodyRecvBytes);
UIntl6status=0;
〃實(shí)例化節(jié)點(diǎn)報(bào)告命令的響應(yīng)
GRIP_MessageBody_Sensor_Report_RespmsgBodySend=
newGRIP_MessageBody_Sensor_Report_Resp(status);
//實(shí)例化并獲得消息頭
GRIP_MessageHeadmsgHeadSend=new
GRIP_MessageHead(msgBodySend.BodyLength,
(UIntl6)GRIP_Message_CommandID.NWM_SENSOR_REPORT_RESP,
msgHeadRecv.SequencelD);
〃獲取發(fā)送的數(shù)據(jù)包的byte數(shù)組
byte[]msgSend=
this.messageT2.GetSendMessage(msgHeadSend,msgBodySend);
intlenSend=0;
〃發(fā)送消息
SendMsg(msgSend,this.socketT2,lenSend);
〃推斷會話ID是否相同
if(this.sessionlD==msgBodyRecv.SessionlD)
(
this.ShowMessage(this.txtMessagePing,u\r\n");
this.ShowMessage(this.txtMessagePing,0
[Sensor_Report]指令成功)
this.ShowMessage(this.txtMessagePing,u
[Sensor_Report]lEEEAddress:"+msgBodyRecv.Node.IEEEAddress);
this.ShowMessage(this.txtMessagePing,u
[Sensor_Report]ShortAddress:"+msgBodyRecv.Node.ShortAddress.ToString(uX4u));
this.ShowMessage(this.txtMessagePing,u
[Sensor_Report]Cause:n+msgBodyRecv.Cause);
lhis.ShowMessage(this.txtMessagePing,H
[Sensor_Report]SessionlD:"+msgBodyRecv.SessionlD);
this.ShowMessage(this.txtMessagePing,*'
[Sensor_Report]DataType:"+msgBodyRecv.DataType);
#regionSensojRead引。y發(fā)巧6
//推斷節(jié)點(diǎn)數(shù)據(jù)采集是否成功
if(msgBodyRecv.DataType==0x01)
(
this.ShowMessage(this.txtMessagePing,"
[Sensor_Report(SensorData)]SensorClass:"+
((GRIP_SensorData)msgBodyRecv.Data).SensorClass);
this.ShowMessage(this.txtMessagePing,n
[Sensor_Report(SensorData)]SensorType:"+
((GRIP_SensorData)msgBodyRecv.Data).SensorType.ToString("X4"));
this.ShowMessage(this.txtMessagePing,"
[Sensor_Report(SensorData)]SensorDataLength:"+
((GRIP_SensorData)msgBodyRecv.Data).SensorDataLength);
#region溫濕度傳感器
〃推斷溫濕度傳感器節(jié)點(diǎn)的數(shù)據(jù)長度是否正確同
時(shí)在窗口中顯示溫濕度
if
(((GRIP_SensorData)msgBodyRecv.Data).SensorDataLength==4)
(
this.ShowMessage(this.txtMessagePing,"
[Sensor_Report(SensorData)]Temp_H:"+((GRIP_SensorData)msgBodyRecv.Data).Temp_H);
this.ShowMessage(this.txtMessagePing,"
[Sensor_Report(SensorData)]Temp_L:"+((GRIP_SensorData)msgBodyRecv.Data).Temp_L);
this.ShowMessage(this.txtMessagePing,"
【Sensor_Report(SensorData)】當(dāng)前溫度:”+((GRIP_SensorData)msgBodyRecv.Data).Temp_H
++((GRIP_SensorData)msgBodyRecv.Data).Temp_L+
this.ShowMessage(this.txtMessagePing,"
[Sensor_Report(SensorData)]Humi_H:n+((GRIP_SensorData)msgBodyRecv.Data).Humi_H);
this.ShowMessage(this.txtMessagePing,"
[Sensor_Report(SensorData)]Humi_L:”+((GRIP_SensorData)msgBodyRecv.Data).Humi_L);
this.ShowMessage(this.txtMessagePing,"
[Sensor_Report(SensorData)]當(dāng)前濕度:"+((GRIP_SensorData)msgBodyRecv.Data).Humi_H
++((GRIP_SensorData)msgBodyRecv.Data).Humi_L+"%”);
ShowTempValue(this.lblTempValue,
((GRIP_SensorData)msgBodyRecv.Data).Temp_H++
((GRIP_SensorData)msgBodyRecv.Data).Temp_L+“℃");
ShowTempValue(this.lblHumiValue,
((GRIP_SensorData)msgBodyRecv.Data).Humi_H++
((GRIP_SensorData)msgBodyRecv.Data).Humi_L+"%”);
)
#endregion
#region數(shù)碼管節(jié)點(diǎn)
〃推斷數(shù)碼管節(jié)點(diǎn)數(shù)據(jù)長度是否正確
if
(((GRIP_SensorData)msgBodyRecv.Data).SensorDataLength==5)
(
this.ShowMessage(this.txtMessagePing,"
[Sensor_Report(SensorData)]Value:"+((GRIP_SensorData)msgBodyRecv.Data).Value);
this.ShowMessage(this.txtMessagePing,"
[Sensor_Report(SensorData)]LED:"+((GRIP_SensorData)msgBodyRecv.Data).LED);
this.ShowMessage(this.txtMessagePing,"
[Sensor_Repor
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 1998年度注冊會計(jì)師考試試題及答案
- 海南省三亞市2024-2025學(xué)年八年級上學(xué)期1月期末物理試題(無答案)
- 2024-2025學(xué)年八年級上學(xué)期1月期末物理試題(含答案)
- 7天連鎖酒店集團(tuán)工程施工合同
- 2025年度國家級礦產(chǎn)資源開發(fā)與利用采礦合同范本3篇
- 2024環(huán)保產(chǎn)業(yè)展會合作合同書版B版
- 2024年肉類市場購銷合同
- 2025便利店會員積分體系合作協(xié)議3篇
- 2024青年志愿者社會公益項(xiàng)目合作協(xié)議2篇
- 2024股權(quán)變更與投資協(xié)議
- 浙江省溫州市2023-2024學(xué)年八年級上學(xué)期道德與法治期末測試(含答案)
- 高壓電工操作規(guī)程
- 勞務(wù)派遣勞務(wù)外包服務(wù)方案(技術(shù)方案)
- 2023年藥品注冊專員年度總結(jié)及來年計(jì)劃
- 圖紙標(biāo)注常見問題和要求國家標(biāo)準(zhǔn)新版
- 軟件無線電原理與應(yīng)用第3版 課件 第4-6章 軟件無線電硬件平臺設(shè)計(jì)、軟件無線電信號處理算法、信道編譯碼技術(shù)
- 兒童ERCP的應(yīng)用及技巧課件
- 《低壓電工技術(shù)》課程標(biāo)準(zhǔn)
- 22G101系列圖集常用點(diǎn)全解讀
- (國家基本公共衛(wèi)生服務(wù)項(xiàng)目第三版)7高血壓患者健康管理服務(wù)規(guī)范
- 12 富起來到強(qiáng)起來 精神文明新風(fēng)尚(說課稿)-部編版道德與法治五年級下冊
評論
0/150
提交評論