LoRaWAN و TTN یعنی چه؟ (برای مبتدی)
LoRa یک تکنولوژی رادیویی کممصرف با برد بلند است. LoRaWAN (LoRa Wide Area Network) یک پروتکل شبکه است که بر پایه LoRa ساخته شده — مثل رابطه Ethernet با WiFi. با LoRaWAN میتوان هزاران سنسور را به یک شبکه متصل کرد که دادهها را از طریق دروازههای (Gateway) اینترنتی به سرور ابری میفرستند.
TTN (The Things Network) یک شبکه LoRaWAN عمومی رایگان است که در بسیاری از شهرهای جهان Gateway دارد. حتی اگر Gateway در شهر شما نباشد، میتوانید یک Gateway ارزانقیمت (مثل RAK2287) نصب کنید و با TTN متصل شوید. OTAA (Over-The-Air Activation) روش امنتر اتصال است — هر بار یک کلید جدید تولید میشود.
برای پهپاد و UGV، LoRaWAN برای ارسال Telemetry به سرور مرکزی بدون نیاز به SIM بسیار مناسب است.
محصولی که میسازید
یک سنسور دما/رطوبت که دادهها را هر ۵ دقیقه از طریق LoRaWAN به TTN ارسال میکند.
- زمان راهاندازی: ۳ تا ۵ ساعت
- هزینه: ۸۰۰ هزار تا ۱.۵ میلیون تومان
- برد: تا ۱۵ کیلومتر (بسته به Gateway)
مراحل ثبتنام در TTN
// ۱. حساب کاربری در https://www.thethingsnetwork.org بسازید
// ۲. یک Application جدید بسازید
// ۳. یک End Device ثبت کنید:
// - Brand: HELTEC / Dragino / RAK / یا Manual Entry
// - Activation Mode: OTAA
// - LoRaWAN Version: MAC V1.0.3
// - Frequency Plan: EU_863_870 یا AS_923 (بسته به ماژول)
// ۴. کلیدهای تولیدشده را کپی کنید:
// - Device EUI (deveui) — ۱۶ کاراکتر hex
// - App EUI (appeui) — ۱۶ کاراکتر hex
// - App Key (appkey) — ۳۲ کاراکتر hex
کد Arduino OTAA با LMIC
#include <lmic.h>
#include <hal/hal.h>
#include <DHT.h>
// کلیدهای OTAA از TTN Console (LSB order)
static const u1_t PROGMEM APPEUI[8] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
void os_getArtEui(u1_t* buf) { memcpy_P(buf,APPEUI,8); }
static const u1_t PROGMEM DEVEUI[8] = { /* از TTN */ };
void os_getDevEui(u1_t* buf) { memcpy_P(buf,DEVEUI,8); }
static const u1_t PROGMEM APPKEY[16] = { /* از TTN */ };
void os_getDevKey(u1_t* buf) { memcpy_P(buf,APPKEY,16); }
DHT dht(4, DHT22);
static osjob_t sendjob;
const lmic_pinmap lmic_pins = { .nss=10, .rxtx=LMIC_UNUSED_PIN, .rst=9, .dio={2,6,7} };
void do_send(osjob_t* j) {
float temp = dht.readTemperature();
float hum = dht.readHumidity();
uint8_t payload[4];
int16_t t100 = (int16_t)(temp * 100);
uint16_t h100 = (uint16_t)(hum * 100);
payload[0] = t100 >> 8; payload[1] = t100 & 0xFF;
payload[2] = h100 >> 8; payload[3] = h100 & 0xFF;
LMIC_setTxData2(1, payload, sizeof(payload), 0);
}
void onEvent(ev_t ev) {
if (ev == EV_JOINED) { LMIC_setAdrMode(0); do_send(&sendjob); }
if (ev == EV_TXCOMPLETE) { os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(300), do_send); }
}
void setup() { os_init(); LMIC_reset(); LMIC_startJoining(); dht.begin(); }
void loop() { os_runloop_once(); }
چکلیست راهاندازی
| مرحله | وضعیت |
|---|---|
| Device در TTN ثبت شده؟ | ☐ |
| کلیدهای EUI و AppKey در کد قرار داده شده؟ | ☐ |
| OTAA Join موفق بوده؟ (Serial: EV_JOINED) | ☐ |
| داده در TTN Live Data دیده میشود؟ | ☐ |
| Payload Decoder تنظیم شده؟ | ☐ |