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通讯软体