




已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
項目十 基于WSN技術的智能倉儲環(huán)境監(jiān)測與智能控制系統(tǒng)設計與實現(xiàn)一、教學目標1、 掌握WSN網(wǎng)關通信的相關應用。2、 掌握WSN實現(xiàn)了信息的采集、信息傳輸和信息處理模式。3、 掌握WSN實現(xiàn)倉儲環(huán)境監(jiān)控智能化技術方法。二、教學內(nèi)容10.1設備簡介10.1.1 WSN網(wǎng)關圖10-1 WSN網(wǎng)關圖 供電電源:DC5V,信號獲取接口:USB,上位機通信接口:以太網(wǎng)口,操作系統(tǒng):Linux。網(wǎng)關通過USB與協(xié)調(diào)器連接,并通過協(xié)調(diào)器與各Zigbee節(jié)點進行信號通訊。10.1.2協(xié)調(diào)器圖10-2 協(xié)調(diào)器圖供電方式:USB供電。該設備為網(wǎng)關與各傳感器節(jié)點的中繼,負責轉(zhuǎn)發(fā)Zigbee信號。10.1.3溫濕度傳感器模塊圖10-3 溫濕度傳感模塊圖供電方式:DC5V,通訊協(xié)議:Zigbee。集成模塊:溫濕度傳感器。該節(jié)點可采集溫濕度數(shù)據(jù),并通過Zigbee協(xié)議傳輸?shù)骄W(wǎng)關,上位機通過訪問網(wǎng)關獲取溫濕度數(shù)據(jù)。10.1.4電磁繼電器模塊圖10-4電磁繼電器模塊圖供電方式:DC5V,繼電器控制路數(shù):4路,與網(wǎng)關通信協(xié)議:Zigbee。該繼電器可控制四路電源,在京勝世紀的實驗臺中,控制了兩路燈光、一路風扇和一路電磁門。10.2類的設計與實現(xiàn)在本部分實訓中我們要用到數(shù)據(jù)庫來存儲當前各個節(jié)點的信息,以面向?qū)ο蟮乃枷霝槔?我們需要先編寫幾對數(shù)據(jù)庫操作的基礎類和將節(jié)點信息保存的對象類。10.2.1 DBConnection.cs類這個類文件是要對數(shù)據(jù)庫進行連接操作,登錄到本地的數(shù)據(jù)庫。引用命名空間。該命名空間是SQL Server.NET數(shù)據(jù)提供者,是SQL Server專用的內(nèi)置.NET提供者,引用該命名空間后就可以獲得最好的性能和對基礎功能的最直接訪問。using System.Data.SqlClient; 添加變量 private string str; private SqlCommand sqlcom; private SqlConnection conn;在構(gòu)造函數(shù)中寫入連接數(shù)據(jù)庫方法/ / 連接數(shù)據(jù)庫的方法 / public DBConnection() /定義了要連接的數(shù)據(jù)庫的位置,數(shù)據(jù)庫的名稱,登錄帳號和密碼 this.str = Server=localhost;DataBase=SmartShelfD;uid=sa;pwd=123; this.conn = new SqlConnection(str); this.sqlcom = new SqlCommand(); this.sqlcom.Connection = this.conn; this.conn.Open(); 上邊定義了兩個全局變量,分變是字符型str,變量量為數(shù)據(jù)庫連接字符串內(nèi)容:Server表示正在訪問的數(shù)據(jù)庫服務器名稱,其格式是“計算機名實例名”,如果是本地的數(shù)據(jù)庫服務器并且使用的是SQL Server的默認實例名,則可以使用(Local)或.來表示。DataBase表示數(shù)據(jù)庫名稱,即該項目所要連接的數(shù)據(jù)庫名;Uid表示數(shù)據(jù)庫服務器的登錄名稱;Pwd表示數(shù)據(jù)庫服務器的密碼。返回數(shù)據(jù)連接方法/ / 返回數(shù)據(jù)連接方法 / / public SqlConnection GetConnection() return this.conn; 10.2.2 DBOperate.cs類該類的作用是對程序中的要用到的對數(shù)據(jù)庫的操作進行統(tǒng)一,涉及到對數(shù)據(jù)庫的操作時,如對數(shù)據(jù)庫的增刪改操作,都可以直接調(diào)用該類,相應的方法。傳入相應的參數(shù)即可。添加引用using System.Data.SqlClient;using System.Data;定義變量SqlCommand sqlcom;SqlConnection conn;默認構(gòu)造方法 / / 構(gòu)造函數(shù) / / public DBOperate(DBConnection dbc) sqlcom = new SqlCommand(); sqlcom.Connection = dbc.GetConnection(); 編寫執(zhí)行方法/ / 執(zhí)行sql語句 / / public void ExecuteSQL(string sql) this.sqlcom.CommandText = sql; try this.sqlcom.ExecuteNonQuery(); catch / / 獲取數(shù)據(jù)表格的方法 / / / sql語句 public DataTable GetDataTable(string sql) this.sqlcom.CommandText = sql; SqlDataAdapter sda = new SqlDataAdapter(this.sqlcom); DataSet ds = new DataSet(); DataTable dt = new DataTable(); try sda.Fill(ds); dt = ds.Tables0; catch return dt; / / 執(zhí)行SQL語句,獲取string類型數(shù)據(jù) / / SQL語句 / 獲取到的string類型數(shù)據(jù) public string GetString(string sql) string resultStr = ; this.sqlcom.CommandText = sql; try resultStr = this.sqlcom.ExecuteScalar().ToString(); catch (SqlException e) finally this.sqlcom.Dispose(); return resultStr; public int GetInt(string sql) int resultInt = 0; this.sqlcom.CommandText = sql; try resultInt = Convert.ToInt32(this.sqlcom.ExecuteScalar().ToString(); catch (SqlException e) System.Windows.Forms.MessageBox.Show(e.Message); finally this.sqlcom.Dispose(); return resultInt; 本資源是基于SQL Server開發(fā)的,所以可以使用using指令可以引用SQL Server 專用的.NET數(shù)據(jù)庫提供者:using System.Data.SqlClient;提取數(shù)據(jù)庫中數(shù)據(jù)的4步:1) 連接數(shù)據(jù)源2) 打開連接3) 發(fā)出一個SQL查詢命令4) 執(zhí)行命令語句SqlConnection是一個用于SQL .NET數(shù)據(jù)提供者的連接對象名稱,表示 SQL Server 數(shù)據(jù)庫的一個打開的連接。SqlConnection 對象表示與 SQL Server 數(shù)據(jù)源的一個唯一的會話。對于客戶端/服務器數(shù)據(jù)庫系統(tǒng),它等效于到服務器的網(wǎng)絡連接。SqlConnection 與 SqlDataAdapter 和 SqlCommand 一起使用,可以在連接 Microsoft SQL Server 數(shù)據(jù)庫時提高性能。Server=localhost;DataBase=AccessControl;uid=sa;pwd=123Server=localost,表示正在訪問的SQL Server名稱,其格式是“計算機名實例名”。計算機名(localhost)是一個非常方便的SQL Server簡短名稱,它表示運行在當前機器上的服務器實例。DataBase=AccessControl,指定數(shù)據(jù)庫的名稱。uid=sa;pwd=123,表示登錄數(shù)據(jù)庫的用戶名和密碼,這是SQL Server和Windows的標準內(nèi)置安全。this.conn.Open();打開數(shù)據(jù)庫的連接。CommandText屬性獲取或設置要對數(shù)據(jù)源執(zhí)行的 SQL 語句或存儲過程。ExecuteNonQuery ()方法,對連接執(zhí)行 SQL 語句并返回受影響的行數(shù)。SqlDataAdapter 類表示用于填充 DataSet 和更新 SQL Server 數(shù)據(jù)庫的一組數(shù)據(jù)命令和一個數(shù)據(jù)庫連接。SqlDataAdapter 是 DataSet 和 SQL Server 之間的橋接器,用于檢索和保存數(shù)據(jù)。DataSet 是 ADO.NET 結(jié)構(gòu)的主要組件,它是從數(shù)據(jù)源中檢索到的數(shù)據(jù)在內(nèi)存中的緩存。DataSet 由一組 DataTable 對象組成。try-catch 語句由一個 try 塊后跟一個或多個 catch 子句構(gòu)成,這些子句指定不同的異常處理程序。try 塊包含可能導致異常的保護代碼。該塊一直執(zhí)行到引發(fā)異常或成功完成為止。例如,下列強制轉(zhuǎn)換 null 對象的嘗試引發(fā) NullReferenceException 異常:object o2 = null;try int i2 = (int)o2; /錯誤10.2.3 ObjCargoNode.cs類該類是對節(jié)點信息與數(shù)據(jù)庫中的進行操作進行的修改。節(jié)點加入網(wǎng)絡后,段地址會存儲到數(shù)據(jù)庫中。對當前節(jié)點的識別也需要讀取數(shù)據(jù)庫中已輸入的節(jié)點信息。添加命名空間using System.Data;定義變量private int cargo; private string iEEEAddress; private string shortAddress; private int nodeType;構(gòu)造函數(shù) public ObjCargoNode() public ObjCargoNode(int cargo) this.cargo = cargo; DataTable dtb = Program.dbo.GetDataTable(string.Format(select Cargo,IEEEAddress,ShortAddress,NodeType from CargoNode where Cargo=0 , this.cargo); DataRow row = dtb.Rows0; this.cargo = Convert.ToInt32(rowCargo.ToString(); this.iEEEAddress = rowIEEEAddress.ToString(); this.shortAddress = rowShortAddress.ToString(); this.nodeType = Convert.ToInt32(rowNodeType.ToString(); 屬性public int Cargo get return this.cargo; public string IEEEAddress get return this.iEEEAddress; public string ShortAddress get return this.shortAddress; set this.shortAddress = value; public int NodeType get return this.nodeType; 方法public void Insert() Program.dbo.ExecuteSQL(string.Format(update CargoNode set ShortAddress=0 where IEEEAddress=1, this.shortAddress, this.iEEEAddress); 10.3功能設計與實現(xiàn)該部分實訓內(nèi)容主要是通過程序和wsn的網(wǎng)關進行通信,這里我們需要學習關于wsn網(wǎng)關通信的相關應用。該模塊程序中的代碼,在后面會分解出來應用。向窗體中添加一個TabControl控件,在TabPages屬性添加6個成員。控件Name屬性Text屬性UseVisualStyleBackColor屬性TabPagetpConnect建立連接TrueTabPagetpPingPing指令TrueTabPagetpConfigReadConfig_Read指令TrueTabPagetpConfigWriteConfig_Write指令TrueTabPagetpSensorReadSensor_Read指令TrueTabPagetpSensorWriteSensor_Write指令True10.3.1創(chuàng)建建立連接1、建立連接TabPage窗體屬性,窗體如圖10-5所示。 圖10-5 Zigbee節(jié)點連接實驗圖向窗體添加1個SplitContainer控件,2個GroudBox控件,8個Label控件,9個TextBox控件,4個Button控件。更改窗體和控件屬性:2、設置窗體屬性窗體StartPosition屬性MaximizeBox屬性MinimizeBox屬性FormBorderStyle屬性Text屬性frmGoodsOutCenterParentFalseFalseFixedSingleZigbee節(jié)點連接實驗3、設置Lable控件屬性控件Name屬性Text屬性T1通道SocketLablelblIPAddressT1IP地址LablelblPortT1端口號LablelblAppIDT1AppIDLablelblPasswordT1PasswordT2通道SocketLablelblIPAddressT2IP地址LablelblPortT2端口號LablelblAppIDT2AppIDLablelblPasswordT2Password4、設置TextBox屬性控件Name屬性Text屬性TextBoxtxtIPAddressT130TextBoxtxtPortT14000TextBoxtxtAppIDT11001TextBoxtxtPasswordT1KingvczigvineTextBoxtxtIPAddressT230TextBoxtxtPortT24000TextBoxtxtAppIDT21001TextBoxtxtPasswordT2Kingvczigvine5、設置顯示信息內(nèi)容的TextBox屬性控件Name屬性Dock屬性Multiline屬性ReadOnle屬性ScorllBars屬性TextBoxtxtMessageConnectFillTrueTrueVertical6、設置GroupBox控件屬性控件Name屬性Text屬性GroupBoxgbSocket_T1T1通道SocketGroupBoxgbSocket_T2T2通道Socket7、設置Button按鈕事件控件Name屬性Text屬性UseVisualStyleBackColor屬性ButtonbtnConnectSocketT1SocketT1連接TrueButtonbtnConnectT1T1通道連接TrueButtonbtnConnectSocketT2SocketT2連接TrueButtonbtnConnectT2T2通道連接True8、窗體后臺代碼:1) 定義變量 /定義一個函數(shù)結(jié)構(gòu)的委托 private delegate void ShowMessageDel(TextBox txt, string msg); private delegate void ShowMessageDelOfTempLabel(Label lbl, string value); /實例化T1數(shù)據(jù)包消息類 private GRIP_Message messageT1 = new GRIP_Message(); /實例化T2數(shù)據(jù)包消息類 private GRIP_Message messageT2 = new GRIP_Message(); /定義T1Socket通訊接口 private Socket socketT1; /定義T2Socket通訊接口 private Socket socketT2; /定義T1通道流水號 private UInt16 sequenceIDT1; /定義T2通道流水號 private UInt16 sequenceIDT2; private int time; /定義一個線程 private Thread thread; /sessionID為連接后網(wǎng)關隨機分配的一個標識ID private string sessionID = ;2) 構(gòu)造函數(shù)/ / 構(gòu)造函數(shù) / public frmZigBee() InitializeComponent(); 3) 編寫方法Socket發(fā)送消息方法 / / Socket發(fā)送消息方法 / / 要發(fā)送的字節(jié)數(shù)組 / Socket實例 / 已發(fā)送的長度 private void SendMsg(byte msgSend, Socket socket, int lenSend) /需對發(fā)送的字節(jié)長度有明確認識,發(fā)送一段字節(jié)后需要加上該段字節(jié)的長度 while (lenSend msgSend.Length) lenSend += socket.Send(msgSend, lenSend, msgSend.Length - lenSend, SocketFlags.None); Socket接收信息的方法 / / Socket接收消息方法 / / 要接收的字節(jié)數(shù)組 / Socket實例 / 已接收的長度 private void RecvMsg(byte msgRecv, Socket socket, int lenRecv) while (lenRecv msgRecv.Length) lenRecv += socket.Receive(msgRecv, lenRecv, msgRecv.Length - lenRecv, SocketFlags.None); 在控件中顯示信息的方法/ / 在控件中顯示消息的方法 / / / private void ShowMessage(TextBox txt, string msg) if (txt.InvokeRequired) ShowMessageDel smd = new ShowMessageDel(ShowMessage); txt.Invoke(smd, txt, msg); else txt.Text += rn【 + DateTime.Now.ToString(yyyy-MM-dd hh-mm-ss) + 】 + msg; 在Label控件中顯示消息的方法 / / 在Label控件中顯示消息的方法 / / 控件名稱 / 要顯示的值 private void ShowTempValue(Label lbl, string value) if (lbl.InvokeRequired) ShowMessageDelOfTempLabel smd = new ShowMessageDelOfTempLabel(ShowTempValue); lbl.Invoke(smd, lbl, value); else lbl.Text = value; 線程方法/ / T2通道線程執(zhí)行方法 / private void Run() try while (true) #region 解析消息頭 /定義一個byte類型的6位數(shù)組 byte msgRecvHeadBytes = new byte6; /接收到的消息頭的長度 int lenRecv = 0; /Socket接收消息的方法 RecvMsg(msgRecvHeadBytes, this.socketT2, lenRecv); /實例化一個消息頭類 GRIP_MessageHead msgHeadRecv = new GRIP_MessageHead(); /對接收到的消息頭進行轉(zhuǎn)換 msgHeadRecv.GetHeadBytesOfRecive(msgRecvHeadBytes, 0, 6); #endregion #region 心跳包 if (msgHeadRecv.MessageCommand = (UInt16)GRIP_Message_CommandID.NWM_HEARTBEAT) try /消息的長度為16位無符號整數(shù) UInt16 messageLength = 0; /心跳報消息體信息為空 UInt16 messageCommand = (UInt16)GRIP_Message_CommandID.NWM_HEARTBEAT_RESP; /獲取獲取流水號 UInt16 sequenceID = msgHeadRecv.SequenceID; /實例化一個消息頭類 GRIP_MessageHead msgHeadSend = new GRIP_MessageHead(messageLength, messageCommand, sequenceID); /按照本地字節(jié)轉(zhuǎn)換發(fā)送的信息 byte msgSend = msgHeadSend.GetHeadBytesOfSend(); /發(fā)送信息方法 SendMsg(msgSend, this.socketT2, 0); /MessageBox.Show(【T2通道心跳包】發(fā)送成功); catch (Exception ex) MessageBox.Show(【T2通道心跳包】錯誤:+ ex.Message); #endregion #region Status_Report /判斷消息頭返回命令字是否正確 if (msgHeadRecv.MessageCommand = (UInt16)GRIP_Message_CommandID.NWM_STATUS_REPORT) try /定義一個消息頭字節(jié)長度的byte數(shù)組 byte msgBodyRecvBytes = new bytemsgHeadRecv.MessageLength; /定義消息體長度變量 int lenBodyRecv = 0; /Socket接收信息方法接收信息 RecvMsg(msgBodyRecvBytes, this.socketT2, lenBodyRecv); /實例化節(jié)點報告命令 GRIP_MessageBody_Status_Report msgBodyRecv = new GRIP_MessageBody_Status_Report(); /按照本地字節(jié)和網(wǎng)絡字節(jié)的順序轉(zhuǎn)換接收到的消息體 msgBodyRecv.ConvertReciveBytes(msgBodyRecvBytes); UInt16 status = 0; /實例化節(jié)點報告命令響應 GRIP_MessageBody_Status_Report_Resp msgBodySend = new GRIP_MessageBody_Status_Report_Resp(status); /實例化消息頭類,并將響應參數(shù)傳入 GRIP_MessageHead msgHeadSend = new GRIP_MessageHead(msgBodySend.BodyLength, (UInt16)GRIP_Message_CommandID.NWM_STATUS_REPORT_RESP, msgHeadRecv.SequenceID); /獲取發(fā)送的數(shù)據(jù)包的byte數(shù)組 byte msgSend = this.messageT2.GetSendMessage(msgHeadSend, msgBodySend); int lenSend = 0; /發(fā)送消息 SendMsg(msgSend, this.socketT2, lenSend); if (this.sessionID = msgBodyRecv.SessionID) this.ShowMessage(this.txtMessagePing, rn); this.ShowMessage(this.txtMessagePing, 【Status_Report】指令成功); this.ShowMessage(this.txtMessagePing, 【Status_Report】IEEEAddress: + msgBodyRecv.Node.IEEEAddress); this.ShowMessage(this.txtMessagePing, 【Status_Report】ShortAddress: + msgBodyRecv.Node.ShortAddress.ToString(X4); this.ShowMessage(this.txtMessagePing, 【?Status_Report】Cause: + msgBodyRecv.Cause); this.ShowMessage(this.txtMessagePing, 【Status_Report】SessionID: + msgBodyRecv.SessionID); this.ShowMessage(this.txtMessagePing, 【Status_Report】DeviceName: + msgBodyRecv.DeviceName); this.ShowMessage(this.txtMessagePing, 【Status_Report】DeviceType: + msgBodyRecv.DeviceType); this.ShowMessage(this.txtMessagePing, 【Status_Report】Status: + msgBodyRecv.Status); this.ShowMessage(this.txtMessagePing, 【Status_Report】PanID: + msgBodyRecv.PanID + - + msgBodyRecv.PanID.ToString(X4); this.ShowMessage(this.txtMessagePing, 【Status_Report】ParentIEEEAddress: + msgBodyRecv.ParentNode.IEEEAddress); this.ShowMessage(this.txtMessagePing, 【Status_Report】ParentShortAddress: + msgBodyRecv.ParentNode.ShortAddress.ToString(X4); this.ShowMessage(this.txtMessagePing, 【Status_Report】SensorEnable: + msgBodyRecv.SensorEnable); this.ShowMessage(this.txtMessagePing,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電商內(nèi)容營銷策略升級:2025年種草經(jīng)濟下的品牌形象塑造報告
- 環(huán)保產(chǎn)業(yè)園區(qū)的產(chǎn)業(yè)集聚與區(qū)域綠色旅游協(xié)同發(fā)展報告001
- 2025年醫(yī)院信息化建設:電子病歷系統(tǒng)智能藥物市場機遇優(yōu)化報告
- 2025年醫(yī)院電子病歷系統(tǒng)優(yōu)化與醫(yī)療信息化投資分析報告
- 2025年醫(yī)院電子病歷系統(tǒng)優(yōu)化構(gòu)建醫(yī)療信息化協(xié)同發(fā)展報告
- 2025年金融科技安全報告:網(wǎng)絡安全與數(shù)據(jù)保護的關鍵措施001
- 2025年互聯(lián)網(wǎng)廣告精準投放算法效果評測與廣告主滿意度調(diào)查報告
- 2025年醫(yī)藥流通行業(yè)供應鏈整合與成本控制戰(zhàn)略規(guī)劃與優(yōu)化策略實施案例分析報告解讀
- 周瑜人物介紹
- 建筑信息模型(BIM)在全過程建筑工程抗震加固中的應用報告2025
- 股骨粗隆間骨折護理疑難病例討論
- 電動車充電樁設計
- 2024年全球及中國臺式掃描電子顯微鏡(SEM)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 輥壓機的運行與維護
- 福建福州鼓樓區(qū)小學2025屆五年級數(shù)學第二學期期末經(jīng)典試題含答案
- 化工投資項目可研報告編制辦法(中石化聯(lián)產(chǎn)發(fā)2025115號)
- 項目管理與工期控制
- 2025年山西云時代技術有限公司招聘筆試參考題庫含答案解析
- 自身崗位講安全
- 新媒體運營實戰(zhàn)與自媒體平臺選擇指南
- 《保密意識培訓》課件
評論
0/150
提交評論