MDNS - 在 Arduino IDE 上设置 mDNS 客户端
材料准备
AmebaD [AMB21 / AMB22 / AMB23 / BW16] x 1
范例说明
mDNS (Multicast DNS) 是适用于区域网路里,让对方知道自己IP与所提供的服务的协定。mDNS是基于UDP的协定,在IPV4底下会发送封包至224.0.0.251, 使用的port为5353。
Instance Name: 用来识别服务的名称
Protocol Name: 分成两部分, 前半是关于这个服务的名称, 会前缀一个底线, 后半则是所使用的transport protocol name, 一样会前缀底线
Domain: 通常都是区域网路
“File” → “Examples” → “AmebaMDNS” → “mdns_on_arduino_ide”
Next, go to (“Tools” → “Port”), and you can find out at least one Serial Port. This port is simulated by Ameba board via USB. Choose this port and upload the compiled code to 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的范例里说明)
你的电脑与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);