「三年級六班李子明同窗,你媽媽拿了兩罐旺仔牛奶要給你!」.....html
什麼是廣播?你還記得上小學的時候廣播站大喇叭嗎?沒有錯。就是在一個你們都能聽到的場景下對着一個口子傳遞信息。也許都能聽到,可是對於廣播的接受者只關注本身須要的信息。安全
咱們接着空調說,你如今是xx智能空調的Android物聯工程師。bash
你如今擁有硬件:服務器
你研發的空調設備和Android設備已鏈接到路由上,它們已被分配各自的內網IP地址。 咱們須要經過某種方式來使手機和空調之間能互相識別。網絡
根據上面的條件咱們能夠分析到它們經過路由器的方式造成了一個局域網。而設備只要在局域網中就具有了UDP的能力,咱們能夠利用UDP的廣播報文功能作查找設備。(請熟知廣播、多播、單播知識)加密
UDP廣播咱們只須要利用廣播的特性,向固定的端口發送數據便可。而IP使用固定的廣播地址255.255.255.255
。 下面我畫一下流程。spa
這個流程很簡單,咱們經過手機發送一組UDP廣播,而後開啓監聽等待設備響應手機。當局域網中存在多臺設備的時候設備會把本身的設備號以及IP地址回覆給手機。此時在手機上就會收到多臺空調的回覆報文。這時咱們只須要針對SN作業務區別。通常是針對不一樣的SN取別名。(別名有利於人識別,好比臥室空調、客廳空調等)咱們一般把這個過程稱做握手協議或搜索配對協議。設計
這裏我想拋出一個問題讓讀者思考,設備首次鏈接路由時怎麼填入wifi密碼呢?方法有不少,甚至有些方案都已經成熟到硬件廠商幫辦了。但願咱們能有本身的思考。調試
下面我說下我知道的幾種方案:code
上述方案中利用802.11協議的方案多是最節省硬件成本的,其他方案均要搭配其它元器件模塊等。可是該方案會致使某些特殊型號的路由器上失效,目前博主暫未找到緣由,可能和路由廠商對協議加密緻使的。在實際環境場景中能夠藉助第二臺手機開熱點搞定。總之沒有最優的方案,只有最符合工程需求的。
不佔篇幅,這裏就不貼完整代碼了,重要的是思路、重要的是思路、重要的是思路。
下面是發送UDP報文的關鍵代碼。就是前面幾章全部的知識點的聚集。把協議定好,按照協議拆解報文便可。
提供幾個關鍵的對象供參考:
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報文由於它是不可靠協議,咱們須要本身在設計協議時帶上可識別頭字段和數據校驗。
( ′◔ ‸◔`) 一拖再拖,一個月過去了,文章嚴重拖進度了。各類七七八八的事情。沒有更多的時間留給我寫博客。總算安穩的在上海安頓了下來。下週就要踏入新公司的旅途。但願我還能在週末抽出時間寫文章。哈哈哈