流程
1.服务端设置WiFi热点账号密码。
2.服务端设置自身的IP和端口号。
3.客户端连接服务端的WiFi热点。
4.客户端通过服务端的IP和端口号建立TCP连接。
5.数据传输
下面的例子在 串口(URAT)—客户端----服务端----串口(URAT)是双向通的。
客户端TCP传输
#include <Arduino.h> //引用以使用ETH
#include <WiFiUdp.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <HTTPClient.h>
#define MAX_SRV_CLIENTS 20
const char* ssid = "SSID_Board_Number_3"; //设置自身WiFi热点账号
const char* password = "12345678"; //设置自身WiFi热点密码
uint8_t str[]={"Happy New Year !"}; //给客户端传输的数据
uint8_t Client_Counts; //连接的客户端数量
WiFiServer server(8086); //设置服务端端口号
WiFiClient serverClients[MAX_SRV_CLIENTS];
String aa = "";//接收到客户端的数据
char Send[256]={0};
char Rece[128]={0};
char SN[]={1,7,7,3,6,3,9,4,8,8,4};
IPAddress staticIP(192, 168, 4, 1);
IPAddress gateway(192, 168, 4, 1);
IPAddress subnet(255, 255, 255, 0);
//IPAddress dns(192, 168, 0,1);
void setup()
{
Serial.begin(115200);
WiFi.mode(WIFI_AP); //WiFi配置为AP模式
if(WiFi.softAPConfig(staticIP, gateway, subnet)==false)// 设置静态IP地址
{
Serial.println("Configuration failed.");
}
IPAddress ip = WiFi.softAPIP(); // 获取AP的IP地址
WiFi.softAP(ssid, password,1,0,4); //设置热点为显现,最大连接数量为4,生成WiFi热点
//Serial.print("IP address: ");
Serial.println(WiFi.softAPIP()); // 显示IP地址
server.begin();
}
void loop()
{
static uint16_t Rece_count;
uint8_t i,j;
//检测服务器端是否有活动的客户端连接
if (server.hasClient()) //检测是否有客户端连接
{
//查找空闲或者断开连接的客户端,并置为可用
if (!serverClients[Client_Counts] || !serverClients[Client_Counts].connected())
{
if(serverClients[Client_Counts]) serverClients[Client_Counts].stop();
serverClients[Client_Counts] = server.available();
Serial.print("New client: "); Serial.println(Client_Counts);
Client_Counts++;
}
//若没有可用客户端,则停止连接
WiFiClient serverClient = server.available();
serverClient.stop();
}
j=0;
while(Serial.available()) //接收串口发过来的数据
{ // 检查是否有数据可读
Send[j++] = Serial.read(); // 读取串口数据
// Serial.print("Received: ");
//Serial.println(data); // 打印接收到的数据
}
delay(2);
if(j>0)
{
for(i=0;i<Client_Counts;i++)
{
serverClients[i].write(Send,j); //通过TCP发送串口接收的数据给客户端
}
}
serverClients[i].write(SN,11);//发送SN码
for(i = 0; i < Client_Counts; i++) //轮询前面连接的所有客户端
{
if (serverClients[i] && serverClients[i].connected()) //看是否还保持连接
{
/*count++;
if(count==2000)
{
count=0;
serverClients[i].write(SN,11);
}*/
if(serverClients[i].available()) //检测是否有客户端数据
{
while(serverClients[i].available())//接收客户端数据
{
Rece[Rece_count++]= serverClients[i].read();
if(i==128)
{
break;
}
}
delay(2);
//Serial.println(aa);
//serverClients[i].write(Rece,j);
//serverClients[i].write(SN,11);
}
if(Rece_count>0)
{
Serial.write((byte*)&Rece, Rece_count); //把收到的客户端数据发给串口
}
Rece_count=0;
}
}
/* WiFiClient client = server.available();
if (client)
{
while (client.connected())
{
if (client.available())
{
char c = client.read();
// Handle client data here
Serial.println(c);
}
}
}
delay(500);
client.write(str,16);
while (client.available())
{
Serial.println("Connected");
char val = client.read();
Serial.print("val:");
Serial.println(val);
if(val=='a')
{
delay(1000);
client.print("bb");
client.flush();
}
} */
}
客户端TCP传输
#include <Arduino.h> //引用以使用ETH
#include <WiFiUdp.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <HTTPClient.h>
#define MAX_SRV_CLIENTS 10
const char* ssid = "SSID_Board_Number_3"; //服务端的热点账号
const char* password = "12345678"; //服务端的热点密码
//uint8_t str[]={"Happy New Year !"};
const char *host = "192.168.4.1";//要连接的tcp服务端地址
WiFiClient client;
const int tcpPort = 8086;//要连接的服务端的端口号
uint8_t str[]={"client2"};
uint8_t Rece[256]={0};
uint8_t Send[128]={0};
IPAddress staticIP(192, 168, 5, 12);
IPAddress gateway(192, 168, 5, 12);
IPAddress subnet(255, 255, 255, 0);
IPAddress dns(192, 168, 0,1);
void setup()
{
// 设置静态IP地址
Serial.begin(115200);//打开串口(URAT)
WiFi.mode(WIFI_STA); //配置为STA模式
//WiFi.setSleep(false); //关闭STA模式下wifi休眠,提高响应速度
/*if(WiFi.config(staticIP, gateway, subnet, dns, dns)==false)
{
Serial.println("Configuration failed.");
}*/
/*IPAddress ip = WiFi.localIP(); // 获取AP的IP地址
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); // 显示IP地址*/
WiFi.begin(ssid, password);//连接WiFi热点
while (WiFi.status() != WL_CONNECTED) //等待WiFi热点连接成功
{
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
while (!client.connected())//开始连接tcp服务器
{
if (!client.connect(host, tcpPort))
{
Serial.println("connection....");
//delay(5);
}
}
Serial.println("TCP connected Succeed");
}
void loop()
{
static uint8_t i,j;
static uint16_t count;
while(Serial.available()) // 检查是否有数据通过串口发过来
{
Send[j++] = Serial.read(); // 读取数据
// Serial.print("Received: ");
//Serial.println(data); // 打印接收到的数据
}
if(j>0)
{
client.write(Send,j); //把从串口收到的数据发送给服务端
j=0;
}
/*if(count==20000)
{
count=0;
client.write(str,7);
}
count++;*/
while (client.available()) //检测服务端是否有数据发过来
{
//Serial.println("Connected");
Rece[i++] = client.read();//接收服务端发过来的数据
//Serial.println(Rece[i]);
if(i==256)
{
break;
}
}
if(i>0)
{
Serial.write((byte*)&Rece, i); //把接收到的服务端的数据发送给串口
}
/*for(j=0;j<i;j++)
{
Serial.println(Rece[j]);
}*/
i=0;
}