Daftar Isi:
2025 Pengarang: John Day | [email protected]. Terakhir diubah: 2025-01-13 06:57
Video ini adalah tentang "multi." Kita berurusan dengan multitasking, multicore, dan multiclient. Beberapa waktu yang lalu, saya membuat remote control dengan dua ESP: klien dan titik akses. Berdasarkan ini, hari ini kami akan menyiapkan server multiklien. Ini berarti kami akan memiliki banyak klien yang terhubung dalam satu ESP.
Jadi, pelajaran hari ini melibatkan pembuatan server di ESP32, penambahan klien baru dalam loop, dan penanganan permintaan di inti lain. Klien akan mengirimkan informasi tentang perubahan status pin mereka, dan server akan mereproduksi perubahan status ini.
Langkah 1: Demonstrasi
Langkah 2: Memasang Server
Langkah 3: Majelis Klien
Langkah 4: Aliran - Server
Langkah 5: Aliran - Klien
Langkah 6: Klien.ino
Deklarasi dan variabel
#include //Dados da rede //Deve ser giual no Server #define SSID "ESP32Server" #define PASSWORD "87654321" #define SERVER_PORT 5000 //Objeto que vai fazer a conexão com o server WiFiClient client; //Struct que define os dados que vamos enviar (deve ser igual no server) typedef struct{ int number; status int; }Pin; //Quantidade de pinos que iremos ler enviar o status #define PIN_COUNT 2 //Array com os pinos definidos //Tidak ada caso vamos trabalhar com os 21 e 19 mas você pode alterar para os pinos que desejar Pin pin[PIN_COUNT] = { {.number = 21}, {.number = 19} };
Mempersiapkan
void setup(){ Serial.begin(115200); //Tempo untuk mempertimbangkan conexão como perdida client.setTimeout(5000); //Conectamos rede WiFi dan conectamos dan setup serverWiFi(); menghubungkanKlien(); untuk(int i=0; i
Siapkan WiFi
void setupWiFi(){ Serial.print("Menghubungkan ke " + String(SSID)); //Conectamos rede WiFi criado pelo outro ESP WiFi.begin(SSID, PASSWORD); //Konektar Esperamos while (WiFi.status() != WL_CONNECTED) { Serial.print("."); penundaan (500); } //Se chegou aqui está conectado rede WiFi Serial.println(); Serial.println("Terhubung!"); }
HubungkanKlien
void connectClient(){ Serial.println("Menghubungkan klien"); //Esperamos conectar com o server while (!client.connect(WiFi.gatewayIP(), SERVER_PORT)) { Serial.print("."); penundaan (500); } //Se chegou aqui está conectado com o server Serial.println(); Serial.println("Klien terhubung!"); }
Lingkaran
void loop(){ //Se não estiver conectado rede WiFi, mandamos conectar if(WiFi.status() != WL_CONNECTED) { setupWiFi(); } }
MenanganiKoneksi
void handleConnection(void* pvParameters){ //PENTING: A tarefa não pode terminar, kembangkan ficar presa em um loop infinito while(true) { //Se no estiver conectado com o server, mandamos conectar if(!client.connected()) { connectClient(); } //Para cada pino, verificamos se mudou o estado. Se mudou enviamos para o server atau novo estado for(int i=0; i
memilikiPinStatusBerubah
//Verifikasi se o estado do pino na posição 'i' lakukan array mudou//Retorna 'true' se mudou ou 'false' caso contrário boolean hasPinStatusChanged(int i) { //Faz a leiura do pino int pinStatus = digitalRead(pin .nomor); //Se o estado lakukan pino untuk perbedaan if(pins.status != pinStatus) { //Guardamos o novo estado dan retornamos true pins.status = pinStatus; kembali benar; } //Só chegará aqui se o estado não foi alterado //Então retornamos falso return false; }
kirimPinStatus
//Envia para o server os dados lakukan pino dan posio 'saya' lakukan arrayvoid sendPinStatus(int i) { client.write((uint8_t*)&pin, sizeof(Pin)); klien.flush(); }
Langkah 7: Server.ino
Deklarasi dan variabel
#include #include //Dados da rede //Deve ser igual no Client #define SSID "ESP32Server" #define PASSWORD "87654321" #define SERVER_PORT 5000 //Criamos um server dan port yang ditentukan untuk server WiFiServer 'SERVER_PORT' (SERVER_PORT); //Vector pada klien vamos adicionar os sesuai dengan elemen sebelumnya conectando std::vektor klien; //Struct que define os dados que vamos enviar (deve ser igual no client) typedef struct{ int number; status int; }Pin;
Mempersiapkan
void setup(){ Serial.begin(115200); //Criamos a rede WiFi dan iniciamos o server setupWiFi(); server.mulai(); xTaskCreatePinnedToCore(handleClients, //Função que será executada "handleClients", //Nome da tarefa 10000, //Tamanho da pilha NULL, //Parâmetro da tarefa (no caso não usamos) 2, //Prioridade da tarefa NULL, //Prioridade da tarefa NULL, //Prioridade da tarefa NULL Caso queria manter uma referência para a tarefa que vai ser criada (tidak ada caso não precisamos) 0); //Nmero do core que será executada a tarefa (usamos o core 0 para o loop ficar livre com o core 1) }
SiapkanWiFi
void setupWiFi(){ //Coloca este ESP como Access Point WiFi.mode(WIFI_AP); //SSID dan Senha untuk terhubung dengan ESP WiFi.softAP(SSID, PASSWORD); }
Lingkaran
void loop(){ //Memverifikasi klien baru dan terhubung dengan klien WiFiClient = server.available(); //Se sim colocamos ele no vector if(client) { clients.push_back(client); } }
MenanganiKlien
void handleClients(void* pvParameters){ //PENTING: A tarefa não pode terminar, deve ficar presa em um loop infinito while(true) { //Para cada client que temos no vector for(int i=0; i
Langkah 8: File
Unduh file
SAYA TIDAK