İçindekiler:
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
Bu video tamamen "çoklu" ile ilgilidir. Çoklu görev, çoklu çekirdek ve çoklu istemcilerle uğraşıyoruz. Bir süre önce iki ESP ile bir uzaktan kumanda yaptım: bir istemci ve bir erişim noktası. Buna dayanarak, bugün çok istemcili bir sunucu kuracağız. Bu, tek bir ESP'ye bağlı birden fazla istemciye sahip olacağımız anlamına gelir.
Bu nedenle, bugünkü ders, ESP32'de bir sunucunun oluşturulmasını, döngüye yeni istemcilerin eklenmesini ve isteklerin başka bir çekirdekte ele alınmasını içerir. İstemciler, pinlerinin durum değişikliği hakkında bilgi gönderecek ve sunucu bu durum değişikliklerini yeniden üretecektir.
1. Adım: Gösteri
Adım 2: Sunucuyu Kurma
3. Adım: İstemci Derlemesi
4. Adım: Akış - Sunucu
Adım 5: Akış - İstemci
Adım 6: Client.ino
Bildirimler ve değişkenler
#include //Dados da rede //Deve ser giual no Server #define SSID "ESP32Server" #define PASSWORD "87654321" #define SERVER_PORT 5000 //Konex com o server WiFiClient client; //Yapısal kuyruk tanımlı işletim sistemi enviar enviar (geliştirme seri sunucu yok) typedef struct{ int sayı; int durumu; }Toplu iğne; //durum #define PIN_COUNT 2 //Array com os pinos definidos //Caso vamos trabalhar com os 21 ve 19 mas você pode alterar para os pinos que desejar Pin pinleri[PIN_COUNT] = { {.number = 21}, {.number = 19} };
Kurmak
geçersiz kurulum(){ Serial.begin(115200); //Tempo, her zaman için geçerli istemci.setTimeout(5000); //Conectamos à yeniden WiFi ve conectamos ao sunucu kurulumuWiFi(); connectClient(); for(int i=0; ben
WiFi Kurulumu
void setupWiFi(){ Serial.print("Bağlanıyor " + String(SSID)); //ESP WiFi.begin(SSID, PASSWORD); //Esperamos conectar while (WiFi.status() != WL_CONNECTED) { Serial.print("."); gecikme(500); } //WiFi Serial.println(); Serial.println("Bağlandı!"); }
ConnectClient
void connectClient(){ Serial.println("İstemci bağlanıyor"); //Esperamos conectar com o server while (!client.connect(WiFi.gatewayIP(), SERVER_PORT)) { Serial.print("."); gecikme(500); } //Sunucu için bir bağlantı oluştur Serial.println(); Serial.println("İstemci bağlandı!"); }
Döngü
void loop(){ //WiFi, mandamos conectar if(WiFi.status() != WL_CONNECTED) { setupWiFi(); } }
TutamaçBağlantısı
void handleConnection(void* pvParameters){ //ÖNEMLİ: Bir tarefa não pode terminar, deve ficar presa em um loop sonsuz while(true) { //Sunucu için sunucu, mandamos conectar if(!client.connected())) { connectClient(); } //Para cada pino, verifikamos se mudou o estado. Se mudou enviamos para o server o novo estado for(int i=0; i
hasPinStatusChanged
//Doğrulama ve doğrulama 'i' dizi mudou yapmak//Retorna 'true' se mudou u 'yanlış' caso contrário boolean hasPinStatusChanged(int i) { //Faz bir leitura do pino int pinStatus = digitalRead(pins) .sayı); // Farklı if(pins.status != pinStatus) { //Guardamos o novo estado e retornamos true pins.status = pinStatus; true döndür; } //Söz konusu chegará aqui se o estado não foi alterado //Então retornamos falso return false; }
sendPinStatus
//Envia para o server os dados pino ve posição 'i' yapmak arrayvoid sendPinStatus(int i) { client.write((uint8_t*)&pins, sizeof(Pin)); client.flush(); }
Adım 7: Server.ino
Bildirimler ve değişkenler
#include #include //Dados da rede //Müşteri seri yok #define SSID "ESP32Server" #define PASSWORD "87654321" #define SERVER_PORT 5000 // 'SERVER_PORT' porta tanımlı Criamos sunucusu WiFiSunucu sunucusu(SERVER_PORT); //Vector onde vamos adicionar os client'ları conecte eles forem conectando std::vector client; //Yapı que tanım os dados que vamos enviar (seri seri istemci yok) typedef struct{ int sayı; int durumu; }Toplu iğne;
Kurmak
geçersiz kurulum(){ Serial.begin(115200); //Criamos, WiFi ve sunucu kurulumuWiFi(); server.begin(); xTaskCreatePinnedToCore(handleClients, //Função que executada "handleClients", //Tarefa Nome 10000, //Tamanho da pilha NULL, //Parâmetro datarefa (caso não usamos yok) 2, //Öncelikli dara NULL, // Caso queria manter uma referência para a tarefa que vai ser criada (caso não precisamos yok) 0); //Número do core que será executada a tarefa (usamos o core 0 para o loop ficar livre com o core 1) }
KurulumWiFi
void setupWiFi(){ //Coloca este ESP como Erişim Noktası WiFi.mode(WIFI_AP); //SSID ve ESP için geçerli bir bağlantı WiFi.softAP(SSID, PASSWORD); }
Döngü
void loop(){ //Verifica se um novo client está tenando se conectar WiFiClient client = server.available(); //Se sim colocamos ele vektör yok if(client) { client.push_back(client); } }
HandleClients
void handleClients(void* pvParameters){ //ÖNEMLİ: Bir tarefa não pode terminar, deve ficar presa em um loop sonsuz while(true) { //Para cada client que temos no vector for(int i=0; i)
8. Adım: Dosyalar
Dosyaları indirin
BEN HAYIR