Skip to content
Snippets Groups Projects
Commit a93c0382 authored by Zoe Pfister's avatar Zoe Pfister :speech_balloon:
Browse files

WIP: Trying to get a connection

parent 16ee4368
No related branches found
No related tags found
4 merge requests!39Merge Develop into Main,!19development into master,!17Inital Host, initial Client,!14Merge gsm host into development
......@@ -12,6 +12,9 @@
platform = espressif32
board = esp-wrover-kit
framework = arduino
monitor_speed = 115200
monitor_port = /dev/ttyACM0
upload_port = /dev/ttyACM0
lib_deps =
vshymanskyy/TinyGSM@^0.11.5
vshymanskyy/StreamDebugger@^1.0.1
......
/*
FILE: AllFunctions.ino
AUTHOR: Koby Hale
PURPOSE: Test functionality
*/
#define TINY_GSM_MODEM_SIM7000
#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb
#define SerialAT Serial1
// See all AT commands, if wanted
#define DUMP_AT_COMMANDS
/*
Tests enabled
*/
#define TINY_GSM_TEST_GPRS true
#define TINY_GSM_POWERDOWN true
// set GSM PIN, if any
#define GSM_PIN ""
// Your GPRS credentials, if any
const char apn[] = "m2m.public.at"; // SET TO YOUR APN
const char gprsUser[] = "";
const char gprsPass[] = "";
#include <SD.h>
#include <SPI.h>
#include <Ticker.h>
#include <TinyGsmClient.h>
#ifdef DUMP_AT_COMMANDS // if enabled it requires the streamDebugger lib
#include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, Serial);
TinyGsm modem(debugger);
#else
TinyGsm modem(SerialAT);
#endif
#define uS_TO_S_FACTOR 1000000ULL // Conversion factor for micro seconds to seconds
#define TIME_TO_SLEEP 60 // Time ESP32 will go to sleep (in seconds)
#define UART_BAUD 115200
#define PIN_DTR 25
#define PIN_TX 27
#define PIN_RX 26
#define PWR_PIN 4
#define SD_MISO 2
#define SD_MOSI 15
#define SD_SCLK 14
#define SD_CS 13
#define LED_PIN 12
#include <ArduinoJson.h>
int counter, lastIndex, numberOfPieces = 24;
String pieces[24], input;
std::string getResponseBody(const std::string &response)
{
std::string delimiter = "\r\n\r\n";
std::string token = response.substr(response.find(delimiter)).replace(0, delimiter.length(), "");
return token;
}
std::string getResponse(TinyGsmClient &client)
{
String status = client.readStringUntil('\r');
Serial.println(status);
std::string response;
while (client.connected()) {
if (client.available()) {
char c = client.read();
response += c;
}
}
return response;
}
std::string getResponse(std::string server, std::string path, int port)
{
TinyGsmClient client(modem);
// if you get a connection, report back via serial:
if (client.connect(server.c_str(), port)) {
Serial.println("connected to server");
// Make a HTTP request:
client.print("GET ");
client.print(path.c_str());
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(server.c_str());
client.println("Connection: close");
client.println();
} else {
// if you didn't get a connection to the server:
Serial.println("connection failed");
}
std::string response = getResponse(client);
std::string token = getResponseBody(response);
Serial.println(token.c_str());
client.stop();
return token;
}
void modemDisconnect();
bool do_gsm_test()
{
SerialAT.println("AT+CGDCONT?");
delay(500);
if (SerialAT.available()) {
input = SerialAT.readString();
for (int i = 0; i < input.length(); i++) {
if (input.substring(i, i + 1) == "\n") {
pieces[counter] = input.substring(lastIndex, i);
lastIndex = i + 1;
counter++;
}
if (i == input.length() - 1) {
pieces[counter] = input.substring(lastIndex, i);
}
}
// Reset for reuse
input = "";
counter = 0;
lastIndex = 0;
for (int y = 0; y < numberOfPieces; y++) {
for (char c : pieces[y]) {
// gets one byte from buffer
if (c == ',') {
if (input.indexOf(": ") >= 0) {
String data = input.substring((input.indexOf(": ") + 1));
if (data.toInt() > 0 && data.toInt() < 25) {
modem.sendAT("+CGDCONT=" + String(data.toInt()) + ",\"IP\",\"" + String(apn)
+ "\",\"0.0.0.0\",0,0,0,0");
}
input = "";
break;
}
// Reset for reuse
input = "";
} else {
input += c;
}
}
}
} else {
Serial.println("Failed to get PDP!");
}
Serial.println("\n\n\nWaiting for network...");
if (!modem.waitForNetwork()) {
delay(10000);
return false;
}
if (modem.isNetworkConnected()) {
Serial.println("Network connected");
}
Serial.println("\n---Starting GPRS TEST---\n");
Serial.println("Connecting to: " + String(apn));
if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
delay(10000);
return false;
}
Serial.print("GPRS status: ");
if (modem.isGprsConnected()) {
Serial.println("connected");
} else {
Serial.println("not connected");
}
String ccid = modem.getSimCCID();
Serial.println("CCID: " + ccid);
String imei = modem.getIMEI();
Serial.println("IMEI: " + imei);
String cop = modem.getOperator();
Serial.println("Operator: " + cop);
IPAddress local = modem.localIP();
Serial.println("Local IP: " + String(local));
int csq = modem.getSignalQuality();
Serial.println("Signal quality: " + String(csq));
SerialAT.println("AT+CPSI?"); // Get connection type and band
delay(500);
if (SerialAT.available()) {
String r = SerialAT.readString();
Serial.println(r);
}
Serial.println("\n---End of GPRS TEST---\n");
return true;
}
void setup()
{
// Set console baud rate
Serial.begin(115200);
delay(10);
// Set LED OFF
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
pinMode(PWR_PIN, OUTPUT);
digitalWrite(PWR_PIN, HIGH);
delay(300);
digitalWrite(PWR_PIN, LOW);
SPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);
if (!SD.begin(SD_CS)) {
Serial.println("SDCard MOUNT FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
String str = "SDCard Size: " + String(cardSize) + "MB";
Serial.println(str);
}
Serial.println("\nWait...");
delay(1000);
SerialAT.begin(UART_BAUD, SERIAL_8N1, PIN_RX, PIN_TX);
// Restart takes quite some time
// To skip it, call init() instead of restart()
Serial.println("Initializing modem...");
if (!modem.restart()) {
Serial.println("Failed to restart modem, attempting to continue without restarting");
}
}
bool modemConnect()
{
// Restart takes quite some time
// To skip it, call init() instead of restart()
Serial.println("Initializing modem...");
if (!modem.init()) {
Serial.println("Failed to restart modem, attempting to continue without restarting");
}
String name = modem.getModemName();
delay(500);
Serial.println("Modem Name: " + name);
String modemInfo = modem.getModemInfo();
delay(500);
Serial.println("Modem Info: " + modemInfo);
// Set SIM7000G GPIO4 LOW ,turn off GPS power
// CMD:AT+SGPIO=0,4,1,0
// Only in version 20200415 is there a function to control GPS power
modem.sendAT("+SGPIO=0,4,1,0");
if (modem.waitResponse(10000L) != 1) {
DBG(" SGPIO=0,4,1,0 false ");
}
#if TINY_GSM_TEST_GPRS
// Unlock your SIM card with a PIN if needed
if (GSM_PIN && modem.getSimStatus() != 3) {
modem.simUnlock(GSM_PIN);
}
#endif
modem.sendAT("+CFUN=0 ");
if (modem.waitResponse(10000L) != 1) {
DBG(" +CFUN=0 false ");
}
delay(200);
/*
2 Automatic
13 GSM only
38 LTE only
51 GSM and LTE only
* * * */
String res;
res = modem.setNetworkMode(38);
if (res != "1") {
DBG("setNetworkMode false ");
return false;
}
delay(200);
/*
1 CAT-M
2 NB-Iot
3 CAT-M and NB-IoT
* * */
res = modem.setPreferredMode(1);
if (res != "1") {
DBG("setPreferredMode false ");
return false;
}
delay(200);
/*AT+CBANDCFG=<mode>,<band>[,<band>…]
* <mode> "CAT-M" "NB-IOT"
* <band> The value of <band> must is in the band list of getting from AT+CBANDCFG=?
* For example, my SIM card carrier "NB-iot" supports B8. I will configure +CBANDCFG= "Nb-iot ",8
*/
modem.sendAT("+CBANDCFG=\"CAT-M\",8 ");
if (modem.waitResponse(10000L) != 1) {
DBG(" +CBANDCFG=\"NB-IOT\" ");
}
delay(200);
modem.sendAT("+CFUN=1 ");
if (modem.waitResponse(10000L) != 1) {
DBG(" +CFUN=1 false ");
}
delay(200);
#if TINY_GSM_TEST_GPRS
if (!do_gsm_test()) {
return false;
}
modem.gprsDisconnect();
if (!modem.isGprsConnected()) {
Serial.println("GPRS disconnected");
} else {
Serial.println("GPRS disconnect: Failed.");
}
#endif
return true;
}
void loop()
{
if (!modemConnect()) {
return;
}
Serial.println("connecting...");
auto response = getResponse("date.jsontest.com", "/", 80);
// convert response to json object
DynamicJsonDocument doc(1024);
auto error = deserializeJson(doc, response);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
const char *date = doc["date"];
long long milliseconds_since_epoch = doc["milliseconds_since_epoch"].as<long long>();
const char *time = doc["time"];
Serial.println(date);
Serial.println(milliseconds_since_epoch);
Serial.println(time);
modemDisconnect();
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
delay(200);
esp_deep_sleep_start();
// Do nothing forevermore
while (true) {
modem.maintain();
}
}
void modemDisconnect()
{
#if TINY_GSM_POWERDOWN
// Try to power-off (modem may decide to restart automatically)
// To turn off modem completely, please use Reset/Enable pins
modem.sendAT("+CPOWD=1");
if (modem.waitResponse(10000L) != 1) {
DBG("+CPOWD=1");
}
modem.poweroff();
Serial.println("Poweroff.");
#endif
}
///**************************************************************
// *
// * This sketch connects to a website and downloads a page.
// * It can be used to perform HTTP/RESTful API calls.
// *
// * TinyGSM Getting Started guide:
// * https://tiny.cc/tinygsm-readme
// *
// **************************************************************/
//
//// 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_SIM7000SSL
//// #define TINY_GSM_MODEM_SIM7080
//// #define TINY_GSM_MODEM_SIM5360
//// #define TINY_GSM_MODEM_SIM7600
//// #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
//
//// Set serial for debug console (to the Serial Monitor, default speed 115200)
//#define SerialMon Serial
//
//// Set serial for AT commands (to the module)
//// Use Hardware Serial on Mega, Leonardo, Micro
//#ifndef __AVR_ATmega328P__
//#define SerialAT Serial1
//
//// or Software Serial on Uno, Nano
//#else
//#include <SoftwareSerial.h>
//SoftwareSerial SerialAT(2, 3); // RX, TX
//#endif
//
//// Increase RX buffer to capture the entire response
//// Chips without internal buffering (A6/A7, ESP8266, M590)
//// need enough space in the buffer for the entire response
//// else data will be lost (and the http library will fail).
//#if !defined(TINY_GSM_RX_BUFFER)
//#define TINY_GSM_RX_BUFFER 650
//#endif
//
//// See all AT commands, if wanted
//#define DUMP_AT_COMMANDS
//
//// Define the serial console for debug prints, if needed
//#define TINY_GSM_DEBUG SerialMon
//
//// Range to attempt to autobaud
//// NOTE: DO NOT AUTOBAUD in production code. Once you've established
//// communication, set a fixed baud rate using modem.setBaud(#).
//#define GSM_AUTOBAUD_MIN 9600
//#define GSM_AUTOBAUD_MAX 115200
//
//// Add a reception delay, if needed.
//// This may be needed for a fast processor at a slow baud rate.
//// #define TINY_GSM_YIELD() { delay(2); }
//
//// Uncomment this if you want to use SSL
//// #define USE_SSL
//
//// Define how you're planning to connect to the internet.
//// This is only needed for this example, not in other code.
//#define TINY_GSM_USE_GPRS true
//#define TINY_GSM_USE_WIFI false
//
//// set GSM PIN, if any
//#define GSM_PIN ""
//
//// Your GPRS credentials, if any
//const char apn[] = "m2m.public.at";
//const char gprsUser[] = "";
//const char gprsPass[] = "";
//
//// Your WiFi connection credentials, if applicable
//const char wifiSSID[] = "YourSSID";
//const char wifiPass[] = "YourWiFiPass";
//
//// Server details
//const char server[] = "vsh.pp.ua";
//const char resource[] = "/TinyGSM/logo.txt";
//
//#include <TinyGsmClient.h>
//#include <WiFi.h>
//#include <esp_now.h>
//
//// Just in case someone defined the wrong thing..
//#if TINY_GSM_USE_GPRS && not defined TINY_GSM_MODEM_HAS_GPRS
//#undef TINY_GSM_USE_GPRS
//#undef TINY_GSM_USE_WIFI
//#define TINY_GSM_USE_GPRS false
//#define TINY_GSM_USE_WIFI true
//#endif
//#if TINY_GSM_USE_WIFI && not defined TINY_GSM_MODEM_HAS_WIFI
//#undef TINY_GSM_USE_GPRS
//#undef TINY_GSM_USE_WIFI
//#define TINY_GSM_USE_GPRS true
//#define TINY_GSM_USE_WIFI false
//#endif
//
//#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);
//const int port = 443;
//#else
//TinyGsmClient client(modem);
//const int port = 80;
//#endif
//
//TaskHandle_t Task1;
//
//void on_data_sent(const uint8_t *mac_addr, esp_now_send_status_t status)
//{
// // go to sleep
//}
//
//void on_data_recv(const uint8_t *mac, const uint8_t *incomingData, int len)
//{
// // print mac
// Serial.print("Message recieved: Core ");
// Serial.println(xPortGetCoreID());
// for (int i = 0; i < 6; i++) {
// Serial.print(mac[i], HEX);
// Serial.print(":");
// }
// Serial.println();
// char data[len];
// memcpy(data, incomingData, len);
// Serial.println(data);
//}
//
//[[noreturn]] void Task1code(void *parameter)
//{
// Serial.println(xPortGetCoreID());
// WiFi.mode(WIFI_STA);
// Serial.println("ESPNow init");
// if (esp_now_init() != ESP_OK) {
// // initialization failed
// Serial.println("ESPNow init failed");
// // not sure about this
// }
// Serial.println("ESPNow init success");
// esp_now_register_recv_cb(on_data_recv);
//
// while (true) {
// }
//}
//
//void setup2()
//{
// // Set console baud rate
// SerialMon.begin(115200);
// delay(10);
//
// // !!!!!!!!!!!
// // Set your reset, enable, power pins here
// // !!!!!!!!!!!
//
// SerialMon.println("Wait...");
//
// xTaskCreatePinnedToCore(Task1code, /* Function to implement the task */
// "Task1", /* Name of the task */
// 10000, /* Stack size in words */
// nullptr, /* Task input parameter */
// 0, /* Priority of the task */
// &Task1, /* Task handle. */
// 0); /* Core where the task should run */
//
// // Set GSM module baud rate
// // TinyGsmAutoBaud(SerialAT, GSM_AUTOBAUD_MIN, GSM_AUTOBAUD_MAX);
// modem.setBaud(9600);
// // SerialAT.begin(9600);
// delay(6000);
//
// // Restart takes quite some time
// // To skip it, call init() instead of restart()
// SerialMon.println("Initializing modem...");
// modem.restart();
// // modem.init();
//
// String modemInfo = modem.getModemInfo();
// SerialMon.print("Modem Info: ");
// SerialMon.println(modemInfo);
//
//#if TINY_GSM_USE_GPRS
// // Unlock your SIM card with a PIN if needed
// if (GSM_PIN && modem.getSimStatus() != 3) {
// modem.simUnlock(GSM_PIN);
// }
//#endif
//}
//
//void loop2()
//{
//#if TINY_GSM_USE_WIFI
// // Wifi connection parameters must be set before waiting for the network
// SerialMon.print(F("Setting SSID/password..."));
// if (!modem.networkConnect(wifiSSID, wifiPass)) {
// SerialMon.println(" fail");
// delay(10000);
// return;
// }
// SerialMon.println(" success");
//#endif
//
//#if TINY_GSM_USE_GPRS && defined TINY_GSM_MODEM_XBEE
// // The XBee must run the gprsConnect function BEFORE waiting for network!
// modem.gprsConnect(apn, gprsUser, gprsPass);
//#endif
//
// SerialMon.print("Waiting for network...");
// if (!modem.waitForNetwork()) {
// SerialMon.println(" fail");
// delay(10000);
// return;
// }
// SerialMon.println(" success");
//
// if (modem.isNetworkConnected()) {
// SerialMon.println("Network connected");
// }
//
//#if TINY_GSM_USE_GPRS
// // GPRS connection parameters are usually set after network registration
// SerialMon.print(F("Connecting to "));
// SerialMon.print(apn);
// if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
// SerialMon.println(" fail");
// delay(10000);
// return;
// }
// SerialMon.println(" success");
//
// if (modem.isGprsConnected()) {
// SerialMon.println("GPRS connected");
// }
//#endif
//
// SerialMon.print("Connecting to ");
// SerialMon.println(server);
// if (!client.connect(server, port)) {
// SerialMon.println(" fail");
// delay(10000);
// return;
// }
// SerialMon.println(" success");
//
// // Make a HTTP GET request:
// SerialMon.println("Performing HTTP GET request...");
// client.print(String("GET ") + resource + " HTTP/1.1\r\n");
// client.print(String("Host: ") + server + "\r\n");
// client.print("Connection: close\r\n\r\n");
// client.println();
//
// uint32_t timeout = millis();
// while (client.connected() && millis() - timeout < 10000L) {
// // Print available data
// while (client.available()) {
// char c = client.read();
// SerialMon.print(c);
// timeout = millis();
// }
// }
// SerialMon.println();
//
// // Shutdown
//
// client.stop();
// SerialMon.println(F("Server disconnected"));
//
//#if TINY_GSM_USE_WIFI
// modem.networkDisconnect();
// SerialMon.println(F("WiFi disconnected"));
//#endif
//#if TINY_GSM_USE_GPRS
// modem.gprsDisconnect();
// SerialMon.println(F("GPRS disconnected"));
//#endif
//
// // Do nothing forevermore
// while (true) {
// delay(1000);
// }
//}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment