ESP32S2学习笔记——网络篇

说明

都是当客户端,没有服务器的栗子。只有POST和GET没有UDP什么的。

基于wifi

废话不多说,直接上代码。
初始化见下图,没连接上就一直打印 点。。。

<WIFI.h>
//set_up中添加
WiFi.begin("wifi的名字","wifi的密码");
while (WiFi.status() != WL_CONNECTED )
{
	delay(500);
	Serial.print(".");
}

连接上网络,一般会做什么事情?获取时间,天气?或者上传一些数据给服务器?
这里贴出两个常用的协议POST和GET

<HTTPClient.h>
 String callGet(String url)
{
  HTTPClient http;
  http.setTimeout(10000);//超时时间10s
  http.begin(url);
  int httpCode = http.GET();
  String payload = "";
  if (httpCode > 0)
  {
    if (httpCode == HTTP_CODE_OK)
    {
      payload = http.getString();
    }
  }
  http.end();
  return payload;
}

String callPost(String url, String postData)
{
  HTTPClient http;
  http.setTimeout(10000);//超时时间10s
  http.begin(url);
  int httpCode = http.POST(postData);
  String payload = "";
  if (httpCode > 0)
  {
    if (httpCode == HTTP_CODE_OK)
    {
      payload = http.getString();
    }
  }
  httpPost.end();
  return payload;
}

简单示例一下

String OutData = "";
OutData = callGet("http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp");
Serial.println(OutData );

返回的结果
{
“api”: “mtop.common.getTimestamp”,
“v”: “*”,
“ret”: [
“SUCCESS::接口调用成功”
],
“data”: {
“t”: “1640854509167”
}
}

基于w5500的有线网口

wifi的各种功能官方SDK已经自带了,w5500的驱动库需要额外的去下载。
通过项目-管理库-加载库 搜索并下载。在这里插入图片描述
根据PCB实际连接引脚,修改你所下载的库文件。进入你当前工程的目录,在首选项中查看。
在这里插入图片描述
打开后里面有个libraries的文件夹,进入打开\libraries\Ethernet2\src目录,找到w5500.cpp文件。因为w5500是SPI通信的网口芯片,所以在这里找到SPI.begin(xx,xx,xx,xx),根据自己情况进行配置。

应用的话也是包含头文件,调用函数,这里使用的是DHCP也就是动态IP的方式。如果使用静态IP参考Ethernet2.cpp中的几个begin函数。

#include <Ethernet2.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
void w5500_init(void)
{
	pinMode(8, OUTPUT); //这是w5500硬件复位引脚 
  	digitalWrite(8, LOW);
    delay(100);
    digitalWrite(8, HIGH);
    delay(500);
    if (Ethernet.begin(mac) == 0) //此函数中调用了软件复位 但是效果没有硬件复位好
    {
      //初始化失败
    }
    else
    {
   	 //初始化成功
    }
}

同样也写一个POST和GET函数。

EthernetClient client;
String inData;
void w5500_GET(void)
{
   client.stop();
   if (client.connect("api.m.taobao.com", 80)) {
     Serial.println("connecting...");
 
     client.println("GET /rest/api3.do?api=mtop.common.getTimestamp HTTP/1.1");
     client.println("Host: api.m.taobao.com");
     client.println("User-Agent: arduino-ethernet");
     client.println("Connection: close");
     client.println();
 
     delay(100);
     while(client.available()) 
     {
       char thisChar = client.read();
       inData += thisChar;
     }
}

这个返回的信息就比较多了,懒不贴了。贴一个提取从接收到“{”再开始读取的代码吧,这样接收的字符串就和wifi提取到的字符串一样了,方便后面数据的提取。

void w5500_GET(void)
{
   client.stop();
   if (client.connect("api.m.taobao.com", 80)) {
     Serial.println("connecting...");
 
     client.println("GET /rest/api3.do?api=mtop.common.getTimestamp HTTP/1.1");
     client.println("Host: api.m.taobao.com");
     client.println("User-Agent: arduino-ethernet");
     client.println("Connection: close");
     client.println();
 
     delay(100);
     while(client.available()) 
     {
      char thisChar = client.read();
       //inData += thisChar;
       if ((char)thisChar == '{') 
       {
          do 
          {
             inData += (char)thisChar;
             thisChar = client.read();
          }
          while (client.available());
          inData += (char)thisChar;
       }
     }
   }
}

返回数据的处理

假设我们已经有了这个字符串String OutData =
{
“api”: “mtop.common.getTimestamp”,
“v”: “*”,
“ret”: [
“SUCCESS::接口调用成功”
],
“data”: {
“t”: “1640854509167”
}
}

#include <Ethernet2.h>
#include <ArduinoJson.h>
void Test(String OutData  )
{
     DynamicJsonDocument doc(512);
     DeserializationError error = deserializeJson(doc, OutData );
     if (!error)
     {
       String Timestamp= doc["data"]["t"];
       Serial.println(Timestamp);
     }
     doc.clear();
}

这样t就提取出来了,以此类推想要提取“api”就doc[“api”]这样就好了。是要库调用的对,一切就没问题。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值