WiFiNINA callmebot

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
  }
1 Like

Ok ora così funziona

int    HTTP_PORT   = 80;
String HTTP_METHOD = "GET"; // or "POST"
char   HOST_NAME[] = "api.callmebot.com"; // hostname of web server:
String PATH_NAME   = "";

WiFiClient client;

String phoneNumber = "+39XXXXXX";
String apiKey = "XXXXXX";


void sendMessage(String message){
  Serial.println("\nStarting connection to server...");
  // if you get a connection, report back via serial:
  Serial.println(HOST_NAME);
  PATH_NAME ="/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message);
  Serial.println(PATH_NAME);
  delay(5000);
  if (client.connect(HOST_NAME, HTTP_PORT)) {
    Serial.println("connected to server");
    // send HTTP request header
    client.println(HTTP_METHOD + " " + PATH_NAME + " HTTP/1.1");
    client.println("Host: " + String(HOST_NAME));
    client.println("Connection: close");
    client.println(); // end HTTP request header
  }

Grazie!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.