466|0

253

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

【得捷电子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名称即可访问开发板上的服务,非常的方便。

 

 
点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
芯片封装技术

芯片封装技术 自从美国Intel公司1971年设计制造出4位微处a理器芯片以来,在20多年时间内,CPU从Intel4004、80286、80386、80486 ...

ESD问答

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 1、问:为什么有些ESD地线有阻抗而有些没有呢?  答:ESD地线的目的是将 ...

PCB设计技巧

PCB设计技巧

超声波测距资料与大家共享

超声波测距资料与大家共享

运放稳定性

运算放大器的稳定性设计,中文材料,不太清楚在这个论坛里有没有人上传过,要是没有会陆续更新。谢谢~~ 第一部分:环路稳定性基 ...

拥抱互联:汽车网关如何提升驾驶体验

汽车供应商和原始设备制造商正大力投资软件研发工作,以期增加新的功能和特性,从而实现自主性、电气化和连通性。但通过增加更多 ...

NVC语音ic离线常用型号!

NVC语音ic:NV020C、NV040C、NV080C、NV180C 分别对应20秒、40秒、80秒、180秒;

【平头哥RVB2601创意应用开发】开箱+详细图片分享

首先感谢EEWORLD,感谢平头哥,通过了我参与此次平头哥RVB2601创意应用开发的名额,给了怎么好的学习机会~Thank you!同时也 ...

童诗白模电书--电流并联负反馈电路关系式为什么带一个负号

624532 如上图,我感觉不应该带负号的呀?搞不明白,哪位大佬指点一下。

高云FPGA使用DDR剩余引脚使用问题

在早期高云的DDR设计参考手册里高云FPGA DDR3的设计参考手册 ,FPGA如果使用1:4模式模式下一个差分对如果有一个引脚用作DDR,另 ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表