404 Not found on ngrok - http-status-code-404

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.

Related

Arduino IDE-http.begin() return false

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.

NodeMCU client.connect returns 0 for locally hosted parse api?

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.

Connect nodemcu with 000webhost database

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();
}

Storing an HTTP request in an array using C

I am trying to catch an HTTP request and store it in an array using C . How can I possibly do this ?
The request I get from is of the following form :
POST /box/update HTTP/1.1
Accept : application/json
Content-Type : application/x-www-form-urlencoded
host:121.158.41.104:1338
content-length : 83
Connection : close
serial=1234&pin=1234&poweState=true&startState=true&temperature=11&macAdress=113
Code I have tried so far :
/*
WiFi Web Server
A simple web server that shows the value of the analog input pins.
using a WiFi shield.
This example is written for a network using WPA encryption. For
WEP or WPA, change the Wifi.begin() call accordingly.
Circuit:
* WiFi shield attached
* Analog inputs attached to pins A0 through A5 (optional)
created 13 July 2010
by dlf (Metodo2 srl)
modified 31 May 2012
by Tom Igoe
*/
#include <SPI.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
// your network name also called SSID
char ssid[] = "MySSID";
// your network password
char password[] = "MyPassword";
// your network key Index number (needed only for WEP)
int keyIndex = 0;
WiFiServer server(Mport);
int array_number = 3;
void setup() {
Serial.begin(115200); // initialize serial communication
pinMode(RED_LED, OUTPUT); // set the LED pin mode
// attempt to connect to Wifi network:
Serial.print("Attempting to connect to Network named: ");
// print the network name (SSID);
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED) {
// print dots while we wait to connect
Serial.print(".");
delay(300);
}
Serial.println("\nYou're connected to the network");
Serial.println("Waiting for an ip address");
while (WiFi.localIP() == INADDR_NONE) {
// print dots while we wait for an ip addresss
Serial.print(".");
delay(300);
}
// you're connected now, so print out the status
printWifiStatus();
Serial.println("Starting webserver on port 80");
server.begin(); // start the web server on port 80
Serial.println("Webserver started!");
}
void loop() {
// listen for incoming clients
WiFiClient client = server.available();
String buffer = "";
String post_str1 = "";
/*
int temperatures;
String macAddresses;
*/
String status_message;
int status_code;
boolean powerStates[3]= {true,true,true};
boolean startStates[3]= {true,true,true};
//int temperatures[3]={11,22,33};
char * macAddresses[3] = {"155","156","157"};
char * temperatures[3] = {"11","22","33"};
// powerStates[3]
//startStates[3]
/*
temperatures = 11;
macAddresses = "155";
*/
status_code = 1;
status_message = "success";
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
int check = 0;
while (client.connected()) {
if (client.available()) {
char c = client.read();
buffer +=c;
Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
//if(c == '\n' && currentLineIsBlank){
if(buffer.indexOf("true")>=0||buffer.indexOf("false")>=0){
// you're starting a new line
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
client.print("{\"serial\":\"");
client.print("1234");
client.print("\",\"pin\":\"");
client.print("1234");
client.print("\",\"powerStates\":");
client.print("[1,1,1]");
client.print(",\"startStates\":");
client.print("[1,1,1]");
client.print(",\"temperatures\":");
client.print("[11,22,33]");
client.print(",\"macAddresses\":");
client.print("[\"125\",\"136\",\"137\"]");
/*
client.print("\",\"powerStates\":");
client.print("[\"true\",\"true\",\"true\"]");
client.print(",\"startStates\":");
client.print("[\"false\",\"false\",\"false\"]");
client.print(",\"temperatures\":");
client.print("[\"11\",\"22\",\"33\"]");
client.print(",\"macAddresses\":");
client.print("[\"155\",\"156\",\"157\"]");
*/
client.print(",\"status_code\":");
client.print(status_code);
client.print(",\"status_message\":\"");
client.print(status_message);
client.print("\"}");
Serial.print("\n\r");
Serial.print("{\"serial\":\"");
Serial.print("1234");
Serial.print("\",\"pin\":\"");
Serial.print("1234");
Serial.print("\",\"powerStates\":");
Serial.print("[\"true\",\"true\",\"true\"]");
Serial.print(",\"startStates\":");
Serial.print("[\"true\",\"true\",\"true\"]");
Serial.print(",\"temperatures\":");
Serial.print("[\"11\",\"22\",\"33\"]");
Serial.print(",\"macAddresses\":");
Serial.print("[\"155\",\"156\",\"157\"]");
Serial.print(",\"status_code\":");
Serial.print(status_code);
Serial.print(",\"status_message\":\"");
Serial.print(status_message);
Serial.print("\"}");
Serial.print("\n\r");
buffer="";
check==0;
break;
}
if(c == '\n'){
currentLineIsBlank=true;
}
else if (c !='\r'){
currentLineIsBlank=false;
}
}// carrage
}//client avable
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println("client disonnected");
}//if client
}//while
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("Network Name: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
My program requires to store each variable and value for further use.I have been able to read this request and output on my console , but further from that I am stuck.
I don't know what did you try since I'm usingStack Overflow for Android (buggy) and I can't see your whole code buffer
Be specific in your code next time please
If you want to store the buffer you get in an array (requests)
the best way I can think of is the dynamic memory allocation with a 2D pointer.
You can start with that code
#include <stdio.h>
#include <stdlib.h>
#define MAX_BUF 1024
char* arrOfBuffers[1000]; // stored requests
int requests = 0; // number of http requests stored
const char* getHttp(const char* URL)
{
char* buf;
// Some http GET functions
// send(socket, "GET / HTTP/1.0", ...);
// ...
// memset(buf 0, MAX_BUF)
// ...
// recv(socket, buf, sizeof(buf), ...);
// ...
// Save it
buf = "some buffer"; // example
arrOfBuffers[requests] = buf;
puts(arrOfBuffers[requests]);
++requests;
return buf;
}
int main ()
{
for(int i = 0; i <= 1000; ++i) // 1000 requests
{
char* request = (char*)calloc(1, 80);
sprintf(request, "http://www.stackoverflow.com/users/%d/", i);
getHttp(request);
}
return 0;
}
I really want to make a real live example of my code but I can't use socket libraries right now cause I'm PC afk.

Reading data from the web using arduino wifi shield

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.

Resources