1. Pengenalan LoRa Mesh Networking
LoRa Mesh Networking adalah pendekatan jaringan di mana perangkat LoRa tidak hanya berkomunikasi langsung dengan gateway, tetapi juga dapat saling berkomunikasi satu sama lain dan meneruskan data (relay) melalui perangkat lain hingga mencapai tujuan. Ini sangat berbeda dengan model LoRaWAN tradisional yang menggunakan topologi star.
Dalam skenario LoRaWAN biasa, semua end device harus berada dalam jangkauan langsung gateway. Jika suatu area terlalu luas atau terhalang medan (pegunungan, hutan, gedung), coverage menjadi terbatas. LoRa Mesh menyelesaikan masalah ini dengan memanfaatkan perangkat sebagai relay node yang meneruskan data secara berantai (multi-hop).
Mengapa LoRa Mesh?
| Tantangan | LoRaWAN (Star) | LoRa Mesh |
|---|---|---|
| Area terpencil tanpa gateway | β Tidak ter-cover | β Relay melalui node lain |
| Topografi kompleks (pegunungan) | β Shadow zone | β Routing menghindari obstacle |
| Biaya gateway | π° Perlu banyak gateway | π° Node merangkap relay (lebih murah) |
| Reliability | β οΈ Single point of failure (gateway) | β Multiple path, self-healing |
| Skalabilitas area | β οΈ Terbatas jangkauan GW | β Bisa diperluas dengan menambah node |
Kelebihan dan Kekurangan LoRa Mesh
| Kelebihan β | Kekurangan β |
|---|---|
| Jangkauan bisa sangat luas (multi-hop) | Latensi meningkat per hop |
| Tidak perlu gateway di setiap titik | Konsumsi daya lebih tinggi (node relay harus aktif) |
| Self-healing jika node mati | Kompleksitas implementasi lebih tinggi |
| Skalabel dengan menambah node | Throughput berkurang per hop |
| Cocok untuk area tanpa infrastruktur | Tidak standar (berbeda dari LoRaWAN) |
| Redundancy built-in | Manajemen node lebih kompleks |
2. Topologi Mesh vs Star
Untuk memahami LoRa Mesh, kita perlu membandingkannya dengan topologi star yang digunakan LoRaWAN konvensional. Setiap topologi memiliki trade-off tersendiri.
STAR TOPOLOGY (LoRaWAN) MESH TOPOLOGY (LoRa Mesh)
βββββββββββββββββββββββ ββββββββββββββββββββββββββ
βββββ βββββ
β GWβ β A β
βββ¬ββ /βββ¬ββ
/|\ / β
/ | \ / β
/ | \ / β
βββββββββββββββ βββββ βββββ
β N1ββ N2ββ N3β β B ββββββ C β
βββββββββββββββ βββ¬ββ βββ¬ββ
β β
βββββ βββββ
β D ββββββ E β
βββββ βββββ
β’ N1, N2, N3 harus dalam β’ Data bisa sampai ke GW
jangkauan langsung GW melalui BβA atau CβA
β’ Jika GW mati, semua β’ Jika node A mati, data
komunikasi terhenti bisa lewat BβCβ...βGW lain
β’ Jangkauan terbatas β’ Jangkauan bisa sangat luas
Jenis Topologi Mesh
| Topologi | Deskripsi | Cocok Untuk |
|---|---|---|
| Full Mesh | Setiap node terhubung ke semua node lain | Jaringan kecil, redundancy tinggi |
| Partial Mesh | Beberapa node terhubung, yang lain lewat relay | Deployment umum, cost-effective |
| Star-Mesh Hybrid | Cluster mesh lokal yang terhubung ke gateway via star | Area luas dengan beberapa gateway |
| Tree Mesh | Hierarchical, data mengalir dari leaf ke root | Monitoring lingkungan, pertanian |
Perbandingan Karakteristik
| Parameter | Star (LoRaWAN) | Full Mesh | Partial Mesh |
|---|---|---|---|
| Latensi | π’ Rendah (1 hop) | π΄ Bisa tinggi | π‘ Moderate |
| Redundancy | π΄ Rendah | π’ Tinggi | π‘ Sedang |
| Kompleksitas | π’ Rendah | π΄ Tinggi | π‘ Sedang |
| Konsumsi Daya | π’ Hemat | π΄ Tinggi | π‘ Moderate |
| Jangkauan | π΄ Terbatas | π’ Luas | π’ Luas |
| Skalabilitas | π‘ Sedang | π΄ Terbatas (overhead) | π’ Baik |
3. Protokol Routing Mesh
Routing protocol menentukan bagaimana data menemukan jalur terbaik dari node sumber ke node tujuan. Dalam LoRa Mesh, routing protocol harus mempertimbangkan keterbatasan daya, bandwidth rendah, dan dinamika jaringan.
Kategori Routing Protocol
1. Proactive Routing (Table-Driven)
Setiap node selalu memelihara tabel routing yang berisi jalur ke semua node lain. Tabel diperbarui secara periodik meskipun tidak ada traffic.
| Protokol | Karakteristik | Kelebihan | Kekurangan |
|---|---|---|---|
| OLSR | Optimized Link State Routing | Latensi rendah, jalur sudah siap | Overhead tinggi, boros bandwidth |
| Babel | Distance-vector hybrid | Adaptif, loop-free | Konsumsi memori cukup besar |
| DSDV | Destination Sequenced DV | Loop-free, simple | Tidak cocok untuk jaringan dinamis |
2. Reactive Routing (On-Demand)
Rute hanya dicari saat diperlukan. Menghemat bandwidth tapi menambah latensi saat pertama kali mengirim.
| Protokol | Karakteristik | Kelebihan | Kekurangan |
|---|---|---|---|
| AODV | Ad hoc On-Demand DV | Hemat bandwidth, scalable | Latensi tinggi pada discovery |
| DSR | Dynamic Source Routing | Tidak perlu tabel routing | Header besar (seluruh path di payload) |
| LYNX | LoRa-specific reactive | Dioptimasi untuk LoRa constraints | Baru, belum banyak referensi |
3. Hybrid Routing
Kombinasi proactive dan reactive. Contoh: ZRP (Zone Routing Protocol) β proaktif dalam zona lokal, reaktif antar zona.
4. Routing Berdasarkan Posisi
Keputusan routing berdasarkan koordinat GPS node. Node meneruskan paket ke node yang paling dekat dengan tujuan. Cocok untuk LoRa karena tidak perlu tabel routing besar.
Greedy Position-Based Routing
βββββββββββββββββββββββββββββ
Source (S) ingin mengirim ke Destination (D)
βββββ βββββ βββββ
β S βββββββββββ A βββββββββββ β
βββ¬ββ βββ¬ββ βββββ
β β
β ββββββ
βΌ βΌ
βββββ βββββ βββββ
β B βββββββ C βββββββββββ D β β Tujuan
βββββ βββββ βββββ
S melihat tetangga: A dan B
β B lebih dekat ke D β kirim ke B
B melihat tetangga: C dan A
β C lebih dekat ke D β kirim ke C
C melihat tetangga: D dan B
β D adalah tujuan β kirim ke D
Path: S β B β C β D (3 hop)
4. Komunikasi Multi-Hop
Multi-hop communication adalah inti dari LoRa Mesh. Data dikirim dari satu node ke node lain secara berantai sampai mencapai tujuan. Setiap node yang meneruskan data disebut relay node atau forwarder.
Cara Kerja Multi-Hop
- Node Sumber mengirim paket data ke node tetangga terdekat yang dipilih oleh routing protocol
- Relay Node menerima paket, memeriksa apakah dirinya tujuan. Jika bukan, ia meneruskan ke node berikutnya
- Proses berulang hingga paket sampai di Node Tujuan (atau gateway)
- Setiap hop menambahkan TTL (Time To Live) untuk mencegah infinite loop
Tantangan Multi-Hop di LoRa
| Tantangan | Penjelasan | Mitigasi |
|---|---|---|
| Latensi akumulatif | Setiap hop menambah delay | Batasi max hop (3-5), optimasi SF |
| Packet loss bertingkat | Jika 1 hop gagal, seluruh jalur gagal | Redundant paths, retransmission |
| Bandwidth menyusut | Setiap relay menghabiskan waktu udara | Kompresi payload, kurangi frekuensi update |
| Konsumsi daya relay | Relay node harus aktif menerima + meneruskan | Solar-powered relay, TDMA scheduling |
| Hidden terminal problem | Dua node mengirim ke relay bersamaan β collision | CSMA/CA, RTS/CTS, TDMA |
| Loop detection | Paket bisa berputar dalam loop | Sequence number, source routing, TTL |
Optimasi Multi-Hop
// ============================================
// Optimasi Multi-Hop: Kompresi Payload
// ============================================
// Sebelum kompresi (14 bytes):
struct SensorData {
float temperature; // 4 bytes
float humidity; // 4 bytes
uint32_t timestamp; // 4 bytes
uint16_t battery; // 2 bytes
};
// Setelah kompresi (8 bytes):
struct CompressedData {
int16_t temperature; // 2 bytes (x100, range -327.68 to 327.67Β°C)
uint16_t humidity; // 2 bytes (x100, range 0-655.35%)
uint16_t timestamp; // 2 bytes (offset dari base time, resolusi 1 menit)
uint16_t battery; // 2 bytes (x1000, range 0-65.535V)
};
// Penghematan: 14 bytes β 8 bytes = 43% lebih kecil
// Lebih kecil = lebih cepat transmit = lebih hemat daya
// = lebih banyak kapasitas untuk multi-hop relay
5. Self-Healing Network
Salah satu keunggulan terbesar LoRa Mesh adalah kemampuan self-healing β jaringan secara otomatis mendeteksi node yang gagal dan mencari jalur alternatif tanpa intervensi manual.
Mekanisme Self-Healing
- Neighbor Discovery: Setiap node secara periodik mengirim beacon/hello packet ke tetangga
- Link Quality Monitoring: Node memantau RSSI dan delivery ratio ke setiap tetangga
- Failure Detection: Jika node tetangga tidak merespons dalam periode tertentu, dianggap gagal
- Route Recalculation: Routing protocol menghitung ulang jalur tanpa melibatkan node yang gagal
- Convergence: Semua node memperbarui tabel routing dan jaringan kembali stabil
SELF-HEALING: Node Failure Recovery
ββββββββββββββββββββββββββββββββββββ
Normal Operation:
βββββ βββββ βββββ βββββ
β A ββββββ B ββββββ C ββββββ GWβ β Path normal
βββββ βββββ βββββ βββββ
Node B Gagal:
βββββ βββββ βββββ βββββ
β A ββββββ B ββ³β³β³β³β C ββββββ GWβ
βββββ βββββ βββββ βββββ
β²
GAGAL!
Self-Healing: A menemukan jalur alternatif
βββββ βββββ βββββ
β A ββββββββββββββββ C ββββββ GWβ β Path baru
βββββ βββββ βββββ
β β²
βββ Atau via D ββββ
βββββ
β D β β Relay alternatif
βββββ
Recovery time: 10-60 detik (tergantung protocol)
Parameter Self-Healing
| Parameter | Nilai Typical | Fungsi |
|---|---|---|
| Hello Interval | 30-120 detik | Frekuensi beacon/keepalive |
| Neighbor Timeout | 3x Hello Interval | Batas waktu sebelum node dianggap mati |
| Route Timeout | 5-15 menit | Batas waktu rute tidak digunakan sebelum dihapus |
| Max Hop Count | 3-7 hop | Batas hop untuk mencegah loop |
| Retransmission | 2-3 kali | Jumlah retry jika transmisi gagal |
6. Implementasi LoRa Mesh
Framework dan Library
| Framework | Platform | Fitur | Lisensi |
|---|---|---|---|
| Ripple (Meshtastic fork) | ESP32/nRF52 | LoRa mesh dengan app mobile, GPS, OTA | Open Source (GPL) |
| Meshtastic | ESP32 + SX1262 | Mesh + GPS + messaging, populer | Open Source (GPL) |
| RadioHead Mesh | Arduino/ESP32 | Simple mesh library, mudah dipelajari | Open Source |
| Painless Mesh | ESP32/ESP8266 | Easy mesh networking (WiFi based, adaptasi LoRa) | Open Source (MIT) |
| Custom (LMIC + AODV) | ESP32 + SX1276 | Fleksibel penuh, butuh development | Sesuai kebutuhan |
Implementasi dengan Meshtastic
# ============================================
# Setup LoRa Mesh dengan Meshtastic
# Hardware: Heltec WiFi LoRa 32 V3 / T-Beam
# ============================================
# 1. Install Meshtastic CLI
pip install meshtastic
# 2. Flash firmware ke perangkat
# Download firmware dari https://meshtastic.org/downloads
# Flash menggunakan web flasher atau ESPTool:
esptool.py --port /dev/ttyUSB0 write_flash \
0x10000 firmware.bin
# 3. Konfigurasi via CLI
# Set region (Indonesia = AS923)
meshtastic --set lora.region AS923
# Set device sebagai Router
meshtastic --set device.role ROUTER
# Set nama node
meshtastic --set device.user.shortname "Node01"
meshtastic --set device.user.longname "Mesh Router 01"
# Set channel (shared key)
meshtastic --ch-set psk "SuperSecretKey123" --ch-index 0
# Set GPS (jika ada)
meshtastic --set position.gps_enabled true
meshtastic--set position.position_broadcast_secs 300
# 4. Cek status semua node yang terdeteksi
meshtastic --nodes
# 5. Kirim pesan text
meshtastic --sendtext "Hello from Node01!"
# 6. Kirim ke node spesifik
meshtastic --dest "!a1b2c3d4" --sendtext "Ping!"
# 7. Monitor log realtime
meshtastic --seriallog stdout
Implementasi Custom Mesh (Arduino)
// ============================================
// Custom LoRa Mesh - Simple Flooding Protocol
// Hardware: ESP32 + SX1276
// Library: RadioHead (RH_RF95 + RHMesh)
// ============================================
#include <SPI.h>
#include <RH_RF95.h>
#include <RHMesh.h>
// Konfigurasi
#define NODE_ID 1 // ID unik node ini (1-255)
#define GATEWAY_ID 10 // ID gateway node
#define MAX_HOP 5 // Maksimum hop count
#define BROADCAST_INTERVAL 60000 // Interval broadcast (ms)
// Pin LoRa
#define RFM95_CS 5
#define RFM95_RST 14
#define RFM95_INT 26
#define RF95_FREQ 920.0 // Frekuensi Indonesia
// Inisialisasi
RH_RF95 rf95(RFM95_CS, RFM95_INT);
RHMesh manager(rf95, NODE_ID);
// Tabel routing lokal
struct RouteEntry {
uint8_t destId;
uint8_t nextHop;
uint8_t hopCount;
int16_t rssi;
unsigned long lastSeen;
};
RouteEntry routingTable[50];
uint8_t routeCount = 0;
// Mesh packet structure
struct MeshPacket {
uint8_t sourceId;
uint8_t destId;
uint8_t hopCount;
uint8_t maxHops;
uint16_t sequenceNum;
uint8_t dataType; // 0=data, 1=route_discovery, 2=ack
uint8_t payload[64];
uint8_t payloadLen;
};
void setup() {
Serial.begin(115200);
Serial.printf("LoRa Mesh Node %d starting...\n", NODE_ID);
// Reset LoRa module
pinMode(RFM95_RST, OUTPUT);
digitalWrite(RFM95_RST, LOW);
delay(10);
digitalWrite(RFM95_RST, HIGH);
delay(10);
if (!manager.init()) {
Serial.println("LoRa init failed!");
while(1);
}
rf95.setFrequency(RF95_FREQ);
rf95.setTxPower(14, false);
rf95.setSpreadingFactor(10); // SF10 untuk range baik
rf95.setSignalBandwidth(125000);
rf95.setCodingRate4(5); // 4/5
Serial.println("Mesh node ready!");
}
void loop() {
// 1. Cek incoming packet
uint8_t buf[RH_MESH_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
uint8_t from;
if (manager.recvfromAck(buf, &len, &from)) {
MeshPacket* pkt = (MeshPacket*)buf;
// Update routing table
updateRoutingTable(pkt->sourceId, from,
pkt->hopCount, rf95.lastRssi());
// Cek apakah untuk kita
if (pkt->destId == NODE_ID) {
handleIncomingPacket(pkt);
}
// Cek apakah perlu diteruskan
else if (pkt->hopCount < pkt->maxHops) {
forwardPacket(pkt);
}
}
// 2. Periodic: kirim data sensor
static unsigned long lastSend = 0;
if (millis() - lastSend > BROADCAST_INTERVAL) {
sendSensorData();
lastSend = millis();
}
// 3. Periodic: route maintenance
static unsigned long lastMaintenance = 0;
if (millis() - lastMaintenance > 300000) { // 5 menit
cleanRoutingTable();
lastMaintenance = millis();
}
}
void forwardPacket(MeshPacket* pkt) {
uint8_t nextHop = findNextHop(pkt->destId);
if (nextHop == 0) {
// Tidak ada route, broadcast discovery
broadcastRouteDiscovery(pkt->destId);
return;
}
pkt->hopCount++;
uint8_t err = manager.sendtoWait(
(uint8_t*)pkt, sizeof(MeshPacket), nextHop
);
if (err == RH_ROUTER_ERROR_NONE) {
Serial.printf("Forwarded to %d via %d (hop %d)\n",
pkt->destId, nextHop, pkt->hopCount);
} else {
Serial.printf("Forward failed: %d\n", err);
// Invalidate route, try alternative
invalidateRoute(pkt->destId, nextHop);
}
}
void sendSensorData() {
float temp = readTemperature();
float hum = readHumidity();
MeshPacket pkt;
pkt.sourceId = NODE_ID;
pkt.destId = GATEWAY_ID;
pkt.hopCount = 0;
pkt.maxHops = MAX_HOP;
pkt.dataType = 0;
// Encode sensor data ke payload
int16_t tempInt = (int16_t)(temp * 100);
uint16_t humInt = (uint16_t)(hum * 100);
pkt.payload[0] = tempInt >> 8;
pkt.payload[1] = tempInt & 0xFF;
pkt.payload[2] = humInt >> 8;
pkt.payload[3] = humInt & 0xFF;
pkt.payloadLen = 4;
forwardPacket(&pkt);
}
uint8_t findNextHop(uint8_t destId) {
for (uint8_t i = 0; i < routeCount; i++) {
if (routingTable[i].destId == destId) {
return routingTable[i].nextHop;
}
}
return 0; // No route found
}
void updateRoutingTable(uint8_t src, uint8_t from,
uint8_t hops, int16_t rssi) {
for (uint8_t i = 0; i < routeCount; i++) {
if (routingTable[i].destId == src) {
// Update jika rute lebih baik (lebih sedikit hop)
if (hops + 1 < routingTable[i].hopCount) {
routingTable[i].nextHop = from;
routingTable[i].hopCount = hops + 1;
routingTable[i].rssi = rssi;
routingTable[i].lastSeen = millis();
}
return;
}
}
// Tambah entry baru
if (routeCount < 50) {
routingTable[routeCount].destId = src;
routingTable[routeCount].nextHop = from;
routingTable[routeCount].hopCount = hops + 1;
routingTable[routeCount].rssi = rssi;
routingTable[routeCount].lastSeen = millis();
routeCount++;
}
}
void cleanRoutingTable() {
unsigned long now = millis();
uint8_t writeIdx = 0;
for (uint8_t i = 0; i < routeCount; i++) {
if (now - routingTable[i].lastSeen < 900000) { // 15 menit timeout
if (writeIdx != i) {
routingTable[writeIdx] = routingTable[i];
}
writeIdx++;
}
}
routeCount = writeIdx;
Serial.printf("Route table cleaned, %d entries remain\n", routeCount);
}
7. Optimasi Jaringan Mesh
Optimasi Daya
| Teknik | Penjelasan | Penghematan |
|---|---|---|
| Duty Cycle Scheduling | Atur slot waktu aktif relay | 30-50% |
| Adaptive Power Control | Sesuaikan TX power dengan jarak | 10-20% |
| Sleep Coordination | Koordinasi sleep antar node (TDMA) | 40-60% |
| Event-Driven Wake | Hanya bangun saat ada event sensor | 50-70% |
| Solar + Battery | Pasokan daya mandiri | Unlimited runtime |
Optimasi Kapasitas Jaringan
| Teknik | Penjelasan | Impact |
|---|---|---|
| Multi-Channel | Gunakan frekuensi berbeda untuk uplink/downlink | 2x throughput |
| Aggregasi Data | Kumpulkan data dari beberapa node, kirim sekaligus | Kurangi packet overhead |
| Data Compression | Kompres payload sebelum dikirim | 30-50% kurangi size |
| Selective Forwarding | Filter data duplikat di relay | Kurangi redundancy |
| Load Balancing | Distribusi traffic ke beberapa jalur | Hindari bottleneck |
8. Deployment di Lapangan
Langkah Persiapan Deployment
- Survey Lokasi: Petakan area, identifikasi titik-titik potensial untuk node, ukur jarak antar titik
- Simulasi Coverage: Gunakan tools seperti Radio Mobile atau CloudRF untuk simulasi coverage
- Penentuan Jumlah Node: Hitung kebutuhan node berdasarkan jarak, obstacle, dan density
- Hardware Selection: Pilih perangkat sesuai kebutuhan (indoor/outdoor, solar/battery)
- Prototyping: Uji skala kecil (5-10 node) sebelum full deployment
- Installasi: Pasang node dengan mounting yang kokoh, antenna yang tepat
- Testing & Commissioning: Uji semua jalur komunikasi, verifikasi data sampai ke server
- Monitoring Setup: Pasang sistem monitoring untuk alert jika node mati
Pertimbangan Hardware untuk Deployment
| Komponen | Indoor | Outdoor |
|---|---|---|
| Casing | Plastic project box | IP67 weatherproof enclosure |
| Antenna | PCB antenna / whip | External omni 5-8 dBi + lightning arrestor |
| Power | USB adapter | Solar panel + LiPo battery + charge controller |
| MCU | Heltec WiFi LoRa 32 | RAK WisBlock + IP67 enclosure |
| Mounting | Dinding / rak | Tiang / tower / pohon |
| Kabel | USB 5V | LMR-400 coaxial (low loss) |
Di daerah tropis Indonesia, pertimbangkan: tahan air dan kelembaban (gunakan IP67), tahan panas (ventilasi atau heat sink), anti petir (lightning arrestor untuk outdoor), anti rayap (jangan gunakan casing kayu), dan solar panel untuk area tanpa listrik.
9. Kasus Penggunaan LoRa Mesh
1. Monitoring Pertanian Terpencil
Di lahan pertanian yang luas tanpa infrastruktur internet, LoRa Mesh memungkinkan sensor tanah, kelembaban, dan cuaca saling berkomunikasi hingga ke posko utama melalui relay antar sensor.
2. Disaster Recovery Communication
Saat bencana alam (gempa, tsunami) dan infrastruktur komunikasi rusak, LoRa Mesh bisa menjadi jaringan komunikasi darurat yang cepat didirikan. Setiap node tidak memerlu koneksi internet.
3. Smart Forest / Anti-Illegal Logging
Sensor suara (chainsaw detection) dan sensor asap yang tersebar di hutan dapat membentuk mesh network untuk melaporkan aktivitas illegal logging atau kebakaran hutan ke pos jaga terdekat.
4. Mining & Pertambangan
Area tambang yang luas dan terpencil membutuhkan monitoring keselamatan (gas, longsor, suhu). LoRa Mesh memberikan coverage tanpa perlu infrastruktur cellular yang mahal.
5. Maritime / Nelayan
Di kepulauan Indonesia, nelayan di pulau kecil bisa saling berkomunikasi dan melaporkan posisi tangkapan menggunakan LoRa Mesh tanpa perlu BTS cellular.
10. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang LoRa Mesh Networking: