Unlocking and improving the Pythings SIM800 GPRS module for MicroPython

I’ve made some updates to the driver which should now gracefully fall back to not use SSL at all if the modeminfo string is smaller than SIM800 R14.00.

I’ve outlined the rationale to actually prefer modeminfo (retrieved by ATI) over the firmware revision (retrieved by AT+CGMR) within [SIM800] Problems with AT+HTTPSSL commands · Issue #3 · pythings/Drivers · GitHub.

thanks for explaining your intentions on your library approach. - Citing the loboris fork here by me is a bit unfair as it does not take care on backward compatibility to µpy mainline. I benefit from this fork while using it on an Odroid Go and don’t have to care about compatibility and hence ‘proprietary’ extensions … ;)

1 Like

I liked it actually. Credit whom credit is due. I believe Boris already brought some good things related to PPPoS support into ESP-IDF the other day.

Interesting that my firmware version number ist totally different from the structure. Must be very old! ;-)

Good to know that it works, on this issue someone reported problems ander the TinyGSM lib with https and the same number also: SIM 800L - HTTPS · Issue #235 · vshymanskyy/TinyGSM · GitHub

It looks like one can update the firmware in the SIM800L. After a bit of googling it looks like I have the latest firmware version. Unfortunately, I haven’t found it anywhere for download. Only hint was here:


It may also be that the firmware update tool can download the firmware itself. Isn’t clear to me.

Simcom also has an official downloads directory with lots of files:
https://simcom.ee/documents/

Dear Stefano,

This is our first attempt of adding support for PPPoS we have been discussing here and investigated further within PPP over Serial (PPPoS) support for MicroPython on ESP32. Please note this is still untested as I don’t have respective hardware on my workbench.

On Genuine MicroPython, this might work out-of-the-box. However, there definitively will be dragons.

With kind regards,
Andreas.

If someone wants to use PPP-based networking on Pycom MicroPython, there are now updated firmware images on https://packages.hiveeyes.org/hiveeyes/foss/pycom/vanilla/.

  • FiPy-1.20.2.rc3-0.8.1-vanilla-squirrel-ppp.tar.gz
  • GPy-1.20.2.rc3-0.8.1-vanilla-squirrel-ppp.tar.gz
  • LoPy-1.20.2.rc3-0.8.1-vanilla-squirrel-ppp.tar.gz
  • LoPy4-1.20.2.rc3-0.8.1-vanilla-squirrel-ppp.tar.gz
  • SiPy-1.20.2.rc3-0.8.1-vanilla-squirrel-ppp.tar.gz
  • WiPy-1.20.2.rc3-0.8.1-vanilla-squirrel-ppp.tar.gz

This adds PPP networking from Genuine MicroPython in order to support PPP over Serial (PPPoS), which has not been included on Pycom devices up to this date.

1 Like

Hi guys,

could you also share the output of "AT+CIPSSL=?" with us? It might be better than going for "modem_info".

Thanks,
Andreas.

SIM 800L - HTTPS · Issue #235 · vshymanskyy/TinyGSM · GitHub

‘+CIPSSL: (0-1)’

Nicht so der Bringer…

Man findet die Dokumentation bei 2.4.AT +CIPSSL Set TCP to Use SSL Function auf Seite 9 der SIM800 Series_SSL_ApplicationNote_V1.02. Damit kann man dann wohl abfragen, ob SSL angeschaltet wurde (1) oder nicht (0).

Vergessen wirs einfach und lassen die Implementierung so wie sie ist. Nur bei Lust und Laune… Wenn dann bräuchten wir beide Ausgaben – von Dir von @clemens – um diese vergleichen zu können.

so, zum Vergleich mal eine ‘alte’ firmware rausgekramt; vielleicht könntest Du, @Clemens, auch noch mal schauen - Du müßtest beim letzten Befehl das gleiche bekommen:

ati
SIM800 R13.08

OK
at+cgmr
Revision:1308B08SIM800L16

OK
at+cipssl=?
ERROR
1 Like

Danke! Wenn das bei @poesel “OK” ausgibt, wollen wir das dann als extra Roundtrip zur Capability Detection einbauen, statt – wie momentan implementiert – auf die ati Zeichenkette zu schauen?

Wie schon geschrieben, die Antwort auf

at+cipssl=?

ist

+CIPSSL: (0-1)

Ah ok. Sorry!

Hier noch gschwind die Referenzimplementierung von TinyGSM.


Bump.

1 Like

ja, müssen wir wohl auch so machen, denn poesel will uns leider nicht verraten, ob bei ihm danach noch ne Leerzeile und nen OK kommen… ;)

bei mir:

ati
  SIM800 R13.08
  OK

at+cgmr
  Revision:1308B07SIM800L16_20141031_1027
  OK

at+cipssl=?
  ERROR

Hatte beim letzten mal testen das AT-Kommando für die Revision in einen bestehenden sketch eingebaut, da ist wohl was bei der Ausgabe verschluckt worden, daher nun am Anfang nicht mehr abgeschnitten.

ansonsten
q.e.d.

1 Like

the secret is mine…

Nee, leider gibts da nicht mehr:

>>> modem.execute_at_command('firmware2', None, False)
'+CIPSSL: (0-1)\r\n'

Auch andere berichten über fehlenden SSL support bei den SIM800-Modulen.

Hier wird noch von einem AT-Kommando AT+SSLOPT=1,1 gesprochen, um die SSL-Option (überhaupt erst?) einzuschalten. Hm.

OK, danke ! ;)

Aber das ist ja leider schon interpretiert (dadurch, daß Du das Ding per Python ansprichst) und leider nicht transparent wie in einem terminal-Programm: die Ausgabe eines etwaigen OK wird durch sowas unterdrückt - wir bräuchten hier mal die Ausgabe im raw-Modus…
Hier z.B. (2x in der Mitte, nach CIPSSL suchen) findet sich ein Hinweis, daß auch bei diesem Befehl -wenn er funktioniert resp. implementiert ist- eine Leerzeile samt OK auf neuer Zeile rausgeschickt wird. - Ist aber jetzt auch nicht soo wichtig; wenn Du Zeit findest.

… oder du packst die Arduino-IDE kurz aus und spielst das drauf

Arduino-Code AT über Serielle
// GPRS credentials (leave empty, if missing)
const char apn[]      = "internet.telekom"; // Your APN
const char gprsUser[] = ""; // User
const char gprsPass[] = ""; // Password
const char simPIN[]   = ""; // SIM card PIN code, if any

// pins TTGO T-Call 
// SIM800
#define MODEM_RST            5
#define MODEM_PWKEY          4
#define MODEM_POWER_ON       23
#define MODEM_TX             27
#define MODEM_RX             26
// I2C pins for IP5306
#define I2C_SDA              21
#define I2C_SCL              22

// power management IP5306 
#define IP5306_ADDR          0x75
#define IP5306_REG_SYS_CTL0  0x00

// Serials
// set serial for Serial Monitor
#define SerialMon Serial
// set serial for SIM800 / AT commands
#define SerialAT  Serial1
// Define the serial console for debug prints, if needed
#define TINY_GSM_DEBUG SerialMon
//#define DUMP_AT_COMMANDS

// Configure TinyGSM library
#define TINY_GSM_MODEM_SIM800      // Modem is SIM800
#define TINY_GSM_RX_BUFFER   1024  // Set RX buffer to 1Kb

// libraries 
#include <Wire.h>
#include <TinyGsmClient.h>

#ifdef DUMP_AT_COMMANDS
  #include <StreamDebugger.h>
  StreamDebugger debugger(SerialAT, SerialMon);
  TinyGsm modem(debugger);
#else
  TinyGsm modem(SerialAT);
#endif

TinyGsmClient client(modem);

// power management via IP5306
bool setPowerBoostKeepOn(int en)
{
  Wire.beginTransmission(IP5306_ADDR);
  Wire.write(IP5306_REG_SYS_CTL0);
  if (en) {
    Wire.write(0x37); // Set bit1: 1 enable 0 disable boost keep on
  } else {
    Wire.write(0x35); // 0x37 is default reg value
  }
  return Wire.endTransmission() == 0;
}


void setup() {
  // Set console baud rate
  SerialMon.begin(115200);
  delay(10);

  // Keep power when running from battery
  Wire.begin(I2C_SDA, I2C_SCL);
  bool isOk = setPowerBoostKeepOn(1);
  SerialMon.println(String("IP5306 KeepOn ") + (isOk ? "OK" : "FAIL"));

  // Set-up modem reset, enable, power pins
  pinMode(MODEM_PWKEY, OUTPUT);
  pinMode(MODEM_RST, OUTPUT);
  pinMode(MODEM_POWER_ON, OUTPUT);
  digitalWrite(MODEM_PWKEY, LOW);
  digitalWrite(MODEM_RST, HIGH);
  digitalWrite(MODEM_POWER_ON, HIGH);

  // Set GSM module baud rate and UART pins
  SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
  delay(3000);
  

  // restart takes quite some time
  // to skip it, call init() instead of restart()
  SerialMon.println("Initializing modem...");
  modem.restart();
  // Or, use modem.init() if you don't need the complete restart
  //modem.init();

  String modemInfo = modem.getModemInfo();
  SerialMon.print("Modem: ");
  SerialMon.println(modemInfo);

  // Unlock your SIM card with a PIN if needed
  if (strlen(simPIN) && modem.getSimStatus() != 3 ) {
    modem.simUnlock(simPIN);
  }
}

void loop() {
  if (SerialAT.available()) {
    SerialMon.write(SerialAT.read());
  }
  if (SerialMon.available()) {
    SerialAT.write(SerialMon.read());
  }
}

mit 115200 baud und neue Zeile im Seriellen Monitor kannst du dann AT-Kommandos absetzen.