*** Disclaimer : LoRa dan LoRawan merupakan hak intelektual daripada semtech dan harus dihormati sesuai UU Hak cipta. Semua yang dibahas disini merupakan percobaan terbatas untuk pembuktian konsep Software Defined Radio vs LoRa. Tidak ada keinginan penulis untuk mengkomersialkan segala praktek pada tulisan ini ***
Sebelumnya penulis ingin berbagi pengalaman saat pertama kalinya mengenal gateway lora ke internet, jauh sebelum Lorawan Antares telkom diluncurkan ( yang saya pernah bahas disini). Mahasiswa dari bandung meminta saya untuk membantunya melakukan setting gateway LoRa bernama DRAGINO. Terkejutnya saya saat mengetahui harga dari hardware berbentuk seperti router wifi ini. Coba cek harga di tahun 2024 deh..
Jadi saya sangat bersyukur saat Telkom Antares meluncurkan gateway nya berbasis LoRaWan di 2021 dan tersebar di berbagai lokasi di seluruh Indonesia. Namun permasalahannya adalah sedikitnya pembahasan teknis di Internet maupun Youtube sehingga beberapa mahasiswa yg ingin skripsi LoraWan "kesasar" ke blog ini, bahkan banyak yg WA saya. Library arduino yg bberhubungan dengan LoRaWan kurang tutorial bahkan kalau dipakai banyak errornya, dan menjadi faktor kenapa youtube saya disini banyak yg komentar dan ujungnya berkonsultasi menggunakan library oprekan yang bisa dibaca disini.
Dan kemudian saya menulis juga berbagai faktor yang menyebabkan kenapa lorawan antares gak bisa terhubung dengan modul lora kamu (baca disini ), salah satunya adalah jarak yang jauh dengan BTS LoRaWan Antares (yg biasanya di tower pada kantor STO Milik Telkom) . Ingat LoRaWan di Indonesia menggunakan band frekuensi AS 923-2 sehingga jangkauannya agak lebih pendek dibandingkan jangkauan LoRa 433 Mhz.
Lalu solusi jika gateway IOT nya susah bagaimana ? Memang bisa memanfaatkan LoRa ke-2 yang dihubungkan ke wifi, namun saya berpikir kenapa tidak memanfaatkan Software Define Radio , dengan dongle usb rtl-sdr yang super murah untuk mendecode sinyal LoRa (baca disini dulu). Ayo kita coba ..
Langkah pertama setelah puas mendengarkan cuap-cuap satpam gedung mall dengan dongle ini + software sdr#, adalah pindah ke PC berbasis Linux, pilihan saya distro Ubuntu, lalu menginstall Gnu-Radio yang dapat dibaca
disini. Gnu Radio bukanlah software siap pakai namun harus di "coding" dengan mudah melalui gnu-radio companion seperti praktek saya mengenai cara mendengarkan Siaran FM di gnu-radio (baca
disini).
Untuk dapat menghubungkan Gnu Radio dengan LoRa maka kita bisa membaca beberapa tulisan dari Pieter Robyns, Peter Quax, Wim Lamotte dan William Thenaers yang membuat library gr-lora namun kurang berhasil di layer aplikasinya. Sehingga saya menemukan library gr-lora_sdr yang diklaim sukses membuat decoding LoRa secara fungsional. Silahkan baca disini :
https://github.com/tapparelj/gr-lora_sdr.
Blok diatas merupakan blok lengkap dari LoRa receiver yang akan muncul jika instalasi gr-lora_sdr sukses dilakukan. Lakukan penyesuaian pada blok ini yang harus sesuai dengan script yang akan digunakan pada Arduino + pengirim lora yang dipakai. Rangkaian pengirim data nya seperti ini :
Sedangkan untuk pengiriman datanya melalui modul LoRa SX1276 saya gunakan sensor DHT11 sebagai pembaca data suhu dan kelembaban. Scriptnya sebagai berikut :
#include <SPI.h>
#include <LoRa.h>
//Library standar LoRa
#include <DHT.h>
int counter = 0;
//Sesuaikan PIN CS, Reset, DIO0
const int csPin = 10;
const int resetPin = 9;
const int irqPin = 2;
const int dhtPin = 3;
//Sesuaikan pin DHT
#define DHTTYPE DHT11
//Sensor DHT11
DHT dht(dhtPin, DHTTYPE);
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("LoRa DHT 11 - www.aisi555.com);
if (!LoRa.begin(
922E6
))
{
//sesuaikan frekuensi LoRa yg dipakai
Serial.println("Starting LoRa failed!");
while (1);
}
dht.begin();
delay(5000);
}
String SendTempHumid(){
//function pengukuran DHT
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
}
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" °C ");
//yang dikirim data berupa string JSON
return( "{\"counter\":" + String(counter) + ",\"suhu\":" + String(t) + ",\"humi\":" + String(h,0) +"}");
}
void loop() {
//baca terus menerus
String paket = SendTempHumid();
Serial.print("Sending packet: ");
Serial.println(paket);
// send packet
LoRa.beginPacket(true);
LoRa.print(paket);
LoRa.endPacket();
counter++;
delay(10000);
//sesuaikan delay
pengiriman
}
Jika setting benar pada flow gnu radio, sesuai contoh pada library nya gr-lora_sdr, maka pesan yang muncul pada output Gnu-Radio seperti ini :
Selanjutnya saya menggunakan parsing data melalui python, yang saya kombinasikan dengan pengiriman data via TCP lokal (gunakan TCP sink di GnuRadio) serta untuk pengiriman data ke Internet saya gunakan modul python paho-mqtt. Script nya kira kira begini :
import json
import socket
import paho.mqtt.client as mqtt
from time import sleep
from random import randrange
#local tcp for gr-lora_sdr bridge
HOST = "127.0.0.1"
# Standard loopback interface address (localhost)
PORT = 12345 #
Port tcp
# Inisialisasi broker mqtt gratis sejuta umat
broker_address="broker.hivemq.com"
broker_port=1883
def on_publish(client,userdata,result):
#create function for callback
print("send data to broker")
pass
client= mqtt.Client(f'aisi555-client-{randrange(0,100)}')
#clientn must random
client.on_publish = on_publish
#assign function to callback
client.connect(broker_address,broker_port)
#function untuk parsing data tidak berguna, thanks to chatGpt
def jason(byte_stream):
# Find the index of the first occurrence of {
start_index = byte_stream.find(b'{')
if start_index != -1:
# Find the index of the first occurrence of } after the first {
end_index = byte_stream.find(b'}', start_index) + 1
# Extract the JSON object from the byte stream
json_object_bytes = byte_stream[start_index:end_index ]
# Decode the JSON object to UTF-8
try:
json_object_str = json_object_bytes.decode('utf-8')
print("Extracted JSON object:", json_object_str)
data = json.loads(json_object_str)
# Access the values using keys
counter = data['counter']
suhu = data['suhu']
humi = data['humi']
print("Counter:", counter)
print("Suhu:", suhu)
print("Humi:", humi)
#publish ke mqtt topics
client.publish("/gr-lora/counter",counter)
client.publish("/gr-lora/suhu",suhu)
client.publish("/gr-lora/humi",humi)
except UnicodeDecodeError as e:
print("Error decoding UTF-8:", e)
else:
print("No JSON object found in the byte stream.")
# function untuk socket TCP
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
with conn:
print(f"Connected by {addr}")
while True:
data = conn.recv(1024)
jason(data)
if not data:
break
Dan hasilnya bisa terkirim data Suhu via LoRa-MQTT ke smartphone saya.
Sumber :
J. Tapparel, O. Afisiadis, P. Mayoraz, A. Balatsoukas-Stimming, and A. Burg, “An Open-Source LoRa Physical Layer Prototype on GNU Radio”
https://arxiv.org/abs/2002.08208
Jika tulisan ini menginspirasi dan menjadi publikasi resmi, selayaknya paper diatas dapat dijadikan "kutipan" atau citation.