2020-09-15 13:46:54 -04:00
|
|
|
/****************************************************************************************************************************
|
|
|
|
|
AsyncDweetPOST_STM32.ino - Dead simple AsyncHTTPRequest for ESP8266, ESP32 and currently STM32 with built-in LAN8742A Ethernet
|
|
|
|
|
|
|
|
|
|
For ESP8266, ESP32 and STM32 with built-in LAN8742A Ethernet (Nucleo-144, DISCOVERY, etc)
|
|
|
|
|
|
|
|
|
|
AsyncHTTPRequest_Generic is a library for the ESP8266, ESP32 and currently STM32 run built-in Ethernet WebServer
|
|
|
|
|
|
|
|
|
|
Based on and modified from asyncHTTPrequest Library (https://github.com/boblemaire/asyncHTTPrequest)
|
|
|
|
|
|
|
|
|
|
Built by Khoi Hoang https://github.com/khoih-prog/AsyncHTTPRequest_Generic
|
|
|
|
|
Licensed under MIT license
|
|
|
|
|
|
|
|
|
|
Copyright (C) <2018> <Bob Lemaire, IoTaWatt, Inc.>
|
|
|
|
|
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
|
|
|
|
|
as published bythe Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
|
You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|
|
2021-03-22 20:22:33 -04:00
|
|
|
Version: 1.1.5
|
2020-09-15 13:46:54 -04:00
|
|
|
|
|
|
|
|
Version Modified By Date Comments
|
|
|
|
|
------- ----------- ---------- -----------
|
|
|
|
|
1.0.0 K Hoang 14/09/2020 Initial coding to add support to STM32 using built-in Ethernet (Nucleo-144, DISCOVERY, etc).
|
2020-10-09 16:06:03 -04:00
|
|
|
1.0.1 K Hoang 09/10/2020 Restore cpp code besides Impl.h code.
|
2020-11-09 03:59:44 -05:00
|
|
|
1.0.2 K Hoang 09/11/2020 Make Mutex Lock and delete more reliable and error-proof
|
2020-12-23 17:35:01 -05:00
|
|
|
1.1.0 K Hoang 23/12/2020 Add HTTP PUT, PATCH, DELETE and HEAD methods
|
2020-12-23 23:35:07 -05:00
|
|
|
1.1.1 K Hoang 24/12/2020 Prevent crash if request and/or method not correct.
|
2021-02-11 14:48:08 -05:00
|
|
|
1.1.2 K Hoang 11/02/2021 Rename _lock and _unlock to avoid conflict with AsyncWebServer library
|
2021-02-25 16:51:32 -05:00
|
|
|
1.1.3 K Hoang 25/02/2021 Fix non-persistent Connection header bug
|
2021-03-22 20:22:33 -04:00
|
|
|
1.1.4 K Hoang 21/03/2021 Fix `library.properties` dependency
|
|
|
|
|
1.1.5 K Hoang 22/03/2021 Fix dependency on STM32AsyncTCP Library
|
2020-09-15 13:46:54 -04:00
|
|
|
*****************************************************************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Dweet.io POST client. Connects to dweet.io once every ten seconds, sends a POST request and a request body.
|
|
|
|
|
// Shows how to use Strings to assemble path and body
|
|
|
|
|
|
|
|
|
|
#include "defines.h"
|
|
|
|
|
|
|
|
|
|
// Select a test server address
|
|
|
|
|
const char POST_ServerAddress[] = "dweet.io";
|
|
|
|
|
|
|
|
|
|
// use your own thing name here
|
|
|
|
|
String dweetName = "/dweet/for/pinA0-Read?";
|
|
|
|
|
|
2021-02-25 16:51:32 -05:00
|
|
|
// 60s = 60 seconds to not flooding the server
|
|
|
|
|
#define HTTP_REQUEST_INTERVAL_MS 60000
|
2020-09-15 13:46:54 -04:00
|
|
|
|
|
|
|
|
#include <AsyncHTTPRequest_Generic.h> // https://github.com/khoih-prog/AsyncHTTPRequest_Generic
|
|
|
|
|
|
|
|
|
|
#include <Ticker.h> // https://github.com/sstaub/Ticker
|
|
|
|
|
|
|
|
|
|
AsyncHTTPRequest request;
|
|
|
|
|
|
|
|
|
|
void sendRequest(void);
|
|
|
|
|
|
|
|
|
|
// Repeat forever, millis() resolution
|
|
|
|
|
Ticker sendHTTPRequest(sendRequest, HTTP_REQUEST_INTERVAL_MS, 0, MILLIS);
|
|
|
|
|
|
|
|
|
|
void sendRequest(void)
|
|
|
|
|
{
|
2020-12-23 23:35:07 -05:00
|
|
|
static bool requestOpenResult;
|
|
|
|
|
|
2020-09-15 13:46:54 -04:00
|
|
|
if (request.readyState() == readyStateUnsent || request.readyState() == readyStateDone)
|
|
|
|
|
{
|
|
|
|
|
String postData = "sensorValue=";
|
|
|
|
|
postData += analogRead(A0);
|
|
|
|
|
|
|
|
|
|
Serial.println("\nMaking new POST request");
|
|
|
|
|
|
2020-12-23 23:35:07 -05:00
|
|
|
requestOpenResult = request.open("POST", (POST_ServerAddress + dweetName + postData).c_str() );
|
|
|
|
|
|
|
|
|
|
if (requestOpenResult)
|
|
|
|
|
{
|
|
|
|
|
// Only send() if open() returns true, or crash
|
|
|
|
|
request.send();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Serial.println("Can't send bad request");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Serial.println("Can't send request");
|
2020-09-15 13:46:54 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void parseResponse(String responseText)
|
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
Typical response is:
|
|
|
|
|
{"this":"succeeded",
|
|
|
|
|
"by":"getting",
|
|
|
|
|
"the":"dweets",
|
|
|
|
|
"with":[{"thing":"my-thing-name",
|
|
|
|
|
"created":"2016-02-16T05:10:36.589Z",
|
|
|
|
|
"content":{"sensorValue":456}}]}
|
|
|
|
|
|
|
|
|
|
You want "content": numberValue
|
|
|
|
|
*/
|
|
|
|
|
// now parse the response looking for "content":
|
|
|
|
|
int labelStart = responseText.indexOf("content\":");
|
|
|
|
|
// find the first { after "content":
|
|
|
|
|
int contentStart = responseText.indexOf("{", labelStart);
|
|
|
|
|
// find the following } and get what's between the braces:
|
|
|
|
|
int contentEnd = responseText.indexOf("}", labelStart);
|
|
|
|
|
String content = responseText.substring(contentStart + 1, contentEnd);
|
|
|
|
|
|
|
|
|
|
Serial.println(content);
|
|
|
|
|
|
|
|
|
|
// now get the value after the colon, and convert to an int:
|
|
|
|
|
int valueStart = content.indexOf(":");
|
|
|
|
|
String valueString = content.substring(valueStart + 1);
|
|
|
|
|
int number = valueString.toInt();
|
|
|
|
|
|
|
|
|
|
Serial.print("Value string: ");
|
|
|
|
|
Serial.println(valueString);
|
|
|
|
|
Serial.print("Actual value: ");
|
|
|
|
|
Serial.println(number);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void requestCB(void* optParm, AsyncHTTPRequest* request, int readyState)
|
|
|
|
|
{
|
2021-02-11 14:48:08 -05:00
|
|
|
(void) optParm;
|
|
|
|
|
|
2020-09-15 13:46:54 -04:00
|
|
|
if (readyState == readyStateDone)
|
|
|
|
|
{
|
|
|
|
|
String responseText = request->responseText();
|
|
|
|
|
|
|
|
|
|
Serial.println("\n**************************************");
|
|
|
|
|
//Serial.println(request->responseText());
|
|
|
|
|
Serial.println(responseText);
|
|
|
|
|
Serial.println("**************************************");
|
|
|
|
|
|
|
|
|
|
parseResponse(responseText);
|
|
|
|
|
|
|
|
|
|
request->setDebug(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void setup(void)
|
|
|
|
|
{
|
|
|
|
|
Serial.begin(115200);
|
|
|
|
|
while (!Serial);
|
|
|
|
|
|
|
|
|
|
Serial.println("\nStart AsyncDweetPOST_STM32 on " + String(BOARD_NAME));
|
2020-12-23 17:35:01 -05:00
|
|
|
Serial.println(ASYNC_HTTP_REQUEST_GENERIC_VERSION);
|
2020-09-15 13:46:54 -04:00
|
|
|
|
|
|
|
|
// start the ethernet connection and the server
|
|
|
|
|
// Use random mac
|
|
|
|
|
uint16_t index = millis() % NUMBER_OF_MAC;
|
|
|
|
|
|
|
|
|
|
// Use Static IP
|
|
|
|
|
//Ethernet.begin(mac[index], ip);
|
|
|
|
|
// Use DHCP dynamic IP and random mac
|
|
|
|
|
Ethernet.begin(mac[index]);
|
|
|
|
|
|
|
|
|
|
Serial.print(F("AsyncHTTPRequest @ IP : "));
|
|
|
|
|
Serial.println(Ethernet.localIP());
|
|
|
|
|
Serial.println();
|
|
|
|
|
|
|
|
|
|
request.setDebug(false);
|
|
|
|
|
|
|
|
|
|
request.onReadyStateChange(requestCB);
|
|
|
|
|
sendHTTPRequest.start(); //start the ticker.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void loop(void)
|
|
|
|
|
{
|
|
|
|
|
sendHTTPRequest.update();
|
|
|
|
|
}
|