N2O

Endpoints

Here is a list of types of endpoints which are supported by EMQ and accesible to N2O apps: WebSockets, MQTT, MQTT-SN, TCP, UDP, CoAP. Normal use of N2O as a Web Framework or a Web Application Server is through WebSockets, but for IoT and MQTT applications it could be served through UDP or SCTP protocols providing application level message delivery consistency. By using MQTT as a transport we extend the supported set of endpoint protocols.

MQTT

EMQ is an open-source MQTT broker implementated by Feng Lee. N2O is EMQ compatible plugin that acts as predefined MQTT clients that form a ring of virtual nodes, process all the protocol requests, and answer to client topics according to classical RPC over MQ schema. This list of modules forms a core of N2O that is common for both MQTT and WebSocket versions:

  • n2o — N2O Application
    : MQTT and WS — 10KB
  • n2o_pi — N2O Processes
    — 4KB
  • n2o_proto — N2O Loop
    : — 1KB
$ mad app mqtt review $ cd review $ mad dep com pla rep $ open http://127.0.0.1:8000

The list of MQTT specific modules:

  • n2o_auth — N2O MQTT Authentication
    : MQTT auth module — 1KB
  • n2o_vnode — N2O Virtual Node
    : MQTT client — 1KB
  • n2o_ring — N2O Ring
    : Hash Ring — 1KB

WebSocket

COWBOY is small, fast, and modern HTTP server implementated by Loïc Hoguin. In this version, N2O loop is integrated as WebSocket cowboy handler that routes all incoming messages to N2O. The list of WebSocket specific modules:

$ mad app web sample $ cd sample $ mad dep com pla rep $ open http://127.0.0.1:8001/app/index.htm

Protocols

Services

JavaScript

SPEC

N2O:
-type n2o() :: #bert{} | #json{} | #binary{} | #default{}. -type cx() :: #cx{}. -type formatter() :: binary | json | bert | text | default | atom(). -type response() :: { formatter(), binary() }. -type memtable() :: atom(). -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(#handler{}) -> {pid(),term()} | #error{}. -spec stop(term(),atom()) -> #handler{} | #error{}. -spec proc(atom(),#handler{}) -> term(). -spec info(term(),term()(),#cx{}) -> #reply{} | #unknown{}. -record(handler, { name :: atom(), module :: atom(), class :: term(), group :: atom(), config :: term(), state :: term(), seq :: term()}). -record(cx, { session = [] :: [] | binary(), formatter = bert :: bert | json, actions = [] :: list(tuple()), state = [] :: [] | term(), module = [] :: [] | atom(), lang = [] :: [] | atom(), path = [] :: [] | binary(), node = [] :: [] | atom(), pid = [] :: [] | pid(), vsn = [] :: [] | integer() }). -spec encode(record()) -> binary(). -spec decode(binary()) -> record(). -spec session(term(),term()) -> term(). -spec session(term()) -> term(). -spec cache(memtable(),term(),term()) -> term(). -spec cache(memtable(),term()) -> term().

ARTICLES