# emqx_gateway ***This is a very early prototype application*** for Gateway in EMQ X Broker 5.0 ## Concept EMQ X Gateway Managment - Gateway-Registry (or Gateway Type) - *Load - *UnLoad - *List - Gateway - *Create - *Delete - *Update - *Stop-And-Start - *Hot-Upgrade - *Satrt/Enable - *Stop/Disable - Listener ## ROADMAP Gateway v0.1: "Basic Functionals" - Management support - Conn/Frame/Protocol Template - Support Stomp/MQTT-SN/CoAP/LwM2M/ExProto Gateway v0.2: "Integration & Friendly Management" - Hooks & Metrics & Statistic - HTTP APIs - Management in the cluster - Integrate with AuthN - Integrate with `emqx_config` - Improve hocon config - Mountpoint & ClientInfo's Metadata - The Concept Review Gateway v0.3: "Fault tolerance and high availability" - A common session modoule for message delivery policy - The restart mechanism for gateway-instance - Consistency of cluster state - Configuration hot update Gateway v1.0: "Best practices for each type of protocol" - CoAP - Stomp - MQTT-SN - LwM2M ### Compatible with EMQ X > Why we need to compatible 1. Authentication 2. Hooks/Event system 3. Messages Mode & Rule Engine 4. Cluster registration 5. Metrics & Statistic > How to do it > ### User Interface #### Configurations ```hocon gateway { ## ... some confs for top scope .. ## End. ## Gateway Instances lwm2m[.name] { ## variable support mountpoint: lwm2m/%e/ lifetime_min: 1s lifetime_max: 86400s #qmode_time_window: 22 #auto_observe: off #update_msg_publish_condition: contains_object_list xml_dir: {{ platform_etc_dir }}/lwm2m_xml clientinfo_override: { username: ${register.opts.uname} password: ${register.opts.passwd} clientid: ${epn} } #authenticator: allow_anonymous authenticator: [ { type: auth-http method: post //?? how to generate clientinfo ?? params: $client.credential } ] translator: { downlink: "dn/#" uplink: { notify: "up/notify" response: "up/resp" register: "up/resp" update: "up/reps" } } %% ?? listener.$type.name ?? listener.udp[.name] { listen_on: 0.0.0.0:5683 max_connections: 1024000 max_conn_rate: 1000 ## ?? udp keepalive in socket level ??? #keepalive: ## ?? udp proxy-protocol in socket level ??? #proxy_protocol: on #proxy_timeout: 30s recbuf: 2KB sndbuf: 2KB buffer: 2KB tune_buffer: off #access: allow all read_packets: 20 } listener.dtls[.name] { listen_on: 0.0.0.0:5684 ... } } ## The CoAP Gateway coap[.name] { #enable_stats: on authenticator: [ ... ] listener.udp[.name] { ... } listener.dtls[.name] { ... } } ## The Stomp Gateway stomp[.name] { allow_anonymous: true default_user.login: guest default_user.passcode: guest frame.max_headers: 10 frame.max_header_length: 1024 frame.max_body_length: 8192 listener.tcp[.name] { ... } listener.ssl[.name] { ... } } exproto[.name] { proto_name: DL-648 authenticators: [...] adapter: { type: grpc options: { listen_on: 9100 } } handler: { type: grpc options: { url: } } listener.tcp[.name] { ... } } ## ============================ Enterpise gateways ## The JT/T 808 Gateway jtt808[.name] { idle_timeout: 30s enable_stats: on max_packet_size: 8192 clientinfo_override: { clientid: $phone username: xxx password: xxx } authenticator: [ { type: auth-http method: post params: $clientinfo.credential } ] translator: { subscribe: [jt808/%c/dn] publish: [jt808/%c/up] } listener.tcp[.name] { ... } listener.ssl[.name] { ... } } gbt32960[.name] { frame.max_length: 8192 retx_interval: 8s retx_max_times: 3 message_queue_len: 10 authenticators: [...] translator: { ## upstream login: gbt32960/${vin}/upstream/vlogin logout: gbt32960/${vin}/upstream/vlogout informing: gbt32960/${vin}/upstream/info reinforming: gbt32960/${vin}/upstream/reinfo ## downstream downstream: gbt32960/${vin}/dnstream response: gbt32960/${vin}/upstream/response } listener.tcp[.name] { ... } listener.ssl[.name] { ... } } privtcp[.name] { max_packet_size: 65535 idle_timeout: 15s enable_stats: on force_gc_policy: 1000|1MB force_shutdown_policy: 8000|800MB translator: { up_topic: tcp/%c/up dn_topic: tcp/%c/dn } listener.tcp[.name]: { ... } } } ``` #### CLI ##### Gateway ```bash ## List all started gateway and gateway-instance emqx_ctl gateway list emqx_ctl gateway lookup emqx_ctl gateway stop emqx_ctl gateway start emqx_ctl gateway-registry re-searching emqx_ctl gateway-registry list emqx_ctl gateway-clients list emqx_ctl gateway-clients show emqx_ctl gateway-clients kick ## Banned ?? emqx_ctl gateway-banned ## Metrics emqx_ctl gateway-metrics [] ``` #### Mangement by HTTP-API/Dashboard/ #### How to integrate a protocol to your platform ### Develop your protocol gateway There are 3 way to create your protocol gateway for EMQ X 5.0: 1. Use Erlang to create a new emqx plugin to handle all of protocol packets (same as v5.0 before) 2. Based on the emqx-gateway-impl-bhvr and emqx-gateway 3. Use the gRPC Gateway