Android與物聯網裝置通訊-利用UDP廣播來做裝置查詢

香脆的大雞排發表於2018-08-10

“三年級六班李子明同學,你媽媽拿了兩罐旺仔牛奶要給你!”.....

image.png

什麼是廣播?你還記得上小學的時候廣播站大喇叭嗎?沒有錯。就是在一個大家都能聽到的場景下對著一個口子傳遞資訊。也許都能聽到,但是對於廣播的接受者只關注自己需要的資訊。


章節

目錄

  • 需求
  • 思路與原理
  • 實現
  • 總結

需求

我們接著空調說,你現在是xx智慧空調的Android物聯工程師。

你現在擁有硬體:

  • wifi空調 x3
  • Android裝置 x1
  • wifi的路由器 x1

image.png

你研發的空調裝置和Android裝置已連線到路由上,它們已被分配各自的內網IP地址。 我們需要通過某種方式來使手機和空調之間能互相識別。

思路與原理

根據上面的條件我們可以分析到它們通過路由器的方式形成了一個區域網。而裝置只要在區域網中就具備了UDP的能力,我們可以利用UDP的廣播報文功能做查詢裝置。(請熟知廣播、多播、單播知識)

UDP廣播我們只需要利用廣播的特性,向固定的埠傳送資料即可。而IP使用固定的廣播地址255.255.255.255。 下面我畫一下流程。

image.png

這個流程很簡單,我們通過手機傳送一組UDP廣播,然後開啟監聽等待裝置響應手機。當區域網中存在多臺裝置的時候裝置會把自己的裝置號以及IP地址回覆給手機。此時在手機上就會收到多臺空調的回覆報文。這時我們只需要針對SN做業務區別。一般是針對不同的SN取別名。(別名有利於人識別,比如臥室空調、客廳空調等)我們通常把這個過程稱作握手協議搜尋配對協議

這裡我想丟擲一個問題讓讀者思考,裝置首次連線路由時怎麼填入wifi密碼呢?方法有很多,甚至有些方案都已經成熟到硬體廠商幫辦了。希望我們能有自己的思考。

下面我說下我知道的幾種方案:

  • 1.裝置自帶AP先開熱點讓手機連線,當連線後按照私有協議把裝置需要連線的ssid和密碼填入。
  • 2.裝置帶藍芽功能,通過藍芽和手機配對後連線wifi。
  • 3.利用802.11的物理層協議的Length欄位做透傳。代表廠商產品有SmartConfig、AirKiss方案等。
  • 4.NFC感應射頻等。
  • 5.聲波透傳。

上述方案中利用802.11協議的方案可能是最節省硬體成本的,其餘方案均要搭配其它元器件模組等。但是該方案會導致某些特殊型號的路由器上失效,目前博主暫未找到原因,可能和路由廠商對協議加密導致的。在實際環境場景中可以藉助第二臺手機開熱點搞定。總之沒有最優的方案,只有最符合工程需求的。

實現

不佔篇幅,這裡就不貼完整程式碼了,重要的是思路、重要的是思路、重要的是思路。

下面是傳送UDP報文的關鍵程式碼。就是前面幾章所有的知識點的彙集。把協議定好,按照協議拆解報文即可。

提供幾個關鍵的物件供參考:

  • DatagramSocket 含傳送和監聽方法
  • InetSocketAddress 地址和埠關係
  • DatagramPacket 資料包
 public void sendData(String host, int port, byte[] data)  {
        clientSocket = new DatagramSocket();         
        serverAddress = new InetSocketAddress(host, port);  
        DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress);
        clientSocket.send(packet);
        clientSocket.close();
        Log.d(TGA, "--->埠:" + port + " \n DATA:" + bytesToHexString(data, data.length));
    }
    
複製程式碼

值得注意的是UDP報文因為它是不可靠協議,我們需要自己在設計協議時帶上可識別頭欄位和資料校驗。


( ′◔ ‸◔`) 一拖再拖,一個月過去了,文章嚴重拖進度了。各種七七八八的事情。沒有更多的時間留給我寫部落格。總算安穩的在上海安頓了下來。下週就要踏入新公司的旅途。希望我還能在週末抽出時間寫文章。哈哈哈

相關文章