mirror of
				https://github.com/KevinMidboe/TinyGSM.git
				synced 2025-10-29 18:00:18 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			208 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**************************************************************
 | |
|  *
 | |
|  * 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:
 | |
|  *   http://tiny.cc/tiny-gsm-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_SIM900
 | |
| // #define TINY_GSM_MODEM_UBLOX
 | |
| // #define TINY_GSM_MODEM_BG96
 | |
| // #define TINY_GSM_MODEM_A6
 | |
| // #define TINY_GSM_MODEM_A7
 | |
| // #define TINY_GSM_MODEM_M590
 | |
| // #define TINY_GSM_MODEM_ESP8266
 | |
| // #define TINY_GSM_MODEM_XBEE
 | |
| 
 | |
| // 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);
 | |
| 
 | |
|   // 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);
 | |
|   }
 | |
| }
 | |
| 
 |