背景
在一次小程序開發需求中,需要開發投影儀設備遙控功能。為了提升用戶的體驗需要實現手機與投影儀設備之間的近場發現(類似於局域網之間的設備進行WIFI配對)。最初選型為局域網內的設備發現,后根據小程序文檔得知 iOS 微信客戶端 7.0.18 及以上版本無法使用 mDNS 相關接口,安卓版本不受影響。所以將使用藍牙功能來補充局域網設備發現的部分缺陷。本篇幅不介紹藍牙相關的能力開發。
介紹
通常我們做網絡之間的通訊無論是 TCP、UDP或者是 HTTP等協議我們都需要知道對等方的 IP地址(域名)和端口號。但是在局域網環境下一般來說設備的IP地址都是由 DHCP進行動態分配,不能保證同一設備在同一局域網段內的 IP地址每次都相同。此時如果一台主機在局域網內建立了網絡服務,作為客戶端是無法得知服務的 IP地址的,也就無法建立網絡通訊,此時我們就需要用到 mDNS協議。
mDNS
-
mDNS 基於 UDP 協議。
-
mDNS 一般作用在一個局域網內的,有特定的 IP 地址,也就是 224.0.0.251,有特定的端口 5353。
-
mDNS 的作用是實現局域網內的服務發現,查詢,注冊
每個進入局域網的主機,如果開啟了 mDNS 服務的話,都會向局域網內的所有主機組播一個消息,核心內容是:我是誰,和我的IP地址是多少。
舉個例子:
A 主機進入局域網,開啟了 mDNS 服務,並向 mDNS 服務注冊以下信息:我提供 TCP 服務,我的 IP 是 192.168.1.101,端口是 9504。當 B 主機進入局域網,並向 B 主機的 mDNS 服務請求,我要找局域網內 TCP 服務器,B主機的 mDNS 就會去局域網內向其他的 mDNS 詢問,並且最終告訴你,有一個IP地址為 192.168.1.101,端口號是 9504 的主機,也就是 A 主機提供 TCP 服務,所以 B 主機就知道了 A 主機的 IP 地址和端口號了。
上述這些就能對近場設備發現功能的實現提供一些思路,我們只需要讓投影儀設備在 mDNS服務上注冊一條提供 TCP服務的信息,此時手機端小程序調用mDNS接口發現投影儀設備給出的信息,再建立小程序與投影儀之間的 TCP連接,后面的內容實現起來就是常規操作了
調試工具
-
avahi:Linux下實現(http://www.avahi.org/)
-
jmDNS:JAVA實現(http://jmdns.sourceforge.net/)
-
Bonjour:MAC OS實現(默認安裝)和 Windows下實現(需要安裝Bonjour Print Services)
文檔
-
avahi操作方法:https://blog.csdn.net/baidu_26678247/article/details/117934516
-
Bonjour Windows下操作方法:首先安裝完成 Bonjour Print Services后即可在命令行中使用 dns-sd命令,后續操作文檔:https://docs.oracle.com/cd/E56344_01/html/E54077/dns-sd-1m.html
