Contents
[hide]WS Oracul implementace ❖
Návod jak posílat zprávy z Artemis serveru pře Oracul WS server na aplikaci OnePro
Oracul je WebSocketový notifikační server, který doručuje notifikace aplikacím/zařízení, které jsou připojené, registrované a aktivně poslouchají. Sestává se ze dvou částí. WS serveru, který odesílá notifikace připojeným klientům a klasického http serveru, který příjmá notifikace pro klienty.
implementace[edit]
post[edit]
public key[edit]
Pro generování tokenu obdržíte PRIVATE_KEY philips
url[edit]
Požadavek se zasílá na adresu
POST https://oracul.artemisonepro.eu:8443/oracul/transfer?id=SERIAL
SERIAL = je seriové číslo připojeného zařízení. Shoduje se se seriovým číslem, se kterým se OnePro připojuje na Artemis server.
header[edit]
Z důvodu zabezpečení se do hlavičky se musí umístit tyto záznamy
- Content-Type: application/json
- Authorization: Bearer TOKEN
- Identification: Client philips
TOKEN = vygenerovaný token
token[edit]
- Vygeneruje se aktuální UTC timestamp v ms.
- Pomocí přiděleného PRIVATE_KEY se zakóduje do binární podoby
- Binární data se převedou na BASE64 hash
- Vygenerovaný HASH se použije jako TOKEN v hlavičce požadavku
- Do hlavičky se umístí také přidělěná identifikace Client
- Identifikace slouží k výběru správného páru PRIVATE/PUBLIC KEY
data[edit]
Data potřebná k doručení na OnePro se umístí klasicky do body požadavku
{"action":"speed_test"}
Na straně OnePro klienta jsou akceptovaná pouze data shodná stávající pro RestApi volání api/devices/requested_actions
response[edit]
Jako response se ze serveru vrací plain/text, který informuje o úspěšnosti dodání dat. A také se vrací příslušný status
Success[edit]
Zpráva byla doručena na OnePro
- status - 200
- message - Message was successfully transferred.
V případě, že zpráva byla přijata na WS server ale OnePro není připojené
- status - 200
- message - Target device is not connected. Message stays undelivered.
Failure[edit]
V případě že nebyl nalezen Bearer záznam v hlavičce
- status - 401
- message - No Bearer in Header was found!
V případě že nebyl nalezeny TOKEN data v hlavičce
- status - 401
- message - Unauthorized access to the server! SecurityException: No Authorization in Header was found!
V případě že nebyl nalezen Client záznam v hlavičce
- status - 401
- message - No Identification in Header was found!
V případě že nebyl nalezeny CLIENT data v hlavičce
- status - 401
- message - No Client in Header was found!
V případě že nebyl na serveru nalezený příslušný PUBLIC key k zaslanému klentovi
- status - 401
- message - Public key not found!
V případě že se nepovedla deriptizace na server
- status - 401
- message - Decryption failed failed!
V případě, že encryptovaná data neobsahovala LONG timestam value
- status - 401
- message - Data conversion failed!
V případě, že zaslaný timestamp je mimo povolený rozsah
- status - 401
- message - invalid token/diff: 6666
testování[edit]
Pro účely testování funguje PHP script na devel serveru. Tento script nepoužívá ověřování tokenem ale je dočasně povolen přístup přes IP adresu.
logování[edit]
nekorektní přihlášení[edit]
v případě že chybí klíčové údaje v hlavičce
[INFO ] cz.kobe.oracul.OraculEndPoint | ---[ OPEN ]-------------------------------------------------------------[ 0 ]--- [TRACE] cz.kobe.oracul.OraculEndPoint | [o] checkHash() [TRACE] cz.kobe.oracul.OraculEndPoint | [o] getProperties() [WARN ] cz.kobe.oracul.OraculEndPoint | getProperties - Properties not found: Authorization [TRACE] cz.kobe.oracul.OraculEndPoint | [o] getProperties() [WARN ] cz.kobe.oracul.OraculEndPoint | getProperties - Properties not found: Identification [TRACE] cz.kobe.oracul.Sentinel | [o] checkHeader() [WARN ] cz.kobe.oracul.OraculEndPoint | onOpen - No Authorization in Header was found! [INFO ] cz.kobe.oracul.OraculEndPoint | ---[ CLOSE ]--------------------------------------[ VIOLATED_POLICY ]---[ 0 ]--- [DEBUG] cz.kobe.oracul.Trapper | [o] unregister(0) [DEBUG] cz.kobe.oracul.Trapper | unregister - Session is not registered: 0
příklady[edit]
Příklad implementace volání pomocí programu curl v scriptu bash
Pozor, v příkladech je použit prinátní klíč test. Pro ostré nasazení se bude muset použít klíč philips
BASH[edit]
Privátní klíč je na disku uložen v souboru ../keys/test-private.pem
#!/bin/bash
# URL, na kterou se má požadavek poslat
URL="https://oracul.framexx.com:8443/oracul/transfer?id=APC390K24180011"
# Data, která se mají poslat v požadavku
DATA='{"action":"speed_test"}'
# Vytvoření TOKENU
timestamp=$(date +%s%3N)
echo "Timestamp: $timestamp"
echo -n "$timestamp" > /tmp/timestamp.txt
openssl rsautl -sign -inkey ../keys/test-private.pem -in /tmp/timestamp.txt -out /tmp/encrypted_timestamp.bin
TOKEN=$(base64 /tmp/encrypted_timestamp.bin)
TOKEN2=$(echo "$TOKEN" | tr -d '\n')
echo "TOKEN: $TOKEN2"
# Odeslání POST požadavku s JSON daty a vypsání odpovědi
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN2" \
-H "Identification: Client test" \
-d "$DATA" "$URL"