ENPLDEPT
Flash
Cała dokumentacja
Przystawki · EXT API

Przystawki i EXT API — sparuj bramę LoRaWAN, SDR albo inny odbiornik przez noda Sensmos

Przystawka to dowolne urządzenie albo program, który słyszy coś użytecznego, ale nie jest i nie będzie nodem Sensmos — brama LoRaWAN, SDR, odbiornik. Nie ma portfela ani atestacji. Node w tym samym LAN-ie za nią ręczy, a backend wydaje jej wąski, odwoływalny token.

Model zaufania

Dwie bariery, każda zamyka inne drzwi:

barieradowodzisprawdza
PIN nodajesteś fizycznie w sieci właścicielanode
grant backendunode istnieje, ma właściciela, ma wolny slotbackend

Trzy pytania są rozdzielone przy każdym żądaniu:

pytanieniesione przez
kim jesteśtoken (sma_…)
co możesz robićzakresy (wiersze na serwerze, nie bajty w tokenie)
jaki format wysyłaszURL

Token to 24 losowe bajty z prefiksem sma_ — niczego nie koduje. Uprawnienia żyją po stronie serwera i można je edytować albo odwołać bez ponownego wydawania czegokolwiek.

Parowanie — jak dostajesz token

Wszystko to dzieje się w LAN-ie, przez lokalny serwer HTTP noda (port 80). Potrzebujesz IP noda i jego PIN-u. (Żeby odkryć nody, odpytaj /info po całej podsieci — co odpowie, jest nodem.)

1 — sprawdź noda

GET http://<node-ip>/info
→ 200 { "device_id": "…", "firmware": "1.00", "ws_connected": true }

ws_connected musi być true — node przekazuje Twoje żądanie do backendu przez własne łącze.

2 — poproś o autoryzację

POST http://<node-ip>/ext/authorize
Authorization: Bearer <PIN>
{ "kind": "lora-gw", "name": "rooftop RAK", "scopes": "radio.frames,radio.spectrum" }

scopes to string rozdzielany przecinkami, nie tablica JSON. Odpowiedzi: 202 {"req":"<id>"} przekazane, odpytuj o odpowiedź · 403 zły PIN · 400 brak kind/scopes.

3 — odpytuj o grant

GET http://<node-ip>/ext/authorize?req=<id>
Authorization: Bearer <PIN>
→ { "status": "pending" }
→ { "status": "granted", "token": "sma_…", "id": "<attachment-id>", "exp": "<iso>" }
→ { "status": "denied",  "reason": "…" }

Odpytuj raz na sekundę; node trzyma odpowiedź przez około 5 minut. Przechowuj token z trybem 0600 — od tej chwili rozmawiasz z backendem bezpośrednio, a node jest poza pętlą.

Wydany, ale nieużyty token wygasa po 30 minutach. Jego pełny czas życia (30 dni, odnawialny) zaczyna się przy pierwszym użyciu. Jeden node ręczy za maksymalnie cztery przystawki; właściciel może odwołać każdą z nich z apki, co natychmiast unieważnia token.

Rozmowa z backendem

Bazowy URL https://sensmos.com/v1/ext, każde żądanie z Authorization: Bearer sma_….

wywołaniecel
GET /v1/ext/meczy nadal żyjesz, co możesz wysyłać, jakie integracje/formaty przyjmuje serwer (catalog) — wywołaj przy starcie
POST /v1/ext/renewprzedłuż ważność tokena; raz dziennie w zupełności wystarczy
POST /v1/ext/<integration>/<format>wyślij dane → 200 {"ok":true,"accepted":n}

Działające endpointy:

URLzakresbody
/v1/ext/radio/rxpkradio.framesJSON PUSH_DATA packet forwardera Semtech, bez zmian
/v1/ext/radio/framesradio.framesnatywny format ramki (poniżej)
/v1/ext/radio/channelradio.spectrumjeden odczyt widma (poniżej)

Formaty danych

rxpk — packet forwarder Semtech, jeden do jednego. Wyślij obiekt dokładnie tak, jak forwarder wyprodukował go w PUSH_DATA:

{ "rxpk": [ {
    "time": "2026-08-21T20:48:11Z",
    "freq": 867.3, "datr": "SF9BW125", "modu": "LORA",
    "rssi": -44, "lsnr": 12.0, "size": 38, "stat": 1,
    "data": "4FNNT1MgY2Nk…"
} ] }

datr jest parsowane tylko dla LoRa; modulacja pochodzi z modu. stat zgodnie z Semtech (1 CRC OK, -1 błąd, 0 brak). tmst jest ignorowane; bez time serwer stempluje czas odbioru.

frames — format natywny, dla przystawek pisanych pod nas (własny odbiornik, SDR, mostek Meshtastic):

{ "frames": [ {
    "ts": 1755808091, "freq": 867.3, "sf": 9, "mode": 0,
    "rssi": -44, "snr": 12.0, "len": 38, "crc": true,
    "hex": "e0534d4f53…", "dir": "rx"
} ] }

mode 0 LoRa / 1 FSK; sf 0 dla FSK; hex = payload PHY, zachowywane pierwsze 128 bajtów. dir: "tx" jest dla nadań Twojej bramy, które inni mogą usłyszeć (zwykłe downlinki z odwróconym IQ niczego nie dowodzą — pomiń je); dla tx rssi niesie moc TX.

channel — jeden odczyt widma:

{ "freq": 869.618, "bw": 62.5, "sf": 8, "sync": 18, "noise": -118, "peak": -97 }

freq wymagane, reszta domyślnie 0; noise/peak w dBm.

Limity i błędy

kodbodyznaczenie
401invalid_tokentoken nieznany, wygasły albo odwołany
403missing_scopetoken ważny, ale nie na ten endpoint
400komunikat parserabody nie pasuje do formatu
404unknown_endpoint + catalognie ma takiej integracji/formatu
413too_manyprzekroczony limit paczki — 200 ramek na żądanie

Grupuj po swojej stronie — raz na sekundę albo gdy uzbiera się 50 ramek, co nastąpi pierwsze. Payloady aplikacyjne pozostają zaszyfrowane end-to-end: serwer pracuje na metadanych radiowych i rozpoznaje ramki Sensmos w ruchu; nie ma kluczy do niczyich payloadów LoRaWAN i ich nie chce.

Co robią dane

Ramki lądują w tych samych tabelach i na tej samej mapie co ramki usłyszane przez własne radio noda — przystawka nie jest osobnym bytem, to lepsza antena dla noda, który za nią poręczył. Nadania awaryjne i ramki czujników Sensmos są rozpoznawane i dostarczane właścicielom; zweryfikowane beacony Sensmos budują krawędzie pokrycia radiowego między nodami; profil danych ręczącego noda zyskuje kategorię RF.

Gotowe przystawki: Brama LoRaWAN (pasywny nasłuch). Źródła obu agentów są na GitHubie.

Dodawanie nowego typu integracji

Strona serwerowa każdej integracji to jeden deklaratywny wpis w rejestrze (zakresy, formaty, parser, handler). Kandydaci w tym samym wzorcu, żaden jeszcze nie działa: widok nieba GNSS i zakłócenia (gnss.sky, celowo bez pozycji), podsumowania odbioru ADS-B i AIS per okno, rtl_433, liczniki energii. Jeśli masz sprzęt i chcesz, żeby jakiś format był przyjmowany, odezwij się na Discordzie — wpis formatu to mała, łatwa do przejrzenia zmiana.

Pytania i proste odpowiedzi

Jakie przystawki istnieją dziś?

Bramy LoRaWAN — pasywny nasłuch dla packet forwarderów Semtech (przetestowany, działa na obcych bramach) i agent dla ChirpStack Gateway Bridge przez MQTT (kompletny, ale nieprzetestowany — nie mamy takiej bramy do sprawdzenia). Oba raportują odebrane ramki radiowe; cała reszta tej strony to kontrakt, którego używają, otwarty dla każdego ze sprzętem.

Czy przystawki zarabiają?

Nie. Są tylko do danych; node, który za nie ręczy, jest jedyną zarabiającą tożsamością. To, co słyszą, jest dostarczane dokładnie tak jak ramki usłyszane przez własne radio noda.

Ile przystawek na noda?

Cztery. Właściciel widzi je i odwołuje w apce pod nodem.

Czy przystawka może coś zrobić w moim LAN-ie?

Parowanie odbywa się wyłącznie przez lokalne API noda z PIN-em noda, z wnętrza LAN-u. Backend nigdy nie sięga do LAN-u; token pozwala jedynie wysyłać dane do /v1/ext.

Aktualizacja: 2026-09-03