Czy lpnGate to pierwszy prawdziwy gateway open-source IoT?

Gateway LoRaWAN do zastosowań w Przemysłowym Internecie Rzeczy

Początki

Pewien czas temu zmierzyliśmy się z projektem, który wymagał zastosowania bezprzewodowej komunikacji dalekiego zasięgu w celu pozyskania pewnych danych z odległych czujników. Dokonaliśmy badań rynku w poszukiwaniu rozwiązania, jednak sprzęt jaki nam zaoferowano okazał się zbyt drogi, a oprogramowanie nie spełniło naszych oczekiwań (ani naszego klienta). Chcieliśmy mieć większą kontrolę nad gatewayem, tak aby być w stanie dopasować jego funkcjonalność do oczekiwań naszego klienta. Chciał on posiadać możliwość integracji urządzenia ze swoim specjalistycznym panelem oraz bazą danych. Ponadto celem było, aby gateway był urządzeniem otwartym, do zastosowań ogólnych w otwartej publicznej sieci chmury, takiej jak The Things Network.

Co to jest lpnGate

Postanowiliśmy, że stworzymy nasze własne urządzenie, które sprosta tym wymaganiom. Zbudowane zostało w głównej mierze w oparciu o gotowe komponenty, jak np. sprawdzone i niezawodne APU2 (używane do tworzenia zaawansowanych routerów czy zapór sieciowych). Platforma korzysta z oprogramowania sprzętowego open-source (coreboot). System operacyjny oparty jest na dobrze znanym i stabilnym OSie dla routerów (OpenWRT), zmodyfikowanym aby sprostać naszym potrzebom.

Podzespoły

lpnGate składa się z następujących komponentów:

  • Platforma APU2 z oprogramowaniem sprzętowym coreboot
  • Karta RAK833 LoRa SX1301 gateway mPCIe
  • Dysk 16GB SSD mSATA

Oprogramowanie

Główne funkcje oprogramowania lpnGate:

  • OpenWRT zmodyfikowany przez LPN Plant
  • pierwsze opublikowane wydanie oparte o wersję 18.06.1 OpenWRT
  • dodano wsparcie dla podwójnego obrazu OS
  • dodano integrację z swupdate dla lepszego wsparcia aktualizacji na odległość
  • zawiera wsparcie dla RAK833
  • wsparcie sprzętowe dla watchdog
  • domyślnie zaprojektowany jako gateway dla The Things Network
  • podatny na modyfikacje
  • standardowy port RS232 jako port do debugowania
  • kontrybucje mile widziane!

Na początek

Gdzie mogę nabyć lpnGate?

lpnGate jest dostępny w naszym sklepie online: bezpośredni link

Możesz być także zbudowany przez użytkownika końcowego. Wszystkie potrzebne komponenty również są dostępne.

Szybki start

Kroki jakie musisz podjąć, aby zainstalować gateway i rozpocząć pracę są względnie proste. Możesz skorzystać z instrukcji dostępnej na naszej stronie.

Dostosowanie obrazu do potrzeb użytkownika

lpnGate jest podatny na modyfikacje. OpenWRT jest dostępny na naszej stronie github. Rozpocznijmy od zbudowania własnego obrazu.

Budowa obrazu

Wymagane narzędzia:

  • pewnego rodzaju distro Linuxa (testowanego na Arch Linux i Ubuntu)
  • docker
  • git

Pobranie kontenera deweloperskiego

Cała kompilacja jest przeprowadzana wewnątrz uruchomionego kontenera, aby zminimalizować różnice pomiędzy różnymi dystrybucjami Linuxa.

Wszystkie komendy powinny być wprowadzane w jakimś katalogu roboczym, np. /home/user/work

W pierwszej kolejności, musimy go wyciągnąć z huba dockera:

docker pull lpnplant/openwrt-docker

Możemy również zbudować go manualnie za pomocą Dockerfile z naszego repozytorium.

Będziemy potrzebowali następującego skryptu, aby uruchomić obraz:

git clone https://github.com/lpn-plant/openwrt_docker.git

Budowa

Najpierw sklonujmy repozytorium:

git clone https://github.com/lpn-plant/openwrt.git

Następnie uruchomimy kontener:

./openwrt_docker/scripts/run_docker.sh openwrt

Wewnątrz kontenera:

./scripts/feeds update luci
./scripts/feeds install luci
cp configs/apu_config .config
make oldconfig
make

Dane wyjściowe powinny wyglądać następująco:

make[1] world
make[2] toolchain/compile
make[2] package/cleanup
make[3] -C toolchain/binutils compile
make[3] -C toolchain/gdb compile
make[3] -C toolchain/fortify-headers compile
make[3] -C toolchain/yasm compile
make[3] -C toolchain/gcc/minimal compile
make[3] -C toolchain/kernel-headers compile
make[3] -C toolchain/glibc/headers compile
make[3] -C toolchain/gcc/initial compile
make[3] -C toolchain/glibc compile
make[3] -C toolchain/gcc/final compile
make[2] target/compile
make[3] -C target/linux compile
make[2] diffconfig
make[2] package/compile
make[3] -C package/libs/libubox host-compile
make[3] -C package/libs/ncurses host-compile
make[3] -C package/system/usign host-compile
make[3] -C package/system/fwtool host-compile
make[3] -C package/libs/toolchain compile
make[3] -C feeds/luci/modules/luci-base host-compile
make[3] -C package/boot/grub2 host-compile
make[3] -C package/utils/lua host-compile
make[3] -C package/kernel/leds-apu2 compile
make[3] -C package/utils/e2fsprogs host-compile
make[3] -C package/utils/zoneinfo compile
make[3] -C package/libs/libnl-tiny compile
make[3] -C package/libs/libjson-c compile
make[3] -C package/utils/lua compile
make[3] -C package/firmware/linux-firmware compile
make[3] -C package/firmware/prism54-firmware compile
make[3] -C package/libs/zlib compile
make[3] -C package/system/fwtool compile
make[3] -C package/system/openwrt-keyring compile
make[3] -C feeds/luci/protocols/luci-proto-ppp compile
make[3] -C feeds/luci/themes/luci-theme-bootstrap compile
make[3] -C package/libs/mbedtls compile
make[3] -C feeds/luci/protocols/luci-proto-ipv6 compile
make[3] -C package/libs/expat compile
make[3] -C package/libs/openssl compile
make[3] -C package/utils/bzip2 compile
make[3] -C package/libs/libconfig compile
make[3] -C package/libs/confuse compile
make[3] -C package/libs/libusb compile
make[3] -C package/lpn/config compile
make[3] -C package/lpn/get-serial compile
make[3] -C package/network/utils/curl compile
make[3] -C package/network/services/dropbear compile
make[3] -C package/utils/busybox compile
make[3] -C package/system/opkg host-compile
make[3] -C package/libs/libubox compile
make[3] -C package/kernel/linux compile
make[3] -C package/libs/ncurses compile
make[3] -C feeds/luci/libs/luci-lib-ip compile
make[3] -C feeds/luci/libs/luci-lib-jsonc compile
make[3] -C feeds/luci/libs/luci-lib-nixio compile
make[3] -C feeds/luci/contrib/package/lucihttp compile
make[3] -C package/libs/ustream-ssl compile
make[3] -C package/kernel/button-hotplug compile
make[3] -C package/libs/libftdi1 compile
make[3] -C package/libs/uclient compile
make[3] -C package/network/ipv6/odhcp6c compile
make[3] -C package/system/mtd compile
make[3] -C package/system/opkg compile
make[3] -C package/system/ubus compile
make[3] -C package/system/uci compile
make[3] -C package/utils/jsonfilter compile
make[3] -C package/system/usign compile
make[3] -C package/network/utils/iptables compile
make[3] -C package/network/utils/iwinfo compile
make[3] -C package/network/services/uhttpd compile
make[3] -C package/lpn/libmpsse compile
make[3] -C package/network/services/dnsmasq compile
make[3] -C package/network/services/odhcpd compile
make[3] -C package/system/ubox compile
make[3] -C package/network/config/netifd compile
make[3] -C package/system/rpcd compile
make[3] -C package/lpn/lora-gateway compile
make[3] -C package/system/procd compile
make[3] -C feeds/luci/modules/luci-base compile
make[3] -C feeds/luci/libs/rpcd-mod-rrdns compile
make[3] -C package/lpn/packet-forwarder compile
make[3] -C package/utils/util-linux compile
make[3] -C package/utils/bash compile
make[3] -C package/utils/xz compile
make[3] -C feeds/luci/modules/luci-mod-admin-full compile
make[3] -C package/network/config/firewall compile
make[3] -C feeds/luci/applications/luci-app-firewall compile
make[3] -C feeds/luci/collections/luci compile
make[3] -C package/boot/grub2 compile
make[3] -C package/system/fstools compile
make[3] -C package/utils/f2fs-tools compile
make[3] -C package/utils/e2fsprogs compile
make[3] -C package/base-files compile
make[3] -C package/libs/libarchive compile
make[3] -C package/lpn/swupdate compile
make[2] package/install
make[2] target/install
make[3] -C target/linux install
make[2] package/index
make[2] checksum

Po utworzeniu obrazy będą dostępne tutaj: bin/targets/x86/64-glibc.

Aktualizacja obrazu

Uwaga! Wgranie niewłaściwego obrazu może skutkować utratą funkcjonalności urządzenia i koniecznością jego ponownego flashowania.  Robisz to na własne ryzyko!

Istnieje kilka sposobów flashowania nowego obrazu. Najprostszym sposobem jest skorzystanie z internetowego panelu lpnGate:
luci_flash

Następnie możesz wgrać nowy obraz (wspierany format posiada zakończenie -combined-squashfs.img.gz). Użyj Flash new firmware image

flash_new

Możesz tutaj również zrobić backup i odzyskać domyślne ustawienia.

Operacja

lpnGate w swojej domyślnej postaci jest używany jako publiczny gateway chmury LoRa otwartej sieci The Things Network. Po dokonaniu rejestracji (opis znajduje się w instrukcji) możemy zobaczyć logi lora_pkt_fwd na stronie Status/System Logw panelu lpnGate.

Fri Jan 25 18:09:31 2019 daemon.info lora_pkt_fwd[3134]: JSON up: {"stat":{"time":"2019-01-25 17:09:31 GMT","rxnb":3,"rxok":3,"rxfw":3,"ackr":100.0,"dwnb":0,"txnb":0}}
Fri Jan 25 18:09:31 2019 daemon.info lora_pkt_fwd[3134]: INFO: [up] PUSH_ACK received in 68 ms
Fri Jan 25 18:09:33 2019 daemon.info lora_pkt_fwd[3134]:
Fri Jan 25 18:09:33 2019 daemon.info lora_pkt_fwd[3134]: INFO: Received pkt from mote: 2601186E (fcnt=34789)
Fri Jan 25 18:09:33 2019 daemon.info lora_pkt_fwd[3134]:
Fri Jan 25 18:09:33 2019 daemon.info lora_pkt_fwd[3134]: JSON up: {"rxpk":[{"tmst":1315826699,"chan":0,"rfch":1,"freq":868.100000,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","lsnr":9.2,"rssi":-22,"size":25,"data":"QG4YASYA5YcBmPuhiD8Am654loCN+8VJeg=="}]}
Fri Jan 25 18:09:33 2019 daemon.info lora_pkt_fwd[3134]: INFO: [up] PUSH_ACK received in 67 ms
Fri Jan 25 18:09:35 2019 daemon.info lora_pkt_fwd[3134]:
Fri Jan 25 18:09:35 2019 daemon.info lora_pkt_fwd[3134]: INFO: Disabling GPS mode for concentrator's counter...
Fri Jan 25 18:09:35 2019 daemon.info lora_pkt_fwd[3134]: INFO: host/sx1301 time offset=(1548434858s:66898µs) - drift=95µs
Fri Jan 25 18:09:35 2019 daemon.info lora_pkt_fwd[3134]: INFO: Enabling GPS mode for concentrator's counter.
Fri Jan 25 18:09:35 2019 daemon.info lora_pkt_fwd[3134]:
Fri Jan 25 18:09:39 2019 daemon.info lora_pkt_fwd[3134]: INFO: [down] PULL_ACK received in 70 ms
Fri Jan 25 18:09:42 2019 daemon.info lora_pkt_fwd[3134]:
Fri Jan 25 18:09:42 2019 daemon.info lora_pkt_fwd[3134]: INFO: Received pkt from mote: 2601186E (fcnt=34790)
Fri Jan 25 18:09:42 2019 daemon.info lora_pkt_fwd[3134]:
Fri Jan 25 18:09:42 2019 daemon.info lora_pkt_fwd[3134]: JSON up: {"rxpk":[{"tmst":1324781579,"chan":0,"rfch":1,"freq":868.100000,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","lsnr":9.0,"rssi":-22,"size":25,"data":"QG4YASYA5ocBVpEVYHS5v/HAcho9nsiOOg=="}]}
Fri Jan 25 18:09:42 2019 daemon.info lora_pkt_fwd[3134]: INFO: [up] PUSH_ACK received in 69 ms
Fri Jan 25 18:09:49 2019 daemon.info lora_pkt_fwd[3134]: INFO: [down] PULL_ACK received in 67 ms
Fri Jan 25 18:09:51 2019 daemon.info lora_pkt_fwd[3134]:
Fri Jan 25 18:09:51 2019 daemon.info lora_pkt_fwd[3134]: INFO: Received pkt from mote: 2601186E (fcnt=34791)
Fri Jan 25 18:09:51 2019 daemon.info lora_pkt_fwd[3134]:
Fri Jan 25 18:09:51 2019 daemon.info lora_pkt_fwd[3134]: JSON up: {"rxpk":[{"tmst":1332941683,"chan":0,"rfch":1,"freq":868.100000,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","lsnr":9.2,"rssi":-22,"size":25,"data":"QG4YASYA54cBSiqaMhX0lcPxyB2jV+uqlg=="}]}
Fri Jan 25 18:09:51 2019 daemon.info lora_pkt_fwd[3134]: INFO: [up] PUSH_ACK received in 67 ms
Fri Jan 25 18:09:59 2019 daemon.info lora_pkt_fwd[3134]:
Fri Jan 25 18:09:59 2019 daemon.info lora_pkt_fwd[3134]: INFO: Received pkt from mote: 2601186E (fcnt=34792)
Fri Jan 25 18:09:59 2019 daemon.info lora_pkt_fwd[3134]:
Fri Jan 25 18:09:59 2019 daemon.info lora_pkt_fwd[3134]: JSON up: {"rxpk":[{"tmst":1341602027,"chan":0,"rfch":1,"freq":868.100000,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","lsnr":10.0,"rssi":-24,"size":25,"data":"QG4YASYA6IcBgXnUUi8vHECHtddlOW69RQ=="}]}
Fri Jan 25 18:09:59 2019 daemon.info lora_pkt_fwd[3134]: INFO: [up] PUSH_ACK received in 67 ms
Fri Jan 25 18:10:00 2019 daemon.info lora_pkt_fwd[3134]: INFO: [down] PULL_ACK received in 66 ms
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]:
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: ##### 2019-01-25 17:10:01 GMT #####
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: ### [UPSTREAM] ###
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # RF packets received by concentrator: 4
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # CRC_OK: 100.00%, CRC_FAIL: 0.00%, NO_CRC: 0.00%
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # RF packets forwarded: 4 (100 bytes)
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # PUSH_DATA datagrams sent: 5 (954 bytes)
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # PUSH_DATA acknowledged: 100.00%
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: ### [DOWNSTREAM] ###
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # PULL_DATA sent: 3 (100.00% acknowledged)
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # PULL_RESP(onse) datagrams received: 0 (0 bytes)
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # RF packets sent to concentrator: 0 (0 bytes)
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # TX errors: 0
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # BEACON queued: 0
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # BEACON sent so far: 0
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # BEACON rejected: 0
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: ### [JIT] ###
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # SX1301 time (PPS): 1317812326
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: src/jitqueue.c:471:jit_print_queue(): INFO: [jit] queue is empty
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: ### [GPS] ###
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: # GPS sync is disabled
Fri Jan 25 18:10:01 2019 daemon.info lora_pkt_fwd[3134]: ##### END #####

W powyższym logu widać, że gateway otrzymał 4 wiadomości z adresu 2601186E. Dane kodowane są w standardzie base64 i są zaszyfrowane. Gateway jedynie przekazuje dane do serwera chmury, sam nie ma do nich dostępu.

Inne możliwe zastosowania

lpnGate jest bramką do zastosowań ogólnych, co oznacza, że może również służyć jako zaawansowany router bądź firewall. Posiada pełną funkcjonalność systemu operacyjnego OpenWRT, co umożliwia instalację pakietów oraz konfigurację interfejsów sieci. Po zainstalowaniu dodatkowej karty mPCIe WiFi (jak np. tej dostępnej w naszym sklepie, możesz również uzyskać punkt dostępu WiFi. Na ten moment (wersja 18.06.1.1), będzie potrzebny zmodyfikowany system ze sterownikami, jednak w przyszłości, wraz z kolejną wersją, powinno zostać dodane wsparcie oficjalnej wersji oprogramowania.

Podsumowanie

lpnGate to bardzo wszechstronne urządzenie. Został zaprojektowany jako zaawansowany gateway IoT LoRa, który jest podatny na modyfikacje przez społeczność. Może być również użyty jako router, firewall, a nawet jako mały serwer ogólnego przeznaczenia.  

W LPN Plant łączymy usługi z zakresu konsultacji, technicznej ekspertyzy oraz efektywności finansowej, aby projektować i wdrażać rozwiązania sieci bezprzewodowych małej mocy dla przedsiębiorstw. Jeżeli poszukujesz programistów dla produktów LoRaWAN, albo jedynie potrzebujesz wsparcia w określonym obszarze Twojego systemu, umów się na spotkanie z naszym ekspertem przez calendly. Jeżeli jesteś zainteresowany tematyką LoRaWAN, zapisz się do naszego newslettera i dziel się treściami na mediach społecznościowych.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *