Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
8 changed files
with
1,123 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,173 @@ | ||
/* | ||
PubSubClient.h - A simple client for MQTT. | ||
Nick O'Leary | ||
http://knolleary.net | ||
*/ | ||
|
||
#ifndef PubSubClient_h | ||
#define PubSubClient_h | ||
|
||
#include <Arduino.h> | ||
#include "IPAddress.h" | ||
#include "Client.h" | ||
#include "Stream.h" | ||
|
||
#define MQTT_VERSION_3_1 3 | ||
#define MQTT_VERSION_3_1_1 4 | ||
|
||
// MQTT_VERSION : Pick the version | ||
//#define MQTT_VERSION MQTT_VERSION_3_1 | ||
#ifndef MQTT_VERSION | ||
#define MQTT_VERSION MQTT_VERSION_3_1_1 | ||
#endif | ||
|
||
// MQTT_MAX_PACKET_SIZE : Maximum packet size | ||
#ifndef MQTT_MAX_PACKET_SIZE | ||
#define MQTT_MAX_PACKET_SIZE 128 | ||
#endif | ||
|
||
// MQTT_KEEPALIVE : keepAlive interval in Seconds | ||
#ifndef MQTT_KEEPALIVE | ||
#define MQTT_KEEPALIVE 15 | ||
#endif | ||
|
||
// MQTT_SOCKET_TIMEOUT: socket timeout interval in Seconds | ||
#ifndef MQTT_SOCKET_TIMEOUT | ||
#define MQTT_SOCKET_TIMEOUT 15 | ||
#endif | ||
|
||
// MQTT_MAX_TRANSFER_SIZE : limit how much data is passed to the network client | ||
// in each write call. Needed for the Arduino Wifi Shield. Leave undefined to | ||
// pass the entire MQTT packet in each write call. | ||
//#define MQTT_MAX_TRANSFER_SIZE 80 | ||
|
||
// Possible values for client.state() | ||
#define MQTT_CONNECTION_TIMEOUT -4 | ||
#define MQTT_CONNECTION_LOST -3 | ||
#define MQTT_CONNECT_FAILED -2 | ||
#define MQTT_DISCONNECTED -1 | ||
#define MQTT_CONNECTED 0 | ||
#define MQTT_CONNECT_BAD_PROTOCOL 1 | ||
#define MQTT_CONNECT_BAD_CLIENT_ID 2 | ||
#define MQTT_CONNECT_UNAVAILABLE 3 | ||
#define MQTT_CONNECT_BAD_CREDENTIALS 4 | ||
#define MQTT_CONNECT_UNAUTHORIZED 5 | ||
|
||
#define MQTTCONNECT 1 << 4 // Client request to connect to Server | ||
#define MQTTCONNACK 2 << 4 // Connect Acknowledgment | ||
#define MQTTPUBLISH 3 << 4 // Publish message | ||
#define MQTTPUBACK 4 << 4 // Publish Acknowledgment | ||
#define MQTTPUBREC 5 << 4 // Publish Received (assured delivery part 1) | ||
#define MQTTPUBREL 6 << 4 // Publish Release (assured delivery part 2) | ||
#define MQTTPUBCOMP 7 << 4 // Publish Complete (assured delivery part 3) | ||
#define MQTTSUBSCRIBE 8 << 4 // Client Subscribe request | ||
#define MQTTSUBACK 9 << 4 // Subscribe Acknowledgment | ||
#define MQTTUNSUBSCRIBE 10 << 4 // Client Unsubscribe request | ||
#define MQTTUNSUBACK 11 << 4 // Unsubscribe Acknowledgment | ||
#define MQTTPINGREQ 12 << 4 // PING Request | ||
#define MQTTPINGRESP 13 << 4 // PING Response | ||
#define MQTTDISCONNECT 14 << 4 // Client is Disconnecting | ||
#define MQTTReserved 15 << 4 // Reserved | ||
|
||
#define MQTTQOS0 (0 << 1) | ||
#define MQTTQOS1 (1 << 1) | ||
#define MQTTQOS2 (2 << 1) | ||
|
||
// Maximum size of fixed header and variable length size header | ||
#define MQTT_MAX_HEADER_SIZE 5 | ||
|
||
#if defined(ESP8266) || defined(ESP32) | ||
#include <functional> | ||
#define MQTT_CALLBACK_SIGNATURE std::function<void(char*, uint8_t*, unsigned int)> callback | ||
#else | ||
#define MQTT_CALLBACK_SIGNATURE void (*callback)(char*, uint8_t*, unsigned int) | ||
#endif | ||
|
||
#define CHECK_STRING_LENGTH(l,s) if (l+2+strlen(s) > MQTT_MAX_PACKET_SIZE) {_client->stop();return false;} | ||
|
||
class PubSubClient : public Print { | ||
private: | ||
Client* _client; | ||
uint8_t buffer[MQTT_MAX_PACKET_SIZE]; | ||
uint16_t nextMsgId; | ||
unsigned long lastOutActivity; | ||
unsigned long lastInActivity; | ||
bool pingOutstanding; | ||
MQTT_CALLBACK_SIGNATURE; | ||
uint16_t readPacket(uint8_t*); | ||
boolean readByte(uint8_t * result); | ||
boolean readByte(uint8_t * result, uint16_t * index); | ||
boolean write(uint8_t header, uint8_t* buf, uint16_t length); | ||
uint16_t writeString(const char* string, uint8_t* buf, uint16_t pos); | ||
// Build up the header ready to send | ||
// Returns the size of the header | ||
// Note: the header is built at the end of the first MQTT_MAX_HEADER_SIZE bytes, so will start | ||
// (MQTT_MAX_HEADER_SIZE - <returned size>) bytes into the buffer | ||
size_t buildHeader(uint8_t header, uint8_t* buf, uint16_t length); | ||
IPAddress ip; | ||
const char* domain; | ||
uint16_t port; | ||
Stream* stream; | ||
int _state; | ||
public: | ||
PubSubClient(); | ||
PubSubClient(Client& client); | ||
PubSubClient(IPAddress, uint16_t, Client& client); | ||
PubSubClient(IPAddress, uint16_t, Client& client, Stream&); | ||
PubSubClient(IPAddress, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client); | ||
PubSubClient(IPAddress, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client, Stream&); | ||
PubSubClient(uint8_t *, uint16_t, Client& client); | ||
PubSubClient(uint8_t *, uint16_t, Client& client, Stream&); | ||
PubSubClient(uint8_t *, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client); | ||
PubSubClient(uint8_t *, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client, Stream&); | ||
PubSubClient(const char*, uint16_t, Client& client); | ||
PubSubClient(const char*, uint16_t, Client& client, Stream&); | ||
PubSubClient(const char*, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client); | ||
PubSubClient(const char*, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client, Stream&); | ||
|
||
PubSubClient& setServer(IPAddress ip, uint16_t port); | ||
PubSubClient& setServer(uint8_t * ip, uint16_t port); | ||
PubSubClient& setServer(const char * domain, uint16_t port); | ||
PubSubClient& setCallback(MQTT_CALLBACK_SIGNATURE); | ||
PubSubClient& setClient(Client& client); | ||
PubSubClient& setStream(Stream& stream); | ||
|
||
boolean connect(const char* id); | ||
boolean connect(const char* id, const char* user, const char* pass); | ||
boolean connect(const char* id, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage); | ||
boolean connect(const char* id, const char* user, const char* pass, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage); | ||
boolean connect(const char* id, const char* user, const char* pass, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage, boolean cleanSession); | ||
void disconnect(); | ||
boolean publish(const char* topic, const char* payload); | ||
boolean publish(const char* topic, const char* payload, boolean retained); | ||
boolean publish(const char* topic, const uint8_t * payload, unsigned int plength); | ||
boolean publish(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained); | ||
boolean publish_P(const char* topic, const char* payload, boolean retained); | ||
boolean publish_P(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained); | ||
// Start to publish a message. | ||
// This API: | ||
// beginPublish(...) | ||
// one or more calls to write(...) | ||
// endPublish() | ||
// Allows for arbitrarily large payloads to be sent without them having to be copied into | ||
// a new buffer and held in memory at one time | ||
// Returns 1 if the message was started successfully, 0 if there was an error | ||
boolean beginPublish(const char* topic, unsigned int plength, boolean retained); | ||
// Finish off this publish message (started with beginPublish) | ||
// Returns 1 if the packet was sent successfully, 0 if there was an error | ||
int endPublish(); | ||
// Write a single byte of payload (only to be used with beginPublish/endPublish) | ||
virtual size_t write(uint8_t); | ||
// Write size bytes from buffer into the payload (only to be used with beginPublish/endPublish) | ||
// Returns the number of bytes written | ||
virtual size_t write(const uint8_t *buffer, size_t size); | ||
boolean subscribe(const char* topic); | ||
boolean subscribe(const char* topic, uint8_t qos); | ||
boolean unsubscribe(const char* topic); | ||
boolean loop(); | ||
boolean connected(); | ||
int state(); | ||
}; | ||
|
||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
|
||
This directory is intended for project header files. | ||
|
||
A header file is a file containing C declarations and macro definitions | ||
to be shared between several project source files. You request the use of a | ||
header file in your project source file (C, C++, etc) located in `src` folder | ||
by including it, with the C preprocessing directive `#include'. | ||
|
||
```src/main.c | ||
|
||
#include "header.h" | ||
|
||
int main (void) | ||
{ | ||
... | ||
} | ||
``` | ||
|
||
Including a header file produces the same results as copying the header file | ||
into each source file that needs it. Such copying would be time-consuming | ||
and error-prone. With a header file, the related declarations appear | ||
in only one place. If they need to be changed, they can be changed in one | ||
place, and programs that include the header file will automatically use the | ||
new version when next recompiled. The header file eliminates the labor of | ||
finding and changing all the copies as well as the risk that a failure to | ||
find one copy will result in inconsistencies within a program. | ||
|
||
In C, the usual convention is to give header files names that end with `.h'. | ||
It is most portable to use only letters, digits, dashes, and underscores in | ||
header file names, and at most one dot. | ||
|
||
Read more about using header files in official GCC documentation: | ||
|
||
* Include Syntax | ||
* Include Operation | ||
* Once-Only Headers | ||
* Computed Includes | ||
|
||
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
// Chris Bass - Coventry University | ||
// 13/04/2019 | ||
// Secure encrypted MQTT with TLS/SSL using the ESP32 esp32doit-devkit-v1 | ||
// mqttcert.h | ||
// Contains the login credentials and certificate for the mqtt.coventry.ac.uk server | ||
|
||
#include <string> | ||
|
||
// WiFi ssid and password, change it with your ssid and password: | ||
const char* WIFI_SSID = "agile-dev"; | ||
const char* WIFI_PASSWORD = "agiledev123!A"; | ||
|
||
// MQTT IP address of the PC/raspberry where you installed MQTT Server: | ||
const char* MQTT_SERVER = "mqtt.coventry.ac.uk"; | ||
const char* MQTT_CLIENT_ID = "tempblub01"; // unique client ID for this device | ||
const std::string MQTT_USERNAME = "302CEM"; | ||
const char* MQTT_PASSWORD = "n3fXXFZrjw"; | ||
// topic name must be in "username/topicname" for our server format, so concatenate strings | ||
const std::string MQTT_TOPIC_NAME = MQTT_USERNAME + "/Team2/temp01"; | ||
|
||
// TLS/SSL certificate for encrypted mqtt: | ||
const char* CA_CERT = | ||
"-----BEGIN CERTIFICATE-----\n" \ | ||
"MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL\n" \ | ||
"BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc\n" \ | ||
"BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00\n" \ | ||
"MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\n" \ | ||
"aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG\n" \ | ||
"SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf\n" \ | ||
"qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW\n" \ | ||
"n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym\n" \ | ||
"c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+\n" \ | ||
"O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1\n" \ | ||
"o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j\n" \ | ||
"IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq\n" \ | ||
"IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz\n" \ | ||
"8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh\n" \ | ||
"vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l\n" \ | ||
"7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG\n" \ | ||
"cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB\n" \ | ||
"BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD\n" \ | ||
"ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66\n" \ | ||
"AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC\n" \ | ||
"roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga\n" \ | ||
"W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n\n" \ | ||
"lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE\n" \ | ||
"+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV\n" \ | ||
"csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd\n" \ | ||
"dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg\n" \ | ||
"KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM\n" \ | ||
"HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4\n" \ | ||
"WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M\n" \ | ||
"-----END CERTIFICATE-----\n"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
|
||
This directory is intended for project specific (private) libraries. | ||
PlatformIO will compile them to static libraries and link into executable file. | ||
|
||
The source code of each library should be placed in a an own separate directory | ||
("lib/your_library_name/[here are source files]"). | ||
|
||
For example, see a structure of the following two libraries `Foo` and `Bar`: | ||
|
||
|--lib | ||
| | | ||
| |--Bar | ||
| | |--docs | ||
| | |--examples | ||
| | |--src | ||
| | |- Bar.c | ||
| | |- Bar.h | ||
| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html | ||
| | | ||
| |--Foo | ||
| | |- Foo.c | ||
| | |- Foo.h | ||
| | | ||
| |- README --> THIS FILE | ||
| | ||
|- platformio.ini | ||
|--src | ||
|- main.c | ||
|
||
and a contents of `src/main.c`: | ||
``` | ||
#include <Foo.h> | ||
#include <Bar.h> | ||
|
||
int main (void) | ||
{ | ||
... | ||
} | ||
|
||
``` | ||
|
||
PlatformIO Library Dependency Finder will find automatically dependent | ||
libraries scanning project source files. | ||
|
||
More information about PlatformIO Library Dependency Finder | ||
- https://docs.platformio.org/page/librarymanager/ldf.html |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
;PlatformIO Project Configuration File | ||
; | ||
; Build options: build flags, source filter | ||
; Upload options: custom upload port, speed and extra flags | ||
; Library options: dependencies, extra library storages | ||
; Advanced options: extra scripting | ||
; | ||
; Please visit documentation for the other options and examples | ||
; https://docs.platformio.org/page/projectconf.html | ||
|
||
[env:esp32doit-devkit-v1] | ||
platform = espressif32 | ||
board = esp32doit-devkit-v1 | ||
framework = arduino | ||
|
Oops, something went wrong.