MDNS - 在 Arduino IDE 上設置 mDNS 客戶端
材料準備
- AmebaD [ AMB23 / AMB21 / AMB22 / BW16 / AW-CU488 Thing Plus ] x 1
範例說明
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是可更改的名稱, 這裡我們使用預設值
接著在原本選Port的地方(“Tools” -> “Port”), 會看到至少一個Serial Port, 這個port是Ameba版子上經由USB模擬出來的Port, 這裡我們選這個Port, 然後編譯程式碼並上傳至Ameba
上傳完成後, 按下Ameba的Reset按鈕, 等待一會兒讓Ameba連上AP並且啟動mDNS服務, 我們可以在Serial Monitor看到底下的Log
接著我們再看看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的範例裡說明)
如果你的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);