Created
June 12, 2019 07:00
-
-
Save bhagman/be4c3208a9e13f0492ad33c4a0f20a67 to your computer and use it in GitHub Desktop.
TinyGSM FileDownload Example (with minor changes, and set for u-blox SARA-R4, APN excluded)
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
#include <Arduino.h> | |
/************************************************************** | |
* | |
* For this example, you need to install CRC32 library: | |
* https://github.com/bakercp/CRC32 | |
* or from http://librarymanager/all#CRC32+checksum | |
* | |
* TinyGSM Getting Started guide: | |
* https://tiny.cc/tinygsm-readme | |
* | |
* ATTENTION! Downloading big files requires of knowledge of | |
* the TinyGSM internals and some modem specifics, | |
* so this is for more experienced developers. | |
* | |
**************************************************************/ | |
// Select your modem: | |
// #define TINY_GSM_MODEM_SIM800 | |
// #define TINY_GSM_MODEM_SIM808 | |
// #define TINY_GSM_MODEM_SIM868 | |
// #define TINY_GSM_MODEM_SIM900 | |
// #define TINY_GSM_MODEM_SIM7000 | |
// #define TINY_GSM_MODEM_UBLOX | |
#define TINY_GSM_MODEM_SARAR4 | |
// #define TINY_GSM_MODEM_M95 | |
// #define TINY_GSM_MODEM_BG96 | |
// #define TINY_GSM_MODEM_A6 | |
// #define TINY_GSM_MODEM_A7 | |
// #define TINY_GSM_MODEM_M590 | |
// #define TINY_GSM_MODEM_MC60 | |
// #define TINY_GSM_MODEM_MC60E | |
// #define TINY_GSM_MODEM_ESP8266 | |
// #define TINY_GSM_MODEM_XBEE | |
// #define TINY_GSM_MODEM_SEQUANS_MONARCH | |
// Increase RX buffer if needed | |
#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 | |
// Set serial for debug console (to the Serial Monitor, default speed 115200) | |
#define SerialMon Serial | |
// Use Hardware Serial on Mega, Leonardo, Micro | |
#define SerialAT Serial1 | |
// or Software Serial on Uno, Nano | |
//#include <SoftwareSerial.h> | |
//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[] = ""; | |
// 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 | |
#include <StreamDebugger.h> | |
StreamDebugger debugger(SerialAT, SerialMon); | |
TinyGsm modem(debugger); | |
#else | |
TinyGsm modem(SerialAT); | |
#endif | |
TinyGsmClient client(modem); | |
void setup() { | |
// Set console baud rate | |
SerialMon.begin(115200); | |
delay(10); | |
SerialMon.println(F("FileDownload Started. Press any key to start.")); | |
while (!SerialMon.available()); | |
while (SerialMon.available()) | |
SerialMon.read(); | |
// 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 printPercent(uint32_t readLength, uint32_t contentLength) { | |
// If we know the total length | |
if (contentLength != -1) { | |
SerialMon.print("\r "); | |
SerialMon.print((100.0 * readLength) / contentLength); | |
SerialMon.print('%'); | |
} else { | |
SerialMon.println(readLength); | |
} | |
} | |
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("Connecting to ")); | |
SerialMon.print(server); | |
if (!client.connect(server, port)) { | |
SerialMon.println(" fail"); | |
delay(10000); | |
return; | |
} | |
SerialMon.println(" OK"); | |
// Make a HTTP GET request: | |
client.print(String("GET ") + resource + " HTTP/1.0\r\n"); | |
client.print(String("Host: ") + server + "\r\n"); | |
client.print("Connection: close\r\n\r\n"); | |
long timeout = millis(); | |
while (client.available() == 0) { | |
if (millis() - timeout > 5000L) { | |
SerialMon.println(F(">>> Client Timeout !")); | |
client.stop(); | |
delay(10000L); | |
return; | |
} | |
} | |
SerialMon.println(F("Reading response header")); | |
uint32_t contentLength = knownFileSize; | |
while (client.available()) { | |
String line = client.readStringUntil('\n'); | |
line.trim(); | |
//SerialMon.println(line); // Uncomment this to show response header | |
line.toLowerCase(); | |
if (line.startsWith("content-length:")) { | |
contentLength = line.substring(line.lastIndexOf(':') + 1).toInt(); | |
} else if (line.length() == 0) { | |
break; | |
} | |
} | |
SerialMon.println(F("Reading response data")); | |
timeout = millis(); | |
uint32_t readLength = 0; | |
CRC32 crc; | |
unsigned long timeElapsed = millis(); | |
printPercent(readLength, contentLength); | |
while (readLength < contentLength && client.connected() && millis() - timeout < 10000L) { | |
while (client.available()) { | |
uint8_t c = client.read(); | |
//SerialMon.print((char)c); // Uncomment this to show data | |
crc.update(c); | |
readLength++; | |
if (readLength % (contentLength / 13) == 0) { | |
printPercent(readLength, contentLength); | |
} | |
timeout = millis(); | |
} | |
} | |
printPercent(readLength, contentLength); | |
timeElapsed = millis() - timeElapsed; | |
SerialMon.println(); | |
// Shutdown | |
client.stop(); | |
SerialMon.println(F("Server disconnected")); | |
modem.gprsDisconnect(); | |
SerialMon.println(F("GPRS disconnected")); | |
float duration = float(timeElapsed) / 1000; | |
SerialMon.println(); | |
SerialMon.print("Content-Length: "); SerialMon.println(contentLength); | |
SerialMon.print("Actually read: "); SerialMon.println(readLength); | |
SerialMon.print("Calc. CRC32: 0x"); SerialMon.println(crc.finalize(), HEX); | |
SerialMon.print("Known CRC32: 0x"); SerialMon.println(knownCRC32, HEX); | |
SerialMon.print("Duration: "); SerialMon.print(duration); SerialMon.println("s"); | |
// Do nothing forevermore | |
while (true) { | |
delay(1000); | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment