Merge updates from original version

Conflicts:
	library.json
	library.properties
	src/TinyGsmClientA6.h
	src/TinyGsmClientESP8266.h
	src/TinyGsmClientM590.h
	src/TinyGsmClientSIM800.h
	src/TinyGsmClientU201.h
	src/TinyGsmClientXBee.h
This commit is contained in:
SRGDamia1
2018-03-15 16:47:43 -04:00
24 changed files with 737 additions and 258 deletions

View File

@@ -26,8 +26,8 @@ This library is easy to integrate with lots of sketches, which use Ethernet or W
### TinyGSM is tiny ### TinyGSM is tiny
The complete WebClient example for Arduino Uno (via Software Serial) takes little resources: The complete WebClient example for Arduino Uno (via Software Serial) takes little resources:
``` ```
Sketch uses 14094 bytes (43%) of program storage space. Maximum is 32256 bytes. Sketch uses 15022 bytes (46%) of program storage space. Maximum is 32256 bytes.
Global variables use 625 bytes (30%) of dynamic memory, leaving 1423 bytes for local variables. Maximum is 2048 bytes. Global variables use 574 bytes (28%) of dynamic memory, leaving 1474 bytes for local variables. Maximum is 2048 bytes.
``` ```
Arduino GSM library uses 15868 bytes (49%) of Flash and 1113 bytes (54%) of RAM in a similar scenario. Arduino GSM library uses 15868 bytes (49%) of Flash and 1113 bytes (54%) of RAM in a similar scenario.
TinyGSM also pulls data gently from the modem (whenever possible), so it can operate on very little RAM. TinyGSM also pulls data gently from the modem (whenever possible), so it can operate on very little RAM.
@@ -78,6 +78,7 @@ GPS/GNSS | ✔¹ | 🅧 | ◌¹ | 🅧 |
- Microduino GSM - Microduino GSM
- Adafruit FONA (Mini Cellular GSM Breakout) - Adafruit FONA (Mini Cellular GSM Breakout)
- Adafruit FONA 800/808 Shield - Adafruit FONA 800/808 Shield
- Industruino GSM
- ... other modules, based on supported modems - ... other modules, based on supported modems
More modems may be supported later: More modems may be supported later:

View File

@@ -41,15 +41,8 @@
#include <TinyGsmClient.h> #include <TinyGsmClient.h>
#include <BlynkSimpleSIM800.h> #include <BlynkSimpleSIM800.h>
// You should get Auth Token in the Blynk App. // Set serial for debug console (to the Serial Monitor, default speed 115200)
// Go to the Project Settings (nut icon). #define SerialMon Serial
const char auth[] = "YourAuthToken";
// Your GPRS credentials
// Leave empty, if missing user or pass
const char apn[] = "YourAPN";
const char user[] = "";
const char pass[] = "";
// Hardware Serial on Mega, Leonardo, Micro // Hardware Serial on Mega, Leonardo, Micro
#define SerialAT Serial1 #define SerialAT Serial1
@@ -58,12 +51,23 @@ const char pass[] = "";
//#include <SoftwareSerial.h> //#include <SoftwareSerial.h>
//SoftwareSerial SerialAT(2, 3); // RX, TX //SoftwareSerial SerialAT(2, 3); // RX, TX
// Your GPRS credentials
// Leave empty, if missing user or pass
const char apn[] = "YourAPN";
const char user[] = "";
const char pass[] = "";
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
const char auth[] = "YourAuthToken";
TinyGsm modem(SerialAT); TinyGsm modem(SerialAT);
void setup() void setup()
{ {
// Set console baud rate // Set console baud rate
Serial.begin(115200); SerialMon.begin(115200);
delay(10); delay(10);
// Set GSM module baud rate // Set GSM module baud rate
@@ -72,12 +76,12 @@ void setup()
// Restart takes quite some time // Restart takes quite some time
// To skip it, call init() instead of restart() // To skip it, call init() instead of restart()
Serial.println("Initializing modem..."); SerialMon.println("Initializing modem...");
modem.restart(); modem.restart();
String modemInfo = modem.getModemInfo(); String modemInfo = modem.getModemInfo();
Serial.print("Modem: "); SerialMon.print("Modem: ");
Serial.println(modemInfo); SerialMon.println(modemInfo);
// Unlock your SIM card with a PIN // Unlock your SIM card with a PIN
//modem.simUnlock("1234"); //modem.simUnlock("1234");

View File

@@ -7,8 +7,9 @@
* TinyGSM Getting Started guide: * TinyGSM Getting Started guide:
* http://tiny.cc/tiny-gsm-readme * http://tiny.cc/tiny-gsm-readme
* *
* ATTENTION! Downloading big files requires quite a lot * ATTENTION! Downloading big files requires of knowledge of
* of knowledge - so this is for more experienced developers. * the TinyGSM internals and some modem specifics,
* so this is for more experienced developers.
* *
**************************************************************/ **************************************************************/
@@ -22,17 +23,17 @@
// #define TINY_GSM_MODEM_ESP8266 // #define TINY_GSM_MODEM_ESP8266
// #define TINY_GSM_MODEM_XBEE // #define TINY_GSM_MODEM_XBEE
// Increase RX buffer // Increase RX buffer if needed
#define TINY_GSM_RX_BUFFER 1030 #define TINY_GSM_RX_BUFFER 1024
#include <TinyGsmClient.h>
#include <CRC32.h>
// Uncomment this if you want to see all AT commands
//#define DUMP_AT_COMMANDS //#define DUMP_AT_COMMANDS
//#define TINY_GSM_DEBUG Serial
// Your GPRS credentials // Set serial for debug console (to the Serial Monitor, default speed 115200)
// Leave empty, if missing user or pass #define SerialMon Serial
const char apn[] = "YourAPN";
const char user[] = "";
const char pass[] = "";
// Use Hardware Serial on Mega, Leonardo, Micro // Use Hardware Serial on Mega, Leonardo, Micro
#define SerialAT Serial1 #define SerialAT Serial1
@@ -41,28 +42,34 @@ const char pass[] = "";
//#include <SoftwareSerial.h> //#include <SoftwareSerial.h>
//SoftwareSerial SerialAT(2, 3); // RX, TX //SoftwareSerial SerialAT(2, 3); // RX, TX
#include <TinyGsmClient.h>
#include <CRC32.h> // Your GPRS credentials
// Leave empty, if missing user or pass
const char apn[] = "YourAPN";
const char user[] = "";
const char pass[] = "";
// Server details
const char server[] = "vsh.pp.ua";
const int port = 80;
const char resource[] = "/TinyGSM/test_1k.bin";
uint32_t knownCRC32 = 0x6f50d767;
uint32_t knownFileSize = 1024; // In case server does not send it
#ifdef DUMP_AT_COMMANDS #ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h> #include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, Serial); StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm modem(debugger); TinyGsm modem(debugger);
#else #else
TinyGsm modem(SerialAT); TinyGsm modem(SerialAT);
#endif #endif
TinyGsmClient client(modem); TinyGsmClient client(modem);
const char server[] = "cdn.rawgit.com";
const int port = 80;
const char resource[] = "/vshymanskyy/tinygsm/master/extras/test_1k.bin";
uint32_t knownCRC32 = 0x6f50d767;
uint32_t knownFileSize = 1024; // In case server does not send it
void setup() { void setup() {
// Set console baud rate // Set console baud rate
Serial.begin(115200); SerialMon.begin(115200);
delay(10); delay(10);
// Set GSM module baud rate // Set GSM module baud rate
@@ -71,12 +78,12 @@ void setup() {
// Restart takes quite some time // Restart takes quite some time
// To skip it, call init() instead of restart() // To skip it, call init() instead of restart()
Serial.println("Initializing modem..."); SerialMon.println(F("Initializing modem..."));
modem.restart(); modem.restart();
String modemInfo = modem.getModemInfo(); String modemInfo = modem.getModemInfo();
Serial.print("Modem: "); SerialMon.print(F("Modem: "));
Serial.println(modemInfo); SerialMon.println(modemInfo);
// Unlock your SIM card with a PIN // Unlock your SIM card with a PIN
//modem.simUnlock("1234"); //modem.simUnlock("1234");
@@ -85,43 +92,42 @@ void setup() {
void printPercent(uint32_t readLength, uint32_t contentLength) { void printPercent(uint32_t readLength, uint32_t contentLength) {
// If we know the total length // If we know the total length
if (contentLength != -1) { if (contentLength != -1) {
Serial.print("\r "); SerialMon.print("\r ");
Serial.print((100.0 * readLength) / contentLength); SerialMon.print((100.0 * readLength) / contentLength);
Serial.print('%'); SerialMon.print('%');
} else { } else {
Serial.println(readLength); SerialMon.println(readLength);
} }
} }
void loop() { void loop() {
Serial.print("Waiting for network..."); SerialMon.print(F("Waiting for network..."));
if (!modem.waitForNetwork()) { if (!modem.waitForNetwork()) {
Serial.println(" fail"); SerialMon.println(" fail");
delay(10000); delay(10000);
return; return;
} }
Serial.println(" OK"); SerialMon.println(" OK");
Serial.print("Connecting to "); SerialMon.print(F("Connecting to "));
Serial.print(apn); SerialMon.print(apn);
if (!modem.gprsConnect(apn, user, pass)) { if (!modem.gprsConnect(apn, user, pass)) {
Serial.println(" fail"); SerialMon.println(" fail");
delay(10000); delay(10000);
return; return;
} }
Serial.println(" OK"); SerialMon.println(" OK");
Serial.print("Connecting to "); SerialMon.print(F("Connecting to "));
Serial.print(server); SerialMon.print(server);
// if you get a connection, report back via serial:
if (!client.connect(server, port)) { if (!client.connect(server, port)) {
Serial.println(" fail"); SerialMon.println(" fail");
delay(10000); delay(10000);
return; return;
} }
Serial.println(" OK"); SerialMon.println(" OK");
// Make a HTTP request:
// Make a HTTP GET request:
client.print(String("GET ") + resource + " HTTP/1.0\r\n"); client.print(String("GET ") + resource + " HTTP/1.0\r\n");
client.print(String("Host: ") + server + "\r\n"); client.print(String("Host: ") + server + "\r\n");
client.print("Connection: close\r\n\r\n"); client.print("Connection: close\r\n\r\n");
@@ -129,20 +135,20 @@ void loop() {
long timeout = millis(); long timeout = millis();
while (client.available() == 0) { while (client.available() == 0) {
if (millis() - timeout > 5000L) { if (millis() - timeout > 5000L) {
Serial.println(">>> Client Timeout !"); SerialMon.println(F(">>> Client Timeout !"));
client.stop(); client.stop();
delay(10000L); delay(10000L);
return; return;
} }
} }
Serial.println("Reading response header"); SerialMon.println(F("Reading response header"));
uint32_t contentLength = knownFileSize; uint32_t contentLength = knownFileSize;
while (client.available()) { while (client.available()) {
String line = client.readStringUntil('\n'); String line = client.readStringUntil('\n');
line.trim(); line.trim();
//Serial.println(line); // Uncomment this to show response header //SerialMon.println(line); // Uncomment this to show response header
line.toLowerCase(); line.toLowerCase();
if (line.startsWith("content-length:")) { if (line.startsWith("content-length:")) {
contentLength = line.substring(line.lastIndexOf(':') + 1).toInt(); contentLength = line.substring(line.lastIndexOf(':') + 1).toInt();
@@ -151,7 +157,7 @@ void loop() {
} }
} }
Serial.println("Reading response data"); SerialMon.println(F("Reading response data"));
timeout = millis(); timeout = millis();
uint32_t readLength = 0; uint32_t readLength = 0;
CRC32 crc; CRC32 crc;
@@ -161,7 +167,7 @@ void loop() {
while (readLength < contentLength && client.connected() && millis() - timeout < 10000L) { while (readLength < contentLength && client.connected() && millis() - timeout < 10000L) {
while (client.available()) { while (client.available()) {
uint8_t c = client.read(); uint8_t c = client.read();
//Serial.print((char)c); // Uncomment this to show data //SerialMon.print((char)c); // Uncomment this to show data
crc.update(c); crc.update(c);
readLength++; readLength++;
if (readLength % (contentLength / 13) == 0) { if (readLength % (contentLength / 13) == 0) {
@@ -172,22 +178,24 @@ void loop() {
} }
printPercent(readLength, contentLength); printPercent(readLength, contentLength);
timeElapsed = millis() - timeElapsed; timeElapsed = millis() - timeElapsed;
Serial.println(); SerialMon.println();
// Shutdown
client.stop(); client.stop();
Serial.println("Server disconnected"); SerialMon.println(F("Server disconnected"));
modem.gprsDisconnect(); modem.gprsDisconnect();
Serial.println("GPRS disconnected"); SerialMon.println(F("GPRS disconnected"));
Serial.println();
float duration = float(timeElapsed) / 1000; float duration = float(timeElapsed) / 1000;
Serial.print("Content-Length: "); Serial.println(contentLength); SerialMon.println();
Serial.print("Actually read: "); Serial.println(readLength); SerialMon.print("Content-Length: "); SerialMon.println(contentLength);
Serial.print("Calc. CRC32: 0x"); Serial.println(crc.finalize(), HEX); SerialMon.print("Actually read: "); SerialMon.println(readLength);
Serial.print("Known CRC32: 0x"); Serial.println(knownCRC32, HEX); SerialMon.print("Calc. CRC32: 0x"); SerialMon.println(crc.finalize(), HEX);
Serial.print("Duration: "); Serial.print(duration); Serial.println("s"); SerialMon.print("Known CRC32: 0x"); SerialMon.println(knownCRC32, HEX);
SerialMon.print("Duration: "); SerialMon.print(duration); SerialMon.println("s");
// Do nothing forevermore // Do nothing forevermore
while (true) { while (true) {

View File

@@ -10,6 +10,8 @@
* TinyGSM Getting Started guide: * TinyGSM Getting Started guide:
* http://tiny.cc/tiny-gsm-readme * http://tiny.cc/tiny-gsm-readme
* *
* For more HTTP API examples, see ArduinoHttpClient library
*
**************************************************************/ **************************************************************/
// Select your modem: // Select your modem:
@@ -21,8 +23,17 @@
// #define TINY_GSM_MODEM_M590 // #define TINY_GSM_MODEM_M590
// #define TINY_GSM_MODEM_ESP8266 // #define TINY_GSM_MODEM_ESP8266
// Increase RX buffer // Increase RX buffer if needed
#define TINY_GSM_RX_BUFFER 600 //#define TINY_GSM_RX_BUFFER 512
#include <TinyGsmClient.h>
#include <ArduinoHttpClient.h>
// Uncomment this if you want to see all AT commands
//#define DUMP_AT_COMMANDS
// Set serial for debug console (to the Serial Monitor, default speed 115200)
#define SerialMon Serial
// Use Hardware Serial on Mega, Leonardo, Micro // Use Hardware Serial on Mega, Leonardo, Micro
#define SerialAT Serial1 #define SerialAT Serial1
@@ -31,9 +42,6 @@
//#include <SoftwareSerial.h> //#include <SoftwareSerial.h>
//SoftwareSerial SerialAT(2, 3); // RX, TX //SoftwareSerial SerialAT(2, 3); // RX, TX
//#define DUMP_AT_COMMANDS
//#define TINY_GSM_DEBUG Serial
// Your GPRS credentials // Your GPRS credentials
// Leave empty, if missing user or pass // Leave empty, if missing user or pass
@@ -41,18 +49,14 @@ const char apn[] = "YourAPN";
const char user[] = ""; const char user[] = "";
const char pass[] = ""; const char pass[] = "";
// Name of the server we want to connect to // Server details
const char server[] = "cdn.rawgit.com"; const char server[] = "vsh.pp.ua";
const int port = 80; const char resource[] = "/TinyGSM/logo.txt";
// Path to download (this is the bit after the hostname in the URL) const int port = 80;
const char resource[] = "/vshymanskyy/tinygsm/master/extras/logo.txt";
#include <TinyGsmClient.h>
#include <ArduinoHttpClient.h>
#ifdef DUMP_AT_COMMANDS #ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h> #include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, Serial); StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm modem(debugger); TinyGsm modem(debugger);
#else #else
TinyGsm modem(SerialAT); TinyGsm modem(SerialAT);
@@ -63,7 +67,7 @@ HttpClient http(client, server, port);
void setup() { void setup() {
// Set console baud rate // Set console baud rate
Serial.begin(115200); SerialMon.begin(115200);
delay(10); delay(10);
// Set GSM module baud rate // Set GSM module baud rate
@@ -72,46 +76,45 @@ void setup() {
// Restart takes quite some time // Restart takes quite some time
// To skip it, call init() instead of restart() // To skip it, call init() instead of restart()
Serial.println("Initializing modem..."); SerialMon.println(F("Initializing modem..."));
modem.restart(); modem.restart();
String modemInfo = modem.getModemInfo(); String modemInfo = modem.getModemInfo();
Serial.print("Modem: "); SerialMon.print(F("Modem: "));
Serial.println(modemInfo); SerialMon.println(modemInfo);
// Unlock your SIM card with a PIN // Unlock your SIM card with a PIN
//modem.simUnlock("1234"); //modem.simUnlock("1234");
} }
void loop() { void loop() {
Serial.print(F("Waiting for network...")); SerialMon.print(F("Waiting for network..."));
if (!modem.waitForNetwork()) { if (!modem.waitForNetwork()) {
Serial.println(" fail"); SerialMon.println(" fail");
delay(10000); delay(10000);
return; return;
} }
Serial.println(" OK"); SerialMon.println(" OK");
Serial.print(F("Connecting to ")); SerialMon.print(F("Connecting to "));
Serial.print(apn); SerialMon.print(apn);
if (!modem.gprsConnect(apn, user, pass)) { if (!modem.gprsConnect(apn, user, pass)) {
Serial.println(" fail"); SerialMon.println(" fail");
delay(10000); delay(10000);
return; return;
} }
Serial.println(" OK"); SerialMon.println(" OK");
SerialMon.print(F("Performing HTTP GET request... "));
Serial.print(F("Performing HTTP GET request... "));
int err = http.get(resource); int err = http.get(resource);
if (err != 0) { if (err != 0) {
Serial.println("failed to connect"); SerialMon.println(F("failed to connect"));
delay(10000); delay(10000);
return; return;
} }
int status = http.responseStatusCode(); int status = http.responseStatusCode();
Serial.println(status); SerialMon.println(status);
if (!status) { if (!status) {
delay(10000); delay(10000);
return; return;
@@ -120,29 +123,32 @@ void loop() {
while (http.headerAvailable()) { while (http.headerAvailable()) {
String headerName = http.readHeaderName(); String headerName = http.readHeaderName();
String headerValue = http.readHeaderValue(); String headerValue = http.readHeaderValue();
//Serial.println(headerName + " : " + headerValue); //SerialMon.println(headerName + " : " + headerValue);
} }
int length = http.contentLength(); int length = http.contentLength();
if (length >= 0) { if (length >= 0) {
Serial.println(String("Content length is: ") + length); SerialMon.print(F("Content length is: "));
SerialMon.println(length);
} }
if (http.isResponseChunked()) { if (http.isResponseChunked()) {
Serial.println("This response is chunked"); SerialMon.println(F("The response is chunked"));
} }
String body = http.responseBody(); String body = http.responseBody();
Serial.println("Response:"); SerialMon.println(F("Response:"));
Serial.println(body); SerialMon.println(body);
Serial.println(String("Body length is: ") + body.length()); SerialMon.print(F("Body length is: "));
SerialMon.println(body.length());
// Shutdown // Shutdown
http.stop(); http.stop();
SerialMon.println(F("Server disconnected"));
modem.gprsDisconnect(); modem.gprsDisconnect();
Serial.println("GPRS disconnected"); SerialMon.println(F("GPRS disconnected"));
// Do nothing forevermore // Do nothing forevermore
while (true) { while (true) {

View File

@@ -10,15 +10,26 @@
* TinyGSM Getting Started guide: * TinyGSM Getting Started guide:
* http://tiny.cc/tiny-gsm-readme * http://tiny.cc/tiny-gsm-readme
* *
* SSL/TLS is currently supported only with SIM8xx series
* For more HTTP API examples, see ArduinoHttpClient library
*
**************************************************************/ **************************************************************/
// Select your modem // Select your modem:
// SSL/TLS is currently supported only with SIM8xx series
#define TINY_GSM_MODEM_SIM800 #define TINY_GSM_MODEM_SIM800
//#define TINY_GSM_MODEM_SIM808 // #define TINY_GSM_MODEM_SIM808
// Increase RX buffer // Increase RX buffer if needed
#define TINY_GSM_RX_BUFFER 64 //#define TINY_GSM_RX_BUFFER 512
#include <TinyGsmClient.h>
#include <ArduinoHttpClient.h>
// Uncomment this if you want to see all AT commands
//#define DUMP_AT_COMMANDS
// Set serial for debug console (to the Serial Monitor, default speed 115200)
#define SerialMon Serial
// Use Hardware Serial on Mega, Leonardo, Micro // Use Hardware Serial on Mega, Leonardo, Micro
#define SerialAT Serial1 #define SerialAT Serial1
@@ -27,9 +38,6 @@
//#include <SoftwareSerial.h> //#include <SoftwareSerial.h>
//SoftwareSerial SerialAT(2, 3); // RX, TX //SoftwareSerial SerialAT(2, 3); // RX, TX
//#define DUMP_AT_COMMANDS
//#define TINY_GSM_DEBUG Serial
// Your GPRS credentials // Your GPRS credentials
// Leave empty, if missing user or pass // Leave empty, if missing user or pass
@@ -37,18 +45,14 @@ const char apn[] = "YourAPN";
const char user[] = ""; const char user[] = "";
const char pass[] = ""; const char pass[] = "";
// Name of the server we want to connect to // Server details
const char server[] = "cdn.rawgit.com"; const char server[] = "vsh.pp.ua";
const int port = 443; const char resource[] = "/TinyGSM/logo.txt";
// Path to download (this is the bit after the hostname in the URL) const int port = 443;
const char resource[] = "/vshymanskyy/tinygsm/master/extras/logo.txt";
#include <TinyGsmClient.h>
#include <ArduinoHttpClient.h>
#ifdef DUMP_AT_COMMANDS #ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h> #include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, Serial); StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm modem(debugger); TinyGsm modem(debugger);
#else #else
TinyGsm modem(SerialAT); TinyGsm modem(SerialAT);
@@ -59,7 +63,7 @@ HttpClient http(client, server, port);
void setup() { void setup() {
// Set console baud rate // Set console baud rate
Serial.begin(115200); SerialMon.begin(115200);
delay(10); delay(10);
// Set GSM module baud rate // Set GSM module baud rate
@@ -68,53 +72,51 @@ void setup() {
// Restart takes quite some time // Restart takes quite some time
// To skip it, call init() instead of restart() // To skip it, call init() instead of restart()
Serial.println("Initializing modem..."); SerialMon.println(F("Initializing modem..."));
modem.restart(); modem.restart();
String modemInfo = modem.getModemInfo(); String modemInfo = modem.getModemInfo();
Serial.print("Modem: "); SerialMon.print(F("Modem: "));
Serial.println(modemInfo); SerialMon.println(modemInfo);
// Unlock your SIM card with a PIN // Unlock your SIM card with a PIN
//modem.simUnlock("1234"); //modem.simUnlock("1234");
if (!modem.hasSSL()) {
SerialMon.println(F("SSL is not supported by this modem"));
while(true) { delay(1000); }
}
} }
void loop() { void loop() {
if (!modem.hasSSL()) { SerialMon.print(F("Waiting for network..."));
Serial.println("SSL is not supported by this modem");
delay(10000);
return;
}
Serial.print(F("Waiting for network..."));
if (!modem.waitForNetwork()) { if (!modem.waitForNetwork()) {
Serial.println(" fail"); SerialMon.println(" fail");
delay(10000); delay(10000);
return; return;
} }
Serial.println(" OK"); SerialMon.println(" OK");
Serial.print(F("Connecting to ")); SerialMon.print(F("Connecting to "));
Serial.print(apn); SerialMon.print(apn);
if (!modem.gprsConnect(apn, user, pass)) { if (!modem.gprsConnect(apn, user, pass)) {
Serial.println(" fail"); SerialMon.println(" fail");
delay(10000); delay(10000);
return; return;
} }
Serial.println(" OK"); SerialMon.println(" OK");
SerialMon.print(F("Performing HTTPS GET request... "));
Serial.print(F("Performing HTTP GET request... "));
http.connectionKeepAlive(); // Currently, this is needed for HTTPS http.connectionKeepAlive(); // Currently, this is needed for HTTPS
int err = http.get(resource); int err = http.get(resource);
if (err != 0) { if (err != 0) {
Serial.println("failed to connect"); SerialMon.println(F("failed to connect"));
delay(10000); delay(10000);
return; return;
} }
int status = http.responseStatusCode(); int status = http.responseStatusCode();
Serial.println(status); SerialMon.println(status);
if (!status) { if (!status) {
delay(10000); delay(10000);
return; return;
@@ -123,29 +125,32 @@ void loop() {
while (http.headerAvailable()) { while (http.headerAvailable()) {
String headerName = http.readHeaderName(); String headerName = http.readHeaderName();
String headerValue = http.readHeaderValue(); String headerValue = http.readHeaderValue();
//Serial.println(headerName + " : " + headerValue); //SerialMon.println(headerName + " : " + headerValue);
} }
int length = http.contentLength(); int length = http.contentLength();
if (length >= 0) { if (length >= 0) {
Serial.println(String("Content length is: ") + length); SerialMon.print(F("Content length is: "));
SerialMon.println(length);
} }
if (http.isResponseChunked()) { if (http.isResponseChunked()) {
Serial.println("This response is chunked"); SerialMon.println(F("The response is chunked"));
} }
String body = http.responseBody(); String body = http.responseBody();
Serial.println("Response:"); SerialMon.println(F("Response:"));
Serial.println(body); SerialMon.println(body);
Serial.println(String("Body length is: ") + body.length()); SerialMon.print(F("Body length is: "));
SerialMon.println(body.length());
// Shutdown // Shutdown
http.stop(); http.stop();
SerialMon.println(F("Server disconnected"));
modem.gprsDisconnect(); modem.gprsDisconnect();
Serial.println("GPRS disconnected"); SerialMon.println(F("GPRS disconnected"));
// Do nothing forevermore // Do nothing forevermore
while (true) { while (true) {

View File

@@ -1,12 +1,14 @@
/************************************************************** /**************************************************************
* *
* For this example, you need to install PubSubClient library: * For this example, you need to install PubSubClient library:
* https://github.com/knolleary/pubsubclient/releases/latest * https://github.com/knolleary/pubsubclient
* or from http://librarymanager/all#PubSubClient * or from http://librarymanager/all#PubSubClient
* *
* TinyGSM Getting Started guide: * TinyGSM Getting Started guide:
* http://tiny.cc/tiny-gsm-readme * http://tiny.cc/tiny-gsm-readme
* *
* For more MQTT examples, see PubSubClient library
*
************************************************************** **************************************************************
* Use Mosquitto client tools to work with MQTT * Use Mosquitto client tools to work with MQTT
* Ubuntu/Linux: sudo apt-get install mosquitto-clients * Ubuntu/Linux: sudo apt-get install mosquitto-clients
@@ -20,7 +22,7 @@
* You can use Node-RED for wiring together MQTT-enabled devices * You can use Node-RED for wiring together MQTT-enabled devices
* https://nodered.org/ * https://nodered.org/
* Also, take a look at these additional Node-RED modules: * Also, take a look at these additional Node-RED modules:
* node-red-contrib-blynk-websockets * node-red-contrib-blynk-ws
* node-red-dashboard * node-red-dashboard
* *
**************************************************************/ **************************************************************/
@@ -38,11 +40,8 @@
#include <TinyGsmClient.h> #include <TinyGsmClient.h>
#include <PubSubClient.h> #include <PubSubClient.h>
// Your GPRS credentials // Set serial for debug console (to the Serial Monitor, default speed 115200)
// Leave empty, if missing user or pass #define SerialMon Serial
const char apn[] = "YourAPN";
const char user[] = "";
const char pass[] = "";
// Use Hardware Serial on Mega, Leonardo, Micro // Use Hardware Serial on Mega, Leonardo, Micro
#define SerialAT Serial1 #define SerialAT Serial1
@@ -51,16 +50,24 @@ const char pass[] = "";
//#include <SoftwareSerial.h> //#include <SoftwareSerial.h>
//SoftwareSerial SerialAT(2, 3); // RX, TX //SoftwareSerial SerialAT(2, 3); // RX, TX
TinyGsm modem(SerialAT);
TinyGsmClient client(modem);
PubSubClient mqtt(client);
// Your GPRS credentials
// Leave empty, if missing user or pass
const char apn[] = "YourAPN";
const char user[] = "";
const char pass[] = "";
// MQTT details
const char* broker = "test.mosquitto.org"; const char* broker = "test.mosquitto.org";
const char* topicLed = "GsmClientTest/led"; const char* topicLed = "GsmClientTest/led";
const char* topicInit = "GsmClientTest/init"; const char* topicInit = "GsmClientTest/init";
const char* topicLedStatus = "GsmClientTest/ledStatus"; const char* topicLedStatus = "GsmClientTest/ledStatus";
TinyGsm modem(SerialAT);
TinyGsmClient client(modem);
PubSubClient mqtt(client);
#define LED_PIN 13 #define LED_PIN 13
int ledStatus = LOW; int ledStatus = LOW;
@@ -70,7 +77,7 @@ void setup() {
pinMode(LED_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT);
// Set console baud rate // Set console baud rate
Serial.begin(115200); SerialMon.begin(115200);
delay(10); delay(10);
// Set GSM module baud rate // Set GSM module baud rate
@@ -79,30 +86,30 @@ void setup() {
// Restart takes quite some time // Restart takes quite some time
// To skip it, call init() instead of restart() // To skip it, call init() instead of restart()
Serial.println("Initializing modem..."); SerialMon.println("Initializing modem...");
modem.restart(); modem.restart();
String modemInfo = modem.getModemInfo(); String modemInfo = modem.getModemInfo();
Serial.print("Modem: "); SerialMon.print("Modem: ");
Serial.println(modemInfo); SerialMon.println(modemInfo);
// Unlock your SIM card with a PIN // Unlock your SIM card with a PIN
//modem.simUnlock("1234"); //modem.simUnlock("1234");
Serial.print("Waiting for network..."); SerialMon.print("Waiting for network...");
if (!modem.waitForNetwork()) { if (!modem.waitForNetwork()) {
Serial.println(" fail"); SerialMon.println(" fail");
while (true); while (true);
} }
Serial.println(" OK"); SerialMon.println(" OK");
Serial.print("Connecting to "); SerialMon.print("Connecting to ");
Serial.print(apn); SerialMon.print(apn);
if (!modem.gprsConnect(apn, user, pass)) { if (!modem.gprsConnect(apn, user, pass)) {
Serial.println(" fail"); SerialMon.println(" fail");
while (true); while (true);
} }
Serial.println(" OK"); SerialMon.println(" OK");
// MQTT Broker setup // MQTT Broker setup
mqtt.setServer(broker, 1883); mqtt.setServer(broker, 1883);
@@ -110,13 +117,13 @@ void setup() {
} }
boolean mqttConnect() { boolean mqttConnect() {
Serial.print("Connecting to "); SerialMon.print("Connecting to ");
Serial.print(broker); SerialMon.print(broker);
if (!mqtt.connect("GsmClientTest")) { if (!mqtt.connect("GsmClientTest")) {
Serial.println(" fail"); SerialMon.println(" fail");
return false; return false;
} }
Serial.println(" OK"); SerialMon.println(" OK");
mqtt.publish(topicInit, "GsmClientTest started"); mqtt.publish(topicInit, "GsmClientTest started");
mqtt.subscribe(topicLed); mqtt.subscribe(topicLed);
return mqtt.connected(); return mqtt.connected();
@@ -140,11 +147,11 @@ void loop() {
} }
void mqttCallback(char* topic, byte* payload, unsigned int len) { void mqttCallback(char* topic, byte* payload, unsigned int len) {
Serial.print("Message arrived ["); SerialMon.print("Message arrived [");
Serial.print(topic); SerialMon.print(topic);
Serial.print("]: "); SerialMon.print("]: ");
Serial.write(payload, len); SerialMon.write(payload, len);
Serial.println(); SerialMon.println();
// Only proceed if incoming message's topic matches // Only proceed if incoming message's topic matches
if (String(topic) == topicLed) { if (String(topic) == topicLed) {

View File

@@ -17,13 +17,16 @@
// #define TINY_GSM_MODEM_M590 // #define TINY_GSM_MODEM_M590
// #define TINY_GSM_MODEM_ESP8266 // #define TINY_GSM_MODEM_ESP8266
// Increase RX buffer if needed
//#define TINY_GSM_RX_BUFFER 512
#include <TinyGsmClient.h> #include <TinyGsmClient.h>
// Your GPRS credentials // Uncomment this if you want to see all AT commands
// Leave empty, if missing user or pass //#define DUMP_AT_COMMANDS
const char apn[] = "YourAPN";
const char user[] = ""; // Set serial for debug console (to the Serial Monitor, default speed 115200)
const char pass[] = ""; #define SerialMon Serial
// Use Hardware Serial on Mega, Leonardo, Micro // Use Hardware Serial on Mega, Leonardo, Micro
#define SerialAT Serial1 #define SerialAT Serial1
@@ -32,17 +35,31 @@ const char pass[] = "";
//#include <SoftwareSerial.h> //#include <SoftwareSerial.h>
//SoftwareSerial SerialAT(2, 3); // RX, TX //SoftwareSerial SerialAT(2, 3); // RX, TX
TinyGsm modem(SerialAT);
// Your GPRS credentials
// Leave empty, if missing user or pass
const char apn[] = "YourAPN";
const char user[] = "";
const char pass[] = "";
// Server details
const char server[] = "vsh.pp.ua";
const char resource[] = "/TinyGSM/logo.txt";
const int port = 80;
#ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm modem(debugger);
#else
TinyGsm modem(SerialAT);
#endif
TinyGsmClient client(modem); TinyGsmClient client(modem);
const char server[] = "cdn.rawgit.com";
const char resource[] = "/vshymanskyy/tinygsm/master/extras/logo.txt";
const int port = 80;
void setup() { void setup() {
// Set console baud rate // Set console baud rate
Serial.begin(115200); SerialMon.begin(115200);
delay(10); delay(10);
// Set GSM module baud rate // Set GSM module baud rate
@@ -51,43 +68,43 @@ void setup() {
// Restart takes quite some time // Restart takes quite some time
// To skip it, call init() instead of restart() // To skip it, call init() instead of restart()
Serial.println(F("Initializing modem...")); SerialMon.println(F("Initializing modem..."));
modem.restart(); modem.restart();
String modemInfo = modem.getModemInfo(); String modemInfo = modem.getModemInfo();
Serial.print("Modem: "); SerialMon.print(F("Modem: "));
Serial.println(modemInfo); SerialMon.println(modemInfo);
// Unlock your SIM card with a PIN // Unlock your SIM card with a PIN
//modem.simUnlock("1234"); //modem.simUnlock("1234");
} }
void loop() { void loop() {
Serial.print(F("Waiting for network...")); SerialMon.print(F("Waiting for network..."));
if (!modem.waitForNetwork()) { if (!modem.waitForNetwork()) {
Serial.println(" fail"); SerialMon.println(" fail");
delay(10000); delay(10000);
return; return;
} }
Serial.println(" OK"); SerialMon.println(" OK");
Serial.print(F("Connecting to ")); SerialMon.print(F("Connecting to "));
Serial.print(apn); SerialMon.print(apn);
if (!modem.gprsConnect(apn, user, pass)) { if (!modem.gprsConnect(apn, user, pass)) {
Serial.println(" fail"); SerialMon.println(" fail");
delay(10000); delay(10000);
return; return;
} }
Serial.println(" OK"); SerialMon.println(" OK");
Serial.print(F("Connecting to ")); SerialMon.print(F("Connecting to "));
Serial.print(server); SerialMon.print(server);
if (!client.connect(server, port)) { if (!client.connect(server, port)) {
Serial.println(" fail"); SerialMon.println(" fail");
delay(10000); delay(10000);
return; return;
} }
Serial.println(" OK"); SerialMon.println(" OK");
// Make a HTTP GET request: // Make a HTTP GET request:
client.print(String("GET ") + resource + " HTTP/1.0\r\n"); client.print(String("GET ") + resource + " HTTP/1.0\r\n");
@@ -99,17 +116,19 @@ void loop() {
// Print available data // Print available data
while (client.available()) { while (client.available()) {
char c = client.read(); char c = client.read();
Serial.print(c); SerialMon.print(c);
timeout = millis(); timeout = millis();
} }
} }
Serial.println(); SerialMon.println();
// Shutdown
client.stop(); client.stop();
Serial.println("Server disconnected"); SerialMon.println(F("Server disconnected"));
modem.gprsDisconnect(); modem.gprsDisconnect();
Serial.println("GPRS disconnected"); SerialMon.println(F("GPRS disconnected"));
// Do nothing forevermore // Do nothing forevermore
while (true) { while (true) {

View File

@@ -0,0 +1,160 @@
/**************************************************************
*
* This sketch connects to a website and downloads a page.
* It can be used to perform HTTP/RESTful API calls.
*
* For this example, you need to install ArduinoHttpClient library:
* https://github.com/arduino-libraries/ArduinoHttpClient
* or from http://librarymanager/all#ArduinoHttpClient
*
* TinyGSM Getting Started guide:
* http://tiny.cc/tiny-gsm-readme
*
* For more HTTP API examples, see ArduinoHttpClient library
*
**************************************************************/
// Industruino uses SIM800H
#define TINY_GSM_MODEM_SIM800
// Increase RX buffer if needed
//#define TINY_GSM_RX_BUFFER 512
#include <TinyGsmClient.h>
#include <ArduinoHttpClient.h>
// Uncomment this if you want to see all AT commands
//#define DUMP_AT_COMMANDS
// Uncomment this if you want to use SSL
//#define USE_SSL
// Set serial for debug console (to the Serial Monitor, speed 115200)
#define SerialMon SerialUSB
// Select Serial1 or Serial depending on your module configuration
#define SerialAT Serial1
// Your GPRS credentials
// Leave empty, if missing user or pass
const char apn[] = "YourAPN";
const char user[] = "";
const char pass[] = "";
// Server details
const char server[] = "vsh.pp.ua";
const char resource[] = "/TinyGSM/logo.txt";
#ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm modem(debugger);
#else
TinyGsm modem(SerialAT);
#endif
#ifdef USE_SSL
TinyGsmClientSecure client(modem);
HttpClient http(client, server, 443);
#else
TinyGsmClient client(modem);
HttpClient http(client, server, 80);
#endif
void setup() {
// Turn on modem with 1 second pulse on D6
pinMode(6, OUTPUT);
digitalWrite(6, HIGH);
delay(1000);
digitalWrite(6, LOW);
// Set console baud rate
SerialMon.begin(115200);
delay(10);
// Set GSM module baud rate
SerialAT.begin(115200);
delay(3000);
// Restart takes quite some time
// To skip it, call init() instead of restart()
SerialMon.println(F("Initializing modem..."));
modem.restart();
String modemInfo = modem.getModemInfo();
SerialMon.print(F("Modem: "));
SerialMon.println(modemInfo);
// Unlock your SIM card with a PIN
//modem.simUnlock("1234");
}
void loop() {
SerialMon.print(F("Waiting for network..."));
if (!modem.waitForNetwork()) {
SerialMon.println(" fail");
delay(10000);
return;
}
SerialMon.println(" OK");
SerialMon.print(F("Connecting to "));
SerialMon.print(apn);
if (!modem.gprsConnect(apn, user, pass)) {
SerialMon.println(" fail");
delay(10000);
return;
}
SerialMon.println(" OK");
SerialMon.print(F("Performing HTTP GET request... "));
int err = http.get(resource);
if (err != 0) {
SerialMon.println(F("failed to connect"));
delay(10000);
return;
}
int status = http.responseStatusCode();
SerialMon.println(status);
if (!status) {
delay(10000);
return;
}
while (http.headerAvailable()) {
String headerName = http.readHeaderName();
String headerValue = http.readHeaderValue();
//SerialMon.println(headerName + " : " + headerValue);
}
int length = http.contentLength();
if (length >= 0) {
SerialMon.print(F("Content length is: "));
SerialMon.println(length);
}
if (http.isResponseChunked()) {
SerialMon.println(F("The response is chunked"));
}
String body = http.responseBody();
SerialMon.println(F("Response:"));
SerialMon.println(body);
SerialMon.print(F("Body length is: "));
SerialMon.println(body.length());
// Shutdown
http.stop();
SerialMon.println(F("Server disconnected"));
modem.gprsDisconnect();
SerialMon.println(F("GPRS disconnected"));
// Do nothing forevermore
while (true) {
delay(1000);
}
}

View File

@@ -0,0 +1,36 @@
const char cert[] PROGMEM =
"-----BEGIN CERTIFICATE-----\n"
"MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB\n"
"hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\n"
"A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV\n"
"BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5\n"
"MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT\n"
"EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\n"
"Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh\n"
"dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR\n"
"6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X\n"
"pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC\n"
"9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV\n"
"/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf\n"
"Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z\n"
"+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w\n"
"qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah\n"
"SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC\n"
"u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf\n"
"Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq\n"
"crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E\n"
"FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB\n"
"/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl\n"
"wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM\n"
"4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV\n"
"2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna\n"
"FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ\n"
"CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK\n"
"boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke\n"
"jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL\n"
"S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb\n"
"QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl\n"
"0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB\n"
"NVOFBkpdn627G190\n"
"-----END CERTIFICATE-----\n";

View File

@@ -0,0 +1,74 @@
const char cert[] PROGMEM =
{
0x30, 0x82, 0x03, 0x4a, 0x30, 0x82, 0x02, 0x32, 0xa0, 0x03, 0x02, 0x01,
0x02, 0x02, 0x10, 0x44, 0xaf, 0xb0, 0x80, 0xd6, 0xa3, 0x27, 0xba, 0x89,
0x30, 0x39, 0x86, 0x2e, 0xf8, 0x40, 0x6b, 0x30, 0x0d, 0x06, 0x09, 0x2a,
0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3f,
0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, 0x44,
0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61,
0x74, 0x75, 0x72, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43,
0x6f, 0x2e, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
0x0e, 0x44, 0x53, 0x54, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41,
0x20, 0x58, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x30, 0x30, 0x39, 0x33,
0x30, 0x32, 0x31, 0x31, 0x32, 0x31, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x31,
0x30, 0x39, 0x33, 0x30, 0x31, 0x34, 0x30, 0x31, 0x31, 0x35, 0x5a, 0x30,
0x3f, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b,
0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, 0x69, 0x67, 0x6e,
0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20,
0x43, 0x6f, 0x2e, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03,
0x13, 0x0e, 0x44, 0x53, 0x54, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43,
0x41, 0x20, 0x58, 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09,
0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,
0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01,
0x00, 0xdf, 0xaf, 0xe9, 0x97, 0x50, 0x08, 0x83, 0x57, 0xb4, 0xcc, 0x62,
0x65, 0xf6, 0x90, 0x82, 0xec, 0xc7, 0xd3, 0x2c, 0x6b, 0x30, 0xca, 0x5b,
0xec, 0xd9, 0xc3, 0x7d, 0xc7, 0x40, 0xc1, 0x18, 0x14, 0x8b, 0xe0, 0xe8,
0x33, 0x76, 0x49, 0x2a, 0xe3, 0x3f, 0x21, 0x49, 0x93, 0xac, 0x4e, 0x0e,
0xaf, 0x3e, 0x48, 0xcb, 0x65, 0xee, 0xfc, 0xd3, 0x21, 0x0f, 0x65, 0xd2,
0x2a, 0xd9, 0x32, 0x8f, 0x8c, 0xe5, 0xf7, 0x77, 0xb0, 0x12, 0x7b, 0xb5,
0x95, 0xc0, 0x89, 0xa3, 0xa9, 0xba, 0xed, 0x73, 0x2e, 0x7a, 0x0c, 0x06,
0x32, 0x83, 0xa2, 0x7e, 0x8a, 0x14, 0x30, 0xcd, 0x11, 0xa0, 0xe1, 0x2a,
0x38, 0xb9, 0x79, 0x0a, 0x31, 0xfd, 0x50, 0xbd, 0x80, 0x65, 0xdf, 0xb7,
0x51, 0x63, 0x83, 0xc8, 0xe2, 0x88, 0x61, 0xea, 0x4b, 0x61, 0x81, 0xec,
0x52, 0x6b, 0xb9, 0xa2, 0xe2, 0x4b, 0x1a, 0x28, 0x9f, 0x48, 0xa3, 0x9e,
0x0c, 0xda, 0x09, 0x8e, 0x3e, 0x17, 0x2e, 0x1e, 0xdd, 0x20, 0xdf, 0x5b,
0xc6, 0x2a, 0x8a, 0xab, 0x2e, 0xbd, 0x70, 0xad, 0xc5, 0x0b, 0x1a, 0x25,
0x90, 0x74, 0x72, 0xc5, 0x7b, 0x6a, 0xab, 0x34, 0xd6, 0x30, 0x89, 0xff,
0xe5, 0x68, 0x13, 0x7b, 0x54, 0x0b, 0xc8, 0xd6, 0xae, 0xec, 0x5a, 0x9c,
0x92, 0x1e, 0x3d, 0x64, 0xb3, 0x8c, 0xc6, 0xdf, 0xbf, 0xc9, 0x41, 0x70,
0xec, 0x16, 0x72, 0xd5, 0x26, 0xec, 0x38, 0x55, 0x39, 0x43, 0xd0, 0xfc,
0xfd, 0x18, 0x5c, 0x40, 0xf1, 0x97, 0xeb, 0xd5, 0x9a, 0x9b, 0x8d, 0x1d,
0xba, 0xda, 0x25, 0xb9, 0xc6, 0xd8, 0xdf, 0xc1, 0x15, 0x02, 0x3a, 0xab,
0xda, 0x6e, 0xf1, 0x3e, 0x2e, 0xf5, 0x5c, 0x08, 0x9c, 0x3c, 0xd6, 0x83,
0x69, 0xe4, 0x10, 0x9b, 0x19, 0x2a, 0xb6, 0x29, 0x57, 0xe3, 0xe5, 0x3d,
0x9b, 0x9f, 0xf0, 0x02, 0x5d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42,
0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,
0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55,
0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30,
0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xc4, 0xa7,
0xb1, 0xa4, 0x7b, 0x2c, 0x71, 0xfa, 0xdb, 0xe1, 0x4b, 0x90, 0x75, 0xff,
0xc4, 0x15, 0x60, 0x85, 0x89, 0x10, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01,
0x01, 0x00, 0xa3, 0x1a, 0x2c, 0x9b, 0x17, 0x00, 0x5c, 0xa9, 0x1e, 0xee,
0x28, 0x66, 0x37, 0x3a, 0xbf, 0x83, 0xc7, 0x3f, 0x4b, 0xc3, 0x09, 0xa0,
0x95, 0x20, 0x5d, 0xe3, 0xd9, 0x59, 0x44, 0xd2, 0x3e, 0x0d, 0x3e, 0xbd,
0x8a, 0x4b, 0xa0, 0x74, 0x1f, 0xce, 0x10, 0x82, 0x9c, 0x74, 0x1a, 0x1d,
0x7e, 0x98, 0x1a, 0xdd, 0xcb, 0x13, 0x4b, 0xb3, 0x20, 0x44, 0xe4, 0x91,
0xe9, 0xcc, 0xfc, 0x7d, 0xa5, 0xdb, 0x6a, 0xe5, 0xfe, 0xe6, 0xfd, 0xe0,
0x4e, 0xdd, 0xb7, 0x00, 0x3a, 0xb5, 0x70, 0x49, 0xaf, 0xf2, 0xe5, 0xeb,
0x02, 0xf1, 0xd1, 0x02, 0x8b, 0x19, 0xcb, 0x94, 0x3a, 0x5e, 0x48, 0xc4,
0x18, 0x1e, 0x58, 0x19, 0x5f, 0x1e, 0x02, 0x5a, 0xf0, 0x0c, 0xf1, 0xb1,
0xad, 0xa9, 0xdc, 0x59, 0x86, 0x8b, 0x6e, 0xe9, 0x91, 0xf5, 0x86, 0xca,
0xfa, 0xb9, 0x66, 0x33, 0xaa, 0x59, 0x5b, 0xce, 0xe2, 0xa7, 0x16, 0x73,
0x47, 0xcb, 0x2b, 0xcc, 0x99, 0xb0, 0x37, 0x48, 0xcf, 0xe3, 0x56, 0x4b,
0xf5, 0xcf, 0x0f, 0x0c, 0x72, 0x32, 0x87, 0xc6, 0xf0, 0x44, 0xbb, 0x53,
0x72, 0x6d, 0x43, 0xf5, 0x26, 0x48, 0x9a, 0x52, 0x67, 0xb7, 0x58, 0xab,
0xfe, 0x67, 0x76, 0x71, 0x78, 0xdb, 0x0d, 0xa2, 0x56, 0x14, 0x13, 0x39,
0x24, 0x31, 0x85, 0xa2, 0xa8, 0x02, 0x5a, 0x30, 0x47, 0xe1, 0xdd, 0x50,
0x07, 0xbc, 0x02, 0x09, 0x90, 0x00, 0xeb, 0x64, 0x63, 0x60, 0x9b, 0x16,
0xbc, 0x88, 0xc9, 0x12, 0xe6, 0xd2, 0x7d, 0x91, 0x8b, 0xf9, 0x3d, 0x32,
0x8d, 0x65, 0xb4, 0xe9, 0x7c, 0xb1, 0x57, 0x76, 0xea, 0xc5, 0xb6, 0x28,
0x39, 0xbf, 0x15, 0x65, 0x1c, 0xc8, 0xf6, 0x77, 0x96, 0x6a, 0x0a, 0x8d,
0x77, 0x0b, 0xd8, 0x91, 0x0b, 0x04, 0x8e, 0x07, 0xdb, 0x29, 0xb6, 0x0a,
0xee, 0x9d, 0x82, 0x35, 0x35, 0x10
};

View File

@@ -0,0 +1,22 @@
const char cert[] PROGMEM =
"-----BEGIN CERTIFICATE-----\n"
"MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/\n"
"MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n"
"DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow\n"
"PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD\n"
"Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\n"
"AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O\n"
"rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq\n"
"OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b\n"
"xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw\n"
"7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD\n"
"aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\n"
"HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG\n"
"SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69\n"
"ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr\n"
"AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz\n"
"R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5\n"
"JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo\n"
"Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\n"
"-----END CERTIFICATE-----\n";

View File

@@ -0,0 +1,97 @@
/**************************************************************
*
* This sketch uploads SSL certificates to the SIM8xx
*
* TinyGSM Getting Started guide:
* http://tiny.cc/tiny-gsm-readme
*
**************************************************************/
// This example is specific to SIM8xx
#define TINY_GSM_MODEM_SIM800
// Select your certificate:
#include "DSTRootCAX3.h"
//#include "DSTRootCAX3.der.h"
//#include "COMODORSACertificationAuthority.h"
// Select the file you want to write into
// (the file is stored on the modem)
#define CERT_FILE "C:\\USER\\CERT.CRT"
#include <TinyGsmClient.h>
// Set serial for debug console (to the Serial Monitor, speed 115200)
#define SerialMon Serial
// Use Hardware Serial for AT commands
#define SerialAT Serial1
// Uncomment this if you want to see all AT commands
//#define DUMP_AT_COMMANDS
#ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm modem(debugger);
#else
TinyGsm modem(SerialAT);
#endif
void setup() {
// Set console baud rate
SerialMon.begin(115200);
delay(10);
// Set GSM module baud rate
SerialAT.begin(115200);
delay(3000);
SerialMon.println(F("Initializing modem..."));
modem.init();
modem.sendAT(GF("+FSCREATE=" CERT_FILE));
if (modem.waitResponse() != 1) return;
const int cert_size = sizeof(cert);
modem.sendAT(GF("+FSWRITE=" CERT_FILE ",0,"), cert_size, GF(",10"));
if (modem.waitResponse(GF(">")) != 1) {
return;
}
for (int i = 0; i < cert_size; i++) {
char c = pgm_read_byte(&cert[i]);
modem.stream.write(c);
}
modem.stream.write(GSM_NL);
modem.stream.flush();
if (modem.waitResponse(2000) != 1) return;
modem.sendAT(GF("+SSLSETCERT=\"" CERT_FILE "\""));
if (modem.waitResponse() != 1) return;
if (modem.waitResponse(5000L, GF(GSM_NL "+SSLSETCERT:")) != 1) return;
const int retCode = modem.stream.readStringUntil('\n').toInt();
SerialMon.println();
SerialMon.println();
SerialMon.println(F("****************************"));
SerialMon.print(F("Setting Certificate: "));
SerialMon.println((0 == retCode) ? "OK" : "FAILED");
SerialMon.println(F("****************************"));
}
void loop() {
if (SerialAT.available()) {
SerialMon.write(SerialAT.read());
}
if (SerialMon.available()) {
SerialAT.write(SerialMon.read());
}
delay(0);
}

Binary file not shown.

View File

@@ -1,6 +1,6 @@
{ {
"name": "TinyGSM", "name": "TinyGSM",
"version": "0.3.13", "version": "0.3.20",
"description": "A small Arduino library for GPRS modules, that just works. Includes examples for Blynk, MQTT, File Download, and Web Client. Supports GSM modules with AT command interface: SIM800, SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868, SIM900, SIM900A, SIM900D, SIM908, SIM968", "description": "A small Arduino library for GPRS modules, that just works. Includes examples for Blynk, MQTT, File Download, and Web Client. Supports GSM modules with AT command interface: SIM800, SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868, SIM900, SIM900A, SIM900D, SIM908, SIM968",
"keywords": "GSM, AT commands, AT, SIM800, SIM900, A6, A7, M590, ESP8266, SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868, SIM900A, SIM900D, SIM908, SIM968", "keywords": "GSM, AT commands, AT, SIM800, SIM900, A6, A7, M590, ESP8266, SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868, SIM900A, SIM900D, SIM908, SIM968",
"authors": "authors":

View File

@@ -1,5 +1,5 @@
name=TinyGSM name=TinyGSM
version=0.3.13 version=0.3.20
author=Volodymyr Shymanskyy author=Volodymyr Shymanskyy
maintainer=Volodymyr Shymanskyy maintainer=Volodymyr Shymanskyy
sentence=A small Arduino library for GPRS modules, that just works. sentence=A small Arduino library for GPRS modules, that just works.

View File

@@ -82,6 +82,7 @@ public:
public: public:
virtual int connect(const char *host, uint16_t port) { virtual int connect(const char *host, uint16_t port) {
stop();
TINY_GSM_YIELD(); TINY_GSM_YIELD();
rx.clear(); rx.clear();
uint8_t newMux = -1; uint8_t newMux = -1;
@@ -110,6 +111,7 @@ public:
at->sendAT(GF("+CIPCLOSE="), mux); at->sendAT(GF("+CIPCLOSE="), mux);
sock_connected = false; sock_connected = false;
at->waitResponse(); at->waitResponse();
rx.clear();
} }
virtual size_t write(const uint8_t *buf, size_t size) { virtual size_t write(const uint8_t *buf, size_t size) {
@@ -252,9 +254,7 @@ public:
} }
void maintain() { void maintain() {
//while (stream.available()) { waitResponse(10, NULL, NULL);
waitResponse(10, NULL, NULL);
//}
} }
bool factoryDefault() { bool factoryDefault() {
@@ -276,7 +276,9 @@ public:
return res; return res;
} }
bool hasSSL() { return false; } bool hasSSL() {
return false;
}
/* /*
* Power functions * Power functions
@@ -427,7 +429,7 @@ public:
/* /*
* GPRS functions * GPRS functions
*/ */
bool gprsConnect(const char* apn, const char* user, const char* pwd) { bool gprsConnect(const char* apn, const char* user = NULL, const char* pwd = NULL) {
gprsDisconnect(); gprsDisconnect();
sendAT(GF("+CGATT=1")); sendAT(GF("+CGATT=1"));
@@ -458,8 +460,10 @@ public:
} }
bool gprsDisconnect() { bool gprsDisconnect() {
// Shut the TCP/IP connection
sendAT(GF("+CIPSHUT")); sendAT(GF("+CIPSHUT"));
waitResponse(5000L); if (waitResponse(60000L) != 1)
return false;
for (int i = 0; i<3; i++) { for (int i = 0; i<3; i++) {
sendAT(GF("+CGATT=0")); sendAT(GF("+CGATT=0"));
@@ -572,12 +576,12 @@ protected:
int modemSend(const void* buff, size_t len, uint8_t mux) { int modemSend(const void* buff, size_t len, uint8_t mux) {
sendAT(GF("+CIPSEND="), mux, ',', len); sendAT(GF("+CIPSEND="), mux, ',', len);
if (waitResponse(2000L, GF(GSM_NL ">")) != 1) { if (waitResponse(2000L, GF(GSM_NL ">")) != 1) {
return -1; return 0;
} }
stream.write((uint8_t*)buff, len); stream.write((uint8_t*)buff, len);
stream.flush(); stream.flush();
if (waitResponse(10000L, GFP(GSM_OK), GF(GSM_NL "FAIL")) != 1) { if (waitResponse(10000L, GFP(GSM_OK), GF(GSM_NL "FAIL")) != 1) {
return -1; return 0;
} }
return len; return len;
} }
@@ -713,8 +717,10 @@ finish:
return waitResponse(1000, r1, r2, r3, r4, r5); return waitResponse(1000, r1, r2, r3, r4, r5);
} }
protected: public:
Stream& stream; Stream& stream;
protected:
GsmClient* sockets[TINY_GSM_MUX_COUNT]; GsmClient* sockets[TINY_GSM_MUX_COUNT];
}; };

View File

@@ -80,6 +80,7 @@ public:
public: public:
virtual int connect(const char *host, uint16_t port) { virtual int connect(const char *host, uint16_t port) {
stop();
TINY_GSM_YIELD(); TINY_GSM_YIELD();
rx.clear(); rx.clear();
sock_connected = at->modemConnect(host, port, mux); sock_connected = at->modemConnect(host, port, mux);
@@ -103,6 +104,7 @@ public:
at->sendAT(GF("+CIPCLOSE="), mux); at->sendAT(GF("+CIPCLOSE="), mux);
sock_connected = false; sock_connected = false;
at->waitResponse(); at->waitResponse();
rx.clear();
} }
virtual size_t write(const uint8_t *buf, size_t size) { virtual size_t write(const uint8_t *buf, size_t size) {
@@ -194,6 +196,7 @@ public:
public: public:
virtual int connect(const char *host, uint16_t port) { virtual int connect(const char *host, uint16_t port) {
stop();
TINY_GSM_YIELD(); TINY_GSM_YIELD();
rx.clear(); rx.clear();
sock_connected = at->modemConnect(host, port, mux, true); sock_connected = at->modemConnect(host, port, mux, true);
@@ -255,7 +258,7 @@ public:
} }
void maintain() { void maintain() {
waitResponse(10, NULL, NULL); waitResponse(10, NULL, NULL);
} }
bool factoryDefault() { bool factoryDefault() {
@@ -443,12 +446,12 @@ protected:
int modemSend(const void* buff, size_t len, uint8_t mux) { int modemSend(const void* buff, size_t len, uint8_t mux) {
sendAT(GF("+CIPSEND="), mux, ',', len); sendAT(GF("+CIPSEND="), mux, ',', len);
if (waitResponse(GF(">")) != 1) { if (waitResponse(GF(">")) != 1) {
return -1; return 0;
} }
stream.write((uint8_t*)buff, len); stream.write((uint8_t*)buff, len);
stream.flush(); stream.flush();
if (waitResponse(10000L, GF(GSM_NL "SEND OK" GSM_NL)) != 1) { if (waitResponse(10000L, GF(GSM_NL "SEND OK" GSM_NL)) != 1) {
return -1; return 0;
} }
return len; return len;
} }
@@ -584,8 +587,10 @@ finish:
return waitResponse(1000, r1, r2, r3, r4, r5); return waitResponse(1000, r1, r2, r3, r4, r5);
} }
protected: public:
Stream& stream; Stream& stream;
protected:
GsmClient* sockets[TINY_GSM_MUX_COUNT]; GsmClient* sockets[TINY_GSM_MUX_COUNT];
}; };

View File

@@ -80,6 +80,7 @@ public:
public: public:
virtual int connect(const char *host, uint16_t port) { virtual int connect(const char *host, uint16_t port) {
stop();
TINY_GSM_YIELD(); TINY_GSM_YIELD();
rx.clear(); rx.clear();
sock_connected = at->modemConnect(host, port, mux); sock_connected = at->modemConnect(host, port, mux);
@@ -103,6 +104,7 @@ public:
at->sendAT(GF("+TCPCLOSE="), mux); at->sendAT(GF("+TCPCLOSE="), mux);
sock_connected = false; sock_connected = false;
at->waitResponse(); at->waitResponse();
rx.clear();
} }
virtual size_t write(const uint8_t *buf, size_t size) { virtual size_t write(const uint8_t *buf, size_t size) {
@@ -273,7 +275,9 @@ public:
return res; return res;
} }
bool hasSSL() { return false; } bool hasSSL() {
return false;
}
/* /*
* Power functions * Power functions
@@ -428,7 +432,7 @@ public:
/* /*
* GPRS functions * GPRS functions
*/ */
bool gprsConnect(const char* apn, const char* user = "", const char* pwd = "") { bool gprsConnect(const char* apn, const char* user = NULL, const char* pwd = NULL) {
gprsDisconnect(); gprsDisconnect();
sendAT(GF("+XISP=0")); sendAT(GF("+XISP=0"));
@@ -724,8 +728,10 @@ finish:
return waitResponse(1000, r1, r2, r3, r4, r5); return waitResponse(1000, r1, r2, r3, r4, r5);
} }
protected: public:
Stream& stream; Stream& stream;
protected:
GsmClient* sockets[TINY_GSM_MUX_COUNT]; GsmClient* sockets[TINY_GSM_MUX_COUNT];
}; };

View File

@@ -85,6 +85,7 @@ public:
public: public:
virtual int connect(const char *host, uint16_t port) { virtual int connect(const char *host, uint16_t port) {
stop();
TINY_GSM_YIELD(); TINY_GSM_YIELD();
rx.clear(); rx.clear();
sock_connected = at->modemConnect(host, port, mux); sock_connected = at->modemConnect(host, port, mux);
@@ -108,6 +109,7 @@ public:
at->sendAT(GF("+CIPCLOSE="), mux); at->sendAT(GF("+CIPCLOSE="), mux);
sock_connected = false; sock_connected = false;
at->waitResponse(); at->waitResponse();
rx.clear();
} }
virtual size_t write(const uint8_t *buf, size_t size) { virtual size_t write(const uint8_t *buf, size_t size) {
@@ -211,6 +213,7 @@ public:
public: public:
virtual int connect(const char *host, uint16_t port) { virtual int connect(const char *host, uint16_t port) {
stop();
TINY_GSM_YIELD(); TINY_GSM_YIELD();
rx.clear(); rx.clear();
sock_connected = at->modemConnect(host, port, mux, true); sock_connected = at->modemConnect(host, port, mux, true);
@@ -320,11 +323,15 @@ public:
} }
bool hasSSL() { bool hasSSL() {
#if defined(TINY_GSM_MODEM_SIM900)
return false;
#else
sendAT(GF("+CIPSSL=?")); sendAT(GF("+CIPSSL=?"));
if (waitResponse(GF(GSM_NL "+CIPSSL:")) != 1) { if (waitResponse(GF(GSM_NL "+CIPSSL:")) != 1) {
return false; return false;
} }
return waitResponse() == 1; return waitResponse() == 1;
#endif
} }
/* /*
@@ -495,7 +502,7 @@ public:
/* /*
* GPRS functions * GPRS functions
*/ */
bool gprsConnect(const char* apn, const char* user = "", const char* pwd = "") { bool gprsConnect(const char* apn, const char* user = NULL, const char* pwd = NULL) {
gprsDisconnect(); gprsDisconnect();
// Set the Bearer for the IP // Set the Bearer for the IP
@@ -583,7 +590,8 @@ public:
} }
bool gprsDisconnect() { bool gprsDisconnect() {
sendAT(GF("+CIPSHUT")); // Shut the TCP/IP connection // Shut the TCP/IP connection
sendAT(GF("+CIPSHUT"));
if (waitResponse(60000L) != 1) if (waitResponse(60000L) != 1)
return false; return false;
@@ -644,6 +652,7 @@ public:
bool sendSMS(const String& number, const String& text) { bool sendSMS(const String& number, const String& text) {
sendAT(GF("+CMGF=1")); sendAT(GF("+CMGF=1"));
waitResponse(); waitResponse();
//Set GSM 7 bit default alphabet (3GPP TS 23.038)
sendAT(GF("+CSCS=\"GSM\"")); sendAT(GF("+CSCS=\"GSM\""));
waitResponse(); waitResponse();
sendAT(GF("+CMGS=\""), number, GF("\"")); sendAT(GF("+CMGS=\""), number, GF("\""));
@@ -731,28 +740,33 @@ public:
protected: protected:
bool modemConnect(const char* host, uint16_t port, uint8_t mux, bool ssl = false) { bool modemConnect(const char* host, uint16_t port, uint8_t mux, bool ssl = false) {
#if !defined(TINY_GSM_MODEM_SIM900)
sendAT(GF("+CIPSSL="), ssl); sendAT(GF("+CIPSSL="), ssl);
int rsp = waitResponse(); int rsp = waitResponse();
if (ssl && rsp != 1) { if (ssl && rsp != 1) {
return false; return false;
} }
#endif
sendAT(GF("+CIPSTART="), mux, ',', GF("\"TCP"), GF("\",\""), host, GF("\","), port); sendAT(GF("+CIPSTART="), mux, ',', GF("\"TCP"), GF("\",\""), host, GF("\","), port);
rsp = waitResponse(75000L, rsp = waitResponse(75000L,
GF("CONNECT OK" GSM_NL), GF("CONNECT OK" GSM_NL),
GF("CONNECT FAIL" GSM_NL), GF("CONNECT FAIL" GSM_NL),
GF("ALREADY CONNECT" GSM_NL)); GF("ALREADY CONNECT" GSM_NL),
GF("ERROR" GSM_NL),
GF("CLOSE OK" GSM_NL) // Happens when HTTPS handshake fails
);
return (1 == rsp); return (1 == rsp);
} }
int modemSend(const void* buff, size_t len, uint8_t mux) { int modemSend(const void* buff, size_t len, uint8_t mux) {
sendAT(GF("+CIPSEND="), mux, ',', len); sendAT(GF("+CIPSEND="), mux, ',', len);
if (waitResponse(GF(">")) != 1) { if (waitResponse(GF(">")) != 1) {
return -1; return 0;
} }
stream.write((uint8_t*)buff, len); stream.write((uint8_t*)buff, len);
stream.flush(); stream.flush();
if (waitResponse(GF(GSM_NL "DATA ACCEPT:")) != 1) { if (waitResponse(GF(GSM_NL "DATA ACCEPT:")) != 1) {
return -1; return 0;
} }
streamSkipUntil(','); // Skip mux streamSkipUntil(','); // Skip mux
return stream.readStringUntil('\n').toInt(); return stream.readStringUntil('\n').toInt();
@@ -934,8 +948,10 @@ finish:
return waitResponse(1000, r1, r2, r3, r4, r5); return waitResponse(1000, r1, r2, r3, r4, r5);
} }
protected: public:
Stream& stream; Stream& stream;
protected:
GsmClient* sockets[TINY_GSM_MUX_COUNT]; GsmClient* sockets[TINY_GSM_MUX_COUNT];
}; };

View File

@@ -81,6 +81,7 @@ public:
public: public:
virtual int connect(const char *host, uint16_t port) { virtual int connect(const char *host, uint16_t port) {
stop();
TINY_GSM_YIELD(); TINY_GSM_YIELD();
rx.clear(); rx.clear();
sock_connected = at->modemConnect(host, port, &mux); sock_connected = at->modemConnect(host, port, &mux);
@@ -105,6 +106,7 @@ public:
at->sendAT(GF("+USOCL="), mux); at->sendAT(GF("+USOCL="), mux);
sock_connected = false; sock_connected = false;
at->waitResponse(); at->waitResponse();
rx.clear();
} }
virtual size_t write(const uint8_t *buf, size_t size) { virtual size_t write(const uint8_t *buf, size_t size) {
@@ -119,7 +121,7 @@ public:
virtual int available() { virtual int available() {
TINY_GSM_YIELD(); TINY_GSM_YIELD();
if (!rx.size() && sock_connected) { // TODO if (!rx.size() && sock_connected) {
at->maintain(); at->maintain();
} }
return rx.size() + sock_available; return rx.size() + sock_available;
@@ -200,6 +202,7 @@ public:
public: public:
virtual int connect(const char *host, uint16_t port) { virtual int connect(const char *host, uint16_t port) {
stop();
TINY_GSM_YIELD(); TINY_GSM_YIELD();
rx.clear(); rx.clear();
sock_connected = at->modemConnect(host, port, &mux, true); sock_connected = at->modemConnect(host, port, &mux, true);
@@ -287,7 +290,9 @@ public:
String getModemInfo() TINY_GSM_ATTR_NOT_IMPLEMENTED; String getModemInfo() TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool hasSSL() { return true; } bool hasSSL() {
return true;
}
/* /*
* Power functions * Power functions
@@ -433,7 +438,7 @@ public:
/* /*
* GPRS functions * GPRS functions
*/ */
bool gprsConnect(const char* apn, const char* user = "", const char* pwd = "") { bool gprsConnect(const char* apn, const char* user = NULL, const char* pwd = NULL) {
gprsDisconnect(); gprsDisconnect();
sendAT(GF("+CGATT=1")); sendAT(GF("+CGATT=1"));
@@ -732,8 +737,10 @@ finish:
return waitResponse(1000, r1, r2, r3, r4, r5); return waitResponse(1000, r1, r2, r3, r4, r5);
} }
protected: public:
Stream& stream; Stream& stream;
protected:
GsmClient* sockets[TINY_GSM_MUX_COUNT]; GsmClient* sockets[TINY_GSM_MUX_COUNT];
}; };

View File

@@ -9,7 +9,7 @@
#ifndef TinyGsmClientXBee_h #ifndef TinyGsmClientXBee_h
#define TinyGsmClientXBee_h #define TinyGsmClientXBee_h
// #define TINY_GSM_DEBUG Serial //#define TINY_GSM_DEBUG Serial
#define TINY_GSM_MUX_COUNT 1 // Multi-plexing isn't supported using command mode #define TINY_GSM_MUX_COUNT 1 // Multi-plexing isn't supported using command mode
@@ -597,7 +597,7 @@ fail:
/* /*
* GPRS functions * GPRS functions
*/ */
bool gprsConnect(const char* apn, const char* user = "", const char* pwd = "") { bool gprsConnect(const char* apn, const char* user = NULL, const char* pwd = NULL) {
if (!commandMode()) return false; // Return immediately if (!commandMode()) return false; // Return immediately
sendAT(GF("AN"), apn); // Set the APN sendAT(GF("AN"), apn); // Set the APN
waitResponse(); waitResponse();
@@ -626,9 +626,7 @@ fail:
* Messaging functions * Messaging functions
*/ */
void sendUSSD() TINY_GSM_ATTR_NOT_AVAILABLE; String sendUSSD(const String& code) TINY_GSM_ATTR_NOT_IMPLEMENTED;
void sendSMS() TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool sendSMS(const String& number, const String& text) { bool sendSMS(const String& number, const String& text) {
if (!commandMode()) return false; // Return immediately if (!commandMode()) return false; // Return immediately
@@ -870,10 +868,12 @@ finish:
return waitResponse(1000, r1, r2, r3, r4, r5); return waitResponse(1000, r1, r2, r3, r4, r5);
} }
public:
Stream& stream;
protected: protected:
int guardTime; int guardTime;
XBeeType beeType; XBeeType beeType;
Stream& stream;
GsmClient* sockets[TINY_GSM_MUX_COUNT]; GsmClient* sockets[TINY_GSM_MUX_COUNT];
}; };

View File

@@ -18,8 +18,6 @@
// #define TINY_GSM_MODEM_ESP8266 // #define TINY_GSM_MODEM_ESP8266
// #define TINY_GSM_MODEM_XBEE // #define TINY_GSM_MODEM_XBEE
#include <TinyGsmClient.h>
// Set serial for debug console (to the Serial Monitor, speed 115200) // Set serial for debug console (to the Serial Monitor, speed 115200)
#define SerialMon Serial #define SerialMon Serial

View File

@@ -1,7 +1,7 @@
/************************************************************** /**************************************************************
* *
* This script just listens in on the communication between an Arduino and the * This script just listens in on the communication
* modem. * between an Arduino and the modem.
* *
* TinyGSM Getting Started guide: * TinyGSM Getting Started guide:
* http://tiny.cc/tiny-gsm-readme * http://tiny.cc/tiny-gsm-readme
@@ -28,18 +28,20 @@ AltSoftSerial BOARD_TX;
void setup() { void setup() {
// Set console baud rate // Set console baud rate
SPY.begin(57600); SPY.begin(115200);
MODEM_TX.begin(BAUD_RATE); MODEM_TX.begin(BAUD_RATE);
BOARD_TX.begin(BAUD_RATE); BOARD_TX.begin(BAUD_RATE);
delay(5000); delay(1000);
} }
void loop() void loop()
{ {
while (MODEM_TX.available()) { while (MODEM_TX.available()) {
SPY.write(MODEM_TX.read()); SPY.write(MODEM_TX.read());
} }
while (BOARD_TX.available()) { while (BOARD_TX.available()) {
SPY.write(BOARD_TX.read()); SPY.write(BOARD_TX.read());
} }
} }