1. 程式人生 > >自己構建一個裝置自發現的應用

自己構建一個裝置自發現的應用

最近在研究一個國產協議IGRS,貌似是根據UPNP改的 研究得不深,只是看了它的基礎協議文件而已。 分享自己的一點小心得,向大家介紹一下, 如何實現區域網內的所有終端(phone/comper/TV...)能相互發現。 所謂相互發現就是指:不需要自己手動的輸入IP來指定相應的電腦。 接下來,開始建立我們自己的裝置發現協議: 1、協議在TCP/IP協議棧的實現位置 (應用層)借用HTTP的規範,在應用層實現我們的協議資料包。 (傳輸層)使用組播的方法,實現資料包在組播範圍內傳送。 (網路層)預設 (資料鏈路層)預設 2、實現的原理 當知道資料的傳送是通過組播的方式時,聰明的你可能已經猜出答案了, 那就是定時傳送自己的“線上宣告”告訴組內的所有成員我“線上”, “線上宣告”就是我們要定義的第一個資料包(後文再說)。 當組內的其他成員在收到你的“線上宣告”後,就能知道你的裝置資訊了, 其他的裝置可以回覆你,也可以不回覆你,這裡為了簡化就當做不回覆處理了。 當你完成了“線上宣告”後,接下來就是接收其他成員的資訊, 在大多數情況下都會接收到其他成員的“線上宣告”, 這時你要做的事情就是——記錄,這樣一段時間後區域網內所有裝置資訊你都會知道了。 裝置線上的時候會不停的傳送“線上宣告”,所以你知道他一直線上, 但不可能所有裝置都是24小時處於開機狀態的, 所以當裝置關機,也就是離線的時候需要告知區域網內的其他成員,他下線了 這時他就需要傳送一個“離線宣告”, 當其他成員再收到“離線宣告”後,就需要將這臺離線裝置的資訊刪除(或標註離線)。 以上都是在理想的狀態下的線上與離線, 但網路這東西經常會出錯,所以必須考慮發生錯誤後如何處理, 這裡我們進行簡化,假設只會出現:裝置異常離線(斷電、宕機...)這個錯誤情況 裝置異常離線會導致“離線宣告”無法發出,不能通知其他成員自己已經下線。 所以此處需要新增一個裝置線上的超時操作,超時後將該裝置判斷為異常離線, 當接收到一個“線上宣告”時,就開始記錄這個裝置的線上狀況,比如:最大生存時間(單位s) 在最大生存期內,再次接到相同裝置的“線上宣告”就重新整理最大生存時間, 當最大生存時間沒能得到及時重新整理,就可能變為0(時間不斷減少),、 當為0時可以判斷此裝置已經異常離線。 這樣的超時操作可以比較好的判斷裝置是否異常離線了, 但需要不停的傳送“線上宣告”,用來重新整理最大生存時間。 3、協議資料包的實現 基於HTTP協議的實現方法 線上宣告:告知網內的其他裝置自己的線上狀況,重新整理生存時間 NOTIFY * HTTP/1.1\r\n                  //頭部 01-MessageType:DeviceOnline\r\n   //訊息型別 01-MaxAge:60\r\n                          //60秒的生存時間 01-PipeIp:192.168.0.1\r\n            //自己裝置的ip地址 01-PipePort:3880\r\n                    //通訊用的埠號 01-DeviceName:dev\r\n               //裝置名稱 線上宣告發送的時間間隔要小於生存時間 離線宣告:告知網內的其他裝置自己離開網路 NOTIFY * HTTP/1.1\r\n                  //頭部 01-MessageType:DeviceOffline\r\n   //訊息型別 4、用途 當你可以通過實現了此協議的程式,獲得其他裝置的資訊時, 你會發現可以讓很多過去很麻煩的事情變得簡單, 最簡單的例項就是:不同裝置間的資源共享(指不同作業系統間)。