Thanapon Tapala

Backend Developer

Embedded Developer

Smart Farmer

Maker

Thanapon Tapala

Backend Developer

Embedded Developer

Smart Farmer

Maker

Blog Post

[LoRa] สร้าง Private LoRaWAN ด้วย LoRa Server Project บน Raspberry Pi 3

July 4, 2019 Arduino, LoRa, RaspberryPi
[LoRa] สร้าง Private LoRaWAN ด้วย LoRa Server Project บน Raspberry Pi 3

หลังจากที่คราวก่อนผมได้เขียนบทความเกี่ยวกับการ สร้าง Single Channel Packet Forwarding บน Raspberry Pi 3 ต่อกับ RFM95w โดย Packet forwarding นี้จะทำการ forward ข้อมูลไปยัง The Things Network ซึ่งปัญหาก็คือเราต้องเชื่อมต่อเข้ากับ Internet ด้วยถ้าหากไม่มี Internet หล่ะหรือบางคนอยากจะทำ LoRaWAN ขึ้นมาเพื่อใช้เองหล่ะ

แล้วทีนี้เราจะทำยังไง ?

หลังจากที่พยายามค้นหาวิธีการทำ Private LoRaWAN อยู่ก็ได้ไปเจอ LoRa Server Project ซึ่งคิดว่ามันเจ๋งมากเพราะเป็นโปรเจค open-source ซึ่งถือว่าครบครันเลยที่เราจะใช้สร้าง Private LoRaWAN ไม่ว่าจะเป็น LoRa Gateway, LoRa Server และ LoRa App Server โดยเราสามารถทำมาใช้สร้างระบบ IoT [Internet of Things] ได้เลยครับ

What is LoRa Server Project

LoRa Server Project คือ ชุด open-source ที่ใช้ในการสร้าง LoRaWAN Network โดยภายในประกอบไปด้วย LoRa Gateway Bridge, LoRa Network Server, LoRa Application Server, LoRa Geo Server, LoRa Gateway OS.

  • LoRa Gateway Bridge คือส่วนที่รับข้อมูลมาจาก packet forwarding ซึ่งเราจำเป็นต้องมี LoRa Packet forwarding ก่อนนะครับ
  • LoRa Network Server คือส่วนที่ทำหน้าที่จัดการกับ Packet ที่ได้รับจาก LoRa Gateway Bridge
  • LoRa Application Server คือส่วนที่นำข้อมูลไปประยุกต์ใช้ต่างๆ ไม่ว่าจะเป็นการให้บริการ API สำหรับเชื่อมต่อกับ application ภายนอก, การจัดการ Application Gateway หรือ End-Device ซึ่งเราสามารถใช้ Web interface ในการควบคุม LoRaWAN Network เหมือนกับ The Things Network
  • LoRa Geo Server เป็นระบบ Geolocation ซึ่งสามารถใช้ในการหาตำแหน่งของอุปกรณ์โดยใช้หลักการของ Time-difference of arrival
  • LoRa Gateway OS คือ Linux embedded OS โดยรวม package ต่างๆที่จำเป็นสำหรับใช้ในการสร้าง LoRaWAN อยู่ในตัว
Image for post

การทำงานของ LoRa Server Project จะทำหน้าที่รับข้อมูลจาก LoRa Gateway/Packet Forwarding แล้วส่งข้อมูลต่อไปยัง LoRa Gateway Bridge หลังจากนั้น LoRa Gateway Bridge ก็จะทำการ forward packet ไปยัง LoRa Server โดยผ่าน MQTT Protocol ซึ่งในส่วน LoRa Server จะทำการจัดการกับ Packet ที่ได้รับมา ยกตัวอย่างเช่นหากเรามี Packet ที่ซ้ำกันโดย Packet นี้ถูกส่งมาจาก Gateway หลายๆตัวที่อยู่ใกล้ๆกัน LoRa Server จะทำการคัดเลือก Packet แล้วจากนั้นก็ส่ง Packetต่อไปยัง LoRa App Server เพื่อนำข้อมูลไปใช้งานครับ

เริ่มต้นสร้าง Private LoRaWAN กัน

หลังจากที่ผมได้อธิบาย concept คราวๆของ LoRa Server Project แล้วหวังว่าผู้อ่านทุกท่านคงจะเข้าใจนะครับ จุดประสงค์หลักของบทความนี้คือ ผมอยากจะสร้าง Private LoRaWAN Netword เพื่อใช้ในระบบ IoT แต่ก่อนอื่นทุกท่านต้องทำการติดตั้ง packet forwarding ก่อนนะครับ ตามนี้เลยครับ [LoRa] สร้าง single channel gateway [TTN] ด้วย Raspberry Pi + RFM95w เพราะเราจำเป็นต้องใช้ Packet forwarding ในการ route LoRa Packet มายัง LoRa Gateway Bridge ครับ

Install LoRa Gateway Bridge

  • ก่อนติดตั้ง LoRa Gateway Bridge เราจำเป็นต้องติดตั้ง MQTT Broker เพราะโครงสร้างของ LoRa Server Project นั้น LoRa Gateway Bridge จะใช้ MQTT เป็นตัวเชื่อมต่อ packet ระหว่าง LoRa Gateway Bridge และ LoRa Server ครับซึ่งทาง LoRa Server Project ก็ได้แนะนำให้ติดตั้ง Mosquitto ซึ่งเป็น open-source MQTT Broker โดยเราสามารถติดตั้งผ่าน CLI ตามข้างล่างนี้ได้เลยครับ
sudo apt-get install mosquitto
  • หลังจากนั้นให้เพิ่ม Package Repository สำหรับดาวน์โหลด LoRa Server Project
sudo echo "deb https://artifacts.loraserver.io/packages/3.x/deb stable main" | sudo tee /etc/apt/sources.list.d/loraserver.list
sudo apt-get update
  • แล้วทำการติตตั้ง LoRa Gateway Bridge
sudo apt-get install lora-gateway-bridge
Image for post
  • หลังจากที่ติดตั้งเสร็จแล้ว ค่า default ของ LoRa Gateway Bridge จะทำการ binding กับ IP Address เป็น 0.0.0.0 Port 1700 นะครับส่วน MQTT Broker นั้นจะเป็น tcp://127.0.0.1:1883 ครับซึ่งเราสามารถเข้าไปแก้ไขการตั้งค่าต่างได้ในไฟล์ /etc/lora-gateway-bridge/lora-gateway-bridge.toml
    [See more detail]
  • เมื่อตั้งต่าเสร็จแล้วขั้นตอนต่อไปทำการเปลี่ยนเส้นทางการ forward packet ของ Single Channel Gateway จากบทความก่อนหน้านี้โดยทำการชี้ Server ที่เราจะส่ง packet ไปจากบทความก่อนจะส่งไปยัง The Things Network ให้เราเปลี่ยนมาเป็นส่งเข้าไปยัง Localhost แทน โดยเราจะเข้าไปแก้ไขไฟล์ global_conf.json ซึ่งจะอยู่ใน directory single_chan_pkt_fwd ครับ
{
  "SX127x_conf":
  {
    "freq": 923200000,
    "spread_factor": 7,
    "pin_nss": 10,
    "pin_dio0": 24,
    "pin_rst": 0,
    "pin_led1":5
  },
  "gateway_conf":
  {
    "ref_latitude": 0.0,
    "ref_longitude": 0.0,
    "ref_altitude": 10,

    "name": "SC Gateway",
    "email": "[email protected]",
    "desc": "Single Channel Gateway on RPI",

    "servers":
    [
      {
        "address": "127.0.0.1",
        "port": 1700,
        "enabled": true
      },
      {
        "address": "router.eu.staging.thethings.network",
        "port": 1700,
        "enabled": false
      }
    ]
  }
}
  • หลังจากแก้ไขไฟล์ global_conf.json เสร็จแล้วให้ทำการ compile หลังจากนั้นก็ทำการรัน single_chan_pkt_fwd
make
make install
systemctl start single_chann_pkt_fwd

Install LoRa Server

  • ก่อนทำการติดตั้ง LoRa Server เราต้องติดตั้ง dependencies สำหรับการใช้งาน LoRa Server ก่อน ซึ่งจะมี MQTT Broker, PostgreSQL database และ Redis database โดยก่อนหน้าเราได้ติดตั้ง MQTT Broker แล้วซึ่งก็ไม่ต้องติดตั้งอีกนะครับ
sudo apt-get install postgresql
sudo apt-get install redis-server

  • ทำการสร้าง database สำหรับ LoRaServer ซึ่งในที่นี้เราจะใช้ PostgreSQL
sudo -u postgres psql
create role loraserver_ns with login password 'dbpassword';
create database loraserver_ns with owner loraserver_ns;

  • หลังจากนั้นทำการทดสอบการเชื่อมต่อ PostgreSQL โดยใช้ Password คือ dbpassword
psql -h localhost -U loraserver_ns -W loraserver_ns
Image for post
  • เมื่อเชื่อมต่อกับ Database สำเร็จแล้วต่อไปเราก็ทำการติดตั้ง LoRa Server โดยสามารถดาวน์โหลดได้จาก Repository ได้เลย
sudo apt-get install loraserver
Image for post
  • หลังจากติดตั้ง LoRa Server เสร็จแล้วเราสร้างไฟล์ configuration สำหรับตั้งค่าการทำงานของ LoRa Server โดยสามารถดาวน์โหลด loraserver.toml ซึ่งผมได้แก้ไข parameter ใน postgresql และ LoRaWAN regional band configuration เรียบร้อยแล้วสามารถนำไปใช้ได้เลยครับ
loraserver configfile > loraserver.toml
nano loraserver.toml
Image for post
Image for post
  • หลังจากแก้ไขแล้วให้ทำการ save ไฟล์ loraserver.toml แล้วทำการ copy ไปยัง /etc/loraserver/loraserver.toml
cp loraserver.toml /etc/loraserver/
  • เมื่อติดตั้งเสร็จแล้วให้ทำการทดสอบการทำงานของ LoRa Server โดยใช้คำสั่ง
loraserver
Image for post

เป็นอันเสร็จสิ้นสำหรับการติดตั้ง LoRa Server ขั้นตอนต่อไปติดตั้ง LoRa App Server เพื่อใช้ในการจัดการ LoRa Server Project กันครับ

Install LoRa App Server

[ติดตั้ง Web UIเพื่อควบคุม LoRa Server Project]

  • เริ่มต้นให้ทำการสร้าง user และ database สำหรับ PostgreSQL
sudo -u postgres psql
create role loraserver_as with login password 'dbpassword';
create database loraserver_as with owner loraserver_as;
  • หลังจากนั้นทำการตั้งค่า PostgreSQL เพื่อทำการ enable pq_trgm extension สำหรับ database: loraserver_as ที่เราสร้างในขั้นตอนก่อนหน้านี้
\c loraserver_as
create extension pg_trgm;
\q
  • จากนั้นทดลอง เชื่อมต่อเข้ากับ PostgreSQL ผ่าน CLI โดยใช้ password: dbpassword
psql -h localhost -U loraserver_as -W loraserver_as
Image for post
  • ติดตั้ง LoRA App Server ด้วยคำสั่ง
sudo apt-get install lora-app-server
  • จากนั้นให้สร้างไฟล์ configuration สำหรับตั้งค่า LoRa App Server ซึ่งเราสามารถใช้คำสั่งเพื่อ generate configuration file โดย parameter ที่ได้จะเป็นค่า default โดยผมได้แก้ไขไฟล์ lora-app-server.toml ให้แล้ว สามารถดาวน์โหลดมาได้เลยครับ
 lora-app-server configfile > lora-app-server.toml
Image for post
  • หลังจากที่ได้ไฟล์มาแล้วเราจำเป็นต้องทำการ generate JWT secret เพื่อใช้ในการ authentication สำหรับเชื่อมต่อ API กับ LoRa Server
openssl rand -base64 32
Image for post
  • ให้เพิ่ม jwt_secret ในไฟล์ lora-app-server.toml
Image for post
  • เสร็จแล้วทำการ save ไฟล์ lora-app-server.toml แล้วทำการ copy ไปไปยัง /etc/lora-app-server/lora-app-server.toml
cp lora-app-server.toml /etc/lora-app-server/
  • ทดสอบการทำงานของ Lora app server กันครับว่าจะใช้ได้ไหม??
lora-app-server
Image for post

*** เราสามารถเข้าไปแก้ไข configuration ได้ที่ /etc/lora-app-server/lora-app-server.toml โดยค่า default ของ Web Interface สำหรับการตั้งค่า LoRa App Server สามารถเข้าผ่าน
http://ip-address-RPI:8080 ซึ่งusername: admin, password: admin ส่วน REST API นั้นสามารถ access ผ่าน http://ip-address-RPI:8080/api ได้เลยครับ

*** pg_trgm คือ module ที่ใช้ในการจัดการกับข้อความตัวอักษรและตัวเลขโดยใช้ trigram matching ยกตัวอย่างเช่น “cat” เราสามารถแบ่งได้เป็น “c”, “ca” และ “at” ซึ่งจะมีประโยชน์มากในการทำ search ครับ

เมื่อติดตั้งทุกอย่างเสร็จเรียบร้อยแล้วให้เรา restart Respberry Pi หลังจากนั้นให้เราเข้า Web interface ผ่าน Browser ดูครับ

LoRaServer With Web Interface

Image for post
Image for post
Image for post

เย้!!!! ใช้งาน LoRa Server Project ได้แล้วส่วนเรื่องการ config ของ LoRaServer ผมขอไปเขียนเพิ่มอีกหนึ่งบทความละกันครับเพราะดูแล้วน่าจะยาวถ้าเขียนรวมกับบทความนี้ สำหรับวันนี้ขอบคุณทุกท่านที่ติดตามครับ หากติดปัญหาหรือผิดพลาดประการใดขออภัยด้วยครับ

Taggs: