ESP32 ve Arduino

SIM7600 MQTT: TinyGSM ile 4G LTE Üzerinden ESP32'den Yayın Yapın

SIM7600 modem, TinyGSM ve PubSubClient ile bir ESP32'yi 4G LTE üzerinden MQTT broker'a bağlayın, şebeke kopmalarından toparlanın ve hücresel veri kullanımını ve maliyetleri kontrol altında tutun.

sim7600 mqtt mesajları gönderen SIM7600 4G modemli ve antenli ESP32 kartı
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

SIM7600 MQTT, bir ESP32'nin hiç Wi-Fi olmayan yerlerden veri yayınlamasını sağlar: pompa istasyonları, şantiyeler, araçlar, tarım arazileri ve uzak panolar. Bu eğitimde bir SIM7600 4G LTE modemi açacak, TinyGSM ile mobil şebekeye bağlayacak, PubSubClient'ı modem üzerinden broker.connectmq.com'a bağlayacak ve şebeke kopmalarından temiz bir şekilde toparlanacaksınız. Ayrıca hücresel verinin gerçekte nereye gittiğini ve aylık kullanımınızı nasıl düşük tutacağınızı da öğreneceksiniz.

Parçalar Nasıl Bir Araya Gelir?

SIM7600, kendi TCP/IP yığınına sahip eksiksiz bir hücresel modemdir. ESP32 onunla bir UART üzerinden AT komutlarıyla konuşur. TinyGSM bu komutları bir Arduino Client sınıfı olan TinyGsmClient içine sarar; PubSubClient herhangi bir Client'ı kabul ettiği için MQTT kodu bir Wi-Fi sketch'iyle neredeyse aynıdır.

Katman Bileşen Sorumluluk
Uygulama Sketch'iniz Sensörleri okumak, neyin yayınlanacağına karar vermek
MQTT PubSubClient CONNECT, PUBLISH, SUBSCRIBE, keep-alive
Taşıma TinyGsmClient AT komutlarıyla modem içinde TCP soketleri açar
Modem SIM7600 Şebeke kaydı, PDP bağlamı, TCP/IP
Radyo LTE şebekesi ve SIM Kapsama alanı, APN, veri paketi

Hücresel MQTT sorunlarının çoğu aslında MQTT sorunu değildir. "MQTT bağlanmıyor" olarak görünen güç, anten, SIM veya APN sorunlarıdır. Bu nedenle sketch her katmanı ayrı ayrı kontrol eder ve nerede başarısız olduğunu loglar.

Donanım

  • SIM7600 modüllü bir ESP32 kartı. LilyGO T-SIM7600 serisi gibi entegre kartlar en kolay başlangıçtır; ayrı bir SIM7600 breakout kartı ile bir ESP32 DevKit de çalışır.
  • Aktif veri paketi olan bir mikro veya nano SIM. IoT veri SIM'leri idealdir; test için bir telefon SIM'i de iş görür.
  • Ana anten portuna bağlı bir LTE anteni. Modemi asla antensiz beslemeyin.
  • Modemin iletim sırasındaki akım tepelerini karşılayabilen bir güç kaynağı. İyi bir 18650 hücresi veya en az 2 A değerinde bir 5 V kaynak makul bir başlangıç noktasıdır.

Güç, arızaların bir numaralı nedenidir. LTE modemler iletim sırasında kısa, yüksek akım darbeleri çeker. Zayıf bir USB portu veya ince kablolar, bağlantının ortasında modemi sıfırlayan voltaj düşüşlerine yol açar ve belirtiler rastgele görünür: bazen şebekeye kaydolur, bazen olmaz, bazen birkaç mesajdan sonra bağlantı kopar.

Sinyal LilyGO T-SIM7600'de tipik pin Amaç
Modem TX'ten ESP32 RX'e GPIO 26 Modemden gelen UART verisi
ESP32 TX'ten modem RX'e GPIO 27 Modeme giden UART verisi
PWRKEY GPIO 4 Modemi açmak için darbe
Güç etkinleştirme GPIO 12 Bazı kart revizyonlarında modem beslemesini etkinleştirir

Pin atamaları kartlar ve revizyonlar arasında farklılık gösterir. Kartınızın dokümantasyonunu kontrol edin ve sketch'teki tanımları buna göre ayarlayın.

Kütüphaneler

Arduino Library Manager üzerinden kurun:

  • Volodymyr Shymanskyy'nin TinyGSM kütüphanesi.
  • Nick O'Leary'nin PubSubClient kütüphanesi.

TinyGSM'in modem modelini derleme zamanında bilmesi gerekir; bu yüzden #define TINY_GSM_MODEM_SIM7600 satırı include'dan önce yer almalıdır.

Tam SIM7600 MQTT Sketch'i

#define TINY_GSM_MODEM_SIM7600
#define TINY_GSM_RX_BUFFER 1024          // larger buffer for incoming MQTT data

#include <TinyGsmClient.h>
#include <PubSubClient.h>

// ---- Board pins (LilyGO T-SIM7600 defaults, adjust for your board) ----
#define MODEM_TX      27
#define MODEM_RX      26
#define MODEM_PWRKEY  4
#define MODEM_POWER   12

// ---- Cellular settings ----
const char APN[]       = "internet";       // from your SIM provider
const char APN_USER[]  = "";
const char APN_PASS[]  = "";
const char SIM_PIN[]   = "";               // leave empty if the SIM has no PIN

// ---- MQTT settings ----
const char* MQTT_HOST = "broker.connectmq.com";
const uint16_t MQTT_PORT = 1883;
const char* CLIENT_ID = "lte-81c3e5";      // unique
const char* BASE = "connectmq/demo/lte-81c3e5";

HardwareSerial SerialAT(1);
TinyGsm modem(SerialAT);
TinyGsmClient gsmClient(modem);
PubSubClient mqtt(gsmClient);

unsigned long lastAttempt = 0, lastPublish = 0;
const unsigned long PUBLISH_INTERVAL = 60000;  // one reading per minute

void powerOnModem() {
  pinMode(MODEM_POWER, OUTPUT);
  digitalWrite(MODEM_POWER, HIGH);
  pinMode(MODEM_PWRKEY, OUTPUT);
  digitalWrite(MODEM_PWRKEY, LOW);
  delay(100);
  digitalWrite(MODEM_PWRKEY, HIGH);              // pulse to switch on
  delay(1000);
  digitalWrite(MODEM_PWRKEY, LOW);
}

bool ensureNetwork() {
  if (!modem.isNetworkConnected()) {
    Serial.println("Waiting for network registration...");
    if (!modem.waitForNetwork(60000L)) {
      Serial.println("No network: check antenna, SIM and coverage");
      return false;
    }
    Serial.printf("Registered, signal quality %d\n", modem.getSignalQuality());
  }
  if (!modem.isGprsConnected()) {
    Serial.printf("Opening data connection with APN %s\n", APN);
    if (!modem.gprsConnect(APN, APN_USER, APN_PASS)) {
      Serial.println("Data connection failed: check APN and data plan");
      return false;
    }
    Serial.print("Local IP: ");
    Serial.println(modem.localIP());
  }
  return true;
}

void onMessage(char* topic, byte* payload, unsigned int length) {
  Serial.printf("Command %s: %.*s\n", topic, (int)length, (const char*)payload);
}

bool connectMqtt() {
  String status = String(BASE) + "/status";
  if (!mqtt.connect(CLIENT_ID, nullptr, nullptr, status.c_str(), 1, true, "offline")) {
    Serial.printf("MQTT failed, state=%d\n", mqtt.state());
    return false;
  }
  mqtt.publish(status.c_str(), "online", true);
  mqtt.subscribe((String(BASE) + "/cmd").c_str(), 1);
  Serial.println("MQTT connected over LTE");
  return true;
}

void setup() {
  Serial.begin(115200);
  SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
  powerOnModem();

  Serial.println("Initializing modem...");
  if (!modem.init()) {
    Serial.println("init failed, trying restart");
    modem.restart();
  }
  Serial.println("Modem: " + modem.getModemInfo());
  if (strlen(SIM_PIN) && modem.getSimStatus() == SIM_LOCKED) modem.simUnlock(SIM_PIN);

  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  mqtt.setCallback(onMessage);
  mqtt.setKeepAlive(120);                        // fewer pings, less data
  mqtt.setSocketTimeout(15);                     // cellular round trips are slower
}

void loop() {
  if (!mqtt.connected()) {
    if (millis() - lastAttempt > 15000) {
      lastAttempt = millis();
      if (ensureNetwork()) connectMqtt();
    }
    return;
  }
  mqtt.loop();

  if (millis() - lastPublish > PUBLISH_INTERVAL) {
    lastPublish = millis();
    char json[64];
    snprintf(json, sizeof(json), "{\"t\":%.1f,\"csq\":%d}",
             20.0 + (esp_random() % 100) / 10.0, modem.getSignalQuality());
    mqtt.publish((String(BASE) + "/telemetry").c_str(), json);
  }
}

Seri monitörde nelere bakmalı?

Sağlıklı bir başlangıçta modem kimliği, Registered, signal quality N, yerel IP ve MQTT connected over LTE yazdırılır. Sinyal kalitesi 0 ile 31 arasındaki CSQ değeridir; 99 bilinmiyor anlamına gelir. Yaklaşık 10'un altındaki değerler sınırdadır; yazılımı suçlamadan önce anteni yeniden konumlandırın. Sketch kayıt aşamasında duruyorsa sorun SIM, kapsama alanı veya antendedir. Şebekeye kaydolup veri bağlantısı başarısız oluyorsa APN yanlıştır veya pakette veri yoktur. Her ikisi de başarılı olup MQTT -2 durumuyla başarısız oluyorsa TCP bağlantısı engelleniyordur; bazı kısıtlayıcı SIM'ler yalnızca beyaz listedeki hedeflere izin verir.

Bilgisayarınızdan Test Edin

mosquitto_sub -h broker.connectmq.com -p 1883 -i watch-81c3e5 -v -t "connectmq/demo/lte-81c3e5/#"

status online mesajını ve ardından her dakika bir telemetri mesajı görmelisiniz. Downlink yolunu doğrulamak için bir komut gönderin; bu aynı zamanda operatörün NAT'ının bağlantıyı açık tuttuğunu da kanıtlar:

mosquitto_pub -h broker.connectmq.com -p 1883 -i cmd-81c3e5 -t "connectmq/demo/lte-81c3e5/cmd" -m "ping"

Ücretsiz public MQTT broker ilk devreye alma için yeterlidir; ancak orada yayınladığınız her şey herkes tarafından okunabilir. Bu yüzden cihaz tezgâhtan ayrılmadan önce kendi kimlik bilgilerinize geçin.

SIM7600 MQTT Veri Kullanımını Düşük Tutmak

Hücresel paketler bayt bazında ücretlendirilir ve MQTT ancak verimli kullanırsanız verimlidir. Etkisi en büyük olan ayarlar, kabaca etki sırasına göre şunlardır:

  1. Yeniden bağlanmalardan kaçının. Her yeni bağlantı bir TCP el sıkışmasına, MQTT CONNECT ve CONNACK'e, aboneliklere ve TLS ile sertifika zinciri dahil tam bir el sıkışmaya mal olur. Birkaç dakikada bir yeniden bağlanan bir cihaz, bağlanmaya telemetriden daha fazla veri harcayabilir. Bir zamanlayıcıyla yeniden bağlanmak yerine kopmaların temel nedenini düzeltin.
  2. Keep-alive'ı ayarlayın. Her keep-alive periyodunda istemci küçük bir PINGREQ gönderir ve broker yanıt verir. Daha uzun bir keep-alive veri tasarrufu sağlar; ancak operatör NAT ağ geçitleri boşta kalan bağlantıları bir süre sonra düşürür ve keep-alive bundan uzunsa bağlantı sessizce ölür. Yaklaşık iki dakikayla başlayın ve gözlemlerinize göre ayarlayın.
  3. Payload'ları kısaltın. Kısa JSON anahtarları kullanın ("temperature" yerine "t"), değerleri yuvarlayın ve nadiren değişen alanları atlayın.
  4. Ölçümleri toplu gönderin. On dakikada bir on ölçümü tek mesajda göndermek, on ayrı mesajdan çok daha az ek yük getirir.
  5. Değiştiğinde yayınlayın. Yavaş değişen değerler için yalnızca değer bir eşikten fazla değiştiğinde yayınlayın, buna periyodik bir heartbeat ekleyin.
  6. Kısa topic'ler kullanın. Topic her mesajla birlikte gönderilir. f/42/t, uzun açıklayıcı bir yoldan daha ucuzdur; ancak okunabilirlik de önemlidir, bir denge bulun.
  7. Aboneliklere dikkat edin. Yoğun topic'lere wildcard abonelikler beklediğinizden çok daha fazla veri çekebilir.

Operatörlerin her oturumu veya fatura dönemini minimum bir birime yuvarlayabileceğini unutmayın; bu yüzden hesaplamalara güvenmek yerine birkaç gün boyunca SIM sağlayıcınızın portalında gerçek kullanımı ölçün.

Hücresel Bağlantılarda Güvenlik

Üretimde 8883 portunda TLS ve ConnectMQ portalında oluşturulan kullanıcı adı, parola ve client ID'yi kullanın. SIM7600'de iki seçeneğiniz var. Bazı TinyGSM sürümleri ve fork'ları, modemin yerleşik SSL motorunu kullanan güvenli bir istemci sunar ve bu ESP32 belleğinden tasarruf sağlar; yüklü sürümünüzün bunu SIM7600 için destekleyip desteklemediğini kontrol edin. Alternatif olarak TLS'i ESP32'nin kendisinde, TinyGsmClient üzerine katmanlanan SSLClient gibi bir sarmalayıcı kütüphaneyle çalıştırabilirsiniz. Her iki durumda da doğrulamayı devre dışı bırakmak yerine broker sertifikasını ISRG Root X1 köküne göre doğrulayın. ESP32 MQTT SSL rehberi sertifika seçimini ve NTP'nin veya şebeke saatinin neden önemli olduğunu açıklar; SIM7600 şebeke saatini de sağlayabilir.

Sorun Giderme

  • Modem AT komutlarına hiç yanıt vermiyor. Yanlış UART pinleri, yanlış baud hızı veya modem beslenmiyor. Kartınız için güç etkinleştirme pinini ve PWRKEY darbesini kontrol edin.
  • Yalnızca 2G veya 3G'ye kaydoluyor ya da hiç kaydolmuyor. Bant, SIM7600 varyantınız tarafından desteklenmiyor olabilir (E, A, SA, G ve diğerleri farklı bölgeleri kapsar).
  • Bağlanıyor, ardından birkaç dakikalık sessizlikten sonra kopuyor. Keep-alive, operatörün NAT zaman aşımından uzun. Kısaltın.
  • İletim sırasında brownout sıfırlamaları. Güç kaynağı tepe akımı karşılayamıyor. Modemin yakınına büyük bir kondansatör ekleyin ve daha kalın kablolar kullanın.
  • Mesajlar saniyelerce gecikiyor. Hücresel bağlantılarda normaldir; gecikme Wi-Fi'a göre daha yüksek ve daha değişkendir. Tasarımınızı buna göre yapın.

Backoff içeren daha sağlam bir yeniden bağlanma stratejisi için ESP32 MQTT yeniden bağlanma mantığı yazısındaki durum makinesini uyarlayın. Cihazın sahada kablolu bir seçeneği varsa W5500 ile ESP32 Ethernet MQTT ile karşılaştırın; hareketli varlıklar için MQTT üzerinden ESP32 GPS takip cihazı yazısına bakın.

Hücresel Bir Filoyu İşletmek

Hücresel cihazlara sahada gitmek pahalıdır; bu yüzden broker tarafı en son endişe etmeniz gereken şey olmalıdır. Tamamen yönetilen bir MQTT servisi, cihazlar hücreler arasında dolaşıp yeniden bağlanırken uç noktayı erişilebilir tutar. ConnectMQ her cihaza kendi kimlik bilgilerini verir, bağlantı durumunu $SYS/broker/connection/{clientId}/state üzerinden gösterir ve portalda canlı trafiği izlemenizi sağlar; bu da bir SIM'in verisinin nereye gittiğini anlamaya çalışırken faydalıdır. Public bir hostname'e sahip bir bulut MQTT broker, kendi sunucunuzda barındırılan broker'ların hücresel cihazlar için çoğu zaman gerektirdiği özel APN ve VPN kurulumlarından da kurtarır. Bu ilk ESP32 projenizse ESP32 IoT eğitimi ile başlayın.

ConnectMQ ile Başlayın

app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun. SIM7600 cihazlarınız kapsama alanı olan her yerden ona yayın yapabilir ve her mesajın gelişini canlı topic gezgininde izleyebilirsiniz.

Sık Sorulan Sorular

PubSubClient SIM7600 ile çalışır mı?

Evet. TinyGSM, Arduino Client arayüzünü uygulayan TinyGsmClient'ı sağlar; böylece PubSubClient modemin TCP soketlerini tıpkı Wi-Fi'ı kullandığı gibi kullanır.

SIM7600 MQTT ne kadar veri kullanır?

Bu büyük ölçüde yeniden bağlanma sıklığına, keep-alive aralığına ve payload boyutuna bağlıdır. Bağlı kalan ve kompakt mesajlar gönderen bir cihaz çok az veri kullanır; sık yeniden bağlanmalar, özellikle TLS ile, kullanıma hâkim olur. SIM sağlayıcınızın portalında ölçün.

Hangi APN'i kullanmalıyım?

APN, SIM sağlayıcınızdan gelir ve genellikle dokümantasyonlarında veya IoT portallarında listelenir. Yanlış bir APN, modemin şebekeye kaydolmasına izin verir ancak veri bağlantısını engeller.

SIM7600 ile TLS üzerinden MQTT kullanabilir miyim?

Evet; TinyGSM sürümünüz SIM7600 için destekliyorsa modemin SSL motoruyla ya da TinyGsmClient üzerinde bir sarmalayıcı kütüphaneyle TLS'i ESP32'de çalıştırarak. Broker sertifikasını her zaman doğrulayın.

İlgili yazılar

ESP32 NTP MQTT Zaman Damgası: Her Mesaja Doğru Zaman Ekleyin

ESP32 saatini NTP ile eşitleyin, ISO 8601 ve epoch milisaniye zaman damgalarını biçimlendirin ve bunları MQTT payload'larına ekleyin; böylece ölçümler geç yayınlansa bile gerçek alınma zamanlarını korur.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.