需求我们接着空调说,你现在是xx智能空调的Android物联工程师。
你现在拥有硬件:

  • wifi空调 x3
  • Android设备 x1
  • wifi的路由器 x1

1.jpg
你研发的空调设备和Android设备已连接到路由上,它们已被分配各自的内网IP地址。我们需要通过某种方式来使手机和空调之间能互相识别。
思路与原理根据上面的条件我们可以分析到它们通过路由器的方式形成了一个局域网。而设备只要在局域网中就具备了UDP的能力,我们可以利用UDP的广播报文功能做查找设备。(请熟知广播、多播、单播知识)
UDP广播我们只需要利用广播的特性,向固定的端口发送数据即可。而IP使用固定的广播地址255.255.255.255。下面我画一下流程。

1.jpg
这个流程很简单,我们通过手机发送一组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报文因为它是不可靠协议,我们需要自己在设计协议时带上可识别头字段和数据校验。