代码中只实现了两个客户端服务,可自行根据需要自行添加任务代码。
#include "WiFi.h"
#define USE_MULTCORE 0 //是否使用多核
#define MAX_SRV_CLIENTS 4
WiFiServer server(8080); //声明服务器对象及监听端口号
WiFiClient serverClients[MAX_SRV_CLIENTS]; //最大连接数数组0-MAX_SRV_CLIENTS
TimerHandle_t xTimer1; //定时器
SemaphoreHandle_t Tcp_sem; //二进制信号量
//SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount);//创建计数型信号量
EventGroupHandle_t xServerEventGroup1; //定义事件组句柄,用来指向创建的事件标志组.
// define led according to pin diagram
int led = 8;
// typedef enum {
// WIFI_OFF -关闭配网模式
// WIFI_STA -设置为STA模式
// WIFI_AP -设置为AP模式
// WIFI_AP_STA -设置为AP和STA共存模式
// } wifi_mode_t;
//多线程基于FREERTOS
//定时器回调函数
void xTime1Task(void *xTime1) {
//xSemaphoreGive(Tcp_sem);//发布信号量
//Serial.println("定时器1回调");
}
//回调函数任务
//创建服务器检测客户端介入并进行分配通信任务
void xTaskServerListen(void *xTask1)
{
bool TaskIDLE = true; //是否有通信任务空闲
int Channel = 0; //扫描到的下一个可用于通信的任务号 100:无任务 默认使用范围0-MAX_SRV_CLIENTS
WiFi.mode(WIFI_AP); //设置为接入点模式
WiFi.softAP("ESP_AP", "123456789");
Serial.println(WiFi.softAPIP()); //服务器本机IP
//启动SOFT服务器
server.begin();
server.setNoDelay(true);
while (1) {
// //WiFiClient client = server.available(); // 监听新客户端接入
//扫描是否有空闲通信任务
if ( TaskIDLE == false) {
for (int i = 0; i < MAX_SRV_CLIENTS; i++) {
if (!serverClients[i]) {
TaskIDLE = true; //是否有通信任务空闲
Channel = i;
Serial.println("有空闲任务");
break;
}
else {
Serial.println("无空闲任务,请等待");
TaskIDLE = false;
//Channel = 100;
}
}
}
if (TaskIDLE == true) //有空闲服务任务
{
serverClients[Channel] = server.available(); // 监听新客户端接入
if(serverClients[Channel]){
TaskIDLE = false;//更换下一个监听
//发送对应的服务任务事件标志位
xEventGroupSetBits(xServerEventGroup1, 0x01 << Channel);
}
//client.~ WiFiClient();
}
vTaskDelay(1);
//delay(500);
}
}
void xTaskOne(void *xTas