MDNS - 在 Arduino IDE 上設置 mDNS 客戶端

材料準備

範例說明

mDNS (Multicast DNS) 是適用於區域網路裡,讓對方知道自己IP與所提供的服務的協定。mDNS是基於UDP的協定,在IPV4底下會發送封包至224.0.0.251, 使用的port為5353。
服務的命名遵循底下的格式: {Instance Name}.{Protocol Name}.{Domain}
其中

  • Instance Name: 用來識別服務的名稱
  • Protocol Name: 分成兩部份, 前半是關於這個服務的名稱, 會前綴一個底線, 後半則是所使用的transport protocol name, 一樣會前綴底線
  • Domain: 通常都是區域網路

舉例來說, Arduino IDE在OTA使用到的mDNS服務命名如下: MyAmeba._arduino._tcp.local
其中MyAmeba可以用來識別我們的Ameba裝置名稱, 這個名稱可以更改。後面的_arduino._tcp則是Arduino IDE使用的協定, 而Domain通常都是local

我們打開範例, “File” -> “Examples” -> “AmebaMDNS” -> “mdns_on_arduino_ide”
這個範例會使用到WiFi, 所以我們將AP的ssid與密碼填入
接著我們在宣告MDNS Service的地方會看到我們將服務的名稱填入, 其中MyAmeba是可更改的名稱, 這裡我們使用預設值1

接著在原本選Port的地方(“Tools” -> “Port”), 會看到至少一個Serial Port, 這個port是Ameba版子上經由USB模擬出來的Port, 這裡我們選這個Port, 然後編譯程式碼並上傳至Ameba
2

上傳完成後, 按下Ameba的Reset按鈕, 等待一會兒讓Ameba連上AP並且啟動mDNS服務, 我們可以在Serial Monitor看到底下的Log
3

接著我們再看看Port的地方, 會發現多了Network Ports的項目 “MyAmeba at 192.168.1.238 (Ameba RTL8722DM/RTL8722CSM)”, 其中MyAmeba是我們之前可以設定的裝置名稱, 後面的IP是Ameba連上AP之後取得的IP, 這個IP與Serial Monitor看到的IP應該是一樣的, 最後則是Ameba RTL8722DM/RTL8722CSM則是版子的類型名稱, 到這裡代表Ameba成功地讓Arduino IDE辨識出mDNS服務。(但是仍無法使用網路上傳程式碼的功能, 這部份會在OTA的範例裡說明)
4

如果你的Arduino IDE裡面沒有出現Network ports,請檢查:

  • 你的電腦與Ameba是否在同個區域網路裡?
  • 重開Arduino IDE試試看, Arduino IDE會重新找尋mDNS服務
  • 在Serial Monitor的log裡Ameba是否成功連上AP並且成功啟用mDNS

程式碼說明

程式一開始設定了mDNS服務,第一個參數是Instance Name, 在這個範例裡可以更改, 第二個參數是服務使用的協定, 對Arduino IDE而言會是 “_arduino._tcp”, 第三個參數是Domain, 通常是填 “local”, 第四個參數是這個服務所在的port, 這裡是5000, 範例裡沒有使用到。

MDNSService service("MyAmeba", "_arduino._tcp", "local", 5000);

連上網路之後, 我們對這個服務設定了一些文字欄位,以底下的例子來說, “board”是欄位名稱, “ameba_rtl8721d”則是欄位的值, “board”主要是讓Arduino IDE查找已安裝的SDK裡面是否有已知的裝置, 如果有的話則會使用該裝置的名稱,使用者有興趣的話可以將 “ameba_rtl8721d”改成 “yun”或其它值試試看有什麼效果。

service.addTxtRecord("board", strlen("ameba_rtl8721d"), "ameba_rtl8721d");

接著添加三個文字欄位 “auth_upload”, “tcp_check”, 以及 “ssh_upload”,這個範例裡並沒有啟用這些服務。

service.addTxtRecord("auth_upload", strlen("no"), "no");
service.addTxtRecord("tcp_check", strlen("no"), "no");
service.addTxtRecord("ssh_upload", strlen("no"), "no");

接著我們啟用MDNS

MDNS.begin();

並且註冊剛剛設定好的mDNS服務

MDNS.registerService(service);
請先確認已安裝QQ通訊軟體