【得捷电子Follow me第4期】基础任务二:在开发板上运行WEB服务控制LED
[复制链接]
基础任务二:主控板建立TCPIP或UDP服务器,局域网PC使用TCPIP或UDP客户端进行连接并发送数据,主控板接收到数据后,送液晶屏显示(没有则通过串口打印显示);通过抓包软件抓取交互报文,展示并分析。(TCP和UDP二选一,或者全都操作)
在 【得捷电子Follow me第4期】基础任务一加餐:使用mDNS服务向局域网发布自身IP地址 中,分享了mDNS服务的基本使用。
这篇分享,就在此基础上,来启动一个WWW服务,通过WWW服务,来时先LED的控制。WWW服务属于TCPIP服务,正好用于完成任务二。
一、代码编写
因为之前的任务,已经完成了基础网络配置的操作,所以这里,直接就上这个部分的代码。
以下代码为添加的代码:
// LED控制
int ledPin = LED_BUILTIN;
// 网络服务客户端
EthernetClient client;
bool haveClient = false;
// WWW服务
#define SERVER_PORT 80
// 有线网络服务
EthernetServer server(SERVER_PORT);
String HTTP_req; // stores the HTTP request
boolean LED_status = LOW; // state of LED, off by default
// switch LED and send back HTML for LED checkbox
void ProcessRequest(EthernetClient cl) {
if (HTTP_req.indexOf("LED=on") > -1) {
LED_status = HIGH;
}
if (HTTP_req.indexOf("LED=off") > -1) {
LED_status = LOW;
}
if (HTTP_req.indexOf("LED=sw") > -1) {
LED_status = !LED_status;
}
if (LED_status) { // 点亮
Serial.println("LED ON");
digitalWrite(ledPin, HIGH);
cl.println("ON");
} else { // 熄灭
Serial.println("LED OFF");
digitalWrite(ledPin, LOW);
cl.println("OFF");
}
}
void setup() {
// 配置LED
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// 在联网成功以后,添加如下的代码
// 开启mDNS服务
Serial.println("mdns Begin");
mdns.begin(Ethernet.localIP(), "arduino_pico");
Serial.println("addServiceRecord");
// 注册www服务
Serial.println("server_www Begin");
server.begin();
mdns.addServiceRecord("Arduino mDNS Webserver Example._http",
SERVER_PORT,
MDNSServiceTCP);
}
void loop() {
// mDNS运行检查
mdns.run();
// 获取客户端连接
client = server.available();
if (client) {
// HTTP请求以空行结束检查
bool current_line_is_blank = true;
haveClient = false;
while (client.connected()) {
// 检查客户端是否存活
if (client.available()) {
// 检查是否连接开始
if (!haveClient) {
haveClient = true;
Serial.print("client request, ip is ");
Serial.println(client.remoteIP());
}
// 读取请求字符
char c = client.read();
HTTP_req += String(c);
if (c == '\n' && current_line_is_blank) {
// 返回
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("Hello from a mDNS-enabled web-server running ");
client.println("on your W5500_Evb_Pico board!");
client.println("");
client.print("Your ip is ");
client.println(client.remoteIP());
client.println("");
client.print("Set LED ");
// 处理请求
ProcessRequest(client);
// 处理结束
haveClient = false;
Serial.print(HTTP_req);
HTTP_req = "";
break;
}
if (c == '\n') {
// 换行
current_line_is_blank = true;
} else if (c != '\r') {
// 非换行字符读取
current_line_is_blank = false;
}
}
}
// 等待信息输出
delay(1);
// 结束连接
client.stop();
Serial.println("client disconnected");
}
}
上述代码中,使用 EthernetServer 开启了一个80端口的TCPIP服务,并使用 mdns.addServiceRecord()来向mDNS中注册这个服务。
然后,在loop()中,检查是否有客户端连接,如果有连接,则读取数据,并检查一遍执行LED控制。
控制LED的参数,通过WWW请求的网址中来传送:
- ?LED=on:点亮LED
-
?LED=off:熄灭LED
-
?LED=sw:切换LED
上述代码编译下载后,运行结果如下:
二、电脑请求
在电脑上,使用mDNS本地名称,分别访问如下的网站:
得到的结果,分别如下:
1. 点亮LED:
开发板输出:
2. 熄灭:
开发板输出如下:
3. 切换:
开发板输出如下:
同时,请求时,查看开发板,板载LED将会随着请求而点亮、熄灭、切换。
三、总结
这篇分享,结合mDNS服务,来发布WWW服务,从而使得在其他设备上,通过mDNS名称即可访问开发板上的服务,非常的方便。
|