Ciao seguendo i vari esempi in rete sto cercando di usare callmebot con arduino nano 33 iot.
Il problema sembra derivi dalla stringa "server" , se come url metto www.google.com non ci sono problemi.
Avete qualche dritta da darmi? Ho provato a passare da stringa ad array di char con la funzione ma non cambia nulla
Grazie in anticipo
#include <WiFiNINA.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <time.h>
WiFiClient client;
String phone_number = "+393386616562";
String apiKey = "1679483";
String url;
// Define NTP Client to get time
WiFiUDP ntpUDP;
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = ""; // your network SSID (name)
char pass[] = ""; // your network password (use for WPA, or use as key for
void setup() {
Serial.begin(9600);
// Gestione collegamento wifi
if (WiFi.status() == WL_NO_MODULE) {
display.clearDisplay();
display.print("WiFi module failed!");
display.display();
delay(4000);
// don't continue
while (true);
}
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
display.clearDisplay();
display.print("Upgrade the firmware");
display.display();
delay(4000);
}
status = WiFi.begin(ssid, pass);
for (int x=0; x< 10;x++){
if (x==1) {
display.clearDisplay();
display.print("Connecting to wifi");
display.display();
}
if (WiFi.status() != WL_CONNECTED) {
delay(1000);
}
else {
break;
}
}
delay(2000);
if (WiFi.status()==WL_CONNECTED){
// you're connected now, so print out the data:
display.clearDisplay();
display.setCursor(0, 0);
display.print("Connected!");
display.setCursor(0, 20);
display.print(WiFi.localIP());
display.display();
delay(2000);
}
else{
display.clearDisplay();
display.print("Connection failed");
display.display();
delay(2000);
}
//=========================
String url = "http://api.callmebot.com/whatsapp.php?phone=+393382&text=Hello+from+ESP32&apikey=111111";
int url_length=url.length()+ 1;
char server[url_length];
url.toCharArray(server, url_length);
Serial.println("\nStarting connection to server...");
// if you get a connection, report back via serial:
Serial.println(server);
delay(5000);
if (client.connect(server, 80)) {
Serial.println("connected to server");
delay(5000);
// Make a HTTP request:
client.println("GET /search?q=arduino HTTP/1.1");
client.println("Host: www.google.com");
client.println("Connection: close");
client.println();
}
}
Io qui ci vedo tanta tanta confusione....
Secondo me non ti è chiaro come funziona una richiesta HTTP.
Prima cosa, tutte quelle manipolazioni di stringhe usando il metodo toCharArray() sono del tutto inutili...
Se usi una varibile String è ti serve un const char* come nel caso del metodo connect() basta usare il metodo c_str()
String server = "api.callmebot.com";
if (client.connect(server.c_str(), 80))...
Seconda cosa, il primo parametro che il metodo connect()si aspetta è l'host su cui risiede la tua risorsa (detta anche "endpoint") e non tutto l'indirizzo come lo potresti inserire nel browser come hai fatto tu.
Una volta che la connessione con l'host è stabilita con successo, ha inizio la comunicazione vera e propria e il tuo client dovrà specificare:
il tipo di richiesta HTTP che sta facendo: nel tuo caso GET;
l'endpoint al quale sta tentando di accedere: "/whatsapp.php?phone=+393382&text=Hello+from+ESP32&apikey=111111"
la versione del protocollo HTTP che sarà usata: HTTP/1.1
eventuali headers.
nel caso di richiesta di tipo POST (non è questo il caso): il payload
Prendendo a riferimento l'esempio che funziona con l'host google.com:
if (client.connect(server, 80)) { // Se vero, il client si è connesso all'host
Serial.println("connected to server");
//delay(5000); // questo è del tutto inutile
// Make a HTTP request:
client.println("GET /search?q=arduino HTTP/1.1"); // Tipo richiesta, endpoint, protocollo separati da uno spazio
client.println("Host: www.google.com"); // Header "Host" (alcuni server lo richiedono obbligatorio
client.println("Connection: close"); // Header "Connection": close informa il server che può chiudere la connessione dopo aver risposto
client.println(); // Un ritorno a capo doppio (quello precedente e questo) segna la fine degli headers
}