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”]这样就好了。是要库调用的对,一切就没问题。