Di dalam satu rangkaian LoRaWAN (Long Range Wind Area Network) terdapat beberapa komponen yang penting
- Pintu Gerbang (Gateway) – berfungsi untuk menerima isyarat radio dari peralatan dan menghantar
- Jambatan (Bridge)
- Pelayan Rangkaian (Network Server)
- Pelayan Aplikasi (Application Server)
- Integrasi
Terdapat beberapa aplikasi pelayan rangkaian untuk LoRaWAN , antaranya yang popular ialah The Things Network, Helium dan Chirpstack. Kebanyakan aplikasi ini adalah dipasang di atas cloud server, tetapi untuk tujuan pembelajaran saya lebih berminat untuk memasang di local server.
Di sini saya kongsikan bagaimana untuk memasang satu rangkaian penuh LORAWAN menggunakan Chirpstack untuk kegunaan di pelayan tempatan (local server), menggunakan raspberry pi. Dalam konfigurasi ini, kita memasang semuanya dalam satu raspberry pi yang sama di satu local server.
Komponen yang saya gunakan di sini adalah
- Raspberry Pi 3b+
- RAK2245 Hat
- Maker Pi RP2040
- Grove LORA-E5
- Grove CO2, Temperature, Humidity Sensor
Langkah 1: Pasang gateway RAK 2245 pada raspberry pi
pasang RAK 2245 HAT pada raspberry pi 3b+/4, dan kemudian ikut arahan di sini , pilih model 1. RAK2245
kemudian laksanakan arahan berikut :
sudo gateway-config
Code language: Bash (bash)
pilih Setup RAK Gateway Channel Plan , kemudian pilih 2 Server is Chirpstack, 1 Chirpstack channel configuration dan pilih 1 AS923 (Untuk Asia)
Langkah 2: pasang Chirpstack
ikut sahaja arahan di sini , oleh kerana network server dan gateway dipasang pada raspberry pi yang sama, jadi kita boleh sahaja guna semua konfigurasi asal, tanpa perubahan. Setelah selesai, anda mungkin perlu membuat semula langkah konfigurasi sudo gateway-config di atas.
Langkah 3: Buka Browser dan buka Chirpstack dashboard
buka http://localhost:8080 dengan username admin password admin (perlu ditukar nanti)
sekiranya semua dibuat dengan betul, anda akan melihat RAK Gateway anda sudah dipasang, siap dengan kedudukannya yang diambil melalui bacaan GPS.
Langkah 4: Buat Device Profile
banyak konfigurasi boleh di cuba, tapi ini konfigurasi yang saya guna setelah beberapa kali percubaan : –
Tab General: seperti di atas
tab Join OTAA – tick device support OTAA
tab Class B & Class-C – abaikan buat masa ini
tab codec – masukkan javascript untuk decode data daripada peralatan, sebagai contoh di bawah (fungsi ini menukar data yang dihantar daripada base64 ke JSON, fungsi ni juga sebenarnya mudah , tapi sebab saya agak buta javascript, jadi mengambil masa juga untuk memahaminya, anda hanya perlu salin dan tampal:
function Decode(fport, obj) {
var warnings = [];
var errors = [];
var msg =""
var data = {};
for (var i = 0; i < obj.length; i++) {
msg += (String.fromCharCode(obj[i]));
}
data = JSON.parse(msg);
return data;
}
Code language: JavaScript (javascript)
Langkah 5: buat Application
pada tab keys (OTAA) – generate key, dan salin. kata kunci ini perlu untuk tujuan identifikasi pada kod yang akan diupload nanti
Langkah 6 : Hantar mesej daripada sensor node
Sekarang masanya untuk kita cuba. saya menggunakan CircuitPython dan Grove Lora-E5. kodnya di sini. Tampal key OTAA tadi di bahagian AT+KEY=APPKEY di bawah, skrip ini akan menghantar bacaan CO2, Temperature & Humidity:-
# Write your code here :-)
import board
import busio
import digitalio
import time
import supervisor
import json
import binascii
import math
import adafruit_scd30
from seeed_hm3301 import HM3301_I2C
#Set UART Pin
LCD_SDA = board.GP26
LCD_SCL = board.GP27
i2c = busio.I2C(scl=LCD_SCL, sda=LCD_SDA)
# i2c = board.I2C() # untuk seeeduino, tidak perlu definisi I2C
uart = busio.UART(board.GP0, board.GP1, baudrate=9600)
get_input = True
message_started = False
message_print = []
allstring = ""
printshow = False
def at_send_check_response(p_ack, timeout, p_cmd):
b = bytes(p_cmd, 'utf-8')
print(p_ack)
print(b)
uart.write(b)
# delay(200)
DELAY_DURATION = timeout
LAST_TIME = 0
now = time.monotonic()
condition = True
allstring=""
while condition:
byte_read = uart.readline()# read one line
if byte_read != None:
allstring += byte_read.decode()
printshow = True
else:
if printshow == True:
if allstring != "":
print(allstring)
allstring=""
printshow ==False
condition = time.monotonic() - now < timeout
return 0
at_send_check_response("AT",2,"AT")
at_send_check_response("AT",3,"AT+ID")
at_send_check_response("AT",3,"AT+ADR=?")
at_send_check_response("Set AT+MODE=LWOTAA",2,"AT+MODE=LWOTAA")
at_send_check_response("Set AT+DR=AS923",2,"AT+DR=AS923")
at_send_check_response("Set AT+APPKEY",2,"AT+KEY=APPKEY \"ca 39 92 57 ba 49 90 6d da 50 02 ad 9b 8b 98 ab\"")
at_send_check_response("Set AT+CLASS=A",2,"AT+CLASS=A")
at_send_check_response("Set AT+PORT=8",2,"AT+PORT=8")
at_send_check_response("Set AT+JOIN",10,"AT+JOIN")
while True:
scd = adafruit_scd30.SCD30(i2c)
hm3301 = HM3301_I2C(i2c, address=0x40)
if scd.temperature != None and hm3301.PM_2_5_conctrt_std != None: # Formatkan sekiranya ada bacaan sensor sahaja
#Formatkan kepada dua titik perpuluhan
PM25 = int(hm3301.PM_2_5_conctrt_std)
temperature = float("{:.1f}".format(scd.temperature))
relative_humidity = float("{:.1f}".format(scd.relative_humidity))
co2_ppm_level = float("{:.1f}".format(scd.CO2))
brokers_out={'C':co2_ppm_level,'T':temperature,'H':relative_humidity,'A':PM25}
print(brokers_out)
data_out=json.dumps(brokers_out)
send_string= "AT+CMSGHEX="+bytes(binascii.hexlify(data_out.encode('utf-8'))).decode()+""
at_send_check_response("Sending : "+send_string, 15, send_string)
time.sleep(15)
Code language: Python (python)
Langkah 7 : Nilai berjaya dibaca oleh Chirpstack Server di dalam raspberry pi
Kita dapat lihat data yang diterima dalam bentuk hex tadi, ditukar semula kepada json pada objectJSON.
Seterusnya, data ini boleh dihantar kepada aplikasi lain melalui MQTT dan HTTP, rujuk kiriman seterusnya.