1、WIFI Server code
#include <Arduino.h>
#include <wifi.h>
#define HEART_PERIOD_SEC 180
#define TASK_PERIOD_SEC 5
#define PAYLOAD_BUFF_SIZE 50
#define SOCKET_RX_BUFF_SIZE 255
#define MAX_SRV_CLIENTS 4
#define MAX_AP_CONNECTS 10
#pragma pack(1)
typedef struct{
uint32_t timecnt;
char buff[PAYLOAD_BUFF_SIZE];
uint16_t sizebuff;
}payload_t;
#pragma pack()
const char *ssid = "esp_server_jacky";
const char *password = "12345678";
uint16_t serverPort = 12222; //服务器端口号
WiFiServer server; //声明一个客户端对象,用于与服务器进行连接
WiFiClient serverClients[MAX_SRV_CLIENTS];
IPAddress localIP(192,168,4,22);
IPAddress gateway(192,168,4,22);
IPAddress subnet(255,255,255,0);
bool isSocketTcpValid = false;
uint32_t timecnt = 0;
uint32_t heartBeatTimeCntLast = 0;
uint32_t taskSendTimeCntLast = 0;
payload_t myPayload;
uint8_t socketRxBuff[SOCKET_RX_BUFF_SIZE];
uint16_t socketRxLen;
uint16_t sendCnt = 0;
void setup() {
Serial.begin(9600);
Serial.println("----------------app start----------------");
WiFi.mode(WIFI_AP); //设置工作在AP模式 WIFI_AP
WiFi.softAPsetHostname("ESP32_NODE");
WiFi.softAPConfig(localIP,gateway,subnet);
while(!WiFi.softAP(ssid)){};
Serial.println("AP start success!");
Serial.print("host name: ");
Serial.println(WiFi.softAPgetHostname());
Serial.print("IP address: ");
Serial.println(WiFi.softAPIP()); //打印模块IP
Serial.print("mac Address: ");
Serial.println(WiFi.softAPmacAddress()); //打印网关地址
server.begin(serverPort); //服务器启动监听端口号12222
Serial.print("server listen port: ");
Serial.println(serverPort);
server.setNoDelay(true);
}
void loop() {
uint8_t i;
//检测服务器端是否有活动的客户端连接
if (server.hasClient()){
for(i = 0; i < MAX_SRV_CLIENTS; i++){
//查找空闲或者断开连接的客户端,并置为可用
if (!serverClients[i] || !serverClients[i].connected()){
if(serverClients[i]) serverClients[i].stop();
serverClients[i] = server.available();
Serial.print("New client: "); Serial.println(i);
continue;
}
}
//若没有可用客户端,则停止连接
WiFiClient serverClient = server.available();
serverClient.stop();
}
//检查客户端的数据
for(i = 0; i < MAX_SRV_CLIENTS; i++){
if (serverClients[i] && serverClients[i].connected()){
if(serverClients[i].available()){
//从Telnet客户端获取数据,并推送到URAT端口
while(serverClients[i].available()) Serial.write(serverClients[i].read());
}
}
}
}
2、WIFI Client code
#include <Arduino.h>
#include <wifi.h>
#define HEART_PERIOD_SEC 180
#define TASK_PERIOD_SEC 5
#define PAYLOAD_BUFF_SIZE 50
#define SOCKET_RX_BUFF_SIZE 255
#pragma pack(1)
typedef struct{
uint32_t timecnt;
char buff[PAYLOAD_BUFF_SIZE];
uint16_t sizebuff;
}payload_t;
#pragma pack()
const char *ssid = "Tsinghua17";
const char *password = "QINGHUA2019";
const IPAddress serverIP(121,36,229,131); //欲访问的地址 我的华为云
uint16_t serverPort = 12222; //服务器端口号
WiFiClient client; //声明一个客户端对象,用于与服务器进行连接
bool isSocketTcpValid = false;
uint32_t timecnt = 0;
uint32_t heartBeatTimeCntLast = 0;
uint32_t taskSendTimeCntLast = 0;
payload_t myPayload;
uint8_t socketRxBuff[SOCKET_RX_BUFF_SIZE];
uint16_t socketRxLen;
uint16_t sendCnt = 0;
void setup() {
Serial.begin(9600);
Serial.println();
WiFi.disconnect();
WiFi.mode(WIFI_STA); //设置工作在STA模式 WIFI_AP
WiFi.setSleep(false); //关闭STA模式下wifi休眠,提高响应速度
WiFi.setHostname("esp32_jacky"); //设置主机名
WiFi.begin(ssid,password);
while(!WiFi.isConnected()){
delay(500);
Serial.print(".");
}
Serial.println("WiFi Connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //打印模块IP
Serial.print("subnetMask: ");
Serial.println(WiFi.subnetMask()); //打印子网掩码
Serial.print("gateway: ");
Serial.println(WiFi.gatewayIP()); //打印网关地址
Serial.print("dns: ");
Serial.println(WiFi.dnsIP()); //打印DNS地址
Serial.print("mac Address: ");
Serial.println(WiFi.macAddress()); //打印mac地址
Serial.print("HostName: ");
Serial.println(WiFi.getHostname()); //打印主机名
Serial.println(WiFi.status());
}
void loop() {
//check valid and reconnect
if( !isSocketTcpValid ){
isSocketTcpValid = client.connect(serverIP, serverPort);
}
/*! write data */
timecnt = millis();
//heart beat
if(isSocketTcpValid && timecnt - heartBeatTimeCntLast >= HEART_PERIOD_SEC*1000){
client.write("client heart cmd");
heartBeatTimeCntLast = timecnt;
}
//task send
if(isSocketTcpValid && timecnt - taskSendTimeCntLast >= TASK_PERIOD_SEC*1000){
myPayload.timecnt = millis();
Serial.print("task send :");
Serial.println(++sendCnt);
myPayload.sizebuff = snprintf(myPayload.buff,PAYLOAD_BUFF_SIZE,"client payload: timemills %d",myPayload.timecnt);
client.write((char*)myPayload.buff,myPayload.sizebuff);
taskSendTimeCntLast = timecnt;
heartBeatTimeCntLast = timecnt;
}
/*! read data */
if (isSocketTcpValid && client.available()) //如果已连接或有收到的未读取的数据
{
socketRxLen = client.readBytes(socketRxBuff,SOCKET_RX_BUFF_SIZE);
socketRxBuff[socketRxLen] = 0;
Serial.println((char*)socketRxBuff);
}
}
client 关闭: client.stop();