大部分局域网设备搜索都是通过 UDP 广播实现的,原理很简单:
- 设备监听某个端口
- 搜索软件发送 UDP 广播到此端口
- 设备回复一个确认包
因为 UDP 协议是基于 IP 协议的,所以可以得到设备的 IP 地址。
在实际使用中会遇到一些其他问题,比如:
- 如果有其他设备也监听了同样的端口,如何区分不同的设备?
- 如何防止被其他软件搜索到?
- 假如设备出厂的时候是固定 IP 的(比如 192.168.0.100),并且和局域网的网段(比如 10.10.0.0/16)并不匹配,是否可以正常工作?
第一个问题好解决,可以在返回的确认包中约定特定的格式
第二个问题也好解决,可以在搜索消息中用密钥对消息进行签名消息防止伪造
第三个问题很有意思,经过试验,广播包是可以收到的,但是非广播包是无法收到的
因此在设备回复确认报的时候,并不可以直接用 remote address 作为目标地址,而是也同样 需要发送一个广播包才能实现通讯。这种情况下的通讯都是两边各自监听一个约定好的端口,然后互相发送 UDP 包来实现通讯的。