Eine kleine Arduino-Bibliothek für GSM-Module, die einfach funktioniert.
Wenn Ihnen TinyGSM gefällt, geben Sie ihm einen Stern oder teilen Sie es und leisten Sie einen Beitrag!
Sie können auch an unserem Chat teilnehmen:
Diese Bibliothek lässt sich leicht in viele Skizzen integrieren, die Ethernet oder WLAN verwenden. Es werden Beispiele für PubSubClient (MQTT) , Blynk , HTTP-Client und Datei-Download bereitgestellt.
Das vollständige WebClient-Beispiel für Arduino Uno (über Software Serial) benötigt nur wenig Ressourcen:
Sketch uses 15022 bytes (46%) of program storage space. Maximum is 32256 bytes.
Global variables use 574 bytes (28%) of dynamic memory, leaving 1474 bytes for local variables. Maximum is 2048 bytes.
Die Arduino GSM-Bibliothek verwendet in einem ähnlichen Szenario 15868 Byte (49 %) Flash und 1113 Byte (54 %) RAM. TinyGSM ruft Daten außerdem sanft vom Modem ab (wann immer möglich), sodass es mit sehr wenig RAM arbeiten kann. Jetzt haben Sie mehr Platz für Ihre Experimente.
Sehen Sie sich dieses Repo an, um neue Updates zu erhalten! Und natürlich sind Beiträge willkommen ;)
Datenverbindungen
USSD
SMS
Sprachanrufe
Standort
Credits
AT
-Befehl mit dieser SkizzeDer allgemeine Ablauf Ihres Codes sollte wie folgt aussehen:
#define TINY_GSM_MODEM_SIM800
#include
TinyGsm modem(SerialAT);
TinyGsmClient client(modem);
oder TinyGsmClientSecure client(modem);
(auf unterstützten Modulen)TinyGsmClient clientX(modem, 0);
, TinyGsmClient clientY(modem, 1);
usw. bzwTinyGsmClientSecure clientX(modem, 0);
, TinyGsmClientSecure clientY(modem, 1);
, uswmodem.init()
oder modem.restart()
modem.simUnlock(GSM_PIN)
modem.networkConnect(wifiSSID, wifiPass)
modem.waitForNetwork(600000L)
modem.gprsConnect(apn, gprsUser, gprsPass)
(oder einfach modem.gprsConnect(apn)
)client.connect(server, port)
Viele GSM-Modems, WLAN- und Funkmodule können durch das Senden von AT-Befehlen über Seriell gesteuert werden. TinyGSM weiß, welche Befehle gesendet werden müssen und wie AT-Antworten verarbeitet werden sollen, und bindet diese in die Standard-Arduino-Client-Schnittstelle ein.
Diese Bibliothek „blockiert“ ihre gesamte Kommunikation. Abhängig von der Funktion kann es sein, dass Ihr Code längere Zeit blockiert ist und auf die Antworten des Moduls wartet. Abgesehen von den offensichtlichen Funktionen (z. B. waitForNetwork()
) können mehrere andere Funktionen Ihren Code für bis zu mehreren Minuten blockieren. Die Funktionen gprsConnect()
und client.connect()
blockieren üblicherweise am längsten, insbesondere in Regionen mit schlechterem Service. Das Herunterfahren und Neustarten des Moduls kann ebenfalls recht langsam sein.
Diese Bibliothek unterstützt keinerlei „Hardware“ oder Pin-Level-Steuerung für die Module. Wenn Sie Ihr Modul mithilfe einer High/Low/High-Pin-Sequenz einschalten oder zurücksetzen müssen, müssen Sie diese Funktionen selbst schreiben.
Für GPRS-Datenströme stellt diese Bibliothek die Standard-Arduino-Client-Schnittstelle bereit. Weitere Funktionen entnehmen Sie bitte dieser Beispielskizze
Die meisten Module benötigen bis zu 2A, um eine ordnungsgemäße Verbindung zum Netzwerk herzustellen. Das ist das Vierfache dessen, was ein „Standard“-USB liefert! Eine Verbesserung der Stromversorgung löst in vielen Fällen tatsächlich Stabilitätsprobleme!
Die meisten Module unterstützen eine Art „Auto-Bauding“-Funktion, bei der das Modul versucht, seine Baudrate an die empfangenen Daten anzupassen. TinyGSM implementiert auch seine eigene automatische Bauding-Funktion ( TinyGsmAutoBaud(SerialAT, GSM_AUTOBAUD_MIN, GSM_AUTOBAUD_MAX);
). Sie sind zwar sehr nützlich, wenn Sie sich zum ersten Mal mit einem Modul verbinden und Tests durchführen, sie sollten jedoch NICHT in Produktionscode verwendet werden. Sobald Sie die Kommunikation mit dem Modul hergestellt haben, stellen Sie die Baudrate mit der Funktion setBaud(#)
ein und bleiben Sie bei dieser Rate.
Manchmal (insbesondere wenn Sie mit AT-Befehlen gespielt haben) kann es vorkommen, dass Ihre Modulkonfiguration ungültig wird. Dies kann zu Problemen führen wie:
Um das Modul auf die Werkseinstellungen zurückzusetzen, verwenden Sie diese Skizze: Datei -> Beispiele -> TinyGSM -> Tools -> FactoryReset
In einigen Fällen müssen Sie möglicherweise einen anfänglichen APN festlegen, um eine Verbindung zum Mobilfunknetz herzustellen. Versuchen Sie, mit der gprsConnect(APN)
-Funktion einen anfänglichen APN festzulegen, wenn Sie sich nicht im Netzwerk registrieren können. Möglicherweise müssen Sie den APN nach der Registrierung erneut festlegen. (In den meisten Fällen sollten Sie den APN nach der Registrierung festlegen.)
Die erste Verbindung mit einer neuen SIM-Karte, einem neuen Modul oder an einem neuen Standort/Turm kann lange dauern – bis zu 15 Minuten oder sogar länger, insbesondere wenn die Signalqualität nicht ausgezeichnet ist. Wenn es Ihre erste Verbindung ist, müssen Sie möglicherweise Ihre Wartezeiten anpassen und möglicherweise während der Wartezeit zum Mittagessen gehen.
Wenn Sie eine TCP-Verbindung öffnen können, die Verbindung jedoch geschlossen wird, bevor Daten empfangen werden, versuchen Sie, Ihrer Anfrage einen Keep-Alive-Header hinzuzufügen. Einige Module (z. B. das SIM7000 im SSL-Modus) verwerfen alle ungelesenen Daten sofort, wenn der Remote-Server die Verbindung schließt – manchmal ohne überhaupt eine Benachrichtigung darüber zu geben, dass die Daten überhaupt angekommen sind. Wenn Sie MQTT verwenden, müssen Sie möglicherweise Ihr Keep-Alive-Intervall (PINGREQ/PINGRESP) reduzieren, um eine kontinuierliche Verbindung aufrechtzuerhalten.
Verwenden Sie diese Skizze, um SIM-Karten- und GPRS-Verbindungsprobleme zu diagnostizieren: Datei -> Beispiele -> TinyGSM -> Tools -> Diagnose
Wenn die Diagnose fehlschlägt, entkommentieren Sie diese Zeile, um einige Debugging-Kommentare aus der Bibliothek auszugeben:
# define TINY_GSM_DEBUG SerialMon
In jedem benutzerdefinierten Code muss TINY_GSM_DEBUG
definiert werden, bevor die TinyGSM-Bibliothek eingebunden wird.
Wenn Sie beim Debuggen der Bibliothek keine offensichtlichen Fehler erkennen können, kopieren Sie mit StreamDebugger die gesamte AT-Befehlssequenz auf den seriellen Hauptport. Kommentieren Sie im Diagnosebeispiel einfach die Zeile aus:
# define DUMP_AT_COMMANDS
Im benutzerdefinierten Code können Sie dieses Snippit hinzufügen:
# ifdef DUMP_AT_COMMANDS
# include < StreamDebugger.h >
StreamDebugger debugger (SerialAT, SerialMon);
TinyGsm modem (debugger);
# else
TinyGsm modem (SerialAT);
# endif
Diese Bibliothek öffnet eine TCP- (oder SSL-) Verbindung zu einem Server. Im OSI-Modell ist das Schicht 4 (oder 5 für SSL). HTTP (GET/POST), MQTT und die meisten anderen Funktionen, die Sie wahrscheinlich verwenden möchten, befinden sich auf Ebene 7. Das bedeutet, dass Sie die oberste Ebene entweder manuell codieren oder eine andere Bibliothek (wie HTTPClient oder PubSubClient) verwenden müssen es für dich. Tools wie PostMan zeigen auch Layer 7 an, nicht Layer 4/5 wie TinyGSM. Wenn Sie erfolgreich eine Verbindung zu einem Server herstellen, aber die Antwort „schlechte Anfrage“ (oder keine Antwort) erhalten, liegt das Problem wahrscheinlich an Ihrer Formatierung. Hier sind einige Tipps zum manuellen Schreiben von Schicht 7 (insbesondere HTTP-Anfrage):
client.print("...")
oder client.write(buf, #)
oder sogar client.write(String("..."))
, nicht client.write("...")
für Verhindert, dass der Text zeichenweise gesendet wird (Schreibmaschinenstil).client.print(String( " GET " ) + resource + " HTTP/1.1 rn " );
client.print( " GET " );
client.print(resource);
client.println( " HTTP/1.1 " )
client.print("....rnrn")
hinzu oder fügen Sie einen zusätzlichen client.println()
ein Bei Verwendung von SoftwareSerial
(auf Uno, Nano usw.) funktioniert die Geschwindigkeit 115200 möglicherweise nicht. Versuchen Sie, 57600 , 38400 oder noch niedriger auszuwählen – diejenige, die für Sie am besten geeignet ist. In manchen Fällen ist 9600 instabil, aber die Verwendung von 38400 hilft usw. Stellen Sie sicher, dass Sie in der Skizze die richtigen TX/RX-Pins setzen. Bitte beachten Sie, dass nicht jeder Arduino-Pin als TX- oder RX-Pin dienen kann. Weitere Informationen zu SoftSerial-Optionen und -Konfiguration finden Sie hier und hier.
Wenn Sie ESP32 HardwareSerial
verwenden, müssen Sie möglicherweise zusätzliche Parameter für den .begin()
-Aufruf angeben. Bitte beachten Sie diesen Kommentar.
Sie können die HttpClient- oder HttpsClient-Beispiele nicht mit ESP32 Core 1.0.2 kompilieren. Upgrade auf 1.0.3, Downgrade auf Version 1.0.1 oder Verwendung des WebClient-Beispiels.
Wenn Sie SAMD21-basierte Karten verwenden, müssen Sie möglicherweise einen Sercom-UART-Port anstelle von Serial1
verwenden. Bitte beachten Sie diesen Kommentar.
Es stellt sich heraus, dass Goouuu Tech IOT-GA6 nicht dasselbe ist wie AI-Thinker A6 . Leider wird IOT-GA6 noch nicht standardmäßig unterstützt. Es gibt einige Hinweise darauf, dass die IOT-GA6-Firmware möglicherweise aktualisiert wird, um mit A6 übereinzustimmen ... Siehe dieses Thema.
Einige, aber nicht alle Versionen des SIM800 unterstützen SSL. Die SSL-Unterstützung hängt von der Firmware-Version und dem einzelnen Modul ab. Selbst mit scheinbar identischer Firmware hatten Benutzer unterschiedliche Erfolge bei der Verwendung von SSL auf dem SIM800. Wenn Sie SSL benötigen und es auf Ihrem SIM800 anscheinend nicht funktioniert, versuchen Sie es mit einem anderen Modul oder versuchen Sie es mit einer sekundären SSL-Bibliothek.
Es gibt zwei Versionen des SIM7000-Codes, eine mit TINY_GSM_MODEM_SIM7000
und eine mit TINY_GSM_MODEM_SIM7000SSL
. Die TINY_GSM_MODEM_SIM7000
-Version unterstützt kein SSL , unterstützt aber bis zu 8 gleichzeitige Verbindungen. Die TINY_GSM_MODEM_SIM7000SSL
-Version unterstützt sowohl SSL als auch ungesicherte Verbindungen mit bis zu 2 gleichzeitigen Verbindungen. Warum gibt es also zwei Versionen? Die „SSL“-Version nutzt die „Application“-Befehle des SIM7000, während die andere das „TCP-IP-Toolkit“ nutzt. Abhängig von Ihrer Region/Firmware funktioniert das eine oder das andere möglicherweise nicht für Sie. Probieren Sie beides aus und verwenden Sie das, was stabiler ist. Wenn Sie kein SSL benötigen, empfehle ich, mit TINY_GSM_MODEM_SIM7000
zu beginnen.
Dieses Projekt ist unter der GNU Lesser General Public License (LGPL-3.0) veröffentlicht.