Точки підключення протоколів
Перелік типів кінцевих точок підключення протоколів, які підтримуються EMQ, та є доступними для N2O програм: WebSockets, MQTT, MQTT-SN, TCP, UDP, CoAP. Нормальним є використання N2O у якості веб фреймворка або сервера веб додатків з передачею даних по WebSockets, але для IoT та MQTT програм можна використовувати UDP чи SCTP протоколи, для забезпечення консистентності доставки повідомлень на рівні програми. Використовуючи MQTT в якості транспорту ми розширюємо підтримуваний набір протоколів кінцевих точок підключення.
MQTT
EMQ — брокер MQTT з відкритим кодом, написаний Feng Lee. N2O — це сумісний з EMQ плагін, являє собою заздалегідь визначені клієнти MQTT, які у вигляді кільця віртуальних вузлів обробляють протокольні запити та відповідають на клієнтські топіки, відповідно до класичної схеми "RPC через MQ". Список модулів нижче утворює ядро N2O, яке є загальним для MQTT та WebSocket версій:
$ mad app mqtt review
$ cd review
$ mad dep com pla rep
$ open http://127.0.0.1:8000
WebSocket
COWBOY — невеликий, швидкий та сучасний HTTP сервер, написаний Loïc Hoguin. У цій версії цикл N2O інтегрований як WebSocket cowboy обробник, який пересилає всі вхідні повідомлення до N2O. Список модулів, специфічних для WebSocket версії:
- n2o_stream — COWBOY та XHR міст
- n2o_cowboy — COWBOY API
- n2o_ws — WebSocket DHT Virtual Node
$ mad app web sample
$ cd sample
$ mad dep com pla rep
$ open https://127.0.0.1:8001/app/index.htm
Протоколи
Сервіси
- n2o_session — бекенд ETS сесій
- n2o_secret — кодер/декодер AES/CBC-128
- n2o_syn — бекенд SYN MQ
JavaScript
Типова специфікація
-type n2o() :: #bert{} | #json{} | #binary{} | #default{}.
-type cx() :: #cx{}.
-type formatter() :: binary | json | bert | text | default | atom().
-type response() :: { formatter(), binary() }.
-record(ok, { data :: term() }).
-record(error { data :: term() }.
-record(reply, { msg :: n2o(), req :: term(), ctx :: cx() } ).
-record(unknown, { msg :: n2o(), req :: term(), ctx :: cx() } ).
-spec start(#pi{}) -> {pid(),term()} | #error{}.
-spec stop(term(),atom()) -> #pi{} | #error{}.
-spec proc(atom(),#pi{}) -> term().
-spec info(term(),term(),#cx{}) -> #reply{} | #unknown{}.
-record(pi, { name :: term(),
table :: atom(),
sup :: atom(),
module :: atom(),
state :: term() }).
-record(cx, { handlers = [] :: list({atom(),atom()}),
actions = [] :: list(tuple()),
req = [] :: [] | term(),
module = [] :: [] | atom(),
lang = [] :: [] | atom(),
path = [] :: [] | binary(),
session = [] :: [] | binary(),
formatter = bert :: bert | json | atom(),
params = [] :: [] | list(tuple()),
node = [] :: [] | atom(),
client_pid= [] :: [] | term(),
state = [] :: [] | term(),
from = [] :: [] | binary(),
vsn = [] :: [] | binary() }).
-type memtable() :: atom().
-spec encode(tuple()) -> binary().
-spec decode(binary()) -> tuple().
-spec session(term(),term()) -> term().
-spec session(term()) -> term().
-spec cache(memtable(),term(),term()) -> term().
-spec cache(memtable(),term()) -> term().