From kobe
Jump to: navigation, search

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"