i want to connect nodemcu with 000webhost database.for that i have built php file on my website file manager. whenerver i make http request through web browser it works properly.means it perform its function properly. but whenever i try to make http request through nodemcu it doesn't works!!
my nodemcu code:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
#define WIFI_SSID "imayank2"
#define WIFI_PASSWORD "123456789"
void setup() {
Serial.begin(74880);
wifiConnect();
}
void loop()
{
HTTPClient http; //Declare an object of class HTTPClient
http.begin("mywebsite address\dataenter.php"); //Specify request destination
int httpCode = http.GET(); //Send the request
if (httpCode > 0) { //Check the returning code
String payload = http.getString(); //Get the request response payload
Serial.println(payload); //Print the response payload
}
http.end(); //Close connection
delay(5000);
}
void wifiConnect()
{
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // Connect to the network
Serial.print("Connecting to ");
Serial.print(WIFI_SSID);
Serial.println(" ...");
int teller = 0;
while (WiFi.status() != WL_CONNECTED)
{ // Wait for the Wi-Fi to connect
delay(1000);
Serial.print(++teller);
Serial.print(' ');
}
Serial.println('\n');
Serial.println("Connection established!");
Serial.print("IP address:\t");
Serial.println(WiFi.localIP()); // Send the IP address of the ESP8266 to the computer
}
output:
nothing only connected with my wifi , not payload
The web server is using virtual hosts. Unless you tell it to which virtual host are you making a request, the server won't know where to send the request and generate an error.
You need to add the required header Host, which tell it just that.
client.println("Host: ADDRESS.000webhostapp.com");
But I don't know how to do that with your library so here is my solution:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
//Setting Wifi information
const char* ssid = "SSID"; //your SSID
const char* password = "PASSWORD"; //your Password
WiFiClient client;
void setup() {
// initialization of communication via serial line at 9600 baud
Serial.begin(9600);
//connect to wifi
WiFi.begin(ssid, password);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
}
void loop() {
//connect to server
if (client.connect("ADDRESS.000webhostapp.com", 80)) {
Serial.println("connected");
// Make a HTTP request:
Serial.print("GET /index.php?tempV=20.1");
client.print("GET /index.php?tempV=20.1"); //YOUR URL
client.print(" "); //SPACE BEFORE HTTP/1.1
client.print("HTTP/1.1");
client.println();
client.println("Host: ADDRESS.000webhostapp.com");
client.println("Connection: close");
client.println();
} else {
// if you didn't get a connection to the server:
Serial.println("connection failed");
}
// end client connection
client.stop();
}
Related
I'm reading DHT11 data and trying to send it to my cloud server using nodeMCU ESP32. The problem is I can not run "http.begin()" line. It always returns false. So far, I've tried adding fingerprint,
const uint8_t fingerprint[20] = "aa bb cc dd";
http.begin(fingerprint, host);
adding WiFiClient,
WiFiClient clientt;
http.begin(clientt, host);
and adding WiFiClientSecure;
WiFiClientSecure client;
client.setInsecure();
client.connect(host, 443);
http.begin(client, host);
but it won't work. Since http.begin() returns false, my post request returns -1. Here is my full code:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
#include <DHT.h>
#include <WiFiClientSecureBearSSL.h>
#define DHTTYPE DHT11
/* Set these to your desired credentials. */
const char *ssid = "ssid"; //ENTER YOUR WIFI SETTINGS
const char *password = "password";
const char *userId = "123";
//Web/Server address to read/write from
const char *host = 'http://api.iot-ms.xyz/api/devices/data/'+userId; //website or IP address of server
//DHT pin
const int DHTPin = D4;
DHT dht(DHTPin, DHTTYPE);
static char celsiusTemp[7];
static char fahrenheitTemp[7];
static char humidityTemp[7];
//=======================================================================
// Power on setup
//=======================================================================
void setup() {
delay(1000);
Serial.begin(115200);
delay(10);
dht.begin();
delay(10);
WiFi.mode(WIFI_OFF); //Prevents reconnection issue (taking too long to connect)
delay(1000);
WiFi.mode(WIFI_STA); //This line hides the viewing of ESP as wifi hotspot
WiFi.begin(ssid, password); //Connect to your WiFi router
Serial.println("");
Serial.print("Connecting");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//If connection successful show IP address in serial monitor
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //IP address assigned to your ESP
}
//=======================================================================
// Main Program Loop
//=======================================================================
void loop() {
HTTPClient http; //Declare object of class HTTPClient
String ADCDataTemp, ADCDataHum, station, postData;
float temperature = dht.readTemperature(); //Read Analog value of LDR
float humidity = dht.readHumidity();
Serial.print("Temperature: ");
Serial.println(temperature);
Serial.print("Humidity: ");
Serial.println(humidity);
if (isnan(humidity) || isnan(temperature)) {
Serial.println("DHT sensoru okunamadi.");
strcpy(celsiusTemp,"HATA!");
strcpy(fahrenheitTemp, "HATA!");
strcpy(humidityTemp, "HATA!");
}
//TESTING JSON CREATION
String json = "{\"mac_address\": \""+WiFi.macAddress()+"\",\"temperature\": \""+temperature+"\",\"humidity\": \""+humidity+ "\"}";
Serial.println(json);
Serial.println("MAC Address: "+WiFi.macAddress());
ADCDataTemp = String(temperature);
ADCDataHum = String(humidity); //String to interger conversion
//Post Data
//const uint8_t fingerprint[20] = {};
WiFiClient clientt;
bool isBegin = http.begin(clientt, host);
if(isBegin){
http.addHeader("Content-Type", "application/json"); //Specify content-type header
http.addHeader("Accept","application/json");
int httpCode = http.POST(json); //Send the request
String payload = http.getString(); //Get the response payload
Serial.print("HTTP Code: "); //Print HTTP return code
Serial.println(httpCode);
Serial.print("Request response payload: "); //Print request response payload
Serial.println(payload);
}else{
Serial.println("HTTP begin failed!");
}
http.end(); //Close connection
delay(5000); //Post Data at every 5 seconds
}
And this is my output:
01:35:43.596 -> .........
01:35:48.310 -> Connected to WiFi
01:35:48.667 -> Temperature: 25.50
01:35:48.667 -> Humidity: 51.00
01:35:48.667 -> HTTP begin failed!
01:35:53.357 -> Temperature: 25.60
01:35:53.357 -> Humidity: 51.00
01:35:53.402 -> HTTP begin failed!
01:35:58.410 -> Temperature: 25.60
01:35:58.410 -> Humidity: 51.00
01:35:58.410 -> HTTP begin failed!
01:36:03.454 -> Temperature: 25.70
01:36:03.454 -> Humidity: 51.00
01:36:03.454 -> HTTP begin failed!
I've checked my server url and I validated my json object. I have tried both http and https in my server url. Can you please help me? Thanks in advance...
P.S: WiFiClient clientt with double "t" was intentional since when I type client it would turn to orange and I'm not very familiar with C, so I wanted to guarantee that I'm not referring to something else.
Below is the link for rest api guide using parse:
https://docs.parseplatform.org/rest/guide/#your-configuration
My hosted remote server configuration
#include <ESP8266WiFi.h>
const char* ssid = "your-ssid"; //replace with your own wifi ssid
const char* password = "your-password"; //replace with your own //wifi ssid password
const char* host = "192.168.1.102:1337";
void setup() {
Serial.begin(115200);
delay(10); // We start by connecting to a WiFi network Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
/* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default, would try to act as both a client and an access-point and could cause network-issues with your other WiFi-devices on your WiFi-network. */
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
int value = 0;
void loop() {
delay(5000);
++value;
Serial.print("connecting to ");
Serial.println(host); // Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// We now create a URI for the request
//this url contains the informtation we want to send to the server
//if esp8266 only requests the website, the url is empty
String url = "/";
/* url += "?param1=";
url += param1;
url += "?param2=";
url += param2;
*/
Serial.print("Requesting URL: ");
Serial.println(url); // This will send the request to the server
client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000){
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
} // Read all the lines of the reply from server and print them to Serial
while (client.available()){
String line = client.readStringUntil('\r'); Serial.print(line);
}
Serial.println();
Serial.println("closing connection");
}
Always returning "connection failed", since "client.connect(host, httpPort)" was 0. Not sure why the host is not connecting. I tested with postman to check whether the api was working, and it was fine.
You embedded the port number in the host string. The host string should be just the name or IP address.
const char* host = "192.168.1.102:1337";
should be
const char* host = "192.168.1.102";
and later where you define
const int httpPort = 80;
you'll need to choose the correct port for your setup, whether that's 80 or 1337.
I have a problem with ngrok and arduino, i send a message but when i open ngrok it says: 404 Not found
I think it could be problem with port, I use 4040 because ngrok open localhost:4040 but i don't know if it is true. The server-side app on java use port 80
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
/* wifi network name */
char* ssidName = "mywifi";
/* WPA2 PSK password */
char* pwd = "mypwd";
/* service IP address */
char* address = "http://cf3c013e.ngrok.io";
void setup() {
Serial.begin(115200);
WiFi.begin(ssidName, pwd);
Serial.print("Connecting...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected: \n local IP: "+WiFi.localIP());
}
int sendData(String address, float value, String place){
HTTPClient http;
http.begin(address + "/api/data");
http.addHeader("Content-Type", "application/json");
String msg =
String("{ \"value\": ") + String(value) +
", \"place\": \"" + place +"\" }";
int retCode = http.POST(msg);
http.end();
String payload = http.getString();
Serial.println(payload);
return retCode;
}
void loop() {
if (WiFi.status()== WL_CONNECTED){
/* read sensor */
float value = (float) analogRead(A0) / 1023.0;
/* send data */
Serial.print("sending "+String(value)+"...");
int code = sendData(address, value, "home");
/* log result */
if (code == 200){
Serial.println("ok");
} else {
Serial.println("error");
}
} else {
Serial.println("Error in WiFi connection");
}
delay(5000);
}
Remove http:// from char* address = "http://cf3c013e.ngrok.io";
The double-up of http declaration in the address is likely causing the 404.
I have a very simple mysql database, which can receive new values via a simple command:
http://7751b6b1.ngrok.io/ethernet/data.php?movement=test
If I enter that in my browser "test" gets write to the databank. Now I want to write to that database via my ESP8266:
#include "ESP8266WiFi.h"
//General Definition
const char server[] = "https://7751b6b1.ngrok.io";
//localhost into server via ngrok
const char* MY_SSID = "Gastzugang";
const char* MY_PWD = "12345678";
String mov; //create Text string
WiFiClient client; //Create Wifi client
//Setup
void setup()
{
Serial.begin(115200);
Serial.println("Connecting to "+*MY_SSID);
WiFi.begin(MY_SSID, MY_PWD);
Serial.println("going into wl connect");
int PIR_output=16; // output of pir sensor
while (WiFi.status() != WL_CONNECTED) //not connected, ...waiting to
connect
{
delay(1000);
Serial.print(".");
}
Serial.println("wl connected");
Serial.println("");
Serial.println("Credentials accepted! Connected to wifi\n ");
Serial.println("");
}
void loop() {
if(digitalRead(16) == HIGH) // reading the data from the pir sensor
{
mov = "1";
Serial.println("1");
}
else {
mov = "0" ;
Serial.println("0");
}
if (client.connect(server, 8095)) { //Connecting at the IP address and port
Serial.println("connected to server");
WiFi.printDiag(Serial);
client.println("Get /ethernet/data.php?");
//Connecting and Sending values to database
client.print("movement=");
client.print(mov);
client.stop();
}
else {
// if you didn't get a connection to the server:
Serial.println("connection failed");
}
delay(50);
}
Sensor reading and Wifi connection works wells but I end up with "connection failed".
Can anyone spot the error?
Edit: Updated Code
#include "ESP8266WiFi.h"
//General Definition
const char server[] = "http://b90e9280.ngrok.io"; //localhost?
const char* MY_SSID = "Gastzugang";
const char* MY_PWD = "12345678";
String mov; //create Text string
WiFiClient client; //Create Wifi client
//Setup
void setup()
{
Serial.begin(115200);
Serial.println("Connecting to "+*MY_SSID);
WiFi.begin(MY_SSID, MY_PWD);
Serial.println("going into wl connect");
int PIR_output=16; // output of pir sensor
while (WiFi.status() != WL_CONNECTED) //not connected, ...waiting to
connect
{
delay(1000);
Serial.print(".");
}
Serial.println("wl connected");
Serial.println("");
Serial.println("Credentials accepted! Connected to wifi\n ");
Serial.println("");
}
void loop() {
//here sensor reading einfügen
if (client.connect(server, 80)) { //Connecting at the IP address and port
Serial.println("connected to server");
WiFi.printDiag(Serial);
client.println("Get /ethernet/data.php?"); //making a http request
Serial.println("Get /ethernet/data.php?");
//Connecting and Sending values to database
if(digitalRead(16) == HIGH) // reading the data from the pir sensor
{
mov = "1";
client.println("movement=1");
Serial.println("movement=1");
}
else {
mov = "0" ;
client.println("movement=0");
Serial.println("movement=0");
}
delay(5000);
client.stop();
}
else {
// if you didn't get a connection to the server:
Serial.println("connection failed");
}
delay(50);
}
Documentation isn't clear on this, but WiFiClient only supports http, not https.
It's great that you're using https! But you'll need to use WiFiClientSecure instead of WifiClient.
You'll most likely want to verify the server's identity once you connect. You'll do that using the verify method on the client object. To do that you'll need to know the fingerprint of the certificate the web server uses.
So your code would look something like this:
#include "ESP8266WiFi.h"
//General Definition
#define SERVER_FINGERPRINT "C0 5D 08 5E E1 3E E0 66 F3 79 27 1A CA 1F FC 09 24 11 61 62"
const char server[] = "https://7751b6b1.ngrok.io";
//localhost into server via ngrok
const char* MY_SSID = "Gastzugang";
const char* MY_PWD = "12345678";
String mov; //create Text string
WiFiClientSecure client; //Create Wifi client
//Setup
void setup()
{
Serial.begin(115200);
Serial.println("Connecting to "+*MY_SSID);
WiFi.begin(MY_SSID, MY_PWD);
Serial.println("going into wl connect");
int PIR_output=16; // output of pir sensor
while (WiFi.status() != WL_CONNECTED) //not connected, ...waiting to
connect
{
delay(1000);
Serial.print(".");
}
Serial.println("wl connected");
Serial.println("");
Serial.println("Credentials accepted! Connected to wifi\n ");
Serial.println("");
}
void loop() {
if(digitalRead(16) == HIGH) // reading the data from the pir sensor
{
mov = "1";
Serial.println("1");
}
else {
mov = "0" ;
Serial.println("0");
}
if (client.connect(server, 8095)) { //Connecting at the IP address and port
Serial.println("connected to server");
if (client.verify(SERVER_FINGERPRINT, host)) {
Serial.println("certificate matches");
} else {
Serial.println("certificate doesn't match");
}
WiFi.printDiag(Serial);
client.println("Get /ethernet/data.php?");
//Connecting and Sending values to database
client.print("movement=");
client.print(mov);
client.stop();
}
else {
// if you didn't get a connection to the server:
Serial.println("connection failed");
}
delay(50);
}
The three important changes are:
- defining client to be WiFiClientSecure rather than WiFiClient
- adding a call to client.verify after the connection succeeds
- providing a constant server finger print to compare with
The fingerprint I provided won't work with your server. You'll need to find its fingerprint yourself. You can do this going to it with a web browser like Chrome and clicking on the "Secure" field in the address bar (in Chrome's case). Click on "Certificate", then expand "Details" in the view of the certificate. Scroll to the end and you'll see two fingerprints, SHA-256 and SHA-1. Copy the SHA-1 fingerprint and provide it as a string like the SERVER_FINGERPRINT I included.
You can skip verifying the certificate if you want but then you won't be certain you're actually connecting to the real server instead of a server impersonating it.
There's more info on WiFiClientSecure at Client Secure, including another example of how to find a server's fingerprint under Windows.
If you run into problems, I'd recommend stripping your program down to just the basics - WiFi connect and then WiFiClientSecure; don't worry about the PIR sensor or anything else. Once you get the stripped down version working with your server, transpose the changes you made back into the real program you're trying to get working.
Update
For your revised code, it's written right now as:
client.println("Get /ethernet/data.php?"); //making a http request
Serial.println("Get /ethernet/data.php?");
//Connecting and Sending values to database
if(digitalRead(16) == HIGH) // reading the data from the pir sensor
{
mov = "1";
client.println("movement=1");
Serial.println("movement=1");
}
else {
mov = "0" ;
client.println("movement=0");
Serial.println("movement=0");
}
delay(5000);
client.stop();
}
Try:
client.print("Get /ethernet/data.php?"); //making a http request
Serial.println("Get /ethernet/data.php?");
//Connecting and Sending values to database
if(digitalRead(16) == HIGH) // reading the data from the pir sensor
{
mov = "1";
client.print("movement=1");
Serial.println("movement=1");
}
else {
mov = "0" ;
client.print("movement=0");
Serial.println("movement=0");
}
client.println(" HTTP/1.1");
client.println("Host: 7751b6b1.ngrok.io");
delay(5000);
client.stop();
}
The way it's written now it cuts off the parameters in the URL with a newline, omits the "HTTP/1.1" tag at the end of the line and doesn't specify the virtual host you're trying to contact (may or may not be an issue depending on your server). It needs to send two lines to the web server, looking like:
GET /ethernet/data.php?movement=1 HTTP/1.1
HOST: 7751b6b1.ngrok.io
I have arduino wifi shield.I want to read text file from web page that has some commands.I will parse the commands from html file and going to control arduino from the web page like that..
Problem is i don't understand how should i read the data so arduino will remotely open the led.If i use the code below every time i need to open serial monitor to switch on led.But i want this process to completed inside of arduino,i don't want to depend on serial monitor.As i said it should work when not plugged to computer.How can i do that i want to know what should i understand first to do this.
#include <SPI.h>
#include <WiFi.h>
char lf=10;
int x=0;
char ssid[] = "AIRTIES_RT-205"; // your network SSID (name)
char pass[] = ""; // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0; // your network key Index number (needed only for WEP)
String readString, readString1;
int status = WL_IDLE_STATUS;
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128); // numeric IP for Google (no DNS)
char server[] = "taylankaan-001-site1.myasp.net"; // name address for Google (using DNS)
// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
WiFiClient client;
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
// don't continue:
while (true);
}
String fv = WiFi.firmwareVersion();
if ( fv != "1.1.0" )
Serial.println("Please upgrade the firmware");
// attempt to connect to Wifi network:
while (status != WL_CONNECTED) {
// Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid);
// wait 10 seconds for connection:
delay(10000);
}
//printWifiStatus();
//Serial.println("\nStarting connection to server...");
// if you get a connection, report back via serial:
if (client.connect(server, 80)) {
Serial.println("connected to server");
// Make a HTTP request:
client.println("GET /asp.txt HTTP/1.1");
client.println("Host: taylankaan-001-site1.myasp.net");
client.println("Connection: close");
client.println();
}
}
String command;
void loop() {
while(client.connected() && !client.available()) delay(1); //waits for data
while (client.connected() || client.available()) { //connected or data available
char c = client.read();
if (c == '\n') {
parseCommand(command);
command = "";
}
else {
command += c;
}
}
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting from server.");
client.stop();
while (true);
}
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.println("Connected to network");
Serial.print(WiFi.SSID());
if(WiFi.RSSI()>=-35){
Serial.println("Very good connection");
}
if(WiFi.RSSI()>=-65 && WiFi.RSSI()<-35){
Serial.println("%50 good connected");
}
if(WiFi.RSSI()<-65){
Serial.println("Worst connection");
}
}
void parseCommand(String com) {
String part1;
String part2;
//PINON 13
part1 = com.substring(0, com.indexOf(" "));
part2 = com.substring(com.indexOf(" ") + 1);
if (part1.equalsIgnoreCase("openled")) {
digitalWrite(9, HIGH);
}
}
well this was funny but after realizing its about serial port i tried few things and the reason for me to wait serial port is :
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
i didnt care what for this used and now see it was preventing everything unless serial port is open.