Nell’articolo di oggi vedremo come utilizzare il protocollo TCP/IP su ESP32.
Ci sono due principali protagonisti nella comunicazione TCP/IP: il client ed il server.
Che cosa è il protocollo TCP/IP
TCP/IP è un protocollo di collegamento dati utilizzato in Internet per consentire a computer e altri dispositivi di inviare e ricevere dati. TCP/IP sta per Transmission Control Protocol/Internet Protocol, cioè un sistema che consente ai dispositivi connessi a Internet di comunicare tra loro attraverso le reti.
Il modello TCP/IP determina le modalità con cui i computer trasferiscono i dati da un dispositivo all’altro. L’accuratezza di questi dati deve essere mantenuta in modo che il destinatario riceva le stesse informazioni inviate dal mittente.
Quindi che cos’è TCP/IP e come funziona? Per garantire che ogni comunicazione raggiunga intatta la destinazione prevista, il modello TCP/IP suddivide i dati in pacchetti e poi li riassembla nel messaggio completo quando giunge a destinazione. L’invio dei dati in piccoli pacchetti rende più facile mantenere l’accuratezza rispetto all’invio di tutti i dati contemporaneamente.
Dopo che un singolo messaggio è stato suddiviso in pacchetti, questi possono seguire percorsi diversi se un percorso è congestionato. È come inviare per posta biglietti d’auguri diversi alla stessa persona. Scrivi i biglietti a casa tua, per poi lasciarne ognuno in una buca delle lettere diversa, con la possibilità che prendano percorsi diversi fino all’indirizzo di destinazione.
Cosa fare con ESP32
Installare processing dal seguente link https://processing.org/download/.
Estrarre la cartella compressa e cliccare su “processing.exe” come mostrato nell’immagine sottostante.
Una volta aperta l’applicazione andare su:
- Sketch
- Import Library
- Add library
- ricercare ControlP5
Copiare e incollare il seguente codice sull’IDE di processing.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 |
import controlP5.*; import processing.net.*; ControlP5 cp5; //Println console; Server myServer; Client myClient; int dataIn=0; int radioFlag1=0; int radioFlag2=0; int send_flag=1; void setup() { size(600,400); smooth(); noStroke(); cp5 = new ControlP5(this); cp5.addTab("default") .activateEvent(true) .setHeight(30) .setWidth(100) .setLabel("TCP Server") .setId(1) ; cp5.getTab("TCP Client") .activateEvent(true) .setHeight(30) .setWidth(100) .setId(2) ; cp5.addTextfield("Local IP") .setPosition(20,40) .setSize(160,40) .setFont(createFont("微软雅黑 Light",20)) .setColor(color(255,255,0)) .setColorLabel(color(0)) .setColorBackground(color(100,255)) .moveTo("default") ; cp5.addTextfield("Local PORT") .setPosition(20,120) .setSize(160,40) .setFont(createFont("微软雅黑 Light",20)) .setColor(color(255,255,0)) .setColorLabel(color(0)) .setColorBackground(color(100,255)) .setText("8888") .moveTo("default") ; cp5.addRadioButton("connect1") .setPosition(20,200) .setSize(100,25) .addItem("Listening", 1) .setColorLabel(color(0)) .moveTo("default") ; cp5.addTextfield("Remote IP") .setPosition(20,40) .setSize(160,40) .setFont(createFont("微软雅黑 Light",20)) .setColor(color(255,255,0)) .setColorLabel(color(0)) .setColorBackground(color(100,255)) .setText("192.168.1.xxx") .moveTo("TCP Client") ; cp5.addTextfield("Remote PORT") .setPosition(20,120) .setSize(160,40) .setFont(createFont("微软雅黑 Light",20)) .setColor(color(255,255,0)) .setColorLabel(color(0)) .setColorBackground(color(100,255)) .setText("80") .moveTo("TCP Client") ; cp5.addRadioButton("connect2") .setPosition(20,200) .setSize(100,25) .addItem("connect Server",1) .setColorLabel(color(0)) .moveTo("TCP Client") ; cp5.addTextarea("recvData") .setPosition(200,40) .setSize(350,150) .setFont(createFont("微软雅黑 Light",20)) .setColor(color(255,255,0)) .setColorBackground(color(100,255)) .scroll(15) .setColorForeground(color(0,100)) .moveTo("global") ; cp5.addTextfield("sendData") .setPosition(200,230) .setSize(350,80) .setFont(createFont("微软雅黑 Light",20)) .setColor(color(255,255,0)) .setLabel("") .setFocus(true) .setColorBackground(color(100,255)) .setColorForeground(color(0,100)) .moveTo("global") ; cp5.addButton("clearRecv") .setValue(0) .setPosition(200,200) .setSize(100,20) .setColorLabel(color(255,100)) .moveTo("global") ; cp5.addButton("clearSend") .setValue(0) .setPosition(200,320) .setSize(100,20) .setColorLabel(color(255,100)) .moveTo("global") ; cp5.addButton("Send") .setValue(0) .setPosition(450,320) .setSize(100,20) .plugTo(this,"send_Textfield_SendData") .setColorLabel(color(255,100)) .moveTo("global") ; cp5.get(Textfield.class,"Local IP").setText(Server.ip()); } void draw(){ background(220); if(radioFlag1==1){ Client thisClient = myServer.available(); if (thisClient !=null) { String whatClientSaid = thisClient.readString(); if (whatClientSaid != null) { cp5.get(Textarea.class,"recvData").append(thisClient.ip()+": "); cp5.get(Textarea.class,"recvData").append(whatClientSaid+"\n"); } } } // myServer.active() if(radioFlag2==1){ if (myClient.available() > 0) { String whatClientSaid = myClient.readString(); if (whatClientSaid != null) { cp5.get(Textarea.class,"recvData").append(cp5.get(Textfield.class,"Remote IP").getText()+": "); cp5.get(Textarea.class,"recvData").append(whatClientSaid+"\n"); } } } } void controlEvent(ControlEvent theControlEvent) { if (theControlEvent.isTab()) { if(theControlEvent.getTab().getId()==1){ cp5.get(Textarea.class,"recvData").clear(); cp5.get(Textfield.class,"sendData").clear(); send_flag=1; } else if(theControlEvent.getTab().getId()==2){ cp5.get(Textarea.class,"recvData").clear(); cp5.get(Textfield.class,"sendData").clear(); send_flag=2; } } } void connect1(int a) { println("a radio Button event: "+a); radioFlag1=a; if(radioFlag1==1){ String port_buffer = cp5.get(Textfield.class,"Local PORT").getText(); int port = int(port_buffer); myServer = new Server(this,port); println(Server.ip()); cp5.get(Textfield.class,"Local IP").setText(Server.ip()); println(port); } else myServer.stop(); } void connect2(int a) { println("a radio Button event: "+a); radioFlag2=a; if(radioFlag2==1){ String port_buffer = cp5.get(Textfield.class,"Remote PORT").getText(); String IP_buffer = cp5.get(Textfield.class,"Remote IP").getText(); int port = int(port_buffer); if(IP_buffer.compareTo("192.168.1.xxx")==0){ println("connect error!"); } else{ myClient = new Client(this,IP_buffer,port); println("connect success!"); } } else myClient.stop(); } void clearRecv(){ cp5.get(Textarea.class,"recvData").clear(); } void clearSend(){ cp5.get(Textfield.class,"sendData").clear(); } void send_Textfield_SendData(){ if(send_flag==1){ myServer.write(cp5.get(Textfield.class,"sendData").getText()); cp5.get(Textfield.class,"sendData").clear(); } else if(send_flag==2){ myClient.write(cp5.get(Textfield.class,"sendData").getText()); cp5.get(Textfield.class,"sendData").clear(); } } |
Eseguite il codice e vi comparirà una nuova finestra. Se vuoi usare ESP32 come clinet devi selezione TCP server.
Ora apriamo Arduino IDE e copiamo ed incolliamo questo codice, ricordati rima di modificare i valori nelle assegnazione di:
- ssid router (ossia nome router)
- password router
- remote IP (inserisci il server remoto che vuoi connettere) che compare nel pop-up di processing
- remote port (inserisci porta remota)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#include <WiFi.h> const char *ssid_Router = "nomerouter"; //Enter the router name const char *password_Router = "pw"; //Enter the router password #define REMOTE_IP "ip_che_compare_in_processing" //input the remote server which is you want to connect #define REMOTE_PORT 8888 //input the remote port which is the remote provide WiFiClient client; void setup() { Serial.begin(115200); delay(10); WiFi.begin(ssid_Router, password_Router); Serial.print("\nWaiting for WiFi... "); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); Serial.print("Connecting to "); Serial.println(REMOTE_IP); while (!client.connect(REMOTE_IP, REMOTE_PORT)) { Serial.println("Connection failed."); Serial.println("Waiting a moment before retrying..."); } Serial.println("Connected"); client.print("Hello\n"); client.print("This is my IP.\n"); } void loop() { if (client.available() > 0) { delay(20); //read back one line from the server String line = client.readString(); Serial.println(REMOTE_IP + String(":") + line); } if (Serial.available() > 0) { delay(20); String line = Serial.readString(); client.print(line); } if (client.connected () == 0) { client.stop(); WiFi.disconnect(); } } |
Iscriviti ai nostri gruppi Telegram
Link utili
È possibile vedere come creare la versione server su Arduino con uso della esp32 via tcp IP WiFi ?
sto proveddendo a documentarmi, farò sapere il prima possibile
Hi, with the processing sketch, I can’t edit the local ip address or activate local ip detection.