From 2754717faf79b50badde34b98e58c34262743713 Mon Sep 17 00:00:00 2001 From: Feng Date: Sun, 20 Nov 2016 19:04:18 +0800 Subject: [PATCH 1/2] mv docs to emqtt/docs_en project --- CHANGES | 1 - docs/{specs => }/MQTT-SN_spec_v1.2.pdf | Bin docs/Makefile | 177 -- docs/README | 8 +- docs/make.bat | 242 --- docs/{specs => }/mqtt-v3.1.1.pdf | Bin docs/source/_static/dispatch.png | Bin 10582 -> 0 bytes docs/source/_static/images/cluster.png | Bin 26430 -> 0 bytes docs/source/_static/images/concept.png | Bin 26430 -> 0 bytes docs/source/_static/images/dashboard.png | Bin 131596 -> 0 bytes docs/source/_static/images/dispatch.png | Bin 10582 -> 0 bytes docs/source/_static/images/emqtt.png | Bin 50559 -> 0 bytes .../_static/images/erlang_supervisor.png | Bin 83681 -> 0 bytes docs/source/_static/images/publish.png | Bin 22506 -> 0 bytes docs/source/_static/images/pubsub_concept.png | Bin 83909 -> 0 bytes docs/source/_static/images/route.png | Bin 19104 -> 0 bytes docs/source/_static/images/weixin.jpg | Bin 41618 -> 0 bytes docs/source/advanced.rst | 45 - docs/source/bridge.rst | 129 -- docs/source/changes.rst | 1739 ----------------- docs/source/cluster.rst | 276 --- docs/source/coap.rst | 9 - docs/source/commands.rst | 785 -------- docs/source/conf.py | 337 ---- docs/source/config.rst | 548 ------ docs/source/design.rst | 532 ----- docs/source/faq.rst | 77 - docs/source/getstarted.rst | 279 --- docs/source/guide.rst | 881 --------- docs/source/index.rst | 64 - docs/source/install.rst | 386 ---- docs/source/mqtt-sn.rst | 10 - docs/source/mqtt.rst | 101 - docs/source/plugins.rst | 1165 ----------- docs/source/tables.md | 31 - docs/source/tune.rst | 133 -- docs/source/upgrade.rst | 33 - 37 files changed, 4 insertions(+), 7984 deletions(-) delete mode 100644 CHANGES rename docs/{specs => }/MQTT-SN_spec_v1.2.pdf (100%) delete mode 100644 docs/Makefile delete mode 100644 docs/make.bat rename docs/{specs => }/mqtt-v3.1.1.pdf (100%) delete mode 100644 docs/source/_static/dispatch.png delete mode 100644 docs/source/_static/images/cluster.png delete mode 100644 docs/source/_static/images/concept.png delete mode 100644 docs/source/_static/images/dashboard.png delete mode 100644 docs/source/_static/images/dispatch.png delete mode 100644 docs/source/_static/images/emqtt.png delete mode 100644 docs/source/_static/images/erlang_supervisor.png delete mode 100644 docs/source/_static/images/publish.png delete mode 100644 docs/source/_static/images/pubsub_concept.png delete mode 100644 docs/source/_static/images/route.png delete mode 100644 docs/source/_static/images/weixin.jpg delete mode 100644 docs/source/advanced.rst delete mode 100644 docs/source/bridge.rst delete mode 100644 docs/source/changes.rst delete mode 100644 docs/source/cluster.rst delete mode 100644 docs/source/coap.rst delete mode 100644 docs/source/commands.rst delete mode 100644 docs/source/conf.py delete mode 100644 docs/source/config.rst delete mode 100644 docs/source/design.rst delete mode 100644 docs/source/faq.rst delete mode 100644 docs/source/getstarted.rst delete mode 100644 docs/source/guide.rst delete mode 100644 docs/source/index.rst delete mode 100644 docs/source/install.rst delete mode 100644 docs/source/mqtt-sn.rst delete mode 100644 docs/source/mqtt.rst delete mode 100644 docs/source/plugins.rst delete mode 100644 docs/source/tables.md delete mode 100644 docs/source/tune.rst delete mode 100644 docs/source/upgrade.rst diff --git a/CHANGES b/CHANGES deleted file mode 100644 index 2a91dbf3c..000000000 --- a/CHANGES +++ /dev/null @@ -1 +0,0 @@ -Move to docs/source/changes.rst diff --git a/docs/specs/MQTT-SN_spec_v1.2.pdf b/docs/MQTT-SN_spec_v1.2.pdf similarity index 100% rename from docs/specs/MQTT-SN_spec_v1.2.pdf rename to docs/MQTT-SN_spec_v1.2.pdf diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 167db2e93..000000000 --- a/docs/Makefile +++ /dev/null @@ -1,177 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = build - -# User-friendly check for sphinx-build -ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) -$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) -endif - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " xml to make Docutils-native XML files" - @echo " pseudoxml to make pseudoxml-XML files for display purposes" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ErlangMQTTBroker.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ErlangMQTTBroker.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/ErlangMQTTBroker" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ErlangMQTTBroker" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -latexpdfja: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through platex and dvipdfmx..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -xml: - $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml - @echo - @echo "Build finished. The XML files are in $(BUILDDIR)/xml." - -pseudoxml: - $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml - @echo - @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/README b/docs/README index d5c46fb45..94f96fb12 100644 --- a/docs/README +++ b/docs/README @@ -1,11 +1,11 @@ +http://emqttd.io/docs/v2/ + +or + http://docs.emqtt.com/ or http://emqttd-docs.rtfd.org -or - -http://emqttd.io/docs - diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index f8d18dac5..000000000 --- a/docs/make.bat +++ /dev/null @@ -1,242 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source -set I18NSPHINXOPTS=%SPHINXOPTS% source -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. xml to make Docutils-native XML files - echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - - -%SPHINXBUILD% 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\ErlangMQTTBroker.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\ErlangMQTTBroker.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdf" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf - cd %BUILDDIR%/.. - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdfja" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf-ja - cd %BUILDDIR%/.. - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -if "%1" == "xml" ( - %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The XML files are in %BUILDDIR%/xml. - goto end -) - -if "%1" == "pseudoxml" ( - %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. - goto end -) - -:end diff --git a/docs/specs/mqtt-v3.1.1.pdf b/docs/mqtt-v3.1.1.pdf similarity index 100% rename from docs/specs/mqtt-v3.1.1.pdf rename to docs/mqtt-v3.1.1.pdf diff --git a/docs/source/_static/dispatch.png b/docs/source/_static/dispatch.png deleted file mode 100644 index 11d2c6567ec1054f275db26665ffa52da6c0616c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10582 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 diff --git a/docs/source/_static/images/concept.png b/docs/source/_static/images/concept.png deleted file mode 100644 index 77c7dcc9e2924440da9ba1f9e81e2c082b874dcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26430 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 diff --git a/docs/source/_static/images/dashboard.png b/docs/source/_static/images/dashboard.png deleted file mode 100644 index ed69a72496435dd67af775deecc424c746ed214e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131596 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 diff --git a/docs/source/_static/images/dispatch.png b/docs/source/_static/images/dispatch.png deleted file mode 100644 index 11d2c6567ec1054f275db26665ffa52da6c0616c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10582 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 fFq&un@~V{8%ZFG^;Wxp&bg8WBV~B!=$p9^${l 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 E0HRv9UH||9 diff --git a/docs/source/_static/images/erlang_supervisor.png b/docs/source/_static/images/erlang_supervisor.png deleted file mode 100644 index 37ccecf8ea24c4b84a439cda2b9ab05e46abe934..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83681 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 M%i_=Cb60NsA9g-IEC2ui diff --git a/docs/source/_static/images/publish.png b/docs/source/_static/images/publish.png deleted file mode 100644 index 0884fc22436fa223ba20b14a324b53dd154d0df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22506 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 diff --git a/docs/source/_static/images/pubsub_concept.png b/docs/source/_static/images/pubsub_concept.png deleted file mode 100644 index 2d2a8aed63bdb5d7cb546cf356af100530bb0015..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83909 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

EYjLQ1<)QR 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 Q1Mo*uR92)yNH5_308Q9@=Kufz diff --git a/docs/source/_static/images/route.png b/docs/source/_static/images/route.png deleted file mode 100644 index f53d0c90a9fe67ad966ec0482a03d163676e595b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19104 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 diff --git a/docs/source/_static/images/weixin.jpg b/docs/source/_static/images/weixin.jpg deleted file mode 100644 index e1ad7c351eefcc25bd5d8f651f5dcf74bb2bab5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41618 zcmc$H2|!Hi|NcpmB|?%!;}TI4LY6dKOS0UMWUINP8=|pXE!3Q{UQ0sKwGKiEBb87( zEh>sex6&rlB9W$MTBfO)IrIO#XF@ai-tX=Hf4~3V_x6<~o%fvge3s{VKF=#Jke6b8 z7tXhxkEy9)m>T>KlNV!iF!e57(0}lwEBvR?T|=X5SB;*Un%%l<_0-bp)w5Tx-hKM_ z?cJwepI*KC4(!`cXMnD*u9mjmpn(Gh^&g-+0R1Cs>hLvPHF{`h^cc{)SMLFx{vl7q z`gK>kuXbNuZ8+AYpPG6)KDF|4$QUchgz6UUT@40TTmGUF|;N=g1`8<=Fxwiw!&X_2@ZJZ;<}r zk)w=9k1?4vd5Y!KY18M-oj2cRf$c*36%H#MSFK*-veET7w@sV3?D~DTrbkDokEPI;c1mj2>p#$P$Pd2jOz z3X96hD?U_ytoro1T3FxE*d%Hex3r>lsbT7hWx@X|7N)YUez2}CUAwAx)kN!3>*56; z>ixQE{4}9k|Jlnl*YD67J~5#CfS*rYjZEq>!eY5Vcf-!?o&$|0m5mglrBN&UXA9f+ zuU7VLVc*wPglVa(!NXJUhtV;a{k5Z`vH!Op9}>p+E*GRH;a#d(6NP8PWkF@n#;1xR zcu|@3(2omG8Nciwbus>rsrJV|ly;e=xptm!gdEeJFZ+}DbW@I1YTC=O4_oMEpLkJv zvH?8lm1XR5>=!QjU$D&X!{%mTKm$ zaLgbCjm*MhyQO?}cwpPlh`^$YJ*Xd9eZ;ij+OwZGci?9N@Rp<~CVhPB=~+Tz&ZZsRJC&ENXY zwI}ACxjdar-(9j>qk&#oSWIw4kA%FZUKOPvDPyZEyRqT_2J!6868UFZW?ooz<9q zAh7tXep)wM%->Ia-Ve8)di5RCN=Anb?Rdvmi(2_#crh-xZv`vwK@*vu63H=GI>R`t z!HUx)yjjz--0xilbLxv1uynKv*hoSfw2=gi^gZnTzOEJQ8fO2^35=q5f0o20K;s#)j8EnA{X3GS-BSf>79Lu?M!_Sdn zf+sB_KBQWYl4I{I=HU(lRDRYKtIIKs`Eo4yix`5ycCKv7 z8i*ha!5mu4J$7?fIab^%Tfxa7#6JZ|-*P4UaK6kB;uG~H1KPf1S`mE7?~e5xM&3M3 zw*_7cjVw8K-dK+9AY>0XA$aL6UcDc#gV*ZIv74C-TUNsUmt*_Z$+4GB(us2HF`K+F z?n`qkf#Id0boi@UL@j*v&CI7V@``q)Gl5gTzk#jz{qPx2Tkjvmq!2atRpGC7;2+?T z1&)`6;VX@;fm9M=ug6!@h z$0kRSrECe#fJ^A`Y?_>Klg4GUG|+`>;U6F2@8J6~zf`luBe~K)!&A&9u$IqRwFwbd zx*Tn>Cws!Rjv6DhB+J;XyP`RXCK!3gRG>-yzHz?d_qRrKc-2xhSa28)w-;WQ$8O{W zv(f66YfPK$l`iSd88vA{HaxWfNqp0p7SiP83n8|{#wgXr z9dxA;`Au+tPts!9{3>C7DZyt{u)B#Z)9D584RTm1qD2sr^rghawD%~uU#$G#S$V=D zz#lV&bwFke$EnPyzL?64Ki*D|w{i%Sw*qeB^^<9k0E@h+1UQLH&gX<|x}sfu4Q(*x zy(l9&i8Qf^rIgKh&XXL%KR^6Su{j6HvDaJS-Wij;{5tXVGG451VV^1nDBKShtLQoIOZt z0Rb)Oc~E~@gv4>J#4j(jh{fG)cAfqt=JaU$t>fpiO~!eCs61kvN0jB$p(M~TmvXk? z(qLP-h9~gm4iLM-n?{#SE6LCMU9F)xxvs#X)G-N%a6D1K3?L%oZEv=)U7wNp3GB>< z;oj^IXFcbfIh7wWHEVwNu72vy%OuNuf0tv2wu*JinSaPJNHC}H4YE*jB->qLeyPf7 zj%I5~P%QIOT6-(oH{;Yuys(iu9wQ{~t} z2CPd@WL}7uyTNCgg}!yu-$DS$^E)TvH+ae_E|l`?Ff>szMEN}6~zy;+^i zBDr!bk!|@(f=dj1Iprnw{(d(kdwiD(=}CCuoOJ7n0*`Q6VEGb@no)l>*9h$@TSDIo z=`T$l4!M3}8kC;D`rCY73TWh22{ln3Z*Z9FRD01YG{Ag319j<4#8 z{1;F=zHHuc>0OojP`gy~g9(Gg*`-c)NeL5k=#Q){Z~vK)=PEk#YlGF3<&f-McN`AX z*0MN0WZ!IQ0aUtGcpk*tOb)!}ux?i#+P{<7=?pDt+x|uCE^4>#x0|W``+eQR3?T{i zd4fv!b9m)mdx%fxrD~9Jh>$&4t9qH2BHRT`;(m*EzPyL4@r|pvl`W^^ISrZW(=uQ1 zGl#gTV;FrQz4Qz(M(=rDkv%yuNIDi$X0na!m@E`kd26B6k+@wTuT3h6dl^*cX5gLn z3u~n;6o;=7{DpUkw-D0Efrq6dh++m@<`FmP2syT;-uJ@oD{^eD=z2+9MoII0OP7lq zWip8tnL-yp-yk?I$5P!<0FoN9p%eJiv4F)D;dJssW}FwB%$m~7#Wbb52IOM7=`xEQu~66aJDt zvmPyGml8EsE7ZHWzd+auS>0#3&5+w^JIBu&QO^5s6-lLA zhs~|%ZrWuD--vlsB3Df@5((L32}H$TWH;z#n_%~$#>EIPAPVtc;oXcuEzct#qI$%V z;`l#F(T>>T8>@uQgaf_w5WQh7y%yqDY@=F}-9Nu`if#$j8c;&jhpT*{Lw<*14`Zo0 z!W)gU(sgczY+)E8;i{)qrDBN_Z8(S zzsF96e%Ho8CD2+9FYIrSr?jA)_DJ6EFFs*#s} z=|c+(;w#U?s(=((#2qiK$cw1wki8(ZO|l~^aLM{vhPNe4$y|mO4oN-0d6d{vunXGQ zKcx$Vkf9z%+dXhv?H69tyv*sfeEn;Ly#euWLHZeR~5@`|kuaucAsf$%p7!e82ZrZjYhdaEkuH_ouYyjnY zPiQ}T?2==~`GQQc9B-cbNw9q!(+Tm|bCW zA{xcK#bkkSRQN~P*-U=F*&ls&SaBLMGWPc{xV*}3kiL<69Zz|4gsEIRl(HDAWtFep zTN{OX*gF;X6rny+YJ1a%u|;vw8*NQ|g%&?$EI5203bs*xf4y@9n3k-0syCCSVlp}M_=ip98sHE92s}m?ORi z<THaBl8tmnTggckoA!62A)MMI;gYTG&*+2NX4qNq6s z1t~!C7R`VczCzK`ux7nM?W%5zn#6~Ej}K+_BJ;>;0_J{z&;rYzS=P`u0yY&1&Cu9w zmH6dV`dQ949;+&*4g%o56&?x;>iMKG#1``-yy$SL8Lchd1WEKH<~6iW10N;WT@rCE zWpg*jc?HwnXH5|vzbI+ue-_$2hq_3PxoQs)XC^&mi!6^!;y$>rh!>R#xG!TZ{Hf8M z7duZ+t^CE})IK$gHXC6k4l0ir_PlbR2e`x}$2as?z}d8X^<)v!T>$2NW~0v8I@xS& zLiX6NJxLVQl2vD?W_81`z0K187er1_J}<3g)1fFEm5&q;dF%R#G2-2ff{r(A^Rl12E+nZK`1%FV-z*9%pM>L8R>N z^*pGzU#P?sHLNJ??bf}{d-C-3D#q^?8SIG=_SXB4D5U|Ir@GBEVo>#{(zyNwFUWly zfbCI?7Ux_5wnrtX$!as;mUFls0b#Fpi_cus$~9b0w(qpT@+ z=PSugK!qeuy`GrzAt!2Rp`=YL;6mtehT5Adaup^&RU zjHztcBl?-dipquvGQN9w%!m^!Dy9t@)>o}jm#TPG%SS-1x*V1I%i;mdp`RdNOKg#2 zL&TOz3Dd|l!TSp$+SeA~?38+fJ65a8d_?Tn9T&AQtQmUUk(T^Orw*sLLagh|Jy`K<#QXBec1`*KZXzRXy|t!yv-lC13$s@cl%5mh1x zt^zVbIZCR$0{(RT7J_9|ch9npU=R>IKUjEzzc`GFPT8ePP=x@&iF>HY+?4OhC>%K6 z=kmJSP$JB_KVBHNJ!NXr3nLo)lX~l|_AC)+wCq-b0$AuFv`h)&6Ji_uQ9`C1)1g1~ zi+EY@ag{Aw*$Ayzaq}Tdw~N2FJ{zEhpwB)~6x=D4V`szVm?yk=O25vpzVT1~RuMh` zXVL>08d9&@V#_pV*fqjY7b<0UAhfnZXgxC0?(%5;KFjBND5|nNsALc~@Q)GlM7p4Y z)_RZKvITG6Mr-#u1%rm*?S7~IpCZijzwuN(I@4Q1QNGL<%AZ5Q2zok91Aza89NXp> zN{+%eN*sefl+2;G-unz;HnvX7gF7{;p4)*RP;3e%?hJz(cnCnR4pDN<%#P%TDdANL zT&^9r#_*q{)(SO<7Gx&vQF81!T*HBUQa4{Zirrv_(3mZLK{f18G+{$k(nqGm_#AoL zv*iM7TU<~c{Q0ONdL z6H`jkfwtMrMUj3kydb8nP|z6Vf2pd`6U2SZi0a;!X=~i5j2PQ1&OCY^%82V0vaJ?F zLj0+XfEf~7V=7 zX|OugL7oviK?vz7&aQZ7p{Q@TM<$zF)I4Go>b-#wVuwJ$TjNi~?M#`P_;OfZ?PK(^ zG%LliYJ^4D_;+L$+&>{XeOdX z$=Cq%-RxgmQYCR=`U*3t6a}0n!Y12DO)=A6LZzq&P|61?vzj^?K%RA?$$6ofM~~5y z>bjx*=!o`XGN5Azyd>^5JR$7!1N#xEN^Qx63`m`8S%S2hhT}AU(@)w*=??(=-A8uK zmAY1#t3xNrTvDHqzgNa_X`{Ud)Kr-dH}ARQ;zevh3yDhd|E-P!!AW}F(1jv6iE2X& zp$!%F+w3a(132WkFF;C$gmmj~Y4sp${KN%a)msV?XoulYdI4gOAokB}X)tOxl!){z z+9tAFgaUCJ>bvAS;^x{Oaa#o-(OS`&?}%HAqx9-tGD2HAmMsZ@sDQ&8QfhbMBP7ni z1V^Dq3vNpel!9g;EvO4Z?E$%sEPJ*%Q?wQ|1DfY5GZ1haaooyd8sMfI`y$-bfnDfT z?!_MiFK8U8n|=r{8$qU$xe~n9?;a<($}b2p^20q!KD=z+6&PPJVi?U75Nh}`@n$;0 zKX$+u5@bIfpA&^Y=aT)kV|=WaF^I|<&%#i&RJtcN(&<$cW(-RX zk--<7-lX2#nt=VA`_kG`fe^uCb>dDe(EOM#otjQYxRGnvvSOQdpEK}IG3MzZRFl?T zT;XqxUSI&Y^0op>Y%j;+018z4wR<(^-{qtB*{MT5vgs(xP=^THp0N1-c|uO-;uP)5 zrXR>*NQY1AuofjA40XM#@E*{k6YSdP(Mu(Mj6JQwQEX zM6AL14?OC>17Dk#6DANe{-&D;xHexw@~Z)Wto$$-4*9C+E}+4vO9lcOuuHg9 zgXap-uN|-m&G--QaoYogyMwrPr8|QmQ3KWKwF4{bntnhNE7$`i47{PP(+xHB(;2Fo z2#mE-rMXCOxQ1HncBvYnNC+|=HAVrM?uz5Ut=@MR;9?!(H$v>dQ^-z`;6@Z)EXUrM zA!N3O<=86bdGMy&#T~D$nmPz5Jr9Q1lPh%zlK#XHMB-(=fYJ+r#oM&SKjY=l?H-_${fI|$?A2O6ZB~u6%h#j3q@iZ%iDf&UmF{zKmcr0yF5-w3rx|f&>VIWXMBN% zOBoPGpej_zLw6xb80aA~M9{0eoGj4h&w+B>PIlaSy7)pVFNx5BVq~a*m%?x*GqSCd z-1mx@(Q8t@EbH!vopmdjR8PF(2Nn!k3ZY*?|Bkez=rbK(8)#jx0!n~rL%e)7d?v>b zZ}@f){jKZan*%ck8fQ>=EJ%yHOcKa{u!)=>UZgVIhQxoXB0i<71!QP$Pw+mz3nI2>$|6ZzOa6uQOmMjvBqO<=>Xxa1nTk-J&GYUsS`UI zqPqdih{T=`tw*z?vsbW)4sAK&?~O~+ymnpGqCKob6`p=nspBD5TZMN_q6hdJWb*_2 zYZAOJ?FKfwIw3>i*%HSRX1x<$MEJs)H;@Vq;n6~mvV+T~@wKJh>f?zAcx>Ejawsug z^COYWJL*i~@)l{%y`c`KfO*1IfuC%&(~+Kz_>R*7M%96Sh9vYow*|HPoKj@~Bo5j{ zpkbatyM}m}FKkdbB4#Ouj+iC9tcBMELB9SA1bP!mGwhSka;&$pz&M5853Yt@Hk2%q zI7$~;=ZiSTFQ1;*Zi>_KtTXm18B}s&$7u}E4OcGQN(H(Boyb>s!@Bw_yb<&r-l$}# z=w$pHospITUi*LC&|;)J!kGU?k3e@A4PZnlYdQ`hhaLj%a~udTghk}ZvHsi`8NwoN z?w5Hy2P~qE;B8^>UrTo3R2!u$#|Ahm+NfA^1E?6FjS6aA|E-I{Xex^U$`0bpziI+T zqZ&f>1#tA2E*IY@#{&(gqsG9@PU7BeU9X?ceIQ)O;tz&jOSr0YN$qb zd1x|E%XgDtTzDx@e>1z-&>;5}#r8nQLqRzcA>bW8q@UJj_Aqj*QX;S86&NSLLtb~CSDb)~>YW(7S`Mlq&Jf>#N(mac+B9V8{(`ly=Asj}lSJk0z zCy^6qIHRrG0Y+tcJ(&mHj$hlV22}6wG1$DP#qo=$ZKe5CLdhh6z-&t>@UDGJC<;LX zN+>O~?+FEjFxSwRL18+@cQ-&&5f|GusSq=Brvt^EjY!99#^Zm5q%N7BZ zjQaDm)-ayn9#K0@7AAu@?El^oBm|;nA0j38BPNa#^%6Uk1qIS#@PK%O3Ns6dTgo1G z@xhYNqLCojtnmPNX_Vt2?>7PkIF`?Y?jEU(sqVfA5MiVI5LPB3SjZIr#yydsFAf5j zat_(wyoM2jKaV2eReRX-e)rus_&v!Ye(}dzN%)K%X*;du7*g{cm90=IqgBi5P3rac ze^hEfu3XO+gG>P>OGuIjQpo;xC|MfU(A^|-NR~?~OX9eqwD&EgKd3aJOM&~R5<@`V zOw}nWB90bEQKcLUgu*`=-XJabd?3O>;G22C_p|4-H^PfVR7kk>BES0;wcARFk0miX zT5mHZk_DRtyxo8xRl%4t0s*)}ub|`>lsQ?%S=;9S^tOzTK^d zJ6{d>Cg9R-9|`afQ~=}ZryW?aE82-BATflR7gUt=VRS^rD9R5cFaj!uDnAa_gc3y} zz*Q;uVbOGW8^2^6hn{mEYb>aa$AOOG0v&>{i`b3q$K`YAHMGy7SjbG3Ekw1E-{S@s zNkLYv#r~kr3#lTvU8O!iP3TsmC$veSX;3J-x_4&U8emoqHF9GO;uMPdRqy7qjTV9) zYgpMY7Qy~KXdFVhYv&{m9u4>|hn+AQ_@FKcy~K6)0_O2}po7YnSY}EbK-kp?Buan4 zqn0A_^xcHC?b~Ooe;VAe{}`<<3M+Nv+kk>E7-`ZD?r0+xAj87`c3RV7?RBma=LA~1 zWdzq&8Th2l-@`u203o`7k@%E-Jl+*jmy4LWc!J*@5TYX)&~@ATxpx5>=`)~W+EnaR zOC(gy6aH3Q_yd)6C8I-M?q0bDH7rp7L8*rTcU0?<=TNQJlJ!kvI{&;y64r&fTT015tW7ATjyxBLplg8%aqZt^$(@ z3=ab+&`|_~-Z=qCYtN%tJ^KV6Lrb9*MoDzYf%GFp*$}d*0SK*t-Mg!NtQnw=vMdgo zLVtF=7UT+*)_N@TxF>nnEmp99QRPb(y^@%r$8G2qssj*-)dLePBae3!3Zz-iZ7&J_ zLHF{ejipst3J!V}t{f}e3xt!41nN=&H;FjT0w`Hgm*&YLuKDd#)TL)@X}mS*s4gwX zLy8R^Y)=dTGF;b<`cmMk?zh`gfVlEtX^5+G0kK;el$sM2B6luOb;>AWNc}xZJcODk zl>`cMVx?yGpXqkKiHj&2HHkfxHHif@sxWlFZ*N&t*|SAJqk^UsMX8!?<@o8<8@%NRvhi z7nO$|vhF3;vloUQkD=G#y+0o^NA&h;&;+dj`Ctf$gJ&mSbTh{KTlMNNXrbEvA?0!% zRc1og_`5L|YLDJw$C^vGULgB&#BS!|$AsXZELP%0uE$-VSRmngY42^$5jCN-U7jWE zDJ7XmeF{}Ov~7r_L}mNSvLFRXsVLj|6iK<7D%(#Zk`l`H$T;JkJt!GZr{D2B2ZfMY z!^bY2js|jS3T5!kDTeR_zRd^PLo|@{v>~2tj_$4jKm7vjeVP{tsP@EA$a6b&{Al$% z3W73#F_?}hYl@x(nDhqFlZE(32FP{1-XeOk=XbqMi#lkCp|jNH9}MVh zdUI4@yo)jY3UxDoDCAR~#*o;R2i52cOhI7PMA!GuL?Sbz+;}3!S&q5$ki^Q!wtn99 zE6MYZDMTQ9hyeD(Dk^3&6+kh(hxHIx*i_7P3n3G1AZE6K7+BL5(<)wZPI=G~vKN_Q zh~D?zbTl}_UOy$2a61b0V?yi^($)b6XLe*}GPnWFxYZvXD z%Z{GDr(V3;SwFgTh?}wh5>`ZUYPs!xtL8OM_bWmUnr%FDrP2K3xQf~VekOR-7j|R6 z973Q5rK${b-^BpXUr@~{awGz_;ex$DO{PbPic>F73rZA~J29U>o$0?m#OC2is19qd z{23{YNVl3TVZ>YyGz{8o7ty#~N zQ+d|s>z~t07fl->?DFi`!dyhVR-@Ze~{GwP>bu-uyKNtIqdGtaaS=FtV{L z=k48Ux&`rffa+@Ek=_BRV=4V$!Z`73f#%9s!Qo@6(R&Ub8Juqy_50fzvjcaz6W`5E z@))+-b$epO!^465L;f&MWJU}P7AJ@0C141t-1*axF=1Mf~p$QLnvv>4_ zm=j}yx4r?u!t}mpX{Bvf^#<~&jO@^(sNft|y0$ep?WUQkpMFRfC^e&|PSF^i$2n^1 z6c{A)=tYQrgFtR-aWVdck3x(^F-Ryzp#)7aNQz>LVvsbb1WhqW29Tg_6#{zcAWk?+A3d_;_;)380M;yBKpEP82*2JB*#*Ja^XQ*b;ppR0S>-rn)|Lgn| z`uWE*R1%os0D)&(5K_BQ&k>4NyPDyDDFn1sMm9w?tIv8gwAo#=A!;7dWkCPhUatu= zcJvNYb94`8fg5Qs2NgK?@UlKopECJGLr;lUk#+V5JjeSHzn)%%pynTKFlykA(gr|R z+$Ij_rAPK9C~?3;vQR`&;(#h>i8-%898etpj2OpHgzemZ(1LGXoKxm?gq*~J>;h%^ z?_4zBi?1Jema*xmwnb(F(haT#5#z2*tqOG`e;j2OB?c0*OFlqUfMWK)K=IUvSR(Aa?B9v+60CJn#72p z!z9K~UkgD6sf$yS7+ZiBW=oA|Xb@vHge3>jMxce;G(#(AjwtXFLHc$vI!mL~tlW4BZhqcZVLp%@BH0-zZ4 z@MOqXJ&XawFr_332*f~=1UVKJ_^bh%MwRjA1Pt~MqEEDN7>N2xpHKr)6n!%89!x}0 z^a+}XvWvU8tx8`XqyM|XBgfT(*fJ*UC+{z)%Y*F{)PD<$S-3SJd%)Kw?=Dn{PZZxcX=v-l>1=+IpweUbQSVan&Ep;>-3-nqmquWFCO&$rdCR2xhn}+1qiV*1 z9#x)ZA6CtZ9P{BPpONovu5SB7TXKyU1En{uz`i0ViB=Sz>})RN?4w8e&T!GKUgwOv zuX?w2;+n;OOqn-hTIR$PsLLOcUoGQE1J?w}d;lZ*lz9}(8QbNwxBA-zckyeU?Oh%32y6Hm|6d$R4=6_xvv_pPj82eO#OQ#Ma!Z*6B}4 zy)f=ha=; zc}aU+XB0aXKR!F=+SZBVKh5SmA-nsoI984yocmWzkYn_4(*nnUIGSmI?5(=>^L|Co z*67N@*>EydVlG__pAAE^ zm1|Pyt(++9k^~Q4{H|ClH}wpnauU7ChA3N$zuP6Tk<5`}YVjP<9rJ4&@Wag4831V@ zoee^7Px!i)^3*}h&s;9iE;PquY9Qan8K4Qz-GCY9hv=uxpWU?ye~>SAcO!Ke;!Qkp zEJJYK@0g?)xq-b^Vq9dMBgYJ_@z5x~ryRpQ_%PDRzvr*6L{Nn({pugd6$IT9k}#6x05i>q%U7Cix}r@bg8$u-yrFiTmDUY)>nvb^8Fx-yrz}hSpHQWMqyPpF zU~b*6!!&${ne7Az3f~493n1L4&CM!&{uS+zzpeBc4uDW*JOiHuP~?NA1?g747l@P& zNJX~-ZUsL;(5X3-G4y=nmKygX!u(?!1Xk9@Z$GB^1ucs8e$(hS@t1!1Kok0O{&hLF zjvZ7#xxtI?b1&w`-RT>K^s0LpC%OAuX$9HpN`2SHLd8>u9mHV zpJuzf(K_E)%q&bP*C>g$Pra6wz2ItILVn*D!}_wCuiiILbMBjGrG3|F^Ymx2g|+2Q z@1|7l9>#a|sP?H6Or6}SeU&?uI2_HMu#dUVXkGKjZknIhWM8{kboT6wdTG}Q{V$q2 zO=ga0I9vbL$+~v0`+*5|>e0)8s=j;u5G|nFGi^KBCF$Nf1#6wxe!BIxx!>K$D5v?? zZ)5vrZ#~hyG%x5Ft2a~3uxy=Vn|2%Tl^&3!qift`&e&FLuy^a~6#rk3XrG;7{uAD) z)8g>gmGCjfZ}K(ICdXIL58FJicus?teNK3GlWAP9=zdOX7QT6PA)u%_b=Ai0+ilh~ z(t5DChLeQ{4|qM;EL>HzFz)o)7T;?Xkv;YmSYPk?#o9nTyf}>=&G_SW&4#sRQ^@N2 z1%J9a9e6&!d+kIomxQ85^CHcPtQ&%6$JjT%)@LECj6Zhl*pVFkY>%HD90N|P8C?|2 zpLuiAhHF)pS1%3G9hB@45u0)8^xCMTcz1zCnxXo`y(M#gv8@^LaZ$vyuDAB*`KPGW z&L6|-=KVQdU8u9mO_|XA zfc^4aPZtIK^nuQooyB;!CYSOA_S!Auc}H-{jO50RJugevNzU)AI(oYLK1&mY%8VyK zBAvV92u#J_&k%5KEuv2#crcg2t!C+twjGqv7+s@?!LHa6g zCulyko!JQz#&l52bfCo)&Kskz9mT$WbQ(0X-p2`{t4wEL(z~jVA`9kn6~-zoD5^VR z{*(>Ld?o*uWeNp;5lwIbPlepp9Xb&l;O{@}iW9O$K``5$8p}LYNAZst(QRZubW%tU zawOqvCxuvYo}!bY1R+|elR|osgwI*;c3cedhnstaB3NL)O03gHu%Pj(*WZj1Oeul| zp$_jN)3%St)T>%0FgNN1-GMz)GXPKW92c*lDMbI_+m+c2K@&qxM4jmQ}m&1@mq2T=uQC$pR*Q>za$AqVuV&>n2582J}y7he$R zLpf#+{gyFl$`miAml;Wz(qu3o!J}Gejqja`VPt3Pwz|t!9EEg5t58@B(vdVM?~s=T zcmb>y5ns9O0=ON;ire9@{dwUJ$Yr$Ow6madG?rtb3{cHDR^Pzz8MMyLa`{2us6+^M zaMYo%XBS@}2N9$WQ+y3C8xIQ%u3|RU|l;f<4V&M%Ci+$v~xcz(qAR5c*IU| z_}q#Ql0njDTbXGV-4z#`xJf7Fr<rq9F5{mvJ+u z$jXjaUEJ_2SQMYVruMI)wrVaeB3EC})q_jj$kv|p!BzJ;OD?Z;(;GYXFLN?|k5yms zjMcfx`*-ZZKUg#u{BgtPV~zVNasL(KYwyS6NBZ7cdzv2}x@^$?@Y6Quj=LPM;LLP? zO?TxS-Gd*z&+(lW@owa$n8s^+H&<@E^{~`*jB&tYjbWE73`6p&0cP+Bz2lws#c|t? zpWfX6ZEyIa6T1C-KaX@cb5Y~vR3o<`d-JV^eohZ@e(!1Zw7-3F&Wf;CIeE@+8%C4) zDYkj>GsCucdYz56^lW$*SwC{+E`zHc+ierav`X@C`p(ZcNTK&^ytMikjf+LU->bd0 zpjkWBmKNw6Aq-7Xp2<|Mi}id#xw`?&D7 z4Lx4J(DCLcA`d)iT6?||=>5^>nUGfAGotQL+S)}%B2yg;ydo>tcZyJS;g)p5o2Er^ z#lK$~i=A_J=>0^`efux-7gp7CCdxvr7WJ-4u*_xNzk0~M_*1Rjg<;E!_eWZ>_Y|KS zW4b$EFvDf}MU$Kl_)sXS6KzOt&V0fkVdV4YJ)FzuGuHJA1)$@qnNK?3^5#3P@TT{v ziOnb1{4r#g?%R8NWmiA#pG~>+ zEs|T|;)gCjTc)hwNBddn<=*<t*;Yplif%#VinM%#~l{fm)HG4l$nWL%k`Oh_HW3P zZLXq#ZOqBJ>RFFYObg!nRzPG_%oxA(`u^5bf#W=DL&28KS#cX<`LrvS`_1+Lnf!g;9K#TkFk|C}w8d_S&2G z2ApdYZ+e`)Z}0V>I}{ez&V-2Jfbuzg26>B3I^nWZ#+?wiSt=?1nd86FF+u-KiP$#b z$)H0WU?=?vIFvvch}d`@5}P6`5U~v`Nw7)q@=PB_Gs#BIXlPvH$8&8MbZe04mEFB) zv6f$Fx4PR&SArV^4x?MVmIE+b3_}|AbZT;oEPz=f9|lbR=Rk_Ahy}1QQ0JT0iI2NB z#D7_R1qMDM!PY3&FXz(ZifI__uMo-zO)2;ZDaipdk@e=ySHRMac>1l=ZH}r}s?*3Oik)4HXIlp0wwAf3BT>1=P#>3=5J6R$C zbVL-~HsjX~K=`HcOvSOjSN;QHP05NnJs$EuAuH-&%BA8T0Pm1$;iClL`&+}tR?#y3 zr{P!CX%+^~%H+l9rO*mekQ%nP)CGWmpLqSPCW|;2wv zb)@$TO7s{Q5%b_hrSSsY4Efd|&zQECw?UB?jrOcu-HS-z;%Plk_3O?M{y=%yORVtPlu^ z+Bc^O9oCM_69^o6k15YMF4g>`2@3CVQaf1`2@3BD<0OzHCc6lD&j}ECza@F@t|E3+ zQR-&PT94~THx^IoAO7mtr6>B!d$c%$dEyh8N#2SSl+-M_4gC?+N)Pbxq7t9?cA+0( z9{H50;&o7+%Z$faedwEkfrE;?on>FkS|vZ0{}rc@BQk${J>vwuE3t*$!<$G;=uV~z z_{SY@@9>e`bJ_9W<>pD7lu+2uyc1R<^-gRMPB}J3*P}7+cbgHlQ%~=_Cm!D|&UWfq zdPBk6-LdU)+9hL5CmQQcef;cPOXls(`P1jg@&aq-8$@g#tbc9&i|yM}8g7yK^x#UL z2A@^wp&zHb+OsXow3<=GD82r)AT;%B7H*oW`4eV+b^hkumBt!rXMWzf%(kh>V&Mx;bI96i zi$(L)JO^Rmt#HFutG@V&_l?s7tp)}j)e-MsmOaZk^@7tc)tSrok-g5jJPUXp`L5f@ zynu|8>6d$Z;XSP;`w3mjZ`{r`IxSqx^T-`%^x>gtm)SF8r{t->5&rdfMz3C%mW$qJ zW%U?$ziP*jrO)He6$miHm}c`t-hphXxghJM$o8J|hD9%fPj(+NKU@+K++@UFSbcR# z?%B8z1)1A(Qdc;N?c-`Ziv}Oeom|>Yvslqj_J9zs7|jc+2>L#n2P5%**N}%rE3yD| zotHeH-!LA{=4qBR+O_m>=QXtwtxGgk{e@S&b9}%$!0N6lD1)I6l&zo(P6}t_zGaI!puNDpN8r07c6pQfWvO33k7T zJ`6>MdzLp_816_M1s)S4fj>OzxhwRP-odF^zhFkbAmM~@8)fTGg~KA{pN1S;^@Q({ z)VYnC0{=9yNBj%|D5DT-?<*Up+4g(f=I%22ht4*6j85v9Ksc|&u&GQ#H7)n2cNmQ{ zp?dmf7>k7P3`B0bspk6F_8mSIq1J)wupM2kY`%%H+@)sXwUkCY$I76z#Dda@UqIyb zJfx;Z-~=C9Thk493>sT{6NJHGO{LB z1(hk^yucg@We}Cwjnb=8RHlce7YJn#mH8M6*1r3(?BSlkkrb!Mj*>4bW;T(0k@Dks zkK~JUOV}oD7J--)UYL%sBS8ltEUnNB)L-ibrq6l$)_uI)fC4;XI9OsXS_u>&DC_;M zRh!xpyLKBrNciLyV!d&z$BPuqCXue(MI%3k(VQ3Boi#kf`Y3s8F;Ie5rt%f~Qi|E6 z^raNDsnC~F%%(zLN>Q5x52($|*j;XX`avGj)bAr_jntI@6=fV)| z*cx!(;F#>Vc)V|SthL+GAG%4Xfo%yu_3cL20Mt?SoXD%hhro>lFNVV!c^u6iCi_Y0TgjiDF>GdjAeVP8Le|>viL>d z29ytqvHTDYdHgX)N6e7)^zAJk0n_DahFXHz*}n5!KAJr%&8w>_FbWLYzI=6|fk}CWq_H19dXO5Md!K$3}$RIzPWm%Q6I@*|LNVF-Z^p!ef+moR*S~A zau1%JVYck0&)rr0LuGL%_l%&ukQlmuvS_*vH0H`(2Y$PowMM+f`_G*#9Bn?{kGWcH zI5hXhgS@dHA3Qr=cJ0INmJJdz{Tt1P6v#r?<@`$g;rI5`b|Kqg{XQaq z!;ar9F??~iLCkQ}ia+IgOJMWxg(h7vQtJNt_QBI{r-xMtr_J25BqKDQ(D``Olp{1x zwj1O<>q%~7uNP(Zub=m*n(Nm*YL;}zy2JBLSc0h|9=GO?ICdh?aLDIhE=1?py)t!6 zzTD@n6*FSgrE3K*_wMBF-IP3krc+SQncTAT`~(dt?Qr?cNYB{w{!tGi3;s&!XXsm) zg>g%U>@1jSq{jG7Y@bv_-xnS8AbacZ$Qb8^Y1Y5d-*50Ses{h)?C@?qi)_O*^|5D7 z@<#D#sTYlt*#50}O80q9IitcjFD^KLVP^K7xpJ6~dhTVr2j$P)^apI;GRWbkU^LzNjhF8rNwqp4tQOhwF8C@Cq)H}deIV&(B^g&>N`dVTJQl2*N z+jb_B!_-@Sfn-X6S5;ZZ3HoW3At1=p81kP;P=TY&42Zef(&^Hg7i?sHOZkzN&qnx`~jU_QA15 ziY&`pn*n<&}pd>vYX(3DfuB{dpI@F;$dyObvrEquKQua zcdomxuE0$Mox>p{-N`3MbHsCqG6RX8G?i5XBM3e)N1kjJ=Nlx7ihDGT!p4=ptsgZ! z`UwB#D7G64yKu@;Y>bHe5Uhg1QLL(EuXR4NSyan|aod6)8^+zDyrvYxm&j^r8jN&M z!R zF&E8uTHYL#khfRlgF?)5qn6<-q0-ex5|$8IN2RlNHS4;(5nMMThg8okqNPW zGaTpEU;H&X{-^X|wPgS9T@A<28djx?FuZ-&$XAOefELXXbZLXx;2yYg zpV==QJEZl~bo9GRHFKvV3_1UPqFIw{@!E@nvd`=PZ2qf$#cv~q79MGipcUk^8x3>m zbtMp?26Nb~KE6)iC9(L?W0ryUAL3&YgBKE3ajys_phsYZnGGh|E7)FBi?b$Le54DO z;TpDObp^cgfnj>*v`zwEwmvsx#Pq<2P0~&3eC?XG+*a)^wB}j}g@Mat$KYL_T{4H1 z730D?q%&AB#L!yEr*e#VO-_~#r^a4x+O-VE>P{T-#6Qlwh4bQ=f$cy+YDb>`F& z_-Wg`Lqpf?41;4KhFxM7uATc>wjUtO(ePHDKF@^LH`zhNsL`I5bsNz-ye;VkQaJ`1 zp=~5tQcOA(ukCTYapS^%=c7Zo*~=v3y_dgl8rLW(aaj;IC*;B}PZsF24vh3#V{^bf z`p>RrN6s2FYS zH5(V*t8R9D^lN}<@8=CCx|GCrUD5mU{I@TxL&Pqyvx;Pp(>~1tATaqbh>t&N`%HS8iWscjUY_TXygIBA4B)H$Dw7ck}@wVHNv#ou5IE{K#_K)L&m8_LoA4}Y$7pS>UI&Ee$_s-%X+qlrB{T^((wvIb!L0+O~*MYyS608`b zT|WR9%$YMB?s6{{>agV`HHjUduD?Uf z0h_xr_8-&<3n!4zT?A0x?v&5n5;$Vv2>9H6&2t3gIaC=TuG$n;MvHNZt4{sORVPzi zHCT@)c-M3Or9Lj867L*PbW)u(2&MRlK@}9lt>7bE$+rqV0#bKH@e7KOFqduNH(2@> zdj>1Lp`3p`GDpKZde_})Z`t_ua}~|Ue>~Zxqgf1~aBA~(f8bC0Ml*xgUL^vCF)Bx~ zfWEBVV61Kje<9GUD-K%uN7g(_W<;OVo0k9h@R!loki(}k%#H!h-W_tle?E5Rzns(p zO1Qjv9iT2KNx?$tyZcb1T8AYvh+K4(4J1`nwg&JR&`ByYU6k*Bd#bDB87lvECFpP? z#ZVy}aHK~0EUSKNn2H61{2$^p9S!fP16qJXY^Mk6_@om}fSyv82!XuN9Xzb4Gan*U z590x8()Zie)MTgX%mfB5N<)jP)4Bu(?pR=z_tm)?{oMJs@k&Gn=<5S;bW()x5085JiO~oDl33I9I}D{ zPP{>>&s@5QUPeP{p(sVOl@|?#_sY7b6XJ$c7^&As!FhN#(7*&Mn7FUz1Bi;dvZe^k z2Pi5Ixev6R5#ndBvRjdWyPf+Lz3dQCR!kS3;-SMpl2ak!n3JxY8g>ow$d4maC#`*3 zq|eyy4fMPzb>>JCfPuFq8rM~-Ph=~=D}wf49OOFi-LwZ>{_8gT)L7{2YYycrs``nSY2G^QPFO%f0fQ5Lk1)M(=&XeoQvhl1zlrn88M z1-I~(;AlRiKAk%E=e5$wK}x>>$2n6~Klz|epdH|Hb*z+usyOhinTh}<%7l}uQoo(R z!-V5UE)m`?o<3wO{&9 zQm}Hx`e4~H0W3Qn!82Y5X@#O=Uc5IY9&Z^xN5R}0!^dftL%s{J9 zV46bjLoWl~B6*(dn20St2cOLrF=k{vg({BW3RQJUTUE{DDIR@qC{IDyu#6!%j3--y zaqdyTIB1(1;JY1I>)Ar%yLoNhsn+C#dn_1!gMjN5K1N3b@a=mVaWFm1Y?eophile0#3K zyjwM1KpN#(@gBaHT}H>l7%PvU&y;k$O_lh=I?BH7#Cv`5_Q?tZ@4RmY-rIgtHt?3o zpalX{<(ql;8%;P-kYFXTDWfOa!@~jbl&>vvdV+~b4jxlSS;_tZ{O)cz-%?Xy^;C%~ zN7pAfimoT+xT_iJGN7;iSc{T5t5T>1h;tz?Db} zGFmF~&<{1H=oN8TTyz|RiLxWn&}~1!OW0@kEBlhA(x6+=JL7OU99sveH%JnQVh%`kO zXR!bx03DkPgMsG2mLfhDJkHwYWapj+eYF;x4P>b}p{cbS_$R9zuL#D5kWFCTKz1E4 zKPsJEAp6s67$}{5(pw29X`pmcv81s6x&m#zYzK^p6G#Ezg*)L(X#wEWT6V#_8=*zR zVH~^e9!kOx)Zf)pzT328c>DUg^){6zlxDJEIioukC-EFa*HD!dWLJu=Spa}GW#bfH zgeobDula7{1cel8`r4hdsZ`oGstFnYLrM@Ri^GP-1kR}G1WzC^ z@38HctDa*Eg&y>l0IaJ>O%yh}%HFk@4;*~v1_FNS@Q?fL9xi35#HJ4aK!!>$+8HW= zHbUv1qfPTe>nynQaE1dqTBdWJNTtZdq5U~%=o<(b0J4R$i~(eWv2kH=h4CRefNV?( zWcz|MV-Uz@<{EvtdCJ2@7PaTSgDdB!)m$8H20?gV+-faoM2vOO|%YV(VrJZ;bkYzjjs zDT4|!VI8I6(-G}0$fGb5O_fc`tj^edZT>Q{3E;e?7!-UmTNzETTE+tXX zwa$~b{@Pdm`MDY_8`sYzYRh?$zy{eBQA zMvI2ss;aMZ{G?g)jIuXI;#ap)UYeZ_{A-l@bqkq??2Re)Yo?cW-8~nie(guk_;Ts- zwB@tmG)NV%f{lq3p7*z3*O|=$#x8tf*lW2GlfW?x(JL?G_~_{N5>i~ z9o=pEZx3ODgI)gBVP7CyRyyODI&5GA?0DDz)7|+8MRA^S{0u5-tRbT~Q^e$2HBJ-S zT0v_Q>8&%F#u&#yg7s`uy`&luQ$a)uZ9F3? zPQ?%)c>D;GAs~Xod2n}Yzt6k7u)B9r4%2`7hck|oIC#7F{&=46^Z7tF(2iCXWCN{5 zA*hV__G(aEIRW2flzU{|V~qE+&U|zvnC`JgIJ{PH)-m1Vb2U%+3V%DEbdR&U-fKyJ zX2BaX6CHOdpmsT_1;OZvjN8HJi4wPi(GwZBgTWJBUjm+ZzGQh*qd=!AjO{-JJ%)6e zqOpDWF>sn%jEv)1I!&pj)eJo%P@Pe3G;_2n@cDSYD(gAi)Y{!|1A;x(nGN|$ut#oi z_po43(lJt(vS816Rj`Mj_Obb!o2uIoToo z$oHh}?)!;*1jP*ZFa#k5!;xjEm3(SBgM6U}ZLb@oY+YL!KnaMfkyOoB6^78pQdNmO zHbT%cVR);Apk=~vemM}dOc+iG+Tjqf#!5QP)ov7FK;7P&AttZo#3xbw*4=nj#YL%n zp+0|926u7r(`l_5^+s0wf=WCC#jnTREN_7oV2iEVM0tyY6{3A34jL--ra#G~U-)L_kob45X$7;;lo{n!$co&ZcqFR=cNI*>-A5fFF z2<4Np_$P;BSVE0U`w>y}IGkhATSn>;G_rPctF zL8C{u@@kKe5J*Yy^7u=f5t_kJ$Gq<@RRtg1d!<(9bi?}8^oi_rqvdI`5{P2j*O|EO zPgv=SDJvUlxZf;!=%0A5r*COI7?P)**qK1I>K&6(>@T6CJEbs{w0HlgM21bw*ShllW)6XBSq=z!IgFGT>P>BM;ipi7TGGN%m6D`cI1)e717t6E2t=S;+%zk1jYOdP;`)^jUZMbLGvT<& zLjD_YZpZDv5FdZ<#E298K#^)KsI>N*4L~gjtAJ!M7OF*j>fcj@Rxjo2Ez0F^4r~aw z_Q>9lqe27ffb@dIVXVOWq=*+}ip7aIaU^f@Im?0 z-4>>P+{ZYaJtGJ1Y4-*^~*lMCqiL;SfoMxIC7j*;h)f{WeQvPl;Xct7Z`&qnx>)U;qz z%M?7gst8Wq#=S(_u2Sb(Fh->)>%zDL_B6d{?_y*TUV8$< z-FD}>x*IEMl2l)jQalxXP5WkVzrmUH!KISiq(?fZiw(Bk%#R(nu{Z-J#IE^tJL>k& zy=6F(Di;1UuK9O3r06cBJDDSkkn#GKrodCVRQsRriP97TyMX}1_=ze+fZiymL_KEa zUd8uP6BP-TT8BcAkPJJhy4o{;Q27ttcvkS|+$ZJYc5Wb9gT?|D)WglT&oqV@Xrnr# z&nFKDM9a4N$LgvsulW}AW%Lk6w?=g>#88|0>|uPpwdfeEabE|MUm)Kl$pk75eX7K!amO-^l6CfjZ~ z%nfE)!<(i#G?G?hAo2}>{)1k%fEe^uU|Dy~t5IWd?)%h;o*mGdnNrj4%0x)2S4_56 zL@Ny$l>jLFdF`~jLxA%6?lLNloiwMR)+=ckrOfp$&72|O4GI~#LBdvdMC~jkdyzSDU3! zZMuZ80{RB|#;7Y9;nUOb8q8QLtd-yc{Hx=Xv6dq~Kz#OM)RQN1qY~#3A0VUs=6p+< z?^l(@JH)G>KlSe1gJq+#_aCi&vtXhP1qVAv|7W#B9P=m0vcHdVBW&4$e|Rw0;@+Fq#n!o)_ndX`fEp8Jo%ni#fYp$mM^&4x~q8p?zbWuE9kPg z*+c>dsfJF7W}em13n;zJYUsazvFQm#8b|ZMYRU(el2ar3Q^kDK1c8o*uiy@Guf<<( zsphKrKl&`ak^bzS8#HQjl`mRxWfAC_^_sBkJQ$WOJB&_SdrN0kz0hu9T2>cF7JEcm z=U~7&25tS*H2j?h#lyPh*Awz`4Msi3M&vj zh;eK^k{`r5p~fve2;RRjYcxHG=39mXcoH4E)?MW9^nzeOC8#TmB=g;t09a{A^H?kn z+d&I$5z6YjoF{#O_+@$rwg~X2a#oGX{@bIl7i@YZ=JYeOC;G8PXqK=lx4>c@ODpnB zF_M)}CUd2Fl8DSzc?lVgD}?5f%yovSTx~WN2QER7&@U7|0;mJpZWcar!`e;ZBO<>j z*`rLHmin)lV1TY6IAs5ysFkxbA2hecU{C+;Vf_EAZK`=zR!u+#yW*63vbmx+20XeBO3GRYl=(oG;X-J z+{M+JVk?h36tddtziSlTh+nebZTXV^&?f8SGua0;mGM z1WSbN*N1O4;I5;ePng!*;~VA&b6%M>EO?u|SPAVXuYozA)ZDYH3M9SJrcjq@)*?YC=MD9MpU)=C_(r9FO2=}7-LJOgQu zx3nDq14!EA&6(ET)?d;dALqYtv^KBchsInTH)B>X4ZvXjDl+Wpp>G0+7?`PrhEpfD z+s)gRQ|E1`TM-(4m3gF6{ZONp37dA)k;~OMYl{_XR8mltw{xk-wqDC{FPs(qNbwII z=HITGu`>SO5#S_iaS7T$(4L6kw`Q<8h|A(BOXmTbcP`(smv5}&Po{Y$w;}eK^HG~^ znJ>w|zDHbCakw@RC~^8rii?q>#ZEK=UGJ$$ViWIs5sNH7&n&;R$hMS~j_j;pi!2&d z<-YN3ktKz|3#yFJnX&lpwT4|nj@t8bh|50KI(`^jbpw@2#7(C7rN@&C`i I_*>Qg1#$A^_W%F@ diff --git a/docs/source/advanced.rst b/docs/source/advanced.rst deleted file mode 100644 index e47c7dae8..000000000 --- a/docs/source/advanced.rst +++ /dev/null @@ -1,45 +0,0 @@ - -.. _advanced: - -======== -Advanced -======== - -*EMQ* 2.0-rc.2 release supports `Local Subscription` and `Shared Subscription`. - ------------------- -Local Subscription ------------------- - -The *EMQ* broker will not create global routes for `Local Subscription`, and only dispatch MQTT messages on local node. - -.. code-block:: shell - - mosquitto_sub -t '$local/topic' - - mosquitto_pub -t 'topic' - -Usage: subscribe a topic with `$local/` prefix. - -------------------- -Shared Subscription -------------------- - -Shared Subscription supports Load balancing to distribute MQTT messages between multiple subscribers in the same group:: - - --------- - | | --Msg1--> Subscriber1 - Publisher--Msg1,Msg2,Msg3-->| EMQ | --Msg2--> Subscriber2 - | | --Msg3--> Subscriber3 - --------- - -Two ways to create a shared subscription: - -+-----------------+-------------------------------------------+ -| Prefix | Examples | -+-----------------+-------------------------------------------+ -| $queue/ | mosquitto_sub -t '$queue/topic | -+-----------------+-------------------------------------------+ -| $share// | mosquitto_sub -t '$share/group/topic | -+-----------------+-------------------------------------------+ - diff --git a/docs/source/bridge.rst b/docs/source/bridge.rst deleted file mode 100644 index 9b141f38d..000000000 --- a/docs/source/bridge.rst +++ /dev/null @@ -1,129 +0,0 @@ - -.. _bridge:: - -====== -Bridge -====== - ---------------- -EMQ Node Bridge ---------------- - -Two or more *EMQ* brokers could be bridged together. Bridges forward MQTT messages from one broker node to another:: - - --------- --------- --------- - Publisher --> | node1 | --Bridge Forward--> | node2 | --Bridge Forward--> | node3 | --> Subscriber - --------- --------- --------- - -Configure Bridge ----------------- - -Suppose that we create two *EMQ* brokers on localhost: - -+---------+---------------------+-----------+ -| Name | Node | MQTT Port | -+---------+---------------------+-----------+ -| emqttd1 | emqttd1@127.0.0.1 | 1883 | -+---------+---------------------+-----------+ -| emqttd2 | emqttd2@127.0.0.1 | 2883 | -+---------+---------------------+-----------+ - -Create a bridge that forwards all the 'sensor/#' messages from emqttd1 to emqttd2. - -1. Start Brokers -................ - -.. code-block:: bash - - cd emqttd1/ && ./bin/emqttd start - cd emqttd2/ && ./bin/emqttd start - -2. Create bridge: emqttd1--sensor/#-->emqttd2 -............................................. - -.. code-block:: bash - - $ cd emqttd1 && ./bin/emqttd_ctl bridges start emqttd2@127.0.0.1 sensor/# - - bridge is started. - - $ ./bin/emqttd_ctl bridges list - - bridge: emqttd1@127.0.0.1--sensor/#-->emqttd2@127.0.0.1 - -3. Test the bridge -................... - -.. code-block:: bash - - #emqttd2 - mosquitto_sub -t sensor/# -p 2883 -d - - #emqttd1 - mosquitto_pub -t sensor/1/temperature -m "37.5" -d - -4. Delete the bridge -..................... - -.. code-block:: bash - - ./bin/emqttd_ctl bridges stop emqttd2@127.0.0.1 sensor/# - --------------- -EMQ Bridge CLI --------------- - -.. code-block:: bash - - #query bridges - ./bin/emqttd_ctl bridges list - - #start bridge - ./bin/emqttd_ctl bridges start - - #start bridge with options - ./bin/emqttd_ctl bridges start - - #stop bridge - ./bin/emqttd_ctl bridges stop - ------------------ -mosquitto Bridge ------------------ - -Bridge mosquitto to emqttd broker:: - - ------------- ----------------- - Sensor ----> | mosquitto | --Bridge--> | | - ------------- | EMQ | - ------------- | Cluster | - Sensor ----> | mosquitto | --Bridge--> | | - ------------- ----------------- - -mosquitto.conf --------------- - -Suppose that we start an emqttd broker on localost:2883, and mosquitto on localhost:1883. - -A bridge configured in mosquitto.conf:: - - connection emqttd - address 127.0.0.1:2883 - topic sensor/# out 2 - - # Set the version of the MQTT protocol to use with for this bridge. Can be one - # of mqttv31 or mqttv311. Defaults to mqttv31. - bridge_protocol_version mqttv311 - ------------ -rsmb Bridge ------------ - -Bridge RSMB to EMQ broker, same settings as mosquitto. - -broker.cfg:: - - connection emqttd - addresses 127.0.0.1:2883 - topic sensor/# - diff --git a/docs/source/changes.rst b/docs/source/changes.rst deleted file mode 100644 index ead22a2dd..000000000 --- a/docs/source/changes.rst +++ /dev/null @@ -1,1739 +0,0 @@ - -.. _changes: - -======= -Changes -======= - -.. _release_2.0_rc.3: - ----------------- -Version 2.0-rc.3 ----------------- - -*Release Date: 2016-11-01* - -1. Change the three modules(Presence, Retainer, Subscription) to standalone plugins: - -+----------------------------+--------------------------------------------+ -| `emq_mod_retainer`_ | Retained Message Storage | -+----------------------------+--------------------------------------------+ -| `emq_mod_presence`_ | Publish presence message to $SYS topics | -| | when client connected or disconnected | -+----------------------------+--------------------------------------------+ -| `emq_mod_subscription`_ | Subscribe topics automatically when client | -| | connected | -+----------------------------+--------------------------------------------+ - -2. Update the SSL certificates under the etc/certs/ folder. - -3. Bugfix: Fixed a typo (#716) - -4. Bugfix: emqttd_http can not use emq_auth_http? #739 - -5. Bugfix: emq_auth_redis cannot use hostname as server address (#741) - -6. Upgrade Redis, MySQL, Postgre and MongoDB plugins to support hostname. - -.. _release_2.0_rc.2: - ----------------- -Version 2.0-rc.2 ----------------- - -*Release Date: 2016-10-19* - -1. A more user-friendly configuration for the EMQ broker. Integrate with `cuttlefish` library and adopt `K = V` syntax:: - - node.name = emqttd@127.0.0.1 - - ... - - mqtt.listener.tcp = 1883 - - ... - -2. Support OS Environments:: - - EMQ_NODE_NAME - EMQ_NODE_COOKIE - EMQ_MAX_PORTS - EMQ_TCP_PORT - EMQ_SSL_PORT - EMQ_HTTP_PORT - EMQ_HTTPS_PORT - -3. Refactor all the modules and plugins, and adopt new configuration syntax. - -TODO: issues closed. - -.. _release_2.0_rc.1: - ----------------- -Version 2.0-rc.1 ----------------- - -*Release Date: 2016-10-03* - -1. `mqtt/superuser` POST called two times in `emqtt_auth_http` (#696) - -2. Close MQTT TCP connection if authentication failed (#707) - -3. Improve the plugin management. Developer don't need to add plugin's config to rel/sys.config - -4. Add `BUILD_DEPS` in the plugin's Makefile:: - - BUILD_DEPS = emqttd - dep_emqttd = git https://github.com/emqtt/emqttd emq20 - -5. Improve the design of Redis ACL. - -.. _release_2.0_beta.3: - ------------------- -Version 2.0-beta.3 ------------------- - -*Release Date: 2016-09-18* - -New Features ------------- - -Shared Suscriptions (#639, #416):: - - mosquitto_sub -t '$queue/topic' - mosquitto_sub -t '$share/group/topic' - -Local Subscriptions that will not create global routes:: - - mosquitto_sub -t '$local/topic' - -Bugfix ------- - -Error on Loading `emqttd_auth_http` (#691) - -Remove 'emqttd' application from dependencies (emqttd_coap PR#3) - -.. _release_2.0_beta.2: - ------------------- -Version 2.0-beta.2 ------------------- - -*Release Date: 2016-09-10* - -CoAP Support ------------- - -Release an experimental CoAP Gateway: https://github.com/emqtt/emqttd_coap - -API Breaking Changes --------------------- - -'$u', '$c' variables in emqttd.conf and modules/acl.conf changed to '%u', '%c' - -Improve the design of mqtt retained message, replace emqttd_retainer with emqttd_mod_retainer. - -Add 'session.subscribed', 'session.unsubscribed' hooks, remove 'client.subscribe.after' hook - -Tab 'retained_message' -> 'mqtt_retained' - -Bugfix ------- - -[2.0 beta1] FORMAT ERROR: "~s PUBLISH to ~s: ~p" (PR #671) - -Fixing issues in cluster mode. (PR #681) - -Fixing issues with unsubscribe hook (PR #673) - -.. _release_2.0_beta.1: - ------------------- -Version 2.0-beta.1 ------------------- - -*Release Date: 2016-08-30* - -*Release Name: West of West Lake* - -EMQ - Shortened Project Name ----------------------------- - -Adopt a shortened project name: EMQ(Erlang/Enterprise/Elastic MQTT Broker),E means Erlang/OTP, Enterprise and Elastic. - -Improve the Release Management ------------------------------- - -In order to iterate the project fast, we will adopt a new release management strategy since 2.0. There will be two or three 'Preview Release' named beta1, beta2 or beta3, and then one or two 'Release Candidate' named rc1, rc2 before a Major version is production ready. - -Seperate Rel from Application ------------------------------ - -We split the emqttd 1.x project into two projects since 2.0-beta1 release to resolve the plugins' dependency issue. - -A new project named `emqttd-relx`_ is created and responsible for buiding the emqttd application and the plugins:: - - git clone https://github.com/emqtt/emqttd-relx.git - - cd emqttd-relx && make - - cd _rel/emqttd && ./bin/emqttd console - -erlang.mk and relx ------------------- - -The rebar which is used in 1.x release is replaced by `erlang.mk`_ and `relx`_ tools since 2.0-beta1 release. - -You can check the 'Makefile' and 'relx.config' in the release project of the borker: `emqttd-relx`_ . - -Improve Git Branch Management ------------------------------ - -+------------+-------------------------------------------+ -| stable | 1.x Stable Branch | -+------------+-------------------------------------------+ -| master | 2.x Master Branch | -+------------+-------------------------------------------+ -| emq10 | 1.x Developement Branch | -+------------+-------------------------------------------+ -| emq20 | 2.x Development Branch | -+------------+-------------------------------------------+ -| emq30 | 3.x Development Branch | -+------------+-------------------------------------------+ -| issue#{id} | BugFix Branch | -+------------+-------------------------------------------+ - -New Config Syntax ------------------ - -Since 2.0-beta1 release the configuration file of the broker and plugins adopt a new syntax like rebar.config and relx.config: - -etc/emqttd.conf for example:: - - %% Max ClientId Length Allowed. - {mqtt_max_clientid_len, 512}. - - %% Max Packet Size Allowed, 64K by default. - {mqtt_max_packet_size, 65536}. - - %% Client Idle Timeout. - {mqtt_client_idle_timeout, 30}. % Second - -MQTT-SN Protocol Plugin ------------------------ - -The MQTT-SN Protocol Plugin `emqttd_sn`_ has been ready in 2.0-beta1 release. The default UDP port of MQTT-SN is 1884. - -Load the plugin:: - - ./bin/emqttd_ctl plugins load emqttd_sn - -Improve the PubSub Design -------------------------- - -.. image:: _static/images/publish.png - -Improve the Plugin Management ------------------------------ - -The plugin of EMQ 2.0 broker is a normal erlang application which depends on and extends 'emqttd'. You can create a standalone plugin application project, and add it to `emqttd-relx`_ Makefile as a DEP. - -All the plugins' config files will be copied to emqttd/etc/plugins/ folder when making emqttd brinary packages in `emqttd-relx`_ project:: - - ▾ emqttd/ - ▾ etc/ - ▸ modules/ - ▾ plugins/ - emqtt_coap.conf - emqttd.conf - emqttd_auth_http.conf - emqttd_auth_mongo.conf - emqttd_auth_mysql.conf - emqttd_auth_pgsql.conf - emqttd_auth_redis.conf - emqttd_coap.conf - emqttd_dashboard.conf - emqttd_plugin_template.conf - emqttd_recon.conf - emqttd_reloader.conf - emqttd_sn.conf - emqttd_stomp.conf - -EMQ 2.0 Documentation ---------------------- - -http://emqtt.io/docs/v2/index.html - -.. _release_1.1.3: - -------------- -Version 1.1.3 -------------- - -*Release Date: 2016-08-19* - -Support './bin/emqttd_ctl users list' CLI (#621) - -Cannot publish payloads with a size of the order 64K using WebSockets (#643) - -Optimize the procedures that retrieve the Broker version and Borker description in the tick timer (PR#627) - -Fix SSL certfile, keyfile config (#651) - -------------- -Version 1.1.2 -------------- - -.. _release_1.1.2: - -------------- -Version 1.1.2 -------------- - -*Release Date: 2016-06-30* - -Upgrade mysql-otp driver to 1.2.0 (#564, #523, #586, #596) - -Fix WebSocket Client Leak (PR #612) - -java.io.EOFException using paho java client (#551) - -Send message from paho java client to javascript client (#552) - -Compatible with the Qos0 PUBREL packet (#575) - -Empty clientId with non-clean session accepted (#599) - -Update docs to fix typos (#601, #607) - -.. _release_1.1.1: - -------------- -Version 1.1.1 -------------- - -*Release Date: 2016-06-04* - -Compatible with the Qos0 PUBREL packet (#575) - -phpMqtt Client Compatibility (#572) - -java.io.EOFException using paho java client (#551) - -.. _release_1.1: - ------------ -Version 1.1 ------------ - -*Release Date: 2016-06-01* - -Highlights ----------- - -Upgrade eSockd library to 4.0 and Support IPv6 - -Support to listen on specific IP Address:: - - {mqtt, {"192.168.1.20", 1883}, [ - ... - ]}, - -Add MongoDB, HTTP Authentication/ACL Plugins - -Upgrade MySQL, PostgreSQL, Redis Plugins to support superuser authentication and avoid SQL Injection - -Enhancements ------------- - -Allow human-friendly IP addresses (PR#395) - -File operation error: emfile (#445) - -emqttd_plugin_mongo not found in emqttd (#489) - -emqttd_plugin_mongo Error While Loading in emqttd (#505) - -Feature request: HTTP Authentication (#541) - -Compatible with the Qos0 PUBREL packet (#575) - -Bugfix ------- - -Bugfix: function_clause exception occurs when registering a duplicated authentication module (#542) - -Bugfix: ./emqttd_top msg_q result: {"init terminating in do_boot",{undef,[{etop,start,[],[]},{init,start_it,1,[]},{init,start_em,1,[]}]}} (#557) - -Tests ------ - -111 common test cases. - -Dashboard Plugin ----------------- - -WebSocket Page: Support 'Clean Session', Qos, Retained parameters (emqttd_dashboard#52) - -Upgrade eSockd library to 4.0, Show OTP Release on Overview Page (emqttd_dashboard#61) - -Changing dashboard credentials for username authentication (emqttd_dashboard#56) - -Add './bin/emqttd_ctl admins' CLI,support to add/delete admins - -HTTP Auth Plugin ----------------- - -Authentication/ACL by HTTP API: https://github.com/emqtt/emqttd_auth_http - -MongoDB Plugin --------------- - -Upgrade Erlang MongoDB driver to v1.0.0 - -Support superuser authentication - -Support ACL (emqttd_plugin_mongo#3) - -MySQL Plugin ------------- - -Support superuser authentication - -Use parameterized query to avoid SQL Injection - -Postgre Plugin --------------- - -Support superuser authentication - -Use parameterized query to avoid SQL Injection - -Redis Plugin ------------- - -Support superuser authentication - -Support ClientId authentication by '%c' variable - -Reloader Plugin ---------------- - -Reload modified modules during development automatically. - -.. _release_1.0.3: - -------------- -Version 1.0.3 -------------- - -*Release Date: 2016-05-23* - -eSockd 3.2 - -MochiWeb 4.0.1 - -.. _release_1.0.2: - -------------- -Version 1.0.2 -------------- - -*Release Date: 2016-05-04* - -Issue#534 - './bin/emqttd_ctl vm' - add 'port/count', 'port/limit' statistics - -Issue#535 - emqttd_client should be terminated properly even if exception happened when sending data - -PR#519 - The erlang '-name' requires the fully qualified host name - -emqttd_reloader plugin - help reload modified modules during development. - -.. _release_l.0.1: - -------------- -Version 1.0.1 -------------- - -*Release Date: 2016-04-16* - -PR#515 - Fix '$queue' pubsub, add 'pubsub_queue' test and update docs - -.. _release_1.0: - ------------------------------------- -Version 1.0 (The Seven Mile Journey) ------------------------------------- - -*Release Date: 2016-04-13* - -*Release Name: The Seven Mile Journey* - -We finally released Version 1.0 (The Seven Mile Journey) with full documentation after two years' development and more than fifty iterations. - -The emqttd 1.0 implements a fully-featured, scalable, distributed and extensible open-source MQTT broker for IoT, M2M and Mobile applications: - -1. Full MQTT V3.1/3.1.1 Protocol Specifications Support - -2. Massively scalable - Scaling to 1 million connections on a single server - -3. Distributed - Route MQTT Messages among clustered or bridged broker nodes - -4. Extensible - LDAP, MySQL, PostgreSQL, Redis Authentication/ACL Plugins - -Bugfix and Enhancements ------------------------ - -Possible race condition using emqttd_cm (#486) - -Improve the design of retained message expiration (#503) - -Do not expire the retained messages from $SYS/# topics (#500) - -Documentation --------------- - -http://emqtt.io/docs - -http://docs.emqtt.com/ - -Thanks ------- - -Thank Ericsson for the Great Erlang/OTP Platform (http://erlang.org/)! - -Contributors on GitHub: @callbay @lsxredrain @hejin1026 @desoulter @turtleDeng @Hades32 @huangdan @phanimahesh @dvliman @Prots @joaohf - -Partners: EACG (http://eacg.de/) - -Favorite Band: The Seven Mile Journey (http://www.thesevenmilejourney.dk/) - -.. _release_0.17.1: - -------------------- -Version 0.17.1-beta -------------------- - -*Release Date: 2016-03-22* - -Enhancements ------------- - -Time unit of session 'expired_after' changed to minute. (#479) - -Dashboard ---------- - -Code Review and improve the design of Dashboard. - -.. _release_0.17.0: - -------------------- -Version 0.17.0-beta -------------------- - -*Release Date: 2016-03-15* - -Highlights ----------- - -Installation and Configuration Guide released on http://docs.emqtt.com - -Improve and Consolidate the design of Hook, Server, PubSub and Router - -Upgrade the [Web Dashboard](https://github.com/emqtt/emqttd_dashboard) to support pagination - -Bridge emqttd broker to another emqttd broker & emqttd to mosquitto bridge (#438) - -Enhancements ------------- - -emqttd_ctl: better error message (#450) - -./bin/emqttd_ctl: add 'routes' command:: - - routes list # List all routes - routes show # Show a route - -Add 'backend_subscription' table and support static subscriptions (emqttd_backend) - -Add 'retained_message' table and refactor emqttd_retainer module (emqttd_backend) - -A New Hook and Callback Design (emqttd_hook) - -Add PubSub, Hooks APIs to emqttd module (emqttd) - -Move start_listeners/0, stop_listeners/0 APIs to emqttd_app module (emqttd_app) - -Tests ------ - -Add 100+ common test cases. - -Plugins -------- - -Upgrade Dashboard, Redis, Stomp and Template Plugins - -.. _release_0.16.0: - -------------------- -Version 0.16.0-beta -------------------- - -*Release Date: 2016-02-16* - -Highlights ----------- - -Licensed under the Apache License, Version 2.0 Now. - -Improve the design of cluster, support to join or leave the cluster (#449):: - - $ ./bin/emqttd_ctl cluster - cluster join #Join the cluster - cluster leave #Leave the cluster - cluster remove #Remove the node from cluster - cluster status #Cluster status - -Improve the design of Trie and Route, only the wildcard topics stored in Trie. - -Common Test to replace EUnit. - -Enhancements ------------- - -mqtt_message record: add 'sender' field (#440) - -refactor the emqttd, emqttd_time, emqttd_opts, emqttd_node modules. - -Bugfix ------- - -noproc error when call to gen_server2:call(false, {add_route,Topic,<0.685.0>}, infinity) (#446) - -Plugins -------- - -Changed the license of all plugins. - -.. _release_0.15.0: - -------------------- -Version 0.15.0-beta -------------------- - -*Release Date: 2016-01-31* - -Highlights ----------- - -Optimize for Push Application, 500K+ Subscribers to a Topic. - -Optimization for Route ETS insertion (#427) - -Priority Message Queue for Persistent Session (#432) - -Add Redis, MongoDB Plugins (#417) - -Enhancements ------------- - -Username/Password Authentication: Support to configure default users (#428) - -Improve CLI Commands: pubsub, bridges, trace (#429) - -emqttd_mod_subscription: fix client_connected/3 - -emqttd_auth_mod: add passwd_hash/2 function - -priority_queue: add plen/2, out/2 functions - -Bugfix ------- - -Fix dequeue/1 of emqttd_bridge... - -Add emqttd:seed_now/0 function - -Plugins -------- - -emqttd_plubin_mysql: Changed mysql driver to mysql-otp - -emqttd_plugin_pgsql: Integrate with ecpool - -emqttd_plugin_redis: First release - -emqttd_plugin_mongo: First release - -.. _release_0.14.1: - -------------------- -Version 0.14.1-beta -------------------- - -*Release Date: 2015-12-28* - -Bugfix: emqttd_ws_client.erl: Unexpected Info: {'EXIT',<0.27792.18>,{shutdown,destroy}} (#413) - -Improve: fix spec errors found by dialyzer - -.. _release_0.14.0: - -------------------- -Version 0.14.0-beta -------------------- - -*Release Date: 2015-12-18* - -Highlights ----------- - -Scaling to 1.3 Million Concurrent MQTT Connections on a 12 Core, 32G CentOS server. - -New PubSub, Router Design (#402). Prepare for scaling to 10 millions on one cluster. - -Enhancements ------------- - -Improve the gproc_pool usage with a general emqttd_pool_sup - -Improve the design of emqttd_pubsub, add a new emqttd_router module - -Improve the design of the whole supervisor tree - -Route aging mechanism to remove the topics that have no subscriptions - -Improve the dashboard, mysql, pgsql, stomp, sockjs plugins - -Add 'topics', 'subscriptions' admin commands - -Avoid using mnesia table index and mnesia:index_read API to lower CPU usage - -Subscribe timeout exception (#366) - -Long Delay on Multiple Topic Subscription (#365) - -Subscriptions persistence (#344) - -emqttd_ctl: 'subscriptions' command to force clients to subscribe some topics (#361) - -Bugfix ------- - -emqttd_sm: spec of lookup_session/1 is not right BUG (#411) - -Observer application should be removed from reltool.config for 'wx' app is not available (#410) - -Benchmark ---------- - -1.3 million concurrent MQTT connections on a 12 Core, 32G CentOS Server, consume about 15G Memory and 200% CPU. - -.. _release_0.13.1: - -------------------- -Version 0.13.1-beta -------------------- - -*Release Date: 2015-11-28* - -Bugfix: Plugin pathes error under windows (#387) - -Improve: Too many error logs "[error] Session ..... Unexpected EXIT: client_pid=<0.14137.35>, exit_pid=<0.30829.22>, reason=nop..." (#383) - -Improve: Define QOS0/1/2, Pooler Error (PR#382) - -Improve: High CPU load when 400K unstable mobile connections (#377) - -BugFix: emqttd_plugin_pgsql - error using same query with latest update plugin (pgsql#5) - -.. _release_0.13.0: - -------------------- -Version 0.13.0-beta -------------------- - -*Release Date: 2015-11-08* - -Highlights ----------- - -Rate Limiting based on [Token Bucket](https://en.wikipedia.org/wiki/Token_bucket) and [Leaky Bucket](https://en.wikipedia.org/wiki/Leaky_bucket#The_Leaky_Bucket_Algorithm_as_a_Meter) Algorithm - -Upgrade eSockd and MochiWeb libraries to support Parameterized Connection Module - -Improve emqttd_client to support fully asynchronous socket networking - -Enhancements ------------- - -Protocol Compliant - Session Present Flag (#163) - -Compilation fails if repo is cloned with a different name (#348) - -emqttd_client: replace gen_tcp:send with port_command (#358) - -TCP sndbuf, recbuf, buffer tuning (#359) - -emqttd_client.erl to handle 'inet_async', 'inet_reply' properly (#360) - -Refator the [client/session management design](https://github.com/emqtt/emqttd/blob/master/doc/design/ClientSession.md) - -Bugfix ------- - -Cannot kick transient client out when clientId collision (#357) - -Fix the order of emqttd_app:start_server/1 (#367) - -emqttd_session:subscribe/2 will crash (#374) - -Benchmark ---------- - -[benchmark for 0.13.0 release](https://github.com/emqtt/emqttd/wiki/benchmark-for-0.13.0-release) - -3.1G memory and 50+ CPU/core: - -.. code-block:: bash - - Connections: 250K - Subscribers: 250K - Topics: 50K - Qos1 Messages/Sec In: 4K - Qos1 Messages/Sec Out: 20K - Traffic In(bps): 12M+ - Traffic Out(bps): 56M+ - -.. _release_0.12.3: - -------------------- -Version 0.12.3-beta -------------------- - -*Release Date: 2015-10-22* - -Bugfix: emqttd_sysmon crasher for 'undefined' process_info (#350) - -Bugfix: emqttd_client: catch parser exception (#353) - -.. _release_0.12.2: - -------------------- -Version 0.12.2-beta -------------------- - -*Release Date: 2015-10-16* - -Bugfix: Retained messages should not be expired if 'broker.retained.expired_after = 0' (#346) - -.. _release_0.12.1: - -------------------- -Version 0.12.1-beta -------------------- - -*Release Date: 2015-10-15* - -Highlight: Release for Bugfix and Code Refactor. - -Feature: Retained message expiration (#182) - -Improve: '$SYS/#' publish will not match '#' or '+/#' (#68) - -Improve: Add more metrics and ignore '$SYS/#' publish (#266) - -Improve: emqttd_sm should be optimized for clustered nodes may be crashed (#282) - -Improve: Refactor emqttd_sysmon and suppress 'monitor' messages (#328) - -Task: benchmark for 0.12.0 release (#225) - -Benchmark: About 900K concurrent connections established on a 20Core, 32G CentOS server. - -.. _release_0.12.0: - -------------------- -Version 0.12.0-beta -------------------- - -*Release Date: 2015-10-08* - -Highlights ----------- - -Enhance the **emqttd_ctl** module to allow plugins to register new commands (#256) - -Add [emqttd_recon plugin](https://github.com/emqtt/emqttd_recon) to debug/optimize the broker (#235) - -Add **'./bin/emqttd_ctl broker pubsub'** command to check the status of core pubsub processes - -Add **'./bin/emqttd_top'** command(like etop) to show the top 'msg_q', 'reductions', 'memory' or 'runtime' processes - -'rel/files/emqttd.config.production' for production deployment(default) - -'rel/files/emqttd.config.development' for development deployment - -Enhancements ------------- - -Qos1/2 messages will not be dropped under unstable mobile network (#264) - -**emqttd_session:subscribe/2, emqttd_session:unsubscribe/2** APIs should be asynchronous (#292) - -**etc/emqttd.config**: 'idle_timeout' option to close the idle client(socket connected but no 'CONNECT' frame received) - -**etc/emqttd.config**: 'unack_retry_interval' option for redelivering Qos1/2 messages - -How to monitor large 'message_queue_len' (#283) - -Bugfix ------- - -Behaviour emqttd_auth_mod is missing init callback (#318) - -Benchmark ---------- - -Write a new [benchmark tool](https://github.com/emqtt/emqtt_benchmark) to benchmark this release - -Hw requirements - 5K users, 25-50 msgs/sec, QoS=1 (#209) - -Supported Number of Connections Greatly Reduced When Clients are Subscribing (#324) - -.. _release_0.11.0: - -------------------- -Version 0.11.0-beta -------------------- - -*Release Date: 2015-09-25* - -Highlight: Rebar to manage plugin dependencies. - -Highlight: [Stomp](https://github.com/emqtt/emqttd_stomp) and [SockJS](https://github.com/emqtt/emqttd_sockjs) Plugins! - -Improve: add rel/files/emqttd.config.development|production. - -Improve: rel/reltool.config.script to release deps of plugin. - -Improve: persist mnesia schema on slave nodes. - -Improve: use timer:seconds/1 api. - -Improve: The binary release will be compiled with R18.1 now. - -Bugfix: issue#306 - emqttd_cm should unregister the duplicated client - -Bugfix: issue#310 - usage of emqttd_ctl error: 'session list' should be 'sessions list' - -Bugfix: issue#311 - './bin/emqttd_ctl sessions list' error - -Bugfix: issue#312 - unsubcribe will lead to crash if emqttd_plugin_template plugin loaded - -.. _release_0.10.4: - -------------------- -Version 0.10.4-beta -------------------- - -*Release Date: 2015-09-18* - -Optimize session management and upgrade eSockd library to 2.7.1 - -[Benchmark for 0.10.4 release](https://github.com/emqtt/emqttd/wiki/benchmark-for-0.10.4-release) - -Improve: issue#294 - [error] failed to start connection on 0.0.0.0:1883 - enotconn - -Improve: issue#297 - How do I allow user with some pattern to access topic with some pattern? - -Bugfix: issue#291 - "./bin/emqttd attach ..." cannot work - -Bugfix: issue#284 - Should not use erlang:list_to_atom/1 in emqttd_vm.erl - -.. _release_0.10.3: - -------------------- -Version 0.10.3-beta -------------------- - -*Release Date: 2015-08-30* - -Bugfix: issue#271 - add emqttd_ws_client:subscribe/2 function - -Bugfix: issue#269 - bin/emqttd Syntax error on ubuntu - -Improve: issue#265 - client under unstable mobile network generate a lot of logs - -.. _release_0.10.2: - -------------------- -Version 0.10.2-beta -------------------- - -*Release Date: 2015-08-26* - -Improve: issue#257 - After the node name changed, the broker cannot restart for mnesia schema error. - -.. _release_0.10.1: - -------------------- -Version 0.10.1-beta -------------------- - -*Release Date: 2015-08-25* - -Bugfix: issue#259 - when clustered the emqttd_dashboard port is close, and the 'emqttd' application cannot stop normally. - -Feature: issue#262 - Add 'http://host:8083/mqtt/status' Page for health check - -.. _release_0.10.0: - -------------------- -Version 0.10.0-beta -------------------- - -*Release Date: 2015-08-20* - -[Web Dashboard](https://github.com/emqtt/emqttd_dashboard) and [MySQL](https://github.com/emqtt/emqttd_plugin_mysql), [PostgreSQL](https://github.com/emqtt/emqttd_plugin_pgsql) Authentication/ACL Plugins! - -Highlight: Web Dashboard to monitor Statistics, Metrics, Clients, Sessions and Topics of the broker. - -Highlight: JSON/HTTP API to query all clients connected to broker. - -Highlight: A new [Plugin Design](https://github.com/emqtt/emqttd/wiki/Plugin%20Design) and a [Template project](https://github.com/emqtt/emqttd_plugin_template) for plugin development. - -Highlight: Authentication/ACL with MySQL, PostreSQl databases (#194, #172) - -Feature: Session Statistics including inflight_queue, message_queue, message_dropped, awaiting_rel, awaiting_ack, awaiting_comp (#213) - -Feature: Cookie based authentication for MQTT over websocket connections (#231) - -Feature: Get all clients connected to the broker (#228, #230, #148, #129) - -Feature: "./bin/emqttd_ctl clients show ClientId" to query client status (#226) - -Feature: "./bin/emqttd_ctl clients kick ClientId" to kick out a client - -Feature: "./bin/emqttd_ctl sessions list" to show all sessions - -Feature: "./bin/emqttd_ctl sessions show ClientId" to show a session - -Feature: Erlang VM metrics monitor with Web Dashboard (#59) - -Improve: Too many "inflight queue is full!" log when session is overloaded (#247) - -Improve: There are two many "MQueue(~s) drop ~s" logs if the message queue of session is small (#244) - -Improve: gen_server2(from RabbitMQ) to improve emqttd_session, emqttd_pubsub - -Improve: Makefile to build plugins - -Bugfix: emqttd_broker:unhook/2 cannot work (#238) - -Bugfix: emqttd plugin cannot include_lib("emqttd/include/emqttd.hrl") (#233) - -Bugfix: Too many 'Session ~s cannot find PUBACK' logs (#212) - -Bugfix: emqttd_pooler cannot work - -.. _release_0.9.3: - -------------------- -Version 0.9.3-alpha -------------------- - -*Release Date: 2015-07-25* - -Wiki: [Bridge](https://github.com/emqtt/emqttd/wiki/Bridge) - -Improve: emqttd_protocol.hrl to define 'QOS_I' - -Improve: emqttd_pubsub to add subscribe/2 API - -Improve: ./bin/emqttd_ctl to support new bridges command - -Bugfix: issue #206 - Cannot bridge two nodes - -.. _release_0.9.2: - -------------------- -Version 0.9.2-alpha -------------------- - -*Release Date: 2015-07-18* - -Improve: issue #196 - Add New Hook 'client.subscribe.after' - -.. _release_0.9.1: - -------------------- -Version 0.9.1-alpha -------------------- - -*Release Date: 2015-07-10* - -Bugfix: issue #189 - MQTT over WebSocket(SSL) cannot work? - -Bugfix: issue #193 - 'client.ack' hook should be renamed to 'message.acked', and called by emqttd_broker:foreach_hooks - -.. _release_0.9.0: - -------------------- -Version 0.9.0-alpha -------------------- - -*Release Date: 2015-07-09* - -[Session, Queue, Inflight Window, Hooks, Global MessageId and More Protocol Compliant](https://github.com/emqtt/emqttd/releases/tag/0.9.0-alpha) Now! - -Feature: Session/Queue/Inflight Window Design (#145). - -Feature: Support to resume a persistent session on other clustered node. - -Feature: Support alarm management. - -Feature: emqttd_guid to generate global unique message id. - -Feature: Hooks for message pub/ack. - -Feature: Protocol compliant - message ordering, timeout and retry. - -Improve: Every client will start_link a session process, whether or not the client is persistent. - -Improve: etc/emqttd.config to support more session, queue configuration. - -Improve: issue #179 - Max offline message queue {max_queue, 100} meaning. - -Improve: issue #180 - Should change project structure for other projects maybe depend on 'emqttd'. Merge emqtt, emqttd apps. - -Improve: issue #185 - PacketId and MessageId: the broker should generate global unique message id. - -Improve: issue #187 - etc/emqttd.config to support https listener - -Improve: issue #186 - emqttd_cm to store client details - -Improve: issue #174 - add 'from' field to mqtt_message record. - -Improve: issue #170 - $SYS Topics should support alarms. - -Improve: issue #169 - Add More [Hooks](https://github.com/emqtt/emqttd/wiki/Hooks-Design) - -Improve: issue #167 - Inflight window to assure message ordering. - -Improve: issue #166 - Message delivery timeout and retry. - -Improve: issue #143 - Qos1, Qos2 PubSub message timeout. - -Improve: issue #122 - Labeling message with unique id. emqttd_guid module to generate global unique msgid. - -Improve: emqttd_bridge to support pending message queue, and fix the wrong Qos design. - -Improve: mqtt_message record to add 'msgid', 'from' and 'sys' fields. - -Change: Add emqttd_mqueue, emqttd_guid, emqttd_alarm modules. - -Bugfix: issue #184 - emqttd_stats:setstats is not right. - -Bugfix: Closed issues #181, #119. - -Tests: fix the parser, acl test cases. - -.. _release_0.8.6: - ------------------- -Version 0.8.6-beta ------------------- - -*Release Date: 2015-06-17* - -Bugfix: issue #175 - publish Will message when websocket is closed without 'DISCONNECT' packet - -.. _release_0.8.5: - ------------------- -Version 0.8.5-beta ------------------- - -*Release Date: 2015-06-10* - -Bugfix: issue #53 - client will receive duplicate messages when overlapping subscription - -.. _release_0.8.4: - ------------------- -Version 0.8.4-beta ------------------- - -*Release Date: 2015-06-08* - -Bugfix: issue #165 - duplicated message when publish 'retained' message to persistent client - -.. _release_0.8.3: - ------------------- -Version 0.8.3-beta ------------------- - -*Release Date: 2015-06-05* - -Bugfix: issue #158 - should queue:in new message after old one dropped - -Bugfix: issue #155 - emqtt_parser.erl: parse_topics/3 should reverse topics - -Bugfix: issue #149 - Forget to merge plugins/emqttd_auth_mysql from 'dev' branch to 'master' in 0.8.x release - -.. _release_0.8.2: - -------------------- -Version 0.8.2-alpha -------------------- - -*Release Date: 2015-06-01* - -Bugfix: issue #147 - WebSocket client cannot subscribe queue '$Q/queue/${clientId}' - -Bugfix: issue #146 - emqttd_auth_ldap: fill(Username, UserDn) is not right - -.. _release_0.8.1: - -------------------- -Version 0.8.1-alpha -------------------- - -*Release Date: 2015-05-28* - -Client [Presence](https://github.com/emqtt/emqttd/wiki/Presence) Support and [$SYS Topics](https://github.com/emqtt/emqttd/wiki/$SYS-Topics) Redesigned! - -Bugfix: issue #138 - when client disconnected normally, broker will not publish disconnected $SYS message - -Bugfix: fix websocket url in emqttd/priv/www/websocket.html - -Improve: etc/emqttd.config to allow websocket connections from any hosts - -Improve: rel/reltool.config to exclude unnecessary apps. - -.. _release_0.8.0: - -------------------- -Version 0.8.0-alpha -------------------- - -*Release Date: 2015-05-25* - -[Hooks](https://github.com/emqtt/emqttd/wiki/Hooks%20Design), Modules and [Plugins](https://github.com/emqtt/emqttd/wiki/Plugin%20Design) to extend the broker Now! - -Plugin: emqttd_auth_mysql - MySQL authentication plugin (issues #116, #120) - -Plugin: emqttd_auth_ldap - LDAP authentication plugin - -Feature: emqttd_broker to support Hooks API - -Feature: issue #111 - Support 'Forced Subscriptions' by emqttd_mod_autosub module - -Feature: issue #126 - Support 'Rewrite rules' by emqttd_mod_rewrite module - -Improve: Support hooks, modules to extend the broker - -Improve: issue #76 - dialyzer check - -Improve: 'Get Started', 'User Guide', 'Developer Guide' Wiki - -Improve: emqtt_topic to add join/1, feed_var/3, is_queue/1 - -Improve: emqttd_pooler to execute common tasks - -Improve: add emqttd_sm_sup module, and use 'hash' gproc_pool to manage sessions - -Tests: add more test cases for 'emqttd' app - -.. _release_0.7.1: - -------------------- -Version 0.7.1-alpha -------------------- - -*Release Date: 2015-05-04* - -Add doc/design/* and merge doc/* to github Wiki - -Bugfix: issue #121 - emqttd cluster issuse - -Bugfix: issue #123 - emqttd:unload_all_plugins/0 cannot unload any plugin - -Bugfix: fix errors found by dialyzer - -.. _release_0.7.0: - -------------------- -Version 0.7.0-alpha -------------------- - -*Release Date: 2015-05-02* - -[MQTT over WebSocket(SSL)](https://github.com/emqtt/emqttd/wiki/MQTT-Over-WebSocket) Now! - -[Plugin Achitecture](https://github.com/emqtt/emqttd/wiki/Plugin%20Design) based on OTP application - -[Trace MQTT Packets or Messages](https://github.com/emqtt/emqttd/wiki/Trace%20Design) to log files - -Feature: issue #40, #115 - WebSocket/SSL Support - -Feature: issue #49, #105 - Plugin Architecture Support - -Feature: issue #93 - Trace API Design - -Improve: issue #109 - emqttd_broker should add subscribe, notify API - -Improve: update README.md to add 'Goals', 'Contributors' chapters - -Change: rename etc/app.config to etc/emqttd.config - -Change: etc/emqttd.config changed - -Bugfix: critical issue #54 - error when resume session! - -Bugfix: issue #118 - error report when UNSUBSCRIBE with no topics - -Bugfix: issue #117 - sys_interval = 0 config cannot work - -Bugfix: issue #112 - Makefile to support build plugins - -Bugfix: issue #96 - "make clean" cannot work - -.. _release_0.6.2: - -------------------- -Version 0.6.2-alpha -------------------- - -*Release Date: 2015-04-24* - -Bugfix: critical issue #54, #104, #106 - error when resume session - -Improve: add emqttd_cm_sup module, and use 'hash' gproc_pool to register/unregister client ids - -Improve: kick old client out when session is duplicated. - -Improve: move mnesia dir config from etc/app.config to etc/vm.args - -.. _release_0.6.1: - -------------------- -Version 0.6.1-alpha -------------------- - -*Release Date: 2015-04-20* - -Integrate with [gproc library](https://github.com/uwiger/gproc) to support pool - -Feature: issues#91 - should use worker_pool to handle some async work? - -Feature: issues#95 - Topic filters in ACL rule should support 'eq' tag - -Improve: issues#84 - emqttd_pubsub is redesigned again to protect mnesia transaction - -Improve: issues#74 - ACL Support and update [ACL Design Wiki](https://github.com/emqtt/emqttd/wiki/ACL-Design) - -.. _release_0.6.0: - -------------------- -Version 0.6.0-alpha -------------------- - -*Release Date: 2015-04-17* - -ACL Support Now: [ACL-Design Wiki](https://github.com/emqtt/emqttd/wiki/ACL-Design) - -Authentication with username, clientid Now: [Authentication Wiki](https://github.com/emqtt/emqttd/wiki/Authentication) - -Seperate common MQTT library to 'emqtt' application - -Redesign message pubsub, route and retain modules - -Redesign mnesia database cluster - -Feature: issues#47 - authentication, authorization support - -Feature: issues#92 - merge emqttd_acl and emqttd_auth to emqttd_access_control - -Feature: emqttd_acl_mod, emqttd_auth_mod behaviour to extend ACL, authentication - -Feature: issues#85 - lager:info to log subscribe, unsubscribe actions - -Feature: issues#77 - authentication with clientid, ipaddress - -Improve: issues#90 - fix lager_file_backend log format, and rotate 10 log files - -Improve: issues#88 - use '-mneisa_create', '-mnesia_replicate' attributes to init mneisa - -Improve: issues#87 - record mqtt_user and mqtt_client is duplicated - -Improve: issues#81 - redesign nodes cluster to support disc_copies mnesia tables - -Improve: issues#80 - redesign emqttd_cm to handle more concurrent connections - -Improve: issues#70 - how to handle connection flood? Now could support 2K+ CONNECT/sec - -Change: redesign mnesia tables: message, topic, subscriber, trie, trie_node - -Bugfix: issues#83 - emqttd_broker stats cannot work - -Bugfix: issues#75 - careless about function name when emqttd_pubsub handle getstats message - -.. _release_0.5.5: - ------------------- -Version 0.5.5-beta ------------------- - -*Release Date: 2015-04-09* - -Bugfix: issue #75 - careless about function name when emqttd_pubsub handle getstats message. - -Bugfix: issue #79 - cannot find topic_subscriber table after cluster with other nodes. - -.. _release_0.5.4: - -------------------- -Version 0.5.4-alpha -------------------- - -*Release Date: 2015-03-22* - -Benchmark this release on a ubuntu/14.04 server with 8 cores, 32G memory from QingCloud.com:: - - 200K Connections, - 30K Messages/Sec, - 20Mbps In/Out Traffic, - 200K Topics, - 200K Subscribers, - - Consumed 7G memory, 40% CPU/core - -Benchmark code: https://github.com/emqtt/emqttd_benchmark - -Change: rewrite emqttd_pubsub to handle more concurrent subscribe requests. - -Change: ./bin/emqttd_ctl add 'stats', 'metrics' commands. - -Bugfix: issue #71, #72 - -.. _release_0.5.3: - -------------------- -Version 0.5.3-alpha -------------------- - -*Release Date: 2015-03-19* - -Bugfix: issues#72 - emqttd_cm, emqtt_sm ets:match_delete/2 with wrong pattern - -.. _release_0.5.2: - -------------------- -Version 0.5.2-alpha -------------------- - -*Release Date: 2015-03-18* - -Change: upgrade esockd to 2.1.0-alpha, do not tune socket buffer for mqtt connection. - -.. _release_0.5.1: - -------------------- -Version 0.5.1-alpha -------------------- - -*Release Date: 2015-03-13* - -Change: upgrade esockd to v1.2.0-beta, rename 'acceptor_pool' to 'acceptors' - -.. _release_0.5.0: - -------------------- -Version 0.5.0-alpha -------------------- - -*Release Date: 2015-03-12* - -RENAME 'emqtt' to 'emqttd'! - -Support [Broker Bridge](https://github.com/emqtt/emqttd/wiki/Bridge-Design) Now! - -Change: rename project from 'emqtt' to 'emqttd' - -Change: lager:debug to dump RECV/SENT packets - -Feature: emqttd_bridge, emqttd_bridge_sup to support broker bridge - -Feature: emqtt_event to publish client connected/disconnected message to $SYS topics - -Feature: ./bin/emqttd_ctl add more commands: listeners, broker, bridges, start_bridge, stop_bridge... - -Feature: issue#57 - support to configure max packet size - -Feature: issue#68 - if sys_interval = 0, emqttd_broker will not publish messages to $SYS/brokers/# - -Bugfix: issue#67 - subscribe '#' to receive all messages - -Bugfix: issue#64 - emqtt_app start/2: should wait_for_databases - -Test: emqttd_topic_tests add more '_match_test' - -.. _release_0.4.0: - -------------------- -Version 0.4.0-alpha -------------------- - -*Release Date: 2015-03-10* - -Support [$SYS Topics of Broker](https://github.com/emqtt/emqttd/wiki/$SYS-Topics-of-Broker) Now! - -Feature: emqtt_broker to publish version, uptime, datetime to $SYS/brokers/# topics - -Feature: emqtt_broker to publish count of clients, sessions, suscribers to $SYS/brokers/# topics - -Feature: emqtt_metrics to publish bytes, packets, messages metrics to $SYS/brokers/# topics - -Feature: add include/emqtt_systop.hrl - -Change: emqtt_cm to count current clients - -Change: emqtt_sm to count current sessions - -Change: emqtt_pubsub to count current topics and suscribers - -Change: emqtt_pubsub to add create/1 API - -Change: emqtt_pubsub dispatch/2 to return number of subscribers - -Change: emqtt_pubsub to count 'dropped' messages - -Change: emqtt_opts to add merge/2 function - -Test: add emqtt_serialiser_tests.erl - -.. _release_0.3.4: - ------------------- -Version 0.3.4-beta ------------------- - -*Release Date: 2015-03-08* - -Bugfix: emqtt_serialiser.erl cannot serialise UNSUBACK packets - -.. _release_0.3.3: - ------------------- -Version 0.3.3-beta ------------------- - -*Release Date: 2015-03-07* - -Bugfix: emqtt_serialiser.erl cannot serialise PINGRESP issue#60 - -.. _release_0.3.2: - ------------------- -Version 0.3.2-beta ------------------- - -*Release Date: 2015-03-05* - -Improve: merge emqttc serialiser, parser, packet - -Add: emqtt_opts to merge socket options - -.. _release_0.3.1: - ------------------- -Version 0.3.1-beta ------------------- - -*Release Date: 2015-03-02* - -Feature: SSL Socket Support - -Feature: issue#44 HTTP API should add Qos parameter - -Bugfix: issue#52 emqtt_session crash - -Bugfix: issue#53 sslsocket keepalive error - -Upgrade: esockd to v0.2.0 - -Upgrade: mochiweb to v3.0.0 - -.. _release_0.3.0: - ------------------- -Version 0.3.0-beta ------------------- - -*Release Date: 2015-01-19* - -Feature: HTTP POST API to support 'qos', 'retain' parameters - -Feature: $SYS system topics support - -Change: Rewrite emqtt_topic.erl, use '', '#', '+' to replace <<"">>, <<"#">>, <<"+">> - -Change: fix emqtt_pubsub.erl to match '#', '+' - -Tests: emqtt_topic_tests.erl add more test cases - -------------------- -Version 0.3.0-alpha -------------------- - -*Release Date: 2015-01-08* - -NOTICE: Full MQTT 3.1.1 support now! - -Feature: Passed org.eclipse.paho.mqtt.testing/interoperability tests - -Feature: Qos0, Qos1 and Qos2 publish and suscribe - -Feature: session(clean_sess=false) management and offline messages - -Feature: redeliver awaiting puback/pubrec messages(doc: Chapter 4.4) - -Feature: retain messages, add emqtt_server module - -Feature: MQTT 3.1.1 null client_id support - -Bugfix: keepalive timeout to send will message - -Improve: overlapping subscription support - -Improve: add emqtt_packet:dump to dump packets - -Test: passed org.eclipse.paho.mqtt.testing/interoperability - -Test: simple cluster test - -Closed Issues: #22, #24, #27, #28, #29, #30, #31, #32, #33, #34, #36, #37, #38, #39, #41, #42, #43 - -.. _release_0.2.1: - ------------------- -Version 0.2.1-beta ------------------- - -*Release Date: 2015-01-08* - -pull request 26: Use binaries for topic paths and fix wildcard topics - -emqtt_pubsub.erl: fix wildcard topic match bug caused by binary topic in 0.2.0 - -Makefile: deps -> get-deps - -rebar.config: fix mochiweb git url - -tag emqtt release accoding to [Semantic Versioning](http://semver.org/) - -max clientId length is 1024 now. - -.. _release_0.2.0: - -------------- -Version 0.2.0 -------------- - -*Release Date: 2014-12-07* - -rewrite the project, integrate with esockd, mochiweb - -support MQTT 3.1.1 - -support HTTP to publish message - -.. _release_0.1.5: - -------------- -Version 0.1.5 -------------- - -*Release Date: 2013-01-05* - -Bugfix: remove QOS_1 match when handle PUBREL request - -Bugfix: reverse word in emqtt_topic:words/1 function - -.. _release_0.1.4: - -------------- -Version 0.1.4 -------------- - -*Release Date: 2013-01-04* - -Bugfix: fix "mosquitto_sub -q 2 ......" bug - -Bugfix: fix keep alive bug - -.. _release_0.1.3: - -------------- -Version 0.1.3 -------------- - -*Release Date: 2013-01-04* - -Feature: Support QOS2 PUBREC, PUBREL, PUBCOMP messages - -Bugfix: fix emqtt_frame to encode/decoe PUBREC/PUBREL messages - -.. _release_0.1.2: - -------------- -Version 0.1.2 -------------- - -*Release Date: 2012-12-27* - -Feature: release support like riak - -Bugfix: use ?INFO/?ERROR to print log in tcp_listener.erl - -.. _release_0.1.1: - -------------- -Version 0.1.1 -------------- - -*Release Date: 2012-09-24* - -Feature: use rebar to generate release - -Feature: support retained messages - -Bugfix: send will msg when network error - -.. _release_0.1.0: - -------------- -Version 0.1.0 -------------- - -*Release Date: 2012-09-21* - -The first public release. - -.. _erlang.mk_: https://erlang.mk -.. _relx_: https://github.com/erlware/relx -.. _emqttd_: https://github.com/emqtt/emqttd -.. _emqttd_relx: https://github.com/emqtt/emqttd-relx -.. _emqttd_sn: http://github.com/emqtt/emqttd_sn - -.. _emq_mod_retainer: https://github.com/emqtt/emq_mod_retainer -.. _emq_mod_presence: https://github.com/emqtt/emq_mod_presence -.. _emq_mod_subscription: https://github.com/emqtt/emq_mod_subscription - diff --git a/docs/source/cluster.rst b/docs/source/cluster.rst deleted file mode 100644 index c8ab9cef9..000000000 --- a/docs/source/cluster.rst +++ /dev/null @@ -1,276 +0,0 @@ - -.. _cluster: - -========== -Clustering -========== - ----------------------- -Distributed Erlang/OTP ----------------------- - -Erlang/OTP is a concurrent, fault-tolerant, distributed programming platform. A distributed Erlang/OTP system consists of a number of Erlang runtime systems called 'node'. Nodes connect to each other with TCP/IP sockets and communicate by Message Passing. - -.. code:: - - --------- --------- - | Node1 | --------| Node2 | - --------- --------- - | \ / | - | \ / | - | / \ | - | / \ | - --------- --------- - | Node3 | --------| Node4 | - --------- --------- - -Node ----- - -An erlang runtime system called 'node' is identified by a unique name like email addreass. Erlang nodes communicate with each other by the name. - -Suppose we start four Erlang nodes on localhost: - -.. code-block:: bash - - erl -name node1@127.0.0.1 - erl -name node2@127.0.0.1 - erl -name node3@127.0.0.1 - erl -name node4@127.0.0.1 - -connect all the nodes:: - - (node1@127.0.0.1)1> net_kernel:connect_node('node2@127.0.0.1'). - true - (node1@127.0.0.1)2> net_kernel:connect_node('node3@127.0.0.1'). - true - (node1@127.0.0.1)3> net_kernel:connect_node('node4@127.0.0.1'). - true - (node1@127.0.0.1)4> nodes(). - ['node2@127.0.0.1','node3@127.0.0.1','node4@127.0.0.1'] - -epmd ----- - -epmd(Erlang Port Mapper Daemon) is a daemon service that is responsible for mapping node names to machine addresses(TCP sockets). The daemon is started automatically on every host where an Erlang node started. - -.. code-block:: bash - - (node1@127.0.0.1)6> net_adm:names(). - {ok,[{"node1",62740}, - {"node2",62746}, - {"node3",62877}, - {"node4",62895}]} - -Cookie ------- - -Erlang nodes authenticate each other by a magic cookie when communicating. The cookie could be configured by:: - - 1. $HOME/.erlang.cookie - - 2. erl -setcookie - -.. NOTE:: Content of this chapter is from: http://erlang.org/doc/reference_manual/distributed.html - --------------- -Cluster Design --------------- - -The cluster architecture of emqttd broker is based on distrubuted Erlang/OTP and Mnesia database. - -The cluster design could be summarized by the following two rules: - -1. When a MQTT client SUBSCRIBE a Topic on a node, the node will tell all the other nodes in the cluster: I subscribed a Topic. - -2. When a MQTT Client PUBLISH a message to a node, the node will lookup the Topic table and forward the message to nodes that subscribed the Topic. - -Finally there will be a global route table(Topic -> Node) that replicated to all nodes in the cluster:: - - topic1 -> node1, node2 - topic2 -> node3 - topic3 -> node2, node4 - -Topic Trie and Route Table --------------------------- - -Every node in the cluster will store a topic trie and route table in mnesia database. - -Suppose that we create subscriptions: - -+----------------+-------------+----------------------------+ -| Client | Node | Topics | -+================+=============+============================+ -| client1 | node1 | t/+/x, t/+/y | -+----------------+-------------+----------------------------+ -| client2 | node2 | t/# | -+----------------+-------------+----------------------------+ -| client3 | node3 | t/+/x, t/a | -+----------------+-------------+----------------------------+ - -Finally the topic trie and route table in the cluster:: - - -------------------------- - | t | - | / \ | - | + # | - | / \ | - | x y | - -------------------------- - | t/+/x -> node1, node3 | - | t/+/y -> node1 | - | t/# -> node2 | - | t/a -> node3 | - -------------------------- - -Message Route and Deliver --------------------------- - -The brokers in the cluster route messages by topic trie and route table, deliver messages to MQTT clients by subscriptions. Subscriptions are mapping from topic to subscribers, are stored only in the local node, will not be replicated to other nodes. - -Suppose client1 PUBLISH a message to the topic 't/a', the message Route and Deliver process:: - - title: Message Route and Deliver - - client1->node1: Publish[t/a] - node1-->node2: Route[t/#] - node1-->node3: Route[t/a] - node2-->client2: Deliver[t/#] - node3-->client3: Deliver[t/a] - -.. image:: _static/images/route.png - -------------- -Cluster Setup -------------- - -Suppose we deploy two nodes cluster on s1.emqtt.io, s2.emqtt.io: - -+--------------------------+-----------------+---------------------+ -| Node | Host(FQDN) | IP and Port | -+--------------------------+-----------------+---------------------+ -| emqttd@s1.emqtt.io or | s1.emqtt.io | 192.168.0.10:1883 | -| emqttd@192.168.0.10 | | | -+--------------------------+-----------------+---------------------+ -| emqttd@s2.emqtt.io or | s2.emqtt.io | 192.168.0.20:1883 | -| emqttd@192.168.0.20 | | | -+--------------------------+-----------------+---------------------+ - -.. WARNING:: The node name is Name@Host, where Host is IP address or the fully qualified host name. - -emqttd@s1.emqtt.io setting --------------------------- - -emqttd/etc/emq.conf:: - - node.name = emqttd@s1.emqtt.io - - 或 - - node.name = emqttd@192.168.0.10 - -.. WARNING:: The name cannot be changed after node joined the cluster. - -emqttd@s2.emqtt.io setting --------------------------- - -emqttd/etc/emq.conf:: - - node.name = emqttd@s2.emqtt.io - - 或 - - node.name = emqttd@192.168.0.20 - -Join the cluster ----------------- - -Start the two broker nodes, and 'cluster join ' on emqttd@s2.emqtt.io:: - - $ ./bin/emqttd_ctl cluster join emqttd@s1.emqtt.io - - Join the cluster successfully. - Cluster status: [{running_nodes,['emqttd@s1.emqtt.io','emqttd@s2.emqtt.io']}] - -Or 'cluster join' on emqttd@s1.emqtt.io:: - - $ ./bin/emqttd_ctl cluster join emqttd@s2.emqtt.io - - Join the cluster successfully. - Cluster status: [{running_nodes,['emqttd@s1.emqtt.io','emqttd@s2.emqtt.io']}] - -Query the cluster status:: - - $ ./bin/emqttd_ctl cluster status - - Cluster status: [{running_nodes,['emqttd@s1.emqtt.io','emqttd@s2.emqtt.io']}] - -Leave the cluster ------------------ - -Two ways to leave the cluster: - -1. leave: this node leaves the cluster - -2. remove: remove other nodes from the cluster - -emqttd@s2.emqtt.io node tries to leave the cluster:: - - $ ./bin/emqttd_ctl cluster leave - -Or remove emqttd@s2.emqtt.io node from the cluster on emqttd@s1.emqtt.io:: - - $ ./bin/emqttd_ctl cluster remove emqttd@s2.emqtt.io - --------------------- -Session across Nodes --------------------- - -The persistent MQTT sessions (clean session = false) are across nodes in the cluster. - -If a persistent MQTT client connected to node1 first, then disconnected and connects to node2, the MQTT connection and session will be located on different nodes:: - - node1 - ----------- - |-->| session | - | ----------- - node2 | - -------------- | - client-->| connection |<--| - -------------- - ------------- -The Firewall ------------- - -If there is a firewall between clustered nodes, the cluster requires to open 4369 port used by epmd daemon, and a port segment for nodes' communication. - -Configure the port segment in releases/2.0/sys.config, for example: - -.. code-block:: erlang - - [{kernel, [ - ... - {inet_dist_listen_min, 20000}, - {inet_dist_listen_max, 21000} - ]}, - ... - ------------------- -Network Partitions ------------------- - -The emqttd 1.0 cluster requires reliable network to avoid network partitions. The cluster will not recover from a network partition automatically. - -If a network partition occures, there will be critical logs in log/emqttd_error.log:: - - Mnesia inconsistent_database event: running_partitioned_network, emqttd@host - -To recover from a network partition, you have to stop the nodes in a partition, clean the 'data/mneisa' of these nodes and reboot to join the cluster again. - ------------------------ -Consistent Hash and DHT ------------------------ - -Consistent Hash and DHT are popular in the design of NoSQL databases. Cluster of emqttd broker could support 10 million size of global routing table now. We could use the Consistent Hash or DHT to partition the routing table, and evolve the cluster to larger size. - diff --git a/docs/source/coap.rst b/docs/source/coap.rst deleted file mode 100644 index d3c48dfcb..000000000 --- a/docs/source/coap.rst +++ /dev/null @@ -1,9 +0,0 @@ - -.. _coap: - -============= -CoAP Protocol -============= - -.. todo:: CoAP Protocol Introduction... - diff --git a/docs/source/commands.rst b/docs/source/commands.rst deleted file mode 100644 index 52741f860..000000000 --- a/docs/source/commands.rst +++ /dev/null @@ -1,785 +0,0 @@ - -.. _commands:: - -======== -Commands -======== - -The './bin/emqttd_ctl' command line could be used to query and administrate the *EMQ* broker. - -.. WARNING:: Cannot work on Windows - -.. _command_status:: - ------- -status ------- - -Show running status of the broker:: - - $ ./bin/emqttd_ctl status - - Node 'emqttd@127.0.0.1' is started - emqttd 2.0 is running - -.. _command_broker:: - ------- -broker ------- - -Query basic information, statistics and metrics of the broker. - -+----------------+-------------------------------------------------+ -| broker | Show version, description, uptime of the broker | -+----------------+-------------------------------------------------+ -| broker pubsub | Show status of the core pubsub process | -+----------------+-------------------------------------------------+ -| broker stats | Show statistics of client, session, topic, | -| | subscription and route of the broker | -+----------------+-------------------------------------------------+ -| broker metrics | Show metrics of MQTT bytes, packets, messages | -| | sent/received. | -+----------------+-------------------------------------------------+ - -Query version, description and uptime of the broker:: - - $ ./bin/emqttd_ctl broker - - sysdescr : Erlang MQTT Broker - version : 0.15.0 - uptime : 1 hours, 25 minutes, 24 seconds - datetime : 2016-01-16 13:17:32 - -broker stats ------------- - -Query statistics of MQTT Client, Session, Topic, Subscription and Route:: - - $ ./bin/emqttd_ctl broker stats - - clients/count : 1 - clients/max : 1 - queues/count : 0 - queues/max : 0 - retained/count : 2 - retained/max : 2 - routes/count : 2 - routes/reverse : 2 - sessions/count : 0 - sessions/max : 0 - subscriptions/count : 1 - subscriptions/max : 1 - topics/count : 54 - topics/max : 54 - -broker metrics --------------- - -Query metrics of Bytes, MQTT Packets and Messages(sent/received):: - - $ ./bin/emqttd_ctl broker metrics - - bytes/received : 297 - bytes/sent : 40 - messages/dropped : 348 - messages/qos0/received : 0 - messages/qos0/sent : 0 - messages/qos1/received : 0 - messages/qos1/sent : 0 - messages/qos2/received : 0 - messages/qos2/sent : 0 - messages/received : 0 - messages/retained : 2 - messages/sent : 0 - packets/connack : 5 - packets/connect : 5 - packets/disconnect : 0 - packets/pingreq : 0 - packets/pingresp : 0 - packets/puback/received : 0 - packets/puback/sent : 0 - packets/pubcomp/received: 0 - packets/pubcomp/sent : 0 - packets/publish/received: 0 - packets/publish/sent : 0 - packets/pubrec/received : 0 - packets/pubrec/sent : 0 - packets/pubrel/received : 0 - packets/pubrel/sent : 0 - packets/received : 9 - packets/sent : 9 - packets/suback : 4 - packets/subscribe : 4 - packets/unsuback : 0 - packets/unsubscribe : 0 - -.. _command_cluster:: - -------- -cluster -------- - -Cluster two or more emqttd brokers. - -+-----------------------+--------------------------------+ -| cluster join | Join the cluster | -+-----------------------+--------------------------------+ -| cluster leave | Leave the cluster | -+-----------------------+--------------------------------+ -| cluster remove | Remove a node from the cluster | -+-----------------------+--------------------------------+ -| cluster status | Query cluster status and nodes | -+-----------------------+--------------------------------+ - -Suppose we create two emqttd nodes on localhost and cluster them: - -+-----------+---------------------+-------------+ -| Folder | Node | MQTT Port | -+-----------+---------------------+-------------+ -| emqttd1 | emqttd1@127.0.0.1 | 1883 | -+-----------+---------------------+-------------+ -| emqttd2 | emqttd2@127.0.0.1 | 2883 | -+-----------+---------------------+-------------+ - -Start emqttd1 node:: - - cd emqttd1 && ./bin/emqttd start - -Start emqttd2 node:: - - cd emqttd2 && ./bin/emqttd start - -Under emqttd2 folder:: - - $ ./bin/emqttd_ctl cluster join emqttd1@127.0.0.1 - - Join the cluster successfully. - Cluster status: [{running_nodes,['emqttd1@127.0.0.1','emqttd2@127.0.0.1']}] - -Query cluster status:: - - $ ./bin/emqttd_ctl cluster status - - Cluster status: [{running_nodes,['emqttd2@127.0.0.1','emqttd1@127.0.0.1']}] - -Message Route between nodes:: - - # Subscribe topic 'x' on emqttd1 node - mosquitto_sub -t x -q 1 -p 1883 - - # Publish to topic 'x' on emqttd2 node - mosquitto_pub -t x -q 1 -p 2883 -m hello - -emqttd2 leaves the cluster:: - - cd emqttd2 && ./bin/emqttd_ctl cluster leave - -Or remove emqttd2 from the cluster on emqttd1 node:: - - cd emqttd1 && ./bin/emqttd_ctl cluster remove emqttd2@127.0.0.1 - -.. _command_clients:: - -------- -clients -------- - -Query MQTT clients connected to the broker: - -+-------------------------+----------------------------------+ -| clients list | List all MQTT clients | -+-------------------------+----------------------------------+ -| clients show | Show a MQTT Client | -+-------------------------+----------------------------------+ -| clients kick | Kick out a MQTT client | -+-------------------------+----------------------------------+ - -clients lists -------------- - -Query All MQTT clients connected to the broker:: - - $ ./bin/emqttd_ctl clients list - - Client(mosqsub/43832-airlee.lo, clean_sess=true, username=test, peername=127.0.0.1:64896, connected_at=1452929113) - Client(mosqsub/44011-airlee.lo, clean_sess=true, username=test, peername=127.0.0.1:64961, connected_at=1452929275) - ... - -Properties of the Client: - -+--------------+---------------------------------------------------+ -| clean_sess | Clean Session Flag | -+--------------+---------------------------------------------------+ -| username | Username of the client | -+--------------+---------------------------------------------------+ -| peername | Peername of the TCP connection | -+--------------+---------------------------------------------------+ -| connected_at | The timestamp when client connected to the broker | -+--------------+---------------------------------------------------+ - -clients show ------------------------ - -Show a specific MQTT Client:: - - ./bin/emqttd_ctl clients show "mosqsub/43832-airlee.lo" - - Client(mosqsub/43832-airlee.lo, clean_sess=true, username=test, peername=127.0.0.1:64896, connected_at=1452929113) - -clients kick ------------------------ - -Kick out a MQTT Client:: - - ./bin/emqttd_ctl clients kick "clientid" - -.. _command_sessions:: - --------- -sessions --------- - -Query all MQTT sessions. The broker will create a session for each MQTT client. Persistent Session if clean_session flag is true, transient session otherwise. - -+--------------------------+-------------------------------+ -| sessions list | List all Sessions | -+--------------------------+-------------------------------+ -| sessions list persistent | Query all persistent Sessions | -+--------------------------+-------------------------------+ -| sessions list transient | Query all transient Sessions | -+--------------------------+-------------------------------+ -| sessions show | Show a session | -+--------------------------+-------------------------------+ - -sessions list -------------- - -Query all sessions:: - - $ ./bin/emqttd_ctl sessions list - - Session(clientid, clean_sess=false, max_inflight=100, inflight_queue=0, message_queue=0, message_dropped=0, awaiting_rel=0, awaiting_ack=0, awaiting_comp=0, created_at=1452935508) - Session(mosqsub/44101-airlee.lo, clean_sess=true, max_inflight=100, inflight_queue=0, message_queue=0, message_dropped=0, awaiting_rel=0, awaiting_ack=0, awaiting_comp=0, created_at=1452935401) - -Properties of Session: - -TODO:?? - -+-------------------+----------------------------------------------------------------+ -| clean_sess | clean sess flag. false: persistent, true: transient | -+-------------------+----------------------------------------------------------------+ -| max_inflight | Inflight window (Max number of messages delivering) | -+-------------------+----------------------------------------------------------------+ -| inflight_queue | Inflight Queue Size | -+-------------------+----------------------------------------------------------------+ -| message_queue | Message Queue Size | -+-------------------+----------------------------------------------------------------+ -| message_dropped | Number of Messages Dropped for queue is full | -+-------------------+----------------------------------------------------------------+ -| awaiting_rel | The number of QoS2 messages received and waiting for PUBREL | -+-------------------+----------------------------------------------------------------+ -| awaiting_ack | The number of QoS1/2 messages delivered and waiting for PUBACK | -+-------------------+----------------------------------------------------------------+ -| awaiting_comp | The number of QoS2 messages delivered and waiting for PUBCOMP | -+-------------------+----------------------------------------------------------------+ -| created_at | Timestamp when the session is created | -+-------------------+----------------------------------------------------------------+ - -sessions list persistent ------------------------- - -Query all persistent sessions:: - - $ ./bin/emqttd_ctl sessions list persistent - - Session(clientid, clean_sess=false, max_inflight=100, inflight_queue=0, message_queue=0, message_dropped=0, awaiting_rel=0, awaiting_ack=0, awaiting_comp=0, created_at=1452935508) - -sessions list transient ------------------------ - -Query all transient sessions:: - - $ ./bin/emqttd_ctl sessions list transient - - Session(mosqsub/44101-airlee.lo, clean_sess=true, max_inflight=100, inflight_queue=0, message_queue=0, message_dropped=0, awaiting_rel=0, awaiting_ack=0, awaiting_comp=0, created_at=1452935401) - -sessions show ------------------------- - -Show a session:: - - $ ./bin/emqttd_ctl sessions show clientid - - Session(clientid, clean_sess=false, max_inflight=100, inflight_queue=0, message_queue=0, message_dropped=0, awaiting_rel=0, awaiting_ack=0, awaiting_comp=0, created_at=1452935508) - -.. _command_routes:: - ------- -routes ------- - -Show routing table of the broker. - -routes list ------------ - -List all routes:: - - $ ./bin/emqttd_ctl routes list - - t2/# -> emqttd2@127.0.0.1 - t/+/x -> emqttd2@127.0.0.1,emqttd@127.0.0.1 - -routes show -------------------- - -Show a route:: - - $ ./bin/emqttd_ctl routes show t/+/x - - t/+/x -> emqttd2@127.0.0.1,emqttd@127.0.0.1 - -.. _command_topics:: - ------- -topics ------- - -Query topic table of the broker. - -topics list ------------ - -Query all the topics:: - - $ ./bin/emqttd_ctl topics list - - $SYS/brokers/emqttd@127.0.0.1/metrics/packets/subscribe: static - $SYS/brokers/emqttd@127.0.0.1/stats/subscriptions/max: static - $SYS/brokers/emqttd2@127.0.0.1/stats/subscriptions/count: static - ... - -topics show -------------------- - -Show a topic:: - - $ ./bin/emqttd_ctl topics show '$SYS/brokers' - - $SYS/brokers: static - -.. _command_subscriptions:: - -------------- -subscriptions -------------- - -Query the subscription table of the broker: - -+--------------------------------------------+--------------------------------------+ -| subscriptions list | List all subscriptions | -+--------------------------------------------+--------------------------------------+ -| subscriptions show | Show a subscription | -+--------------------------------------------+--------------------------------------+ - -subscriptions list ------------------- - -Query all subscriptions:: - - $ ./bin/emqttd_ctl subscriptions list - - mosqsub/91042-airlee.lo -> t/y:1 - mosqsub/90475-airlee.lo -> t/+/x:2 - -subscriptions list static -------------------------- - -List all static subscriptions:: - - $ ./bin/emqttd_ctl subscriptions list static - - clientid -> new_topic:1 - -subscriptions show ------------------------------ - -Show the subscriptions of a MQTT client:: - - $ ./bin/emqttd_ctl subscriptions show clientid - - clientid: [{<<"x">>,1},{<<"topic2">>,1},{<<"topic3">>,1}] - -.. _command_plugins:: - -------- -plugins -------- - -List, load or unload plugins of emqttd broker. - -+---------------------------+-------------------------+ -| plugins list | List all plugins | -+---------------------------+-------------------------+ -| plugins load | Load Plugin | -+---------------------------+-------------------------+ -| plugins unload | Unload (Plugin) | -+---------------------------+-------------------------+ - -plugins list ------------- - -List all plugins:: - - $ ./bin/emqttd_ctl plugins list - - Plugin(emq_auth_clientid, version=2.0, description=Authentication with ClientId/Password, active=false) - Plugin(emq_auth_http, version=2.0, description=Authentication/ACL with HTTP API, active=false) - Plugin(emq_auth_ldap, version=2.0, description=Authentication/ACL with LDAP, active=false) - Plugin(emq_auth_mongo, version=2.0, description=Authentication/ACL with MongoDB, active=false) - Plugin(emq_auth_mysql, version=2.0, description=Authentication/ACL with MySQL, active=false) - Plugin(emq_auth_pgsql, version=2.0, description=Authentication/ACL with PostgreSQL, active=false) - Plugin(emq_auth_redis, version=2.0, description=Authentication/ACL with Redis, active=false) - Plugin(emq_auth_username, version=2.0, description=Authentication with Username/Password, active=false) - Plugin(emq_coap, version=0.2, description=CoAP Gateway, active=false) - Plugin(emq_dashboard, version=2.0, description=Dashboard, active=true) - Plugin(emq_mod_rewrite, version=2.0, description=EMQ Rewrite Module, active=false) - Plugin(emq_plugin_template, version=2.0, description=EMQ Plugin Template, active=false) - Plugin(emq_recon, version=2.0, description=Recon Plugin, active=false) - Plugin(emq_reloader, version=3.0, description=Reloader Plugin, active=false) - Plugin(emq_sn, version=0.2, description=MQTT-SN Gateway, active=false) - Plugin(emq_stomp, version=2.0, description=Stomp Protocol Plugin, active=false) - -Properties of a plugin: - -+-------------+--------------------------+ -| version | Plugin Version | -+-------------+--------------------------+ -| description | Plugin Description | -+-------------+--------------------------+ -| active | If the plugin is Loaded | -+-------------+--------------------------+ - -Load -------------- - -Load a Plugin:: - - $ ./bin/emqttd_ctl plugins load emq_recon - - Start apps: [recon,emq_recon] - Plugin emq_recon loaded successfully. - -Unload ---------------- - -Unload a Plugin:: - - $ ./bin/emqttd_ctl plugins unload emq_recon - - Plugin emq_recon unloaded successfully. - -.. _command_bridges:: - -------- -bridges -------- - -Bridge two or more *EMQ* brokers:: - - --------- --------- - Publisher --> | node1 | --Bridge Forward--> | node2 | --> Subscriber - --------- --------- - -commands for bridge: - -+----------------------------------------+------------------------------+ -| bridges list | List all bridges | -+----------------------------------------+------------------------------+ -| bridges options | Show bridge options | -+----------------------------------------+------------------------------+ -| bridges start | Create a bridge | -+----------------------------------------+------------------------------+ -| bridges start | Create a bridge with options | -+----------------------------------------+------------------------------+ -| bridges stop | Delete a bridge | -+----------------------------------------+------------------------------+ - -Suppose we create a bridge between emqttd1 and emqttd2 on localhost: - -+---------+---------------------+-----------+ -| Name | Node | MQTT Port | -+---------+---------------------+-----------+ -| emqttd1 | emqttd1@127.0.0.1 | 1883 | -+---------+---------------------+-----------+ -| emqttd2 | emqttd2@127.0.0.1 | 2883 | -+---------+---------------------+-----------+ - -The bridge will forward all the the 'sensor/#' messages from emqttd1 to emqttd2:: - - $ ./bin/emqttd_ctl bridges start emqttd2@127.0.0.1 sensor/# - - bridge is started. - - $ ./bin/emqttd_ctl bridges list - - bridge: emqttd1@127.0.0.1--sensor/#-->emqttd2@127.0.0.1 - -The the 'emqttd1--sensor/#-->emqttd2' bridge:: - - #emqttd2 node - - mosquitto_sub -t sensor/# -p 2883 -d - - #emqttd1节点上 - - mosquitto_pub -t sensor/1/temperature -m "37.5" -d - -bridges options ---------------- - -Show bridge options:: - - $ ./bin/emqttd_ctl bridges options - - Options: - qos = 0 | 1 | 2 - prefix = string - suffix = string - queue = integer - Example: - qos=2,prefix=abc/,suffix=/yxz,queue=1000 - -bridges stop ---------------------------- - -Delete the emqttd1--sensor/#-->emqttd2 bridge:: - - $ ./bin/emqttd_ctl bridges stop emqttd2@127.0.0.1 sensor/# - - bridge is stopped. - -.. _command_vm:: - --- -vm --- - -Query the load, cpu, memory, processes and IO information of the Erlang VM. - -+-------------+-----------------------------------+ -| vm all | Query all | -+-------------+-----------------------------------+ -| vm load | Query VM Load | -+-------------+-----------------------------------+ -| vm memory | Query Memory Usage | -+-------------+-----------------------------------+ -| vm process | Query Number of Erlang Processes | -+-------------+-----------------------------------+ -| vm io | Query Max Fds of VM | -+-------------+-----------------------------------+ - -vm load -------- - -Query load:: - - $ ./bin/emqttd_ctl vm load - - cpu/load1 : 2.21 - cpu/load5 : 2.60 - cpu/load15 : 2.36 - -vm memory ---------- - -Query memory:: - - $ ./bin/emqttd_ctl vm memory - - memory/total : 23967736 - memory/processes : 3594216 - memory/processes_used : 3593112 - memory/system : 20373520 - memory/atom : 512601 - memory/atom_used : 491955 - memory/binary : 51432 - memory/code : 13401565 - memory/ets : 1082848 - -vm process ----------- - -Query number of erlang processes:: - - $ ./bin/emqttd_ctl vm process - - process/limit : 8192 - process/count : 221 - -vm io ------ - -Query max, active file descriptors of IO:: - - $ ./bin/emqttd_ctl vm io - - io/max_fds : 2560 - io/active_fds : 1 - -.. _command_trace:: - ------ -trace ------ - -Trace MQTT packets, messages(sent/received) by ClientId or Topic. - -+-----------------------------------+-----------------------------------+ -| trace list | List all the traces | -+-----------------------------------+-----------------------------------+ -| trace client | Trace a client | -+-----------------------------------+-----------------------------------+ -| trace client off | Stop tracing the client | -+-----------------------------------+-----------------------------------+ -| trace topic | Trace a topic | -+-----------------------------------+-----------------------------------+ -| trace topic off | Stop tracing the topic | -+-----------------------------------+-----------------------------------+ - -trace client ---------------------------------- - -Start to trace a client:: - - $ ./bin/emqttd_ctl trace client clientid log/clientid_trace.log - - trace client clientid successfully. - -trace client off ---------------------------- - -Stop tracing the client:: - - $ ./bin/emqttd_ctl trace client clientid off - - stop tracing client clientid successfully. - -trace topic ------------------------------ - -Start to trace a topic:: - - $ ./bin/emqttd_ctl trace topic topic log/topic_trace.log - - trace topic topic successfully. - -trace topic off ------------------------ - -Stop tracing the topic:: - - $ ./bin/emqttd_ctl trace topic topic off - - stop tracing topic topic successfully. - -trace list ----------- - -List all traces:: - - $ ./bin/emqttd_ctl trace list - - trace client clientid -> log/clientid_trace.log - trace topic topic -> log/topic_trace.log - -.. _command_listeners:: - ---------- -listeners ---------- - -Show all the TCP listeners:: - - $ ./bin/emqttd_ctl listeners - - listener on mqtt:ws:8083 - acceptors : 4 - max_clients : 64 - current_clients : 0 - shutdown_count : [] - listener on mqtt:ssl:8883 - acceptors : 4 - max_clients : 512 - current_clients : 0 - shutdown_count : [] - listener on mqtt:tcp:1883 - acceptors : 8 - max_clients : 1024 - current_clients : 0 - shutdown_count : [] - listener on dashboard:http:18083 - acceptors : 2 - max_clients : 512 - current_clients : 0 - shutdown_count : [] - -listener parameters: - -+-----------------+--------------------------------------+ -| acceptors | TCP Acceptor Pool | -+-----------------+--------------------------------------+ -| max_clients | Max number of clients | -+-----------------+--------------------------------------+ -| current_clients | Count of current clients | -+-----------------+--------------------------------------+ -| shutdown_count | Statistics of client shutdown reason | -+----------------+---------------------------------------+ - -.. _command_mnesia:: - ------- -mnesia ------- - -Show system_info of mnesia database. - ------- -admins ------- - -The 'admins' CLI is used to add/del admin account, which is registered by the dashboard plugin. - -+------------------------------------+-----------------------------+ -| admins add | Add admin account | -+------------------------------------+-----------------------------+ -| admins passwd | Reset admin password | -+------------------------------------+-----------------------------+ -| admins del | Delete admin account | -+------------------------------------+-----------------------------+ - -admins add ----------- - -Add admin account:: - - $ ./bin/emqttd_ctl admins add root public - ok - -admins passwd -------------- - -Reset password:: - - $ ./bin/emqttd_ctl admins passwd root private - ok - -admins del ----------- - -Delete admin account:: - - $ ./bin/emqttd_ctl admins del root - ok - diff --git a/docs/source/conf.py b/docs/source/conf.py deleted file mode 100644 index dc1f26988..000000000 --- a/docs/source/conf.py +++ /dev/null @@ -1,337 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Erlang MQTT Broker documentation build configuration file, created by -# sphinx-quickstart on Mon Feb 22 00:46:47 2016. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys -import os - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'sphinx.ext.todo', - 'sphinx.ext.coverage', -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'EMQ 2.0 - Erlang MQTT Broker' -copyright = u'2016, Feng Lee' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '2.0' -# The full version, including alpha/beta/rc tags. -release = '2.0-rc.2' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = [] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'default' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -#html_extra_path = [] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = 'ErlangMQTTBrokerdoc' - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - ('index', 'ErlangMQTTBroker.tex', u'EMQ 2.0 Documentation', - u'Feng Lee', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'erlangmqttbroker', u'EMQ 2.0 Documentation', - [u'Feng Lee'], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ('index', 'ErlangMQTTBroker', u'Erlang MQTT Broker Documentation', - u'Feng Lee', 'ErlangMQTTBroker', 'One line description of project.', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False - - -# -- Options for Epub output ---------------------------------------------- - -# Bibliographic Dublin Core info. -epub_title = u'Erlang MQTT Broker' -epub_author = u'Feng Lee' -epub_publisher = u'Feng Lee' -epub_copyright = u'2016, Feng Lee' - -# The basename for the epub file. It defaults to the project name. -#epub_basename = u'Erlang MQTT Broker' - -# The HTML theme for the epub output. Since the default themes are not optimized -# for small screen space, using the same theme for HTML and epub output is -# usually not wise. This defaults to 'epub', a theme designed to save visual -# space. -#epub_theme = 'epub' - -# The language of the text. It defaults to the language option -# or en if the language is not set. -#epub_language = '' - -# The scheme of the identifier. Typical schemes are ISBN or URL. -#epub_scheme = '' - -# The unique identifier of the text. This can be a ISBN number -# or the project homepage. -#epub_identifier = '' - -# A unique identification for the text. -#epub_uid = '' - -# A tuple containing the cover image and cover page html template filenames. -#epub_cover = () - -# A sequence of (type, uri, title) tuples for the guide element of content.opf. -#epub_guide = () - -# HTML files that should be inserted before the pages created by sphinx. -# The format is a list of tuples containing the path and title. -#epub_pre_files = [] - -# HTML files shat should be inserted after the pages created by sphinx. -# The format is a list of tuples containing the path and title. -#epub_post_files = [] - -# A list of files that should not be packed into the epub file. -epub_exclude_files = ['search.html'] - -# The depth of the table of contents in toc.ncx. -#epub_tocdepth = 3 - -# Allow duplicate toc entries. -#epub_tocdup = True - -# Choose between 'default' and 'includehidden'. -#epub_tocscope = 'default' - -# Fix unsupported image types using the PIL. -#epub_fix_images = False - -# Scale large images. -#epub_max_image_width = 0 - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#epub_show_urls = 'inline' - -# If false, no index is generated. -#epub_use_index = True - - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'http://docs.python.org/': None} diff --git a/docs/source/config.rst b/docs/source/config.rst deleted file mode 100644 index 36f504efa..000000000 --- a/docs/source/config.rst +++ /dev/null @@ -1,548 +0,0 @@ - -.. _configuration: - -============= -Configuration -============= - -The main configuration files of the EMQ broker are under 'etc/' folder: - -+----------------------+-----------------------------------+ -| File | Description | -+----------------------+-----------------------------------+ -| etc/emq.conf | EMQ 2.0 Configuration File | -+----------------------+-----------------------------------+ -| etc/acl.conf | The default ACL File | -+----------------------+-----------------------------------+ -| etc/plugins/\*.conf | Config Files of Plugins | -+----------------------+-----------------------------------+ - ---------------------- -EMQ 2.0 Config Syntax ---------------------- - -The *EMQ* 2.0-rc.2 release integrated with `cuttlefish` library, and adopt a more user-friendly `k = v` syntax for configuration file: - -.. code-block:: properties - - ## Node name - node.name = emqttd@127.0.0.1 - ... - ## Max ClientId Length Allowed. - mqtt.max_clientid_len = 1024 - ... - -The configuration files will be preprocessed and translated to Erlang `app.config` before the EMQ broker started:: - - ---------------------- 2.0/schema/*.schema ------------------- - | etc/emq.conf | ----------------- \|/ | data/app.config | - | + | --> mergeconf --> | data/app.conf | --> cuttlefish generate --> | | - | etc/plugins/*.conf | ----------------- | data/vm.args | - ---------------------- ------------------- - ------------------------- -OS Environment Variables ------------------------- - -+-------------------+----------------------------------------+ -| EMQ_NODE_NAME | Erlang node name | -+-------------------+----------------------------------------+ -| EMQ_NODE_COOKIE | Cookie for distributed erlang node | -+-------------------+----------------------------------------+ -| EMQ_MAX_PORTS | Maximum number of opened sockets | -+-------------------+----------------------------------------+ -| EMQ_TCP_PORT | MQTT TCP Listener Port, Default: 1883 | -+-------------------+----------------------------------------+ -| EMQ_SSL_PORT | MQTT SSL Listener Port, Default: 8883 | -+-------------------+----------------------------------------+ -| EMQ_HTTP_PORT | HTTP/WebSocket Port, Default: 8083 | -+-------------------+----------------------------------------+ -| EMQ_HTTPS_PORT | HTTPS/WebSocket Port, Default: 8084 | -+-------------------+----------------------------------------+ - -------------------- -EMQ Node and Cookie -------------------- - -The node name and cookie of *EMQ* should be configured when clustering: - -.. code-block:: properties - - ## Node name - node.name = emqttd@127.0.0.1 - - ## Cookie for distributed node - node.cookie = emq_dist_cookie - -------------------- -Erlang VM Arguments -------------------- - -Configure and Optimize Erlang VM: - -.. code-block:: properties - - ## SMP support: enable, auto, disable - node.smp = auto - - ## Enable kernel poll - node.kernel_poll = on - - ## async thread pool - node.async_threads = 32 - - ## Erlang Process Limit - node.process_limit = 256000 - - ## Sets the maximum number of simultaneously existing ports for this system - node.max_ports = 65536 - - ## Set the distribution buffer busy limit (dist_buf_busy_limit) - node.dist_buffer_size = 32MB - - ## Max ETS Tables. - ## Note that mnesia and SSL will create temporary ets tables. - node.max_ets_tables = 256000 - - ## Tweak GC to run more often - node.fullsweep_after = 1000 - - ## Crash dump - node.crash_dump = log/crash.dump - - ## Distributed node ticktime - node.dist_net_ticktime = 60 - - ## Distributed node port range - ## node.dist_listen_min = 6000 - ## node.dist_listen_max = 6999 - -The two most important parameters for Erlang VM: - -+--------------------------+---------------------------------------------------------------------------+ -| node.process_limit | Max number of Erlang proccesses. A MQTT client consumes two proccesses. | -| | The value should be larger than max_clients * 2 | -+--------------------------+---------------------------------------------------------------------------+ -| node.max_ports | Max number of Erlang Ports. A MQTT client consumes one port. | -| | The value should be larger than max_clients. | -+--------------------------+---------------------------------------------------------------------------+ - ------------------- -Log Level and File ------------------- - -Console Log ------------ - -.. code-block:: properties - - ## Console log. Enum: off, file, console, both - log.console = console - - ## Console log level. Enum: debug, info, notice, warning, error, critical, alert, emergency - log.console.level = error - - ## Console log file - ## log.console.file = log/console.log - -Error Log ---------- - -.. code-block:: properties - - ## Error log file - log.error.file = log/error.log - -Crash Log ---------- - -.. code-block:: properties - - ## Enable the crash log. Enum: on, off - log.crash = on - - log.crash.file = log/crash.log - ------------------------- -MQTT Protocol Parameters ------------------------- - -Maximum ClientId Length ------------------------ - -.. code-block:: properties - - ## Max ClientId Length Allowed. - mqtt.max_clientid_len = 1024 - -Maximum Packet Size -------------------- - -.. code-block:: properties - - ## Max Packet Size Allowed, 64K by default. - mqtt.max_packet_size = 64KB - -MQTT Client Idle Timeout ------------------------- - -.. code-block:: properties - - ## Client Idle Timeout (Second) - mqtt.client_idle_timeout = 30 - ----------------------------- -Allow Anonymous and ACL File ----------------------------- - -Allow Anonymous ---------------- - -.. code-block:: properties - - ## Allow Anonymous authentication - mqtt.allow_anonymous = true - -Default ACL File ----------------- - -Enable the default ACL module: - -.. code-block:: properties - - ## Default ACL File - mqtt.acl_file = etc/acl.conf - -Define ACL rules in etc/acl.conf. The rules by default: - -.. code-block:: erlang - - %% Allow 'dashboard' to subscribe '$SYS/#' - {allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}. - - %% Allow clients from localhost to subscribe any topics - {allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}. - - %% Deny clients to subscribe '$SYS#' and '#' - {deny, all, subscribe, ["$SYS/#", {eq, "#"}]}. - - %% Allow all by default - {allow, all}. - -An ACL rule is an Erlang tuple. The Access control module of *EMQ* broker matches the rule one by one from top to bottom:: - - --------- --------- --------- - Client -> | Rule1 | --nomatch--> | Rule2 | --nomatch--> | Rule3 | --> Default - --------- --------- --------- - | | | - match match match - \|/ \|/ \|/ - allow | deny allow | deny allow | deny - ------------------------ -MQTT Session Parameters ------------------------ - -.. code-block:: properties - - ## Max number of QoS 1 and 2 messages that can be “inflight” at one time. - ## 0 means no limit - mqtt.session.max_inflight = 100 - - ## Retry interval for redelivering QoS1/2 messages. - mqtt.session.retry_interval = 60 - - ## Awaiting PUBREL Timeout - mqtt.session.await_rel_timeout = 20 - - ## Max Packets that Awaiting PUBREL, 0 means no limit - mqtt.session.max_awaiting_rel = 0 - - ## Statistics Collection Interval(seconds) - mqtt.session.collect_interval = 0 - - ## Expired after 1 day: - ## w - week - ## d - day - ## h - hour - ## m - minute - ## s - second - mqtt.session.expired_after = 1d - -+------------------------------+----------------------------------------------------------+ -| session.max_inflight | Max number of QoS1/2 messages that can be delivered in | -| | the same time | -+------------------------------+----------------------------------------------------------+ -| session.retry_interval | Retry interval for unacked QoS1/2 messages. | -+------------------------------+----------------------------------------------------------+ -| session.await_rel_timeout | Awaiting PUBREL Timeout | -+------------------------------+----------------------------------------------------------+ -| session.max_awaiting_rel | Max number of Packets that Awaiting PUBREL | -+------------------------------+----------------------------------------------------------+ -| session.collect_interval | Interval of Statistics Collection | -+------------------------------+----------------------------------------------------------+ -| session.expired_after | Expired after (unit: minute) | -+------------------------------+----------------------------------------------------------+ - ------------------- -MQTT Message Queue ------------------- - -The message queue of session stores: - -1. Offline messages for persistent session. - -2. Pending messages for inflight window is full - -Queue parameters: - -.. code-block:: properties - - ## Type: simple | priority - mqtt.queue.type = simple - - ## Topic Priority: 0~255, Default is 0 - ## mqtt.queue.priority = topic/1=10,topic/2=8 - - ## Max queue length. Enqueued messages when persistent client disconnected, - ## or inflight window is full. - mqtt.queue.max_length = infinity - - ## Low-water mark of queued messages - mqtt.queue.low_watermark = 20% - - ## High-water mark of queued messages - mqtt.queue.high_watermark = 60% - - ## Queue Qos0 messages? - mqtt.queue.qos0 = true - -+----------------------+---------------------------------------------------+ -| queue.type | Queue type: simple or priority | -+----------------------+---------------------------------------------------+ -| queue.priority | Topic priority | -+----------------------+---------------------------------------------------+ -| queue.max_length | Max Queue size, infinity means no limit | -+----------------------+---------------------------------------------------+ -| queue.low_watermark | Low watermark | -+----------------------+---------------------------------------------------+ -| queue.high_watermark | High watermark | -+----------------------+---------------------------------------------------+ -| queue.qos0 | If Qos0 message queued? | -+----------------------+---------------------------------------------------+ - ----------------------- -Sys Interval of Broker ----------------------- - -.. code-block:: properties - - ## System Interval of publishing broker $SYS Messages - mqtt.broker.sys_interval = 60 - ------------------ -PubSub Parameters ------------------ - -.. code-block:: properties - - ## PubSub Pool Size. Default should be scheduler numbers. - mqtt.pubsub.pool_size = 8 - - mqtt.pubsub.by_clientid = true - - ##TODO: Subscribe Asynchronously - mqtt.pubsub.async = true - ----------------------- -MQTT Bridge Parameters ----------------------- - -.. code-block:: properties - - ## Bridge Queue Size - mqtt.bridge.max_queue_len = 10000 - - ## Ping Interval of bridge node. Unit: Second - mqtt.bridge.ping_down_interval = 1 - -------------------- -Plugins' Etc Folder -------------------- - -.. code-block:: properties - - ## Dir of plugins' config - mqtt.plugins.etc_dir = etc/plugins/ - - ## File to store loaded plugin names. - mqtt.plugins.loaded_file = data/loaded_plugins - --------------- -MQTT Listeners --------------- - -Configure the TCP listeners for MQTT, MQTT(SSL), HTTP and HTTPS Protocols. - -The most important parameter for MQTT listener is `max_clients`: max concurrent clients allowed. - -The TCP Ports occupied by the *EMQ* broker by default: - -+-----------+-----------------------------------+ -| 1883 | MQTT Port | -+-----------+-----------------------------------+ -| 8883 | MQTT(SSL) Port | -+-----------+-----------------------------------+ -| 8083 | MQTT(WebSocket), HTTP API Port | -+-----------+-----------------------------------+ - -Listener Parameters: - -+-----------------------------+-------------------------------------------------------+ -| mqtt.listener.*.acceptors | TCP Acceptor Pool | -+-----------------------------+-------------------------------------------------------+ -| mqtt.listener.*.max_clients | Maximum number of concurrent TCP connections allowed | -+-----------------------------+-------------------------------------------------------+ -| mqtt.listener.*.rate_limit | Maximum number of concurrent TCP connections allowed | -+-----------------------------+-------------------------------------------------------+ - -TCP Listener - 1883 -------------------- - -.. code-block:: properties - - ## TCP Listener: 1883, 127.0.0.1:1883, ::1:1883 - mqtt.listener.tcp = 1883 - - ## Size of acceptor pool - mqtt.listener.tcp.acceptors = 8 - - ## Maximum number of concurrent clients - mqtt.listener.tcp.max_clients = 1024 - - ## Rate Limit. Format is 'burst,rate', Unit is KB/Sec - ## mqtt.listener.tcp.rate_limit = 100,10 - - ## TCP Socket Options - mqtt.listener.tcp.backlog = 1024 - ## mqtt.listener.tcp.recbuf = 4096 - ## mqtt.listener.tcp.sndbuf = 4096 - ## mqtt.listener.tcp.buffer = 4096 - ## mqtt.listener.tcp.nodelay = true - -SSL Listener - 8883 -------------------- - -.. code-block:: properties - - ## SSL Listener: 8883, 127.0.0.1:8883, ::1:8883 - mqtt.listener.ssl = 8883 - - ## Size of acceptor pool - mqtt.listener.ssl.acceptors = 4 - - ## Maximum number of concurrent clients - mqtt.listener.ssl.max_clients = 512 - - ## Rate Limit. Format is 'burst,rate', Unit is KB/Sec - ## mqtt.listener.ssl.rate_limit = 100,10 - - ## Configuring SSL Options - mqtt.listener.ssl.handshake_timeout = 15 - mqtt.listener.ssl.keyfile = etc/certs/key.pem - mqtt.listener.ssl.certfile = etc/certs/cert.pem - ## mqtt.listener.ssl.cacertfile = etc/certs/cacert.pem - ## mqtt.listener.ssl.verify = verify_peer - ## mqtt.listener.ssl.fail_if_no_peer_cert = true - -HTTP/WS Listener - 8083 ------------------------ - -.. code-block:: properties - - ## HTTP and WebSocket Listener - mqtt.listener.http = 8083 - mqtt.listener.http.acceptors = 4 - mqtt.listener.http.max_clients = 64 - -HTTPS/WSS Listener - 8084 -------------------------- - -.. code-block:: properties - - ## HTTP(SSL) Listener - mqtt.listener.https = 8084 - mqtt.listener.https.acceptors = 4 - mqtt.listener.https.max_clients = 64 - mqtt.listener.https.handshake_timeout = 15 - mqtt.listener.https.certfile = etc/certs/cert.pem - mqtt.listener.https.keyfile = etc/certs/key.pem - ## mqtt.listener.https.cacertfile = etc/certs/cacert.pem - ## mqtt.listener.https.verify = verify_peer - ## mqtt.listener.https.fail_if_no_peer_cert = true - --------------- -System Monitor --------------- - -.. code-block:: properties - - ## Long GC, don't monitor in production mode for: - sysmon.long_gc = false - - ## Long Schedule(ms) - sysmon.long_schedule = 240 - - ## 8M words. 32MB on 32-bit VM, 64MB on 64-bit VM. - sysmon.large_heap = 8MB - - ## Busy Port - sysmon.busy_port = false - - ## Busy Dist Port - sysmon.busy_dist_port = true - --------------------------- -Plugin Configuration Files --------------------------- - -+----------------------------------------+-----------------------------------+ -| File | Description | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_auth_username.conf | Username/Password Auth Plugin | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_auth_clientid.conf | ClientId Auth Plugin | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_auth_http.conf | HTTP Auth/ACL Plugin Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_auth_mongo.conf | MongoDB Auth/ACL Plugin Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_auth_mysql.conf | MySQL Auth/ACL Plugin Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_auth_pgsql.conf | Postgre Auth/ACL Plugin Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_auth_redis.conf | Redis Auth/ACL Plugin Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_coap.conf | CoAP Protocol Plugin Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_mod_presence.conf | Presence Module Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_mod_retainer.conf | Retainer Module Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_mod_rewrite.config | Rewrite Module Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_mod_subscription.conf | Subscription Module Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_dashboard.conf | Dashboard Plugin Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_plugin_template.conf | Template Plugin Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_recon.conf | Recon Plugin Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_reloader.conf | Reloader Plugin Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_sn.conf | MQTT-SN Protocal Plugin Config | -+----------------------------------------+-----------------------------------+ -| etc/plugins/emq_stomp.conf | Stomp Protocl Plugin Config | -+----------------------------------------+-----------------------------------+ - diff --git a/docs/source/design.rst b/docs/source/design.rst deleted file mode 100644 index f7bb6db47..000000000 --- a/docs/source/design.rst +++ /dev/null @@ -1,532 +0,0 @@ - -.. _design: - -====== -Design -====== - -.. _design_architecture: - ------------- -Architecture ------------- - -The *EMQ* broker 1.0 is more like a network Switch or Router, not a traditional enterprise message queue. Compared to a network router that routes packets based on IP or MPLS label, the *EMQ* broker routes MQTT messages based on topic trie. - -.. image:: _static/images/concept.png - -The *EMQ* 2.0 seperated the Message Flow Plane and Monitor/Control Plane, the Architecture is something like:: - - Control Plane - -------------------- - | | - FrontEnd -> | Flow Plane | -> BackEnd - | | - Session Router - --------------------- - Monitor Plane - -Design Philosophy ------------------ - -1. Focus on handling millions of MQTT connections and routing MQTT messages between clustered nodes. - -2. Embrace Erlang/OTP, The Soft-Realtime, Low-Latency, Concurrent and Fault-Tolerant Platform. - -3. Layered Design: Connection, Session, PubSub and Router Layers. - -4. Separate the Message Flow Plane and the Control/Management Plane. - -5. Stream MQTT messages to various backends including MQ or databases. - -System Layers -------------- - -1. Connection Layer - - Handle TCP and WebSocket connections, encode/decode MQTT packets. - -2. Session Layer - - Process MQTT PUBLISH/SUBSCRIBE Packets received from client, and deliver MQTT messages to client. - -3. PubSub Layer - - Dispatch MQTT messages to subscribers in a node. - -4. Routing(Distributed) Layer - - Route MQTT messages among clustered nodes. - ----------------- -Connection Layer ----------------- - -This layer is built on the `eSockd`_ library which is a general Non-blocking TCP/SSL Socket Server: - -* Acceptor Pool and Asynchronous TCP Accept -* Parameterized Connection Module -* Max connections management -* Allow/Deny by peer address or CIDR -* Keepalive Support -* Rate Limit based on The Leaky Bucket Algorithm -* Fully Asynchronous TCP RECV/SEND - -This layer is also responsible for encoding/decoding MQTT frames: - -1. Parse MQTT frames received from client -2. Serialize MQTT frames sent to client -3. MQTT Connection Keepalive - -Main erlang modules of this layer: - -+------------------+--------------------------+ -| Module | Description | -+==================+==========================+ -| emqttd_client | TCP Client | -+------------------+--------------------------+ -| emqttd_ws_client | WebSocket Client | -+------------------+--------------------------+ -| emqttd_protocol | MQTT Protocol Handler | -+------------------+--------------------------+ -| emqttd_parser | MQTT Frame Parser | -+------------------+--------------------------+ -| emqttd_serializer| MQTT Frame Serializer | -+------------------+--------------------------+ - -------------- -Session Layer -------------- - -The session layer processes MQTT packets received from client and delivers PUBLISH packets to client. - -A MQTT session will store the subscriptions and inflight messages in memory: - -1. The Client’s subscriptions. - -2. Inflight qos1/2 messages sent to the client but unacked, QoS 2 messages which - have been sent to the Client, but have not been completely acknowledged. - -3. Inflight qos2 messages received from client and waiting for PUBREL. QoS 2 - messages which have been received from the Client, but have not been - completely acknowledged. - -4. All qos1, qos2 messages published to when client is disconnected. - -MQueue and Inflight Window --------------------------- - -Concept of Message Queue and Inflight Window:: - - |<----------------- Max Len ----------------->| - ----------------------------------------------- - IN -> | Messages Queue | Inflight Window | -> Out - ----------------------------------------------- - |<--- Win Size --->| - -1. Inflight Window to store the messages delivered and await for PUBACK. - -2. Enqueue messages when the inflight window is full. - -3. If the queue is full, drop qos0 messages if store_qos0 is true, otherwise drop the oldest one. - -The larger the inflight window size is, the higher the throughput is. The smaller the window size is, the more strict the message order is. - -PacketId and MessageId ----------------------- - -The 16-bit PacketId is defined by MQTT Protocol Specification, used by client/server to PUBLISH/PUBACK packets. A GUID(128-bit globally unique Id) will be generated by the broker and assigned to a MQTT message. - -Format of the globally unique message id:: - - -------------------------------------------------------- - | Timestamp | NodeID + PID | Sequence | - |<------- 64bits ------->|<--- 48bits --->|<- 16bits ->| - -------------------------------------------------------- - -1. Timestamp: erlang:system_time if Erlang >= R18, otherwise os:timestamp -2. NodeId: encode node() to 2 bytes integer -3. Pid: encode pid to 4 bytes integer -4. Sequence: 2 bytes sequence in one process - -The PacketId and MessageId in a End-to-End Message PubSub Sequence:: - - PktId <-- Session --> MsgId <-- Router --> MsgId <-- Session --> PktId - ------------- -PubSub Layer ------------- - -The PubSub layer maintains a subscription table and is responsible to dispatch MQTT messages to subscribers. - -.. image:: _static/images/dispatch.png - -MQTT messages will be dispatched to the subscriber's session, which finally delivers the messages to client. - -------------- -Routing Layer -------------- - -The routing(distributed) layer maintains and replicates the global Topic Trie and Routing Table. The topic tire is composed of wildcard topics created by subscribers. The Routing Table maps a topic to nodes in the cluster. - -For example, if node1 subscribed 't/+/x' and 't/+/y', node2 subscribed 't/#' and node3 subscribed 't/a', there will be a topic trie and route table:: - - ------------------------- - | t | - | / \ | - | + # | - | / \ | - | x y | - ------------------------- - | t/+/x -> node1, node3 | - | t/+/y -> node1 | - | t/# -> node2 | - | t/a -> node3 | - ------------------------- - -The routing layer would route MQTT messages among clustered nodes by topic trie match and routing table lookup: - -.. image:: _static/images/route.png - -The routing design follows two rules: - -1. A message only gets forwarded to other cluster nodes if a cluster node is interested in it. This reduces the network traffic tremendously, because it prevents nodes from forwarding unnecessary messages. - -2. As soon as a client on a node subscribes to a topic it becomes known within the cluster. If one of the clients somewhere in the cluster is publishing to this topic, the message will be delivered to its subscriber no matter to which cluster node it is connected. - -.. _design_auth_acl: - ----------------------- -Authentication and ACL ----------------------- - -The *EMQ* broker supports an extensible authentication/ACL mechanism, which is implemented by emqttd_access_control, emqttd_auth_mod and emqttd_acl_mod modules. - -emqttd_access_control module provides two APIs that help register/unregister auth or ACL module: - -.. code-block:: erlang - - register_mod(auth | acl, atom(), list()) -> ok | {error, any()}. - - register_mod(auth | acl, atom(), list(), non_neg_integer()) -> ok | {error, any()}. - -Authentication Bahaviour -------------------------- - -The emqttd_auth_mod defines an Erlang behaviour for authentication module: - -.. code-block:: erlang - - -module(emqttd_auth_mod). - - -ifdef(use_specs). - - -callback init(AuthOpts :: list()) -> {ok, State :: any()}. - - -callback check(Client, Password, State) -> ok | ignore | {error, string()} when - Client :: mqtt_client(), - Password :: binary(), - State :: any(). - - -callback description() -> string(). - - -else. - - -export([behaviour_info/1]). - - behaviour_info(callbacks) -> - [{init, 1}, {check, 3}, {description, 0}]; - behaviour_info(_Other) -> - undefined. - - -endif. - -The authentication modules implemented by plugins: - -+-----------------------+--------------------------------+ -| Plugin | Authentication | -+-----------------------+--------------------------------+ -| emq_auth_username | Username and Password | -+-----------------------+--------------------------------+ -| emq_auth_clientid | ClientID and Password | -+-----------------------+--------------------------------+ -| emq_auth_ldap | LDAP | -+-----------------------+--------------------------------+ -| emq_auth_http | HTTP API | -+-----------------------+--------------------------------+ -| emq_auth_mysql | MySQL | -+-----------------------+--------------------------------+ -| emq_auth_pgsql | PostgreSQL | -+-----------------------+--------------------------------+ -| emq_auth_redis | Redis | -+-----------------------+--------------------------------+ -| emq_auth_mongo | MongoDB | -+-----------------------+--------------------------------+ - -Authorization(ACL) ------------------- - -The emqttd_acl_mod defines an Erlang behavihour for ACL module: - -.. code-block:: erlang - - -module(emqttd_acl_mod). - - -include("emqttd.hrl"). - - -ifdef(use_specs). - - -callback init(AclOpts :: list()) -> {ok, State :: any()}. - - -callback check_acl({Client, PubSub, Topic}, State :: any()) -> allow | deny | ignore when - Client :: mqtt_client(), - PubSub :: pubsub(), - Topic :: binary(). - - -callback reload_acl(State :: any()) -> ok | {error, any()}. - - -callback description() -> string(). - - -else. - - -export([behaviour_info/1]). - - behaviour_info(callbacks) -> - [{init, 1}, {check_acl, 2}, {reload_acl, 1}, {description, 0}]; - behaviour_info(_Other) -> - undefined. - - -endif. - -emqttd_acl_internal implements the default ACL based on etc/acl.conf file: - -.. code-block:: erlang - - %%%----------------------------------------------------------------------------- - %%% - %%% -type who() :: all | binary() | - %%% {ipaddr, esockd_access:cidr()} | - %%% {client, binary()} | - %%% {user, binary()}. - %%% - %%% -type access() :: subscribe | publish | pubsub. - %%% - %%% -type topic() :: binary(). - %%% - %%% -type rule() :: {allow, all} | - %%% {allow, who(), access(), list(topic())} | - %%% {deny, all} | - %%% {deny, who(), access(), list(topic())}. - %%% - %%%----------------------------------------------------------------------------- - - {allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}. - - {allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}. - - {deny, all, subscribe, ["$SYS/#", {eq, "#"}]}. - - {allow, all}. - -.. _design_hook: - ------------- -Hooks Design ------------- - -The *EMQ* broker implements a simple but powerful hooks mechanism to help users develop plugin. The broker would run the hooks when a client is connected/disconnected, a topic is subscribed/unsubscribed or a MQTT message is published/delivered/acked. - -Hooks defined by the *EMQ* 2.0 broker: - -+------------------------+------------------------------------------------------+ -| Hook | Description | -+========================+======================================================+ -| client.connected | Run when client connected to the broker successfully | -+------------------------+------------------------------------------------------+ -| client.subscribe | Run before client subscribes topics | -+------------------------+------------------------------------------------------+ -| client.unsubscribe | Run when client unsubscribes topics | -+------------------------+------------------------------------------------------+ -| session.subscribed | Run After client(session) subscribed a topic | -+------------------------+------------------------------------------------------+ -| session.unsubscribed | Run After client(session) unsubscribed a topic | -+------------------------+------------------------------------------------------+ -| message.publish | Run when a MQTT message is published | -+------------------------+------------------------------------------------------+ -| message.delivered | Run when a MQTT message is delivered | -+------------------------+------------------------------------------------------+ -| message.acked | Run when a MQTT message is acked | -+------------------------+------------------------------------------------------+ -| client.disconnected | Run when client disconnected from broker | -+------------------------+------------------------------------------------------+ - -The *EMQ* broker uses the `Chain-of-responsibility_pattern`_ to implement hook mechanism. The callback functions registered to hook will be executed one by one:: - - -------- ok | {ok, NewAcc} -------- ok | {ok, NewAcc} -------- - (Args, Acc) --> | Fun1 | -------------------> | Fun2 | -------------------> | Fun3 | --> {ok, Acc} | {stop, Acc} - -------- -------- -------- - | | | - stop | {stop, NewAcc} stop | {stop, NewAcc} stop | {stop, NewAcc} - -The callback function for a hook should return: - -+-----------------+------------------------+ -| Return | Description | -+=================+========================+ -| ok | Continue | -+-----------------+------------------------+ -| {ok, NewAcc} | Return Acc and Continue| -+-----------------+------------------------+ -| stop | Break | -+-----------------+------------------------+ -| {stop, NewAcc} | Return Acc and Break | -+-----------------+------------------------+ - -The input arguments for a callback function are depending on the types of hook. Clone the `emq_plugin_template`_ project to check the argument in detail. - -Hook Implementation -------------------- - -The hook APIs defined in emqttd module: - -.. code-block:: erlang - - -module(emqttd). - - %% Hooks API - -export([hook/4, hook/3, unhook/2, run_hooks/3]). - hook(Hook :: atom(), Callback :: function(), InitArgs :: list(any())) -> ok | {error, any()}. - - hook(Hook :: atom(), Callback :: function(), InitArgs :: list(any()), Priority :: integer()) -> ok | {error, any()}. - - unhook(Hook :: atom(), Callback :: function()) -> ok | {error, any()}. - - run_hooks(Hook :: atom(), Args :: list(any()), Acc :: any()) -> {ok | stop, any()}. - -And implemented in emqttd_hook module: - -.. code-block:: erlang - - -module(emqttd_hook). - - %% Hooks API - -export([add/3, add/4, delete/2, run/3, lookup/1]). - - add(HookPoint :: atom(), Callback :: function(), InitArgs :: list(any())) -> ok. - - add(HookPoint :: atom(), Callback :: function(), InitArgs :: list(any()), Priority :: integer()) -> ok. - - delete(HookPoint :: atom(), Callback :: function()) -> ok. - - run(HookPoint :: atom(), Args :: list(any()), Acc :: any()) -> any(). - - lookup(HookPoint :: atom()) -> [#callback{}]. - -Hook Usage ----------- - -The `emq_plugin_template`_ project provides the examples for hook usage: - -.. code-block:: erlang - - -module(emq_plugin_template). - - -export([load/1, unload/0]). - - -export([on_message_publish/2, on_message_delivered/3, on_message_acked/3]). - - load(Env) -> - emqttd:hook('message.publish', fun ?MODULE:on_message_publish/2, [Env]), - emqttd:hook('message.delivered', fun ?MODULE:on_message_delivered/3, [Env]), - emqttd:hook('message.acked', fun ?MODULE:on_message_acked/3, [Env]). - - on_message_publish(Message, _Env) -> - io:format("publish ~s~n", [emqttd_message:format(Message)]), - {ok, Message}. - - on_message_delivered(ClientId, Message, _Env) -> - io:format("delivered to client ~s: ~s~n", [ClientId, emqttd_message:format(Message)]), - {ok, Message}. - - on_message_acked(ClientId, Message, _Env) -> - io:format("client ~s acked: ~s~n", [ClientId, emqttd_message:format(Message)]), - {ok, Message}. - - unload() -> - emqttd:unhook('message.publish', fun ?MODULE:on_message_publish/2), - emqttd:unhook('message.acked', fun ?MODULE:on_message_acked/3), - emqttd:unhook('message.delivered', fun ?MODULE:on_message_delivered/3). - -.. _design_plugin: - -------------- -Plugin Design -------------- - -Plugin is a normal erlang application that can be started/stopped dynamically by a running *EMQ* broker. - -emqttd_plugins Module ---------------------- - -The plugin mechanism is implemented by emqttd_plugins module: - -.. code-block:: erlang - - -module(emqttd_plugins). - - -export([load/1, unload/1]). - - %% @doc Load a Plugin - load(PluginName :: atom()) -> ok | {error, any()}. - - %% @doc UnLoad a Plugin - unload(PluginName :: atom()) -> ok | {error, any()}. - -Load a Plugin -------------- - -Use './bin/emqttd_ctl' CLI to load/unload a plugin:: - - ./bin/emqttd_ctl plugins load emqttd_plugin_redis - - ./bin/emqttd_ctl plugins unload emqttd_plugin_redis - -Plugin Template ---------------- - -http://github.com/emqtt/emqttd_plugin_template - -.. _eSockd: https://github.com/emqtt/esockd -.. _Chain-of-responsibility_pattern: https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern -.. _emq_plugin_template: https://github.com/emqtt/emq_plugin_template/blob/master/src/emq_plugin_template.erl - ------------------ -Mnesia/ETS Tables ------------------ - -+--------------------+--------+----------------------------------------+ -| Table | Type | Description | -+====================+========+========================================+ -| mqtt_trie | mnesia | Trie Table | -+--------------------+--------+----------------------------------------+ -| mqtt_trie_node | mnesia | Trie Node Table | -+--------------------+--------+----------------------------------------+ -| mqtt_route | mnesia | Global Route Table | -+--------------------+--------+----------------------------------------+ -| mqtt_local_route | mnesia | Local Route Table | -+--------------------+--------+----------------------------------------+ -| mqtt_pubsub | ets | PubSub Tab | -+--------------------+--------+----------------------------------------+ -| mqtt_subscriber | ets | Subscriber Tab | -+--------------------+--------+----------------------------------------+ -| mqtt_subscription | ets | Subscription Tab | -+--------------------+--------+----------------------------------------+ -| mqtt_session | mnesia | Global Session Table | -+--------------------+--------+----------------------------------------+ -| mqtt_local_session | ets | Local Session Table | -+--------------------+--------+----------------------------------------+ -| mqtt_client | ets | Client Table | -+--------------------+--------+----------------------------------------+ -| mqtt_retained | mnesia | Retained Message Table | -+--------------------+--------+----------------------------------------+ - diff --git a/docs/source/faq.rst b/docs/source/faq.rst deleted file mode 100644 index e8933b2b9..000000000 --- a/docs/source/faq.rst +++ /dev/null @@ -1,77 +0,0 @@ -=== -FAQ -=== - - -##### Q1. Is port 4369 and another random port secure? - -``` -HI, when start emqttd , I found the port 4369 and another random port(63703) is open, are this security ? - -Example: -tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 13736/epmd -tcp 0 0 0.0.0.0:8083 0.0.0.0:* LISTEN 16745/beam.smp -tcp 0 0 0.0.0.0:8883 0.0.0.0:* LISTEN 16745/beam.smp -tcp 0 0 0.0.0.0:63703 0.0.0.0:* LISTEN 16745/beam.smp -tcp 0 0 0.0.0.0:1883 0.0.0.0:* LISTEN 16745/beam.smp - -1883: mqtt no ssl -8883: mqtt with ssl -8083: websocket -``` - -4369 and some random ports are opened by erlang node for internal communication. Configure your firewall to allow 1883, 8883, 8083 ports to be accessed from outside for security. - -Access control of emqttd broker has two layers: - -eSockd TCP Acceptor, Ipaddress based Access Control, Example: - -``` -{access, [{deny, "192.168.1.1"}, -{allow, "192.168.1.0/24"}, -{deny, all}]} -``` - -MQTT Subscribe/Publish Access Control by etc/acl.config, Example: - -``` -{allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}. - -{deny, all, subscribe, ["$SYS/#", {eq, "#"}]}. - -{allow, all}. -``` - -##### Q2. cannot compile emqttd under Chinese folder? - -It seems that rebar cannot support Chinese folder name. - -##### Q3. emqttd is ready for production ? - -The core features are solid and scalable. A small full-time team with many contributors are developing this project. You could submit issues if any feature requests or bug reports. - -##### Q4. Benchmark and performance issue - -Wiki: https://github.com/emqtt/emqttd/wiki/One-Million-Connections - -##### Q5. 'session' identified by clientID?when session expired what will happen?All queued messages will be deleted and subscribed topics will be deleted too?when reconnected, need redo subscription?(#150) - -When a client connected to broker with 'clean session' flag 0, a session identified by clientId will be created. The session will expire after 48 hours(configured in etc/emqttd.config) if no client connections bind with it, and all queued messages and subscriptions will be dropped. - -##### Q6. "{max_queued_messages, 100}" in 0.8 release or "{queue, {max_length, 1000},..." means queue for one session or one topic?If it stands for session,while one topic has lots of offline messages(100), the user's other topic offline messages will be flushed? (#150) - -For session. Topic just dispatch messages to clients or sessions that matched the subscriptions. Will Flood. - -##### Q7. About the retained message, how to config one topic only keep the latest retained message, the older retained messages will be auto deleted?(#150) - -By default, the broker only keep the latest retained message of one topic. - -##### Q8. When the persistent client with 'clean session' flag 0 is offline but not expired, will the broker put session's subscribed topic new messages to session's queue?(#150) - -Yes - -##### Q9. If max_length of queue is 100, when the session subscribed topic1 and topic2, what will happen when topic1 fill 70 messages, then topic2 fill 80 messages? After the reconnection, will the session lose first 50 message?(#150) - -Lose the oldest 50 messages. - - diff --git a/docs/source/getstarted.rst b/docs/source/getstarted.rst deleted file mode 100644 index 871d0af9a..000000000 --- a/docs/source/getstarted.rst +++ /dev/null @@ -1,279 +0,0 @@ - -.. _getstarted: - -=========== -Get Started -=========== - --------- -Overview --------- - -*EMQ* (Erlang MQTT Broker) is an open source MQTT broker written in Erlang/OTP. Erlang/OTP is a concurrent, fault-tolerant, soft-realtime and distributed programming platform. MQTT is an extremely lightweight publish/subscribe messaging protocol powering IoT, M2M and Mobile applications. - -The *EMQ* project is aimed to implement a scalable, distributed, extensible open-source MQTT broker for IoT, M2M and Mobile applications that hope to handle millions of concurrent MQTT clients. - -Highlights of the *EMQ* broker: - -* Full MQTT V3.1/3.1.1 Protocol Specifications Support -* Easy to Install - Quick Install on Linux, FreeBSD, Mac and Windows -* Massively scalable - Scaling to 1 million connections on a single server -* Cluster and Bridge Support -* Easy to extend - Hooks and plugins to customize or extend the broker -* Pluggable Authentication - LDAP, MySQL, PostgreSQL, Redis Authentication Plugins - --------- -Features --------- - -* Full MQTT V3.1/V3.1.1 protocol specification support -* QoS0, QoS1, QoS2 Publish and Subscribe -* Session Management and Offline Messages -* Retained Message -* Last Will Message -* TCP/SSL Connection -* MQTT Over WebSocket(SSL) -* HTTP Publish API -* STOMP protocol -* MQTT-SN Protocol -* CoAP Protocol -* STOMP over SockJS -* $SYS/# Topics -* ClientID Authentication -* IpAddress Authentication -* Username and Password Authentication -* Access control based on IpAddress, ClientID, Username -* Authentication with LDAP, Redis, MySQL, PostgreSQL and HTTP API -* Cluster brokers on several servers -* Bridge brokers locally or remotely -* mosquitto, RSMB bridge -* Extensible architecture with Hooks, Modules and Plugins -* Passed eclipse paho interoperability tests -* Local subscription -* Shared subscription - ------------ -Quick Start ------------ - -Download and Install --------------------- - -The *EMQ* broker is cross-platform, which could be deployed on Linux, FreeBSD, Mac, Windows and even Raspberry Pi. - -Download binary package from: http://emqtt.io/downloads. - -Installing on Mac, for example: - -.. code-block:: bash - - unzip emqttd-macosx-v2.0-rc.2-20161019.zip && cd emqttd - - # Start emqttd - ./bin/emqttd start - - # Check Status - ./bin/emqttd_ctl status - - # Stop emqttd - ./bin/emqttd stop - -Installing from Source ----------------------- - -.. NOTE:: The *EMQ* broker requires Erlang R18+ to build since 1.1 release. - -.. code-block:: bash - - git clone https://github.com/emqtt/emqttd.git - - cd emqttd && make && make dist - - cd rel/emqttd && ./bin/emqttd console - -------------- -Web Dashboard -------------- - -A Web Dashboard will be loaded when the *EMQ* broker is started successfully. - -The Dashboard helps check running status of the broker, monitor statistics and metrics of MQTT packets, query clients, sessions, topics and subscriptions. - -+------------------+---------------------------+ -| Default Address | http://localhost:18083 | -+------------------+---------------------------+ -| Default User | admin | -+------------------+---------------------------+ -| Default Password | public | -+------------------+---------------------------+ - -.. image:: ./_static/images/dashboard.png - -------- -Plugins -------- - -The *EMQ* broker could be extended by Plugins. A plugin is an Erlang application to extend the *EMQ* broker: - -+-------------------------+--------------------------------------------+ -| `emq_auth_clientid`_ | Authentication with ClientId | -+-------------------------+--------------------------------------------+ -| `emq_auth_username`_ | Authentication with Username and Password | -+-------------------------+--------------------------------------------+ -| `emq_plugin_template`_ | Plugin template and demo | -+-------------------------+--------------------------------------------+ -| `emq_dashboard`_ | Web Dashboard | -+-------------------------+--------------------------------------------+ -| `emq_auth_ldap`_ | LDAP Auth Plugin | -+-------------------------+--------------------------------------------+ -| `emq_auth_http`_ | Authentication/ACL with HTTP API | -+-------------------------+--------------------------------------------+ -| `emq_auth_mysql`_ | Authentication with MySQL | -+-------------------------+--------------------------------------------+ -| `emq_auth_pgsql`_ | Authentication with PostgreSQL | -+-------------------------+--------------------------------------------+ -| `emq_auth_redis`_ | Authentication with Redis | -+-------------------------+--------------------------------------------+ -| `emq_mod_rewrite`_ | Topics rewrite like HTTP rewrite module | -+-------------------------+--------------------------------------------+ -| `emq_mod_retainer`_ | Retainer Module | -+-------------------------+--------------------------------------------+ -| `emq_mod_presence`_ | Presence Module | -+-------------------------+--------------------------------------------+ -| `emq_mod_subscription`_ | Subscription Module | -+-------------------------+--------------------------------------------+ -| `emq_mod_mongo`_ | Authentication with MongoDB | -+-------------------------+--------------------------------------------+ -| `emq_sn`_ | MQTT-SN Protocol Plugin | -+-------------------------+--------------------------------------------+ -| `emq_coap`_ | CoAP Protocol Plugin | -+-------------------------+--------------------------------------------+ -| `emq_stomp`_ | STOMP Protocol Plugin | -+-------------------------+--------------------------------------------+ -| `emq_sockjs`_ | SockJS(Stomp) Plugin | -+-------------------------+--------------------------------------------+ -| `emq_recon`_ | Recon Plugin | -+-------------------------+--------------------------------------------+ -| `emq_reloader`_ | Reloader Plugin | -+-------------------------+--------------------------------------------+ - -A plugin could be enabled by 'bin/emqttd_ctl plugins load' command. - -For example, enable 'emq_auth_pgsql' plugin:: - - ./bin/emqttd_ctl plugins load emq_auth_pgsql - ------------------------ -One Million Connections ------------------------ - -Latest release of the *EMQ* broker is scaling to 1.3 million MQTT connections on a 12 Core, 32G CentOS server. - -.. NOTE:: - - The emqttd broker only allows 512 concurrent connections by default, for 'ulimit -n' limit is 1024 on most platform. - -We need tune the OS Kernel, TCP Stack, Erlang VM and emqttd broker for one million connections benchmark. - -Linux Kernel Parameters ------------------------ - -.. code-block:: bash - - # 2M: - sysctl -w fs.file-max=2097152 - sysctl -w fs.nr_open=2097152 - echo 2097152 > /proc/sys/fs/nr_open - - # 1M: - ulimit -n 1048576 - -TCP Stack Parameters --------------------- - -.. code-block:: bash - - # backlog - sysctl -w net.core.somaxconn=65536 - -Erlang VM ---------- - -emqttd/etc/emq.conf: - -.. code-block:: properties - - ## Erlang Process Limit - node.process_limit = 2097152 - - ## Sets the maximum number of simultaneously existing ports for this system - node.max_ports = 1048576 - -Max Allowed Connections ------------------------ - -emqttd/etc/emq.conf 'listeners': - -.. code-block:: properties - - ## Size of acceptor pool - mqtt.listener.tcp.acceptors = 64 - - ## Maximum number of concurrent clients - mqtt.listener.tcp.max_clients = 1000000 - -Test Client ------------ - -.. code-block:: bash - - sysctl -w net.ipv4.ip_local_port_range="500 65535" - echo 1000000 > /proc/sys/fs/nr_open - ulimit -n 100000 - ---------------------- -MQTT Client Libraries ---------------------- - -GitHub: https://github.com/emqtt - -+--------------------+----------------------+ -| `emqttc`_ | Erlang MQTT Client | -+--------------------+----------------------+ -| `emqtt_benchmark`_ | MQTT benchmark Tool | -+--------------------+----------------------+ -| `CocoaMQTT`_ | Swift MQTT Client | -+--------------------+----------------------+ -| `QMQTT`_ | QT MQTT Client | -+--------------------+----------------------+ - -Eclipse Paho: https://www.eclipse.org/paho/ - -MQTT.org: https://github.com/mqtt/mqtt.github.io/wiki/libraries - -.. _emqttc: https://github.com/emqtt/emqttc -.. _emqtt_benchmark: https://github.com/emqtt/emqtt_benchmark -.. _CocoaMQTT: https://github.com/emqtt/CocoaMQTT -.. _QMQTT: https://github.com/emqtt/qmqtt - -.. _emq_plugin_template: https://github.com/emqtt/emq_plugin_template -.. _emq_dashboard: https://github.com/emqtt/emq_dashboard -.. _emq_mod_rewrite: https://github.com/emqtt/emq_mod_rewrite -.. _emq_auth_clientid: https://github.com/emqtt/emq_auth_clientid -.. _emq_auth_username: https://github.com/emqtt/emq_auth_username -.. _emq_auth_ldap: https://github.com/emqtt/emq_auth_ldap -.. _emq_auth_http: https://github.com/emqtt/emq_auth_http -.. _emq_auth_mysql: https://github.com/emqtt/emq_plugin_mysql -.. _emq_auth_pgsql: https://github.com/emqtt/emq_plugin_pgsql -.. _emq_auth_redis: https://github.com/emqtt/emq_plugin_redis -.. _emq_auth_mongo: https://github.com/emqtt/emq_plugin_mongo -.. _emq_reloader: https://github.com/emqtt/emq_reloader -.. _emq_stomp: https://github.com/emqtt/emq_stomp -.. _emq_sockjs: https://github.com/emqtt/emq_sockjs -.. _emq_recon: https://github.com/emqtt/emq_recon -.. _emq_sn: https://github.com/emqtt/emq_sn -.. _emq_coap: https://github.com/emqtt/emq_coap -.. _emq_mod_retainer: https://github.com/emqtt/emq_mod_retainer -.. _emq_mod_presence: https://github.com/emqtt/emq_mod_presence -.. _emq_mod_subscription: https://github.com/emqtt/emq_mod_subscription - diff --git a/docs/source/guide.rst b/docs/source/guide.rst deleted file mode 100644 index b60b4cc89..000000000 --- a/docs/source/guide.rst +++ /dev/null @@ -1,881 +0,0 @@ - -.. _guide: - -========== -User Guide -========== - --------------- -Authentication --------------- - -The *EMQ* broker supports to authenticate MQTT clients with ClientID, Username/Password, IpAddress and even HTTP Cookies. - -The authentication is provided by a list of plugins such as MySQL, PostgreSQL and Redis... - -If we enable several authentication plugins at the same time, the authentication process:: - - ---------------- ---------------- ------------- - Client --> | Username | -ignore-> | ClientID | -ignore-> | Anonymous | - ---------------- ---------------- ------------- - | | | - \|/ \|/ \|/ - allow | deny allow | deny allow | deny - -The authentication plugins implemented by default: - -+---------------------------+---------------------------+ -| Plugin | Description | -+===========================+===========================+ -| `emq_auth_clientid`_ | ClientId Auth Plugin | -+---------------------------+---------------------------+ -| `emq_auth_username`_ | Username Auth Plugin | -+---------------------------+---------------------------+ -| `emq_auth_ldap`_ | LDAP Auth Plugin | -+---------------------------+---------------------------+ -| `emq_auth_http`_ | HTTP Auth/ACL Plugin | -+---------------------------+---------------------------+ -| `emq_auth_mysql`_ | MySQL Auth/ACL Plugin | -+---------------------------+---------------------------+ -| `emq_auth_pgsql`_ | Postgre Auth/ACL Plugin | -+---------------------------+---------------------------+ -| `emq_auth_redis`_ | Redis Auth/ACL Plugin | -+---------------------------+---------------------------+ -| `emq_auth_mongo`_ | MongoDB Auth/ACL Plugin | -+---------------------------+---------------------------+ - ---------------- -Allow Anonymous ---------------- - -Configure etc/emq.conf to allow anonymous authentication: - -.. code-block:: properties - - ## Allow Anonymous authentication - mqtt.allow_anonymous = true - -Username/Password ------------------ - -Authenticate MQTT client with Username/Password:: - -Configure default users in etc/plugins/emq_auth_username.conf: - -.. code-block:: properties - - auth.username.$name=$password - -Enable `emq_auth_username`_ plugin: - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_auth_username - -Add user by './bin/emqttd_ctl users' command:: - - $ ./bin/emqttd_ctl users add - -ClientId --------- - -Authentication with MQTT ClientId. - -Configure Client Ids in etc/plugins/emq_auth_clientid.conf: - -.. code-block:: properties - - auth.clientid.$id=$password - -Enable `emq_auth_clientid`_ plugin: - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_auth_clientid - -LDAP ----- - -etc/plugins/emq_auth_ldap.conf: - -.. code-block:: properties - - auth.ldap.servers = 127.0.0.1 - - auth.ldap.port = 389 - - auth.ldap.timeout = 30 - - auth.ldap.user_dn = uid=%u,ou=People,dc=example,dc=com - - auth.ldap.ssl = false - -Enable LDAP plugin:: - - ./bin/emqttd_ctl plugins load emq_auth_ldap - -HTTP ----- - -etc/plugins/emq_auth_http.conf: - -.. code-block:: properties - - ## Variables: %u = username, %c = clientid, %a = ipaddress, %P = password, %t = topic - - auth.http.auth_req = http://127.0.0.1:8080/mqtt/auth - auth.http.auth_req.method = post - auth.http.auth_req.params = clientid=%c,username=%u,password=%P - - auth.http.super_req = http://127.0.0.1:8080/mqtt/superuser - auth.http.super_req.method = post - auth.http.super_req.params = clientid=%c,username=%u - -Enable HTTP Plugin:: - - ./bin/emqttd_ctl plugins load emq_auth_http - -MySQL ------ - -Authenticate with MySQL database. Suppose that we create a mqtt_user table: - -.. code-block:: sql - - CREATE TABLE `mqtt_user` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `username` varchar(100) DEFAULT NULL, - `password` varchar(100) DEFAULT NULL, - `salt` varchar(20) DEFAULT NULL, - `created` datetime DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `mqtt_username` (`username`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8; - -Configure the 'auth_query' and 'password_hash' in etc/plugins/emq_auth_mysql.conf: - -.. code-block:: properties - - ## Mysql Server - auth.mysql.server = 127.0.0.1:3306 - - ## Mysql Pool Size - auth.mysql.pool = 8 - - ## Mysql Username - ## auth.mysql.username = - - ## Mysql Password - ## auth.mysql.password = - - ## Mysql Database - auth.mysql.database = mqtt - - ## Variables: %u = username, %c = clientid - - ## Authentication Query: select password only - auth.mysql.auth_query = select password from mqtt_user where username = '%u' limit 1 - - ## Password hash: plain, md5, sha, sha256, pbkdf2 - auth.mysql.password_hash = sha256 - - ## %% Superuser Query - auth.mysql.super_query = select is_superuser from mqtt_user where username = '%u' limit 1 - -Enable MySQL plugin: - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_plugin_mysql - -PostgreSQL ----------- - -Authenticate with PostgreSQL database. Create a mqtt_user table: - -.. code-block:: sql - - CREATE TABLE mqtt_user ( - id SERIAL primary key, - username character varying(100), - password character varying(100), - salt character varying(40) - ); - -Configure the 'auth_query' and 'password_hash' in etc/plugins/emq_auth_pgsql.conf: - -.. code-block:: properties - - ## Postgre Server - auth.pgsql.server = 127.0.0.1:5432 - - auth.pgsql.pool = 8 - - auth.pgsql.username = root - - #auth.pgsql.password = - - auth.pgsql.database = mqtt - - auth.pgsql.encoding = utf8 - - auth.pgsql.ssl = false - - ## Variables: %u = username, %c = clientid, %a = ipaddress - - ## Authentication Query: select password only - auth.pgsql.auth_query = select password from mqtt_user where username = '%u' limit 1 - - ## Password hash: plain, md5, sha, sha256, pbkdf2 - auth.pgsql.password_hash = sha256 - - ## sha256 with salt prefix - ## auth.pgsql.password_hash = salt sha256 - - ## sha256 with salt suffix - ## auth.pgsql.password_hash = sha256 salt - - ## Superuser Query - auth.pgsql.super_query = select is_superuser from mqtt_user where username = '%u' limit 1 - -Enable the plugin: - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_plugin_pgsql - -Redis ------ - -Authenticate with Redis. MQTT users could be stored in redis HASH, the key is "mqtt_user:". - -Configure 'auth_cmd' and 'password_hash' in etc/plugins/emq_auth_redis.conf: - -.. code-block:: properties - - ## Redis Server - auth.redis.server = 127.0.0.1:6379 - - ## Redis Pool Size - auth.redis.pool = 8 - - ## Redis Database - auth.redis.database = 0 - - ## Redis Password - ## auth.redis.password = - - ## Variables: %u = username, %c = clientid - - ## Authentication Query Command - auth.redis.auth_cmd = HGET mqtt_user:%u password - - ## Password hash: plain, md5, sha, sha256, pbkdf2 - auth.redis.password_hash = sha256 - - ## Superuser Query Command - auth.redis.super_cmd = HGET mqtt_user:%u is_superuser - -Enable the plugin: - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_auth_redis - -MongoDB -------- - -Create a `mqtt_user` collection:: - - { - username: "user", - password: "password hash", - is_superuser: boolean (true, false), - created: "datetime" - } - -Configure `super_query`, `auth_query` in etc/plugins/emq_auth_mongo.conf: - -.. code-block:: properties - - ## Mongo Server - auth.mongo.server = 127.0.0.1:27017 - - ## Mongo Pool Size - auth.mongo.pool = 8 - - ## Mongo User - ## auth.mongo.user = - - ## Mongo Password - ## auth.mongo.password = - - ## Mongo Database - auth.mongo.database = mqtt - - ## auth_query - auth.mongo.auth_query.collection = mqtt_user - - auth.mongo.auth_query.password_field = password - - auth.mongo.auth_query.password_hash = sha256 - - auth.mongo.auth_query.selector = username=%u - - ## super_query - auth.mongo.super_query.collection = mqtt_user - - auth.mongo.super_query.super_field = is_superuser - - auth.mongo.super_query.selector = username=%u - -Enable the plugin: - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_auth_mongo - -.. _acl: - ---- -ACL ---- - -The ACL of *EMQ* broker is responsbile for authorizing MQTT clients to publish/subscribe topics. - -The ACL rules define:: - - Allow|Deny Who Publish|Subscribe Topics - -Access Control Module of *EMQ* broker will match the rules one by one:: - - --------- --------- --------- - Client -> | Rule1 | --nomatch--> | Rule2 | --nomatch--> | Rule3 | --> Default - --------- --------- --------- - | | | - match match match - \|/ \|/ \|/ - allow | deny allow | deny allow | deny - -Internal --------- - -The default ACL of *EMQ* broker is implemented by an 'internal' module. - -Enable the 'internal' ACL module in etc/emq.conf: - -.. code-block:: properties - - ## Default ACL File - mqtt.acl_file = etc/acl.conf - -The ACL rules of 'internal' module are defined in 'etc/acl.conf' file: - -.. code-block:: erlang - - %% Allow 'dashboard' to subscribe '$SYS/#' - {allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}. - - %% Allow clients from localhost to subscribe any topics - {allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}. - - %% Deny clients to subscribe '$SYS#' and '#' - {deny, all, subscribe, ["$SYS/#", {eq, "#"}]}. - - %% Allow all by default - {allow, all}. - -HTTP API --------- - -ACL by HTTP API: https://github.com/emqtt/emq_auth_http - -Configure etc/plugins/emq_auth_http.conf and enable the plugin: - -.. code-block:: properties - - ## 'access' parameter: sub = 1, pub = 2 - auth.http.acl_req = http://127.0.0.1:8080/mqtt/acl - auth.http.acl_req.method = get - auth.http.acl_req.params = access=%A,username=%u,clientid=%c,ipaddr=%a,topic=%t - - auth.http.acl_nomatch = deny - -MySQL ------ - -ACL with MySQL database. The `mqtt_acl` table and default data: - -.. code-block:: sql - - CREATE TABLE `mqtt_acl` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `allow` int(1) DEFAULT NULL COMMENT '0: deny, 1: allow', - `ipaddr` varchar(60) DEFAULT NULL COMMENT 'IpAddress', - `username` varchar(100) DEFAULT NULL COMMENT 'Username', - `clientid` varchar(100) DEFAULT NULL COMMENT 'ClientId', - `access` int(2) NOT NULL COMMENT '1: subscribe, 2: publish, 3: pubsub', - `topic` varchar(100) NOT NULL DEFAULT '' COMMENT 'Topic Filter', - PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - INSERT INTO mqtt_acl (id, allow, ipaddr, username, clientid, access, topic) - VALUES - (1,1,NULL,'$all',NULL,2,'#'), - (2,0,NULL,'$all',NULL,1,'$SYS/#'), - (3,0,NULL,'$all',NULL,1,'eq #'), - (5,1,'127.0.0.1',NULL,NULL,2,'$SYS/#'), - (6,1,'127.0.0.1',NULL,NULL,2,'#'), - (7,1,NULL,'dashboard',NULL,1,'$SYS/#'); - -Configure 'acl-query' and 'acl_nomatch' in etc/plugins/emq_auth_mysql.conf: - -.. code-block:: properties - - ## ACL Query Command - auth.mysql.acl_query = select allow, ipaddr, username, clientid, access, topic from mqtt_acl where ipaddr = '%a' or username = '%u' or username = '$all' or clientid = '%c' - - ## ACL nomatch - auth.mysql.acl_nomatch = deny - -PostgreSQL ----------- - -ACL with PostgreSQL database. The mqtt_acl table and default data: - -.. code-block:: sql - - CREATE TABLE mqtt_acl ( - id SERIAL primary key, - allow integer, - ipaddr character varying(60), - username character varying(100), - clientid character varying(100), - access integer, - topic character varying(100) - ); - - INSERT INTO mqtt_acl (id, allow, ipaddr, username, clientid, access, topic) - VALUES - (1,1,NULL,'$all',NULL,2,'#'), - (2,0,NULL,'$all',NULL,1,'$SYS/#'), - (3,0,NULL,'$all',NULL,1,'eq #'), - (5,1,'127.0.0.1',NULL,NULL,2,'$SYS/#'), - (6,1,'127.0.0.1',NULL,NULL,2,'#'), - (7,1,NULL,'dashboard',NULL,1,'$SYS/#'); - -Configure 'acl_query' and 'acl_nomatch' in etc/plugins/emq_auth_pgsql.conf: - -.. code-block:: properties - - ## ACL Query. Comment this query, the acl will be disabled. - auth.pgsql.acl_query = select allow, ipaddr, username, clientid, access, topic from mqtt_acl where ipaddr = '%a' or username = '%u' or username = '$all' or clientid = '%c' - - ## If no rules matched, return... - auth.pgsql.acl_nomatch = deny - -Redis ------ - -ACL with Redis. The ACL rules are stored in a Redis HashSet:: - - HSET mqtt_acl: topic1 1 - HSET mqtt_acl: topic2 2 - HSET mqtt_acl: topic3 3 - -Configure `acl_cmd` and `acl_nomatch` in etc/plugins/emq_auth_redis.conf: - -.. code-block:: properties - - ## ACL Query Command - auth.redis.acl_cmd = HGETALL mqtt_acl:%u - - ## ACL nomatch - auth.redis.acl_nomatch = deny - -MongoDB -------- - -Store ACL Rules in a `mqtt_acl` collection: - -.. code-block:: json - - { - username: "username", - clientid: "clientid", - publish: ["topic1", "topic2", ...], - subscribe: ["subtop1", "subtop2", ...], - pubsub: ["topic/#", "topic1", ...] - } - -For example, insert rules into `mqtt_acl` collection:: - - db.mqtt_acl.insert({username: "test", publish: ["t/1", "t/2"], subscribe: ["user/%u", "client/%c"]}) - db.mqtt_acl.insert({username: "admin", pubsub: ["#"]}) - -Configure `acl_query` and `acl_nomatch` in etc/plugins/emq_auth_mongo.conf: - -.. code-block:: properties - - ## acl_query - auth.mongo.acl_query.collection = mqtt_user - - auth.mongo.acl_query.selector = username=%u - - ## acl_nomatch - auth.mongo.acl_nomatch = deny - ----------------------- -MQTT Publish/Subscribe ----------------------- - -MQTT is a an extremely lightweight publish/subscribe messaging protocol desgined for IoT, M2M and Mobile applications. - -.. image:: _static/images/pubsub_concept.png - -Install and start the *EMQ* broker, and then any MQTT client could connect to the broker, subscribe topics and publish messages. - -MQTT Client Libraries: https://github.com/mqtt/mqtt.github.io/wiki/libraries - -For example, we use mosquitto_sub/pub commands:: - - mosquitto_sub -t topic -q 2 - mosquitto_pub -t topic -q 1 -m "Hello, MQTT!" - -MQTT V3.1.1 Protocol Specification: http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html - -MQTT Listener of emqttd broker is configured in etc/emq.conf: - -.. code-block:: erlang - -.. code-block:: properties - - ## TCP Listener: 1883, 127.0.0.1:1883, ::1:1883 - mqtt.listener.tcp = 1883 - - ## Size of acceptor pool - mqtt.listener.tcp.acceptors = 8 - - ## Maximum number of concurrent clients - mqtt.listener.tcp.max_clients = 1024 - -MQTT(SSL) Listener, Default Port is 8883: - -.. code-block:: properties - - ## SSL Listener: 8883, 127.0.0.1:8883, ::1:8883 - mqtt.listener.ssl = 8883 - - ## Size of acceptor pool - mqtt.listener.ssl.acceptors = 4 - - ## Maximum number of concurrent clients - mqtt.listener.ssl.max_clients = 512 - ----------------- -HTTP Publish API ----------------- - -The *EMQ* broker provides a HTTP API to help application servers publish messages to MQTT clients. - -HTTP API: POST http://host:8083/mqtt/publish - -Web servers such as PHP, Java, Python, NodeJS and Ruby on Rails could use HTTP POST to publish MQTT messages to the broker:: - - curl -v --basic -u user:passwd -d "qos=1&retain=0&topic=/a/b/c&message=hello from http..." -k http://localhost:8083/mqtt/publish - -Parameters of the HTTP API: - -+---------+----------------+ -| Name | Description | -+=========+================+ -| client | clientid | -+---------+----------------+ -| qos | QoS(0, 1, 2) | -+---------+----------------+ -| retain | Retain(0, 1) | -+---------+----------------+ -| topic | Topic | -+---------+----------------+ -| message | Payload | -+---------+----------------+ - -.. NOTE:: The API uses HTTP Basic Authentication. - -------------------- -MQTT Over WebSocket -------------------- - -Web browsers could connect to the emqttd broker directly by MQTT Over WebSocket. - -+-------------------------+----------------------------+ -| WebSocket URI: | ws(s)://host:8083/mqtt | -+-------------------------+----------------------------+ -| Sec-WebSocket-Protocol: | 'mqttv3.1' or 'mqttv3.1.1' | -+-------------------------+----------------------------+ - -The Dashboard plugin provides a test page for WebSocket:: - - http://127.0.0.1:18083/websocket.html - -Listener of WebSocket and HTTP Publish API is configured in etc/emqttd.config: - -.. code-block:: properties - - ## HTTP and WebSocket Listener - mqtt.listener.http = 8083 - mqtt.listener.http.acceptors = 4 - mqtt.listener.http.max_clients = 64 - ------------ -$SYS Topics ------------ - -The *EMQ* broker periodically publishes internal status, MQTT statistics, metrics and client online/offline status to $SYS/# topics. - -For the *EMQ* broker could be clustered, the $SYS topic path is started with:: - - $SYS/brokers/${node}/ - -'${node}' is the erlang node name of emqttd broker. For example:: - - $SYS/brokers/emqttd@127.0.0.1/version - - $SYS/brokers/emqttd@host2/uptime - -.. NOTE:: The broker only allows clients from localhost to subscribe $SYS topics by default. - -Sys Interval of publishing $SYS messages, could be configured in etc/emqttd.config:: - - {broker, [ - %% System interval of publishing broker $SYS messages - {sys_interval, 60}, - - -Broker Version, Uptime and Description ---------------------------------------- - -+--------------------------------+-----------------------+ -| Topic | Description | -+================================+=======================+ -| $SYS/brokers | Broker nodes | -+--------------------------------+-----------------------+ -| $SYS/brokers/${node}/version | Broker Version | -+--------------------------------+-----------------------+ -| $SYS/brokers/${node}/uptime | Broker Uptime | -+--------------------------------+-----------------------+ -| $SYS/brokers/${node}/datetime | Broker DateTime | -+--------------------------------+-----------------------+ -| $SYS/brokers/${node}/sysdescr | Broker Description | -+--------------------------------+-----------------------+ - -Online/Offline Status of MQTT Client ------------------------------------- - -The topic path started with: $SYS/brokers/${node}/clients/ - -+--------------------------+--------------------------------------------+------------------------------------+ -| Topic | Payload(JSON) | Description | -+==========================+============================================+====================================+ -| ${clientid}/connected | {ipaddress: "127.0.0.1", username: "test", | Publish when a client connected | -| | session: false, version: 3, connack: 0, | | -| | ts: 1432648482} | | -+--------------------------+--------------------------------------------+------------------------------------+ -| ${clientid}/disconnected | {reason: "keepalive_timeout", | Publish when a client disconnected | -| | ts: 1432749431} | | -+--------------------------+--------------------------------------------+------------------------------------+ - -Properties of 'connected' Payload:: - - ipaddress: "127.0.0.1", - username: "test", - session: false, - protocol: 3, - connack: 0, - ts: 1432648482 - -Properties of 'disconnected' Payload:: - - reason: normal, - ts: 1432648486 - -Broker Statistics ------------------ - -Topic path started with: $SYS/brokers/${node}/stats/ - -Clients -....... - -+---------------------+---------------------------------------------+ -| Topic | Description | -+---------------------+---------------------------------------------+ -| clients/count | Count of current connected clients | -+---------------------+---------------------------------------------+ -| clients/max | Max number of cocurrent connected clients | -+---------------------+---------------------------------------------+ - -Sessions -........ - -+---------------------+---------------------------------------------+ -| Topic | Description | -+---------------------+---------------------------------------------+ -| sessions/count | Count of current sessions | -+---------------------+---------------------------------------------+ -| sessions/max | Max number of sessions | -+---------------------+---------------------------------------------+ - -Subscriptions -............. - -+---------------------+---------------------------------------------+ -| Topic | Description | -+---------------------+---------------------------------------------+ -| subscriptions/count | Count of current subscriptions | -+---------------------+---------------------------------------------+ -| subscriptions/max | Max number of subscriptions | -+---------------------+---------------------------------------------+ - -Topics -...... - -+---------------------+---------------------------------------------+ -| Topic | Description | -+---------------------+---------------------------------------------+ -| topics/count | Count of current topics | -+---------------------+---------------------------------------------+ -| topics/max | Max number of topics | -+---------------------+---------------------------------------------+ - -Broker Metrics --------------- - -Topic path started with: $SYS/brokers/${node}/metrics/ - -Bytes Sent/Received -................... - -+---------------------+---------------------------------------------+ -| Topic | Description | -+---------------------+---------------------------------------------+ -| bytes/received | MQTT Bytes Received since broker started | -+---------------------+---------------------------------------------+ -| bytes/sent | MQTT Bytes Sent since the broker started | -+---------------------+---------------------------------------------+ - -Packets Sent/Received -..................... - -+--------------------------+---------------------------------------------+ -| Topic | Description | -+--------------------------+---------------------------------------------+ -| packets/received | MQTT Packets received | -+--------------------------+---------------------------------------------+ -| packets/sent | MQTT Packets sent | -+--------------------------+---------------------------------------------+ -| packets/connect | MQTT CONNECT Packet received | -+--------------------------+---------------------------------------------+ -| packets/connack | MQTT CONNACK Packet sent | -+--------------------------+---------------------------------------------+ -| packets/publish/received | MQTT PUBLISH packets received | -+--------------------------+---------------------------------------------+ -| packets/publish/sent | MQTT PUBLISH packets sent | -+--------------------------+---------------------------------------------+ -| packets/subscribe | MQTT SUBSCRIBE Packets received | -+--------------------------+---------------------------------------------+ -| packets/suback | MQTT SUBACK packets sent | -+--------------------------+---------------------------------------------+ -| packets/unsubscribe | MQTT UNSUBSCRIBE Packets received | -+--------------------------+---------------------------------------------+ -| packets/unsuback | MQTT UNSUBACK Packets sent | -+--------------------------+---------------------------------------------+ -| packets/pingreq | MQTT PINGREQ packets received | -+--------------------------+---------------------------------------------+ -| packets/pingresp | MQTT PINGRESP Packets sent | -+--------------------------+---------------------------------------------+ -| packets/disconnect | MQTT DISCONNECT Packets received | -+--------------------------+---------------------------------------------+ - -Messages Sent/Received -...................... - -+--------------------------+---------------------------------------------+ -| Topic | Description | -+--------------------------+---------------------------------------------+ -| messages/received | Messages Received | -+--------------------------+---------------------------------------------+ -| messages/sent | Messages Sent | -+--------------------------+---------------------------------------------+ -| messages/retained | Messages Retained | -+--------------------------+---------------------------------------------+ -| messages/stored | TODO: Messages Stored | -+--------------------------+---------------------------------------------+ -| messages/dropped | Messages Dropped | -+--------------------------+---------------------------------------------+ - -Broker Alarms -------------- - -Topic path started with: $SYS/brokers/${node}/alarms/ - -+------------------+------------------+ -| Topic | Description | -+------------------+------------------+ -| ${alarmId}/alert | New Alarm | -+------------------+------------------+ -| ${alarmId}/clear | Clear Alarm | -+------------------+------------------+ - -Broker Sysmon -------------- - -Topic path started with: '$SYS/brokers/${node}/sysmon/' - -+------------------+--------------------+ -| Topic | Description | -+------------------+--------------------+ -| long_gc | Long GC Warning | -+------------------+--------------------+ -| long_schedule | Long Schedule | -+------------------+--------------------+ -| large_heap | Large Heap Warning | -+------------------+--------------------+ -| busy_port | Busy Port Warning | -+------------------+--------------------+ -| busy_dist_port | Busy Dist Port | -+------------------+--------------------+ - ------ -Trace ------ - -The emqttd broker supports to trace MQTT packets received/sent from/to a client, or trace MQTT messages published to a topic. - -Trace a client:: - - ./bin/emqttd_ctl trace client "clientid" "trace_clientid.log" - -Trace a topic:: - - ./bin/emqttd_ctl trace topic "topic" "trace_topic.log" - -Lookup Traces:: - - ./bin/emqttd_ctl trace list - -Stop a Trace:: - - ./bin/emqttd_ctl trace client "clientid" off - - ./bin/emqttd_ctl trace topic "topic" off - -.. _emq_auth_clientid: https://github.com/emqtt/emq_auth_clientid -.. _emq_auth_username: https://github.com/emqtt/emq_auth_username -.. _emq_auth_ldap: https://github.com/emqtt/emq_auth_ldap -.. _emq_auth_http: https://github.com/emqtt/emq_auth_http -.. _emq_auth_mysql: https://github.com/emqtt/emq_plugin_mysql -.. _emq_auth_pgsql: https://github.com/emqtt/emq_plugin_pgsql -.. _emq_auth_redis: https://github.com/emqtt/emq_plugin_redis -.. _emq_auth_mongo: https://github.com/emqtt/emq_plugin_mongo - diff --git a/docs/source/index.rst b/docs/source/index.rst deleted file mode 100644 index ea4f62557..000000000 --- a/docs/source/index.rst +++ /dev/null @@ -1,64 +0,0 @@ -.. Erlang MQTT Broker documentation master file, created by - sphinx-quickstart on Mon Feb 22 00:46:47 2016. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -========================== -*EMQ* - Erlang MQTT Broker -========================== - -*EMQ* (Erlang MQTT Broker) is a massively scalable and clusterable MQTT V3.1/V3.1.1 broker written in Erlang/OTP. - -.. NOTE:: Adopt a shortened project name since 2.0 release: EMQ - -*EMQ* is fully open source and licensed under the Apache Version 2.0. emqttd implements both MQTT V3.1 and V3.1.1 protocol specifications, and supports WebSocket, STOMP, SockJS, CoAP and MQTT-SN at the same time. - -Latest release of the *EMQ* broker is scaling to 1.3 million MQTT connections on a 12 Core, 32G CentOS server. - -.. image:: ./_static/images/emqtt.png - -The *EMQ* project provides a scalable, enterprise grade, extensible open-source MQTT broker for IoT, M2M, Smart Hardware, Mobile Messaging and HTML5 Web Messaging Applications. - -Sensors, Mobiles, Web Browsers and Application Servers could be connected by *EMQ* brokers with asynchronous PUB/SUB MQTT messages. - -+---------------+-----------------------------------------+ -| Homepage: | http://emqtt.io | -+---------------+-----------------------------------------+ -| Downloads: | http://emqtt.io/downloads | -+---------------+-----------------------------------------+ -| GitHub: | https://github.com/emqtt | -+---------------+-----------------------------------------+ -| Twitter: | @emqtt | -+---------------+-----------------------------------------+ -| Forum: | https://groups.google.com/d/forum/emqtt | -+---------------+-----------------------------------------+ -| Mailing List: | emqtt@googlegroups.com | -+---------------+-----------------------------------------+ -| Author: | Feng Lee | -+---------------+-----------------------------------------+ - -Contents: - -.. toctree:: - :maxdepth: 2 - - getstarted - install - config - cluster - bridge - guide - advanced - design - commands - plugins - tune - changes - upgrade - -------- -License -------- - -Apache License Version 2.0 - diff --git a/docs/source/install.rst b/docs/source/install.rst deleted file mode 100644 index 7e7d107fa..000000000 --- a/docs/source/install.rst +++ /dev/null @@ -1,386 +0,0 @@ - -.. _install: - -============ -Installation -============ - -The *EMQ* broker is cross-platform, which could be deployed on Linux, FreeBSD, Mac, Windows and even Raspberry Pi. - -.. NOTE:: - - Linux, FreeBSD Recommended. - -.. _install_download: - ------------------ -Download Packages ------------------ - -Download binary packages from: http://emqtt.io/downloads - -+-----------+------------------------------------------+ -| Debian | http://emqtt.io/downloads/latest/debian | -+-----------+------------------------------------------+ -| Ubuntu | http://emqtt.io/downloads/latest/ubuntu | -+-----------+------------------------------------------+ -| CentOS | http://emqtt.io/downloads/latest/centos | -+-----------+------------------------------------------+ -| FreeBSD | http://emqtt.io/downloads/latest/freebsd | -+-----------+------------------------------------------+ -| Mac OS X | http://emqtt.io/downloads/latest/macosx | -+-----------+------------------------------------------+ -| Windows | http://emqtt.io/downloads/latest/windows | -+-----------+------------------------------------------+ -| Docker | http://emqtt.com/downloads/latest/docker | -+-----------+------------------------------------------+ - -The package name consists of platform, version and release time. - -For example: emqttd-centos64-v2.0-rc.2-20161019.zip - -.. _install_on_linux: - -------------------- -Installing on Linux -------------------- - -Download CentOS Package from: http://emqtt.io/downloads/latest/centos, and then unzip: - -.. code-block:: bash - - unzip emqttd-centos64-v2.0-rc.2-20161019.zip - -Start the broker in console mode: - -.. code-block:: bash - - cd emqttd && ./bin/emqttd console - -If the broker is started successfully, console will print: - -.. code-block:: bash - - starting emqttd on node 'emqttd@127.0.0.1' - emqttd ctl is starting...[done] - emqttd trace is starting...[done] - emqttd pubsub is starting...[done] - emqttd stats is starting...[done] - emqttd metrics is starting...[done] - emqttd retainer is starting...[done] - emqttd pooler is starting...[done] - emqttd client manager is starting...[done] - emqttd session manager is starting...[done] - emqttd session supervisor is starting...[done] - emqttd broker is starting...[done] - emqttd alarm is starting...[done] - emqttd mod supervisor is starting...[done] - emqttd bridge supervisor is starting...[done] - emqttd access control is starting...[done] - emqttd system monitor is starting...[done] - http listen on 0.0.0.0:18083 with 4 acceptors. - mqtt listen on 0.0.0.0:1883 with 16 acceptors. - mqtts listen on 0.0.0.0:8883 with 4 acceptors. - http listen on 0.0.0.0:8083 with 4 acceptors. - Erlang MQTT Broker 2.0 is running now - Eshell V6.4 (abort with ^G) - (emqttd@127.0.0.1)1> - -CTRL+C to close the console and stop the broker. - -Start the broker in daemon mode: - -.. code-block:: bash - - ./bin/emqttd start - -Check the running status of the broker: - -.. code-block:: bash - - $ ./bin/emqttd_ctl status - Node 'emqttd@127.0.0.1' is started - emqttd 2.0 is running - -Or check the status by URL:: - - http://localhost:8083/status - -Stop the broker:: - - ./bin/emqttd stop - -.. _install_on_freebsd: - ---------------------- -Installing on FreeBSD ---------------------- - -Download FreeBSD Package from: http://emqtt.io/downloads/latest/freebsd - -The installing process is same to Linux. - -.. _install_on_mac: - ----------------------- -Installing on Mac OS X ----------------------- - -We could install the broker on Mac OS X to develop and debug MQTT applications. - -Download Mac Package from: http://emqtt.io/downloads/latest/macosx - -Configure log level in `etc/emq.conf`, all MQTT messages recevied/sent will be printed on console: - -.. code-block:: - - ## Console log. Enum: off, file, console, both - log.console = both - - ## Console log level. Enum: debug, info, notice, warning, error, critical, alert, emergency - log.console.level = debug - - ## Console log file - log.console.file = log/console.log - -The install and boot process on Mac are same to Linux. - -.. _install_on_windows: - ---------------------- -Installing on Windows ---------------------- - -Download Package from: http://emqtt.io/downloads/latest/windows. - -Unzip the package to install folder. Open the command line window and 'cd' to the folder. - -Start the broker in console mode:: - - .\bin\emqttd console - -If the broker started successfully, a Erlang console window will popup. - -Close the console window and stop the emqttd broker. Prepare to register emqttd as window service. - -Install emqttd serivce:: - - .\bin\emqttd install - -Start emqttd serivce:: - - .\bin\emqttd start - -Stop emqttd serivce:: - - .\bin\emqttd stop - -Uninstall emqttd service:: - - .\bin\emqttd uninstall - -.. WARNING:: './bin/emqttd_ctl' command line cannot work on Windows. - -.. _install_via_docker_image: - ------------------------- -Install via Docker Image ------------------------- - -Download *EMQ* 2.0 Docker Image: - - http://emqtt.com/downloads/latest/docker - -unzip emqttd-docker image:: - - unzip emqttd-docker-v2.0.zip - -Load Docker Image:: - - docker load < emqttd-docker-v2.0 - -Run the Container:: - - docker run -itd --net='host' --name emq20 emqttd-docker-v2.0 - -Stop the broker:: - - docker stop emq20 - -Start the broker:: - - docker start emq20 - -Enter the running container:: - - docker exec -it emq20 /bin/bash - -.. _build_from_source: - ----------------------- -Installing From Source ----------------------- - -The *EMQ* broker requires Erlang/OTP R18+ and git client to build: - -Install Erlang: http://www.erlang.org/ - -Install Git Client: http://www.git-scm.com/ - -Could use apt-get on Ubuntu, yum on CentOS/RedHat and brew on Mac to install Erlang and Git. - -When all dependencies are ready, clone the emqttd project from github.com and build: - -.. code-block:: bash - - git clone https://github.com/emqtt/emqttd-relx.git - - cd emqttd-relx && make - - cd _rel/emqttd && ./bin/emqttd console - -The binary package output in folder:: - - _rel/emqttd - -.. _tcp_ports: - --------------- -TCP Ports Used --------------- - -+-----------+-----------------------------------+ -| 1883 | MQTT Port | -+-----------+-----------------------------------+ -| 8883 | MQTT/SSL Port | -+-----------+-----------------------------------+ -| 8083 | MQTT(WebSocket), HTTP API Port | -+-----------+-----------------------------------+ -| 8084 | MQTT(WebSocket/SSL), HTTP API Port| -+-----------+-----------------------------------+ -| 18083 | Web Dashboard Port | -+-----------+-----------------------------------+ - -The TCP ports used can be configured in etc/emqttd.config: - -.. code-block:: properties - - ## TCP Listener: 1883, 127.0.0.1:1883, ::1:1883 - mqtt.listener.tcp = 1883 - - ## SSL Listener: 8883, 127.0.0.1:8883, ::1:8883 - mqtt.listener.ssl = 8883 - - ## HTTP and WebSocket Listener - mqtt.listener.http = 8083 - -The 18083 port is used by Web Dashboard of the broker. Default login: admin, Password: public - -.. _quick_setup: - ------------ -Quick Setup ------------ - -Two main configuration files of the *EMQ* broker: - -+-----------------------+-----------------------------------+ -| etc/emq.conf | EMQ Broker Config | -+-----------------------+-----------------------------------+ -| etc/plugins/\*.conf | EMQ Plugins' Config | -+-----------------------+-----------------------------------+ - -Two important parameters in etc/emq.conf: - -+--------------------+-------------------------------------------------------------------------+ -| node.process_limit | Max number of Erlang proccesses. A MQTT client consumes two proccesses. | -| | The value should be larger than max_clients * 2 | -+--------------------+-------------------------------------------------------------------------+ -| node.max_ports | Max number of Erlang Ports. A MQTT client consumes one port. | -| | The value should be larger than max_clients. | -+--------------------+-------------------------------------------------------------------------+ - -.. NOTE:: - - node.process_limit > maximum number of allowed concurrent clients * 2 - node.max_ports > maximum number of allowed concurrent clients - -The maximum number of allowed MQTT clients: - -.. code-block:: properties - - mqtt.listener.tcp = 1883 - - mqtt.listener.tcp.acceptors = 8 - - mqtt.listener.tcp.max_clients = 1024 - -.. _init_d_emqttd: - -------------------- -/etc/init.d/emqttd -------------------- - -.. code-block:: bash - - #!/bin/sh - # - # emqttd Startup script for emqttd. - # - # chkconfig: 2345 90 10 - # description: emqttd is mqtt broker. - - # source function library - . /etc/rc.d/init.d/functions - - # export HOME=/root - - start() { - echo "starting emqttd..." - cd /opt/emqttd && ./bin/emqttd start - } - - stop() { - echo "stopping emqttd..." - cd /opt/emqttd && ./bin/emqttd stop - } - - restart() { - stop - start - } - - case "$1" in - start) - start - ;; - stop) - stop - ;; - restart) - restart - ;; - *) - echo $"Usage: $0 {start|stop}" - RETVAL=2 - esac - - -chkconfig:: - - chmod +x /etc/init.d/emqttd - chkconfig --add emqttd - chkconfig --list - -boot test:: - - service emqttd start - -.. NOTE:: - - ## erlexec: HOME must be set - uncomment '# export HOME=/root' if "HOME must be set" error. - -.. _emq_dashboard: https://github.com/emqtt/emqttd_dashboard - - diff --git a/docs/source/mqtt-sn.rst b/docs/source/mqtt-sn.rst deleted file mode 100644 index 22bcabf6f..000000000 --- a/docs/source/mqtt-sn.rst +++ /dev/null @@ -1,10 +0,0 @@ - -.. _mqtt_sn: - -TODO:... - -================ -MQTT-SN Protocol -================ - - diff --git a/docs/source/mqtt.rst b/docs/source/mqtt.rst deleted file mode 100644 index 8cebe5b63..000000000 --- a/docs/source/mqtt.rst +++ /dev/null @@ -1,101 +0,0 @@ - -.. _mqtt: - -TODO:... - -============= -MQTT Protocol -============= - ----------------------- -MQTT Protocol Tutorial ----------------------- - -MQTT.ORG docs: a publish/subscribe messaging protocol which is extremely lightweight, for IoT, M2M and mobile messaging - -.. image:: _static/images/pubsub_concept.png - -Publish/Subscribe Model ------------------------ - -.. image:: _static/images/pubsub_concept.png - - -MQTT Control Packets --------------------- - -MQTT Packet Structure ---------------------- - -Compact: 1 byte header - -MQTT Packet Types ------------------ - -MQTT Packet Flags ------------------ - -MQTT Client Libraries ---------------------- - -MQTT Client Libraries ---------------------- - -mosquitto_pub mosquitto_sub co - -mqtt.org: - -TODO: LIST - -Maintained by emqtt.com: - -TODO: LIST - - -------------------------- -QoS0, QoS1, QoS2 Messages -------------------------- - -C->S Sequence... - - ----------------- -Retained Message ----------------- - -publish a retained message:: - - mosquitto_pub -t topic -m msg -q 1 -r - -subscribe to get the message:: - - mosquitto_sub -t topic -m msg -q 1 -r - - ------------- -Will Message ------------- - ------------- -Keep Alive ------------- - ----------------------------------- -Clean Session and Offline Messages ----------------------------------- - - - - -MQTT Client Libraries ---------------------- - -mosquitto_pub mosquitto_sub co - -mqtt.org: - -TODO: LIST - -Maintained by emqtt.com: - -TODO: LIST diff --git a/docs/source/plugins.rst b/docs/source/plugins.rst deleted file mode 100644 index 983beb3ca..000000000 --- a/docs/source/plugins.rst +++ /dev/null @@ -1,1165 +0,0 @@ - -.. _plugins: - -======= -Plugins -======= - -The *EMQ* broker could be extended by plugins. Users could develop plugins to customize authentication, ACL and functions of the broker, or integrate the broker with other systems. - -The plugins that *EMQ* 2.0-rc.2 released: - -+------------------------+-------------------------------+ -| Plugin | Description | -+========================+===============================+ -| `emq_dashboard`_ | Web Dashboard | -+------------------------+-------------------------------+ -| `emq_auth_clientid`_ | ClientId Auth Plugin | -+------------------------+-------------------------------+ -| `emq_auth_username`_ | Username/Password Auth Plugin | -+------------------------+-------------------------------+ -| `emq_auth_ldap`_ | LDAP Auth | -+------------------------+-------------------------------+ -| `emq_auth_http`_ | HTTP Auth/ACL Plugin | -+------------------------+-------------------------------+ -| `emq_auth_mysql`_ | MySQL Auth/ACL Plugin | -+------------------------+-------------------------------+ -| `emq_auth_pgsql`_ | PostgreSQL Auth/ACL Plugin | -+------------------------+-------------------------------+ -| `emq_auth_redis`_ | Redis Auth/ACL Plugin | -+------------------------+-------------------------------+ -| `emq_auth_mongo`_ | MongoDB Auth/ACL Plugin | -+------------------------+-------------------------------+ -| `emq_mod_presence`_ | Presence Module | -+------------------------+-------------------------------+ -| `emq_mod_retainer`_ | Retainer Module | -+------------------------+-------------------------------+ -| `emq_mod_rewrite`_ | Topic Rewrite Module | -+------------------------+-------------------------------+ -| `emq_mod_subscription`_| Subscription Module | -+------------------------+-------------------------------+ -| `emq_coap`_ | CoAP Protocol Plugin | -+------------------------+-------------------------------+ -| `emq_sn`_ | MQTT-SN Protocol Plugin | -+------------------------+-------------------------------+ -| `emq_stomp`_ | STOMP Protocol Plugin | -+------------------------+-------------------------------+ -| `emq_sockjs`_ | STOMP over SockJS Plugin | -+------------------------+-------------------------------+ -| `emq_recon`_ | Recon Plugin | -+------------------------+-------------------------------+ -| `emq_reloader`_ | Reloader Plugin | -+------------------------+-------------------------------+ -| `emq_plugin_template`_ | Template Plugin | -+------------------------+-------------------------------+ - -------------------------------------- -emq_plugin_template - Template Plugin -------------------------------------- - -A plugin is just a normal Erlang application which has its own configuration file: 'etc/.conf|config'. - -emq_plugin_template is a plugin template. - -Load, unload Plugin -------------------- - -Use 'bin/emqttd_ctl plugins' CLI to load, unload a plugin:: - - ./bin/emqttd_ctl plugins load - - ./bin/emqttd_ctl plugins unload - - ./bin/emqttd_ctl plugins list - ----------------------------------------- -emq_auth_clientid - ClientID Auth Plugin ----------------------------------------- - -Released in 2.0-rc.2: https://github.com/emqtt/emq_auth_clientid - -Configure ClientID Auth Plugin ------------------------------- - -etc/plugins/emq_auth_clientid.conf: - -.. code-block:: properties - - ## auth.client.$clientid = $password - ## Examples - ## auth.client.id = passwd - ## auth.client.dev:devid = passwd2 - ## auth.client.app:appid = passwd2 - -Load ClientId Auth Plugin -------------------------- - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_auth_clientid - ----------------------------------------- -emq_auth_username - Username Auth Plugin ----------------------------------------- - -Released in 2.0-rc.2: https://github.com/emqtt/emq_auth_username - -Configure Username Auth Plugin ------------------------------- - -etc/plugins/emq_auth_username.conf: - -.. code-block:: properties - - ##auth.username.$name=$password - - ## Examples: - ##auth.username.admin=public - ##auth.username.feng@emqtt.io=public - -Add username/password by `./bin/emqttd_ctl users` CLI: - -.. code-block:: bash - - $ ./bin/emqttd_ctl users add - -Load Username Auth Plugin -------------------------- - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_auth_username - --------------------------------- -emq_dashboard - Dashboard Plugin --------------------------------- - -The Web Dashboard for *EMQ* broker. The plugin will be loaded automatically when the broker started successfully. - -+------------------+---------------------------+ -| Address | http://localhost:18083 | -+------------------+---------------------------+ -| Default User | admin | -+------------------+---------------------------+ -| Default Password | public | -+------------------+---------------------------+ - -.. image:: _static/images/dashboard.png - -Configure Dashboard Plugin --------------------------- - -etc/plugins/emq_dashboard.conf: - -.. code-block:: properties - - ## HTTP Listener - dashboard.listener.http = 18083 - dashboard.listener.http.acceptors = 2 - dashboard.listener.http.max_clients = 512 - - ## HTTPS Listener - ## dashboard.listener.https = 18084 - ## dashboard.listener.https.acceptors = 2 - ## dashboard.listener.https.max_clients = 512 - ## dashboard.listener.https.handshake_timeout = 15 - ## dashboard.listener.https.certfile = etc/certs/cert.pem - ## dashboard.listener.https.keyfile = etc/certs/key.pem - ## dashboard.listener.https.cacertfile = etc/certs/cacert.pem - ## dashboard.listener.https.verify = verify_peer - ## dashboard.listener.https.fail_if_no_peer_cert = true - -------------------------------- -emq_auth_ldap: LDAP Auth Plugin -------------------------------- - -LDAP Auth Plugin: https://github.com/emqtt/emq_auth_ldap - -.. NOTE:: Released in 2.0-beta.1 - -Configure LDAP Plugin ---------------------- - -etc/plugins/emq_auth_ldap.conf: - -.. code-block:: properties - - auth.ldap.servers = 127.0.0.1 - - auth.ldap.port = 389 - - auth.ldap.timeout = 30 - - auth.ldap.user_dn = uid=%u,ou=People,dc=example,dc=com - - auth.ldap.ssl = false - -Load LDAP Plugin ----------------- - -./bin/emqttd_ctl plugins load emq_auth_ldap - ------------------------------------- -emq_auth_http - HTTP Auth/ACL Plugin ------------------------------------- - -MQTT Authentication/ACL with HTTP API: https://github.com/emqtt/emq_auth_http - -.. NOTE:: Supported in 1.1 release - -Configure HTTP Auth/ACL Plugin ------------------------------- - -etc/plugins/emq_auth_http.conf: - -.. code-block:: properties - - ## Variables: %u = username, %c = clientid, %a = ipaddress, %P = password, %t = topic - - auth.http.auth_req = http://127.0.0.1:8080/mqtt/auth - auth.http.auth_req.method = post - auth.http.auth_req.params = clientid=%c,username=%u,password=%P - - auth.http.super_req = http://127.0.0.1:8080/mqtt/superuser - auth.http.super_req.method = post - auth.http.super_req.params = clientid=%c,username=%u - - ## 'access' parameter: sub = 1, pub = 2 - auth.http.acl_req = http://127.0.0.1:8080/mqtt/acl - auth.http.acl_req.method = get - auth.http.acl_req.params = access=%A,username=%u,clientid=%c,ipaddr=%a,topic=%t - - auth.http.acl_nomatch = deny - -HTTP Auth/ACL API ------------------ - -Return 200 if ok - -Return 4xx if unauthorized - -Load HTTP Auth/ACL Plugin -------------------------- - -.. code:: bash - - ./bin/emqttd_ctl plugins load emq_auth_http - ----------------------------------------- -emq_plugin_mysql - MySQL Auth/ACL Plugin ----------------------------------------- - -MQTT Authentication, ACL with MySQL database. - -MQTT User Table ---------------- - -.. code-block:: sql - - CREATE TABLE `mqtt_user` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `username` varchar(100) DEFAULT NULL, - `password` varchar(100) DEFAULT NULL, - `salt` varchar(20) DEFAULT NULL, - `is_superuser` tinyint(1) DEFAULT 0, - `created` datetime DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `mqtt_username` (`username`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8; - -MQTT ACL Table --------------- - -.. code-block:: sql - - CREATE TABLE `mqtt_acl` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `allow` int(1) DEFAULT NULL COMMENT '0: deny, 1: allow', - `ipaddr` varchar(60) DEFAULT NULL COMMENT 'IpAddress', - `username` varchar(100) DEFAULT NULL COMMENT 'Username', - `clientid` varchar(100) DEFAULT NULL COMMENT 'ClientId', - `access` int(2) NOT NULL COMMENT '1: subscribe, 2: publish, 3: pubsub', - `topic` varchar(100) NOT NULL DEFAULT '' COMMENT 'Topic Filter', - PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - INSERT INTO `mqtt_acl` (`id`, `allow`, `ipaddr`, `username`, `clientid`, `access`, `topic`) - VALUES - (1,1,NULL,'$all',NULL,2,'#'), - (2,0,NULL,'$all',NULL,1,'$SYS/#'), - (3,0,NULL,'$all',NULL,1,'eq #'), - (5,1,'127.0.0.1',NULL,NULL,2,'$SYS/#'), - (6,1,'127.0.0.1',NULL,NULL,2,'#'), - (7,1,NULL,'dashboard',NULL,1,'$SYS/#'); - -Configure MySQL Auth/ACL Plugin -------------------------------- - -etc/plugins/emq_plugin_mysql.conf: - -.. code-block:: properties - - ## Mysql Server - auth.mysql.server = 127.0.0.1:3306 - - ## Mysql Pool Size - auth.mysql.pool = 8 - - ## Mysql Username - ## auth.mysql.username = - - ## Mysql Password - ## auth.mysql.password = - - ## Mysql Database - auth.mysql.database = mqtt - - ## Variables: %u = username, %c = clientid - - ## Authentication Query: select password only - auth.mysql.auth_query = select password from mqtt_user where username = '%u' limit 1 - - ## Password hash: plain, md5, sha, sha256, pbkdf2 - auth.mysql.password_hash = sha256 - - ## %% Superuser Query - auth.mysql.super_query = select is_superuser from mqtt_user where username = '%u' limit 1 - - ## ACL Query Command - auth.mysql.acl_query = select allow, ipaddr, username, clientid, access, topic from mqtt_acl where ipaddr = '%a' or username = '%u' or username = '$all' or clientid = '%c' - - ## ACL nomatch - auth.mysql.acl_nomatch = deny - -Load MySQL Auth/ACL plugin --------------------------- - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_auth_mysql - -------------------------------------------- -emq_auth_pgsql - PostgreSQL Auth/ACL Plugin -------------------------------------------- - -MQTT Authentication/ACL with PostgreSQL Database. - -Postgre MQTT User Table ------------------------ - -.. code-block:: sql - - CREATE TABLE mqtt_user ( - id SERIAL primary key, - is_superuser boolean, - username character varying(100), - password character varying(100), - salt character varying(40) - ); - -Postgre MQTT ACL Table ----------------------- - -.. code-block:: sql - - CREATE TABLE mqtt_acl ( - id SERIAL primary key, - allow integer, - ipaddr character varying(60), - username character varying(100), - clientid character varying(100), - access integer, - topic character varying(100) - ); - - INSERT INTO mqtt_acl (id, allow, ipaddr, username, clientid, access, topic) - VALUES - (1,1,NULL,'$all',NULL,2,'#'), - (2,0,NULL,'$all',NULL,1,'$SYS/#'), - (3,0,NULL,'$all',NULL,1,'eq #'), - (5,1,'127.0.0.1',NULL,NULL,2,'$SYS/#'), - (6,1,'127.0.0.1',NULL,NULL,2,'#'), - (7,1,NULL,'dashboard',NULL,1,'$SYS/#'); - -Configure Postgre Auth/ACL Plugin ----------------------------------- - -Plugin Config: etc/plugins/emq_auth_pgsql.conf. - -Configure host, username, password and database of PostgreSQL: - -.. code-block:: properties - - ## Postgre Server - auth.pgsql.server = 127.0.0.1:5432 - - auth.pgsql.pool = 8 - - auth.pgsql.username = root - - #auth.pgsql.password = - - auth.pgsql.database = mqtt - - auth.pgsql.encoding = utf8 - - auth.pgsql.ssl = false - - ## Variables: %u = username, %c = clientid, %a = ipaddress - - ## Authentication Query: select password only - auth.pgsql.auth_query = select password from mqtt_user where username = '%u' limit 1 - - ## Password hash: plain, md5, sha, sha256, pbkdf2 - auth.pgsql.password_hash = sha256 - - ## sha256 with salt prefix - ## auth.pgsql.password_hash = salt sha256 - - ## sha256 with salt suffix - ## auth.pgsql.password_hash = sha256 salt - - ## Superuser Query - auth.pgsql.super_query = select is_superuser from mqtt_user where username = '%u' limit 1 - - ## ACL Query. Comment this query, the acl will be disabled. - auth.pgsql.acl_query = select allow, ipaddr, username, clientid, access, topic from mqtt_acl where ipaddr = '%a' or username = '%u' or username = '$all' or clientid = '%c' - - ## If no rules matched, return... - auth.pgsql.acl_nomatch = deny - -Load Postgre Auth/ACL Plugin ------------------------------ - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_auth_pgsql - --------------------------------------- -emq_auth_redis - Redis Auth/ACL Plugin --------------------------------------- - -MQTT Authentication, ACL with Redis: https://github.com/emqtt/emq_auth_redis - -Configure Redis Auth/ACL Plugin -------------------------------- - -etc/plugins/emq_auth_redis.conf: - -.. code-block:: properties - - ## Redis Server - auth.redis.server = 127.0.0.1:6379 - - ## Redis Pool Size - auth.redis.pool = 8 - - ## Redis Database - auth.redis.database = 0 - - ## Redis Password - ## auth.redis.password = - - ## Variables: %u = username, %c = clientid - - ## Authentication Query Command - auth.redis.auth_cmd = HGET mqtt_user:%u password - - ## Password hash: plain, md5, sha, sha256, pbkdf2 - auth.redis.password_hash = sha256 - - ## Superuser Query Command - auth.redis.super_cmd = HGET mqtt_user:%u is_superuser - - ## ACL Query Command - auth.redis.acl_cmd = HGETALL mqtt_acl:%u - - ## ACL nomatch - auth.redis.acl_nomatch = deny - -Redis User Hash ---------------- - -Set a 'user' hash with 'password' field, for example:: - - HSET mqtt_user: is_superuser 1 - HSET mqtt_user: password "passwd" - -Redis ACL Rule Hash -------------------- - -The plugin uses a redis Hash to store ACL rules:: - - HSET mqtt_acl: topic1 1 - HSET mqtt_acl: topic2 2 - HSET mqtt_acl: topic3 3 - -.. NOTE:: 1: subscribe, 2: publish, 3: pubsub - -Redis Subscription Hash ------------------------ - -The plugin can store static subscriptions in a redis Hash:: - - HSET mqtt_subs: topic1 0 - HSET mqtt_subs: topic2 1 - HSET mqtt_subs: topic3 2 - -Load Redis Auth/ACL Plugin --------------------------- - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_auth_redis - ----------------------------------------- -emq_auth_mongo - MongoDB Auth/ACL Plugin ----------------------------------------- - -MQTT Authentication/ACL with MongoDB: https://github.com/emqtt/emq_auth_mongo - -Configure MongoDB Auth/ACL Plugin ---------------------------------- - -etc/plugins/emq_plugin_mongo.conf: - -.. code-block:: properties - - ## Mongo Server - auth.mongo.server = 127.0.0.1:27017 - - ## Mongo Pool Size - auth.mongo.pool = 8 - - ## Mongo User - ## auth.mongo.user = - - ## Mongo Password - ## auth.mongo.password = - - ## Mongo Database - auth.mongo.database = mqtt - - ## auth_query - auth.mongo.auth_query.collection = mqtt_user - - auth.mongo.auth_query.password_field = password - - auth.mongo.auth_query.password_hash = sha256 - - auth.mongo.auth_query.selector = username=%u - - ## super_query - auth.mongo.super_query.collection = mqtt_user - - auth.mongo.super_query.super_field = is_superuser - - auth.mongo.super_query.selector = username=%u - - ## acl_query - auth.mongo.acl_query.collection = mqtt_user - - auth.mongo.acl_query.selector = username=%u - - ## acl_nomatch - auth.mongo.acl_nomatch = deny - -MongoDB Database ----------------- - -.. code-block:: - - use mqtt - db.createCollection("mqtt_user") - db.createCollection("mqtt_acl") - db.mqtt_user.ensureIndex({"username":1}) - -MongoDB User Collection ------------------------ - -.. code-block:: json - - { - username: "user", - password: "password hash", - is_superuser: boolean (true, false), - created: "datetime" - } - -For example:: - - db.mqtt_user.insert({username: "test", password: "password hash", is_superuser: false}) - db.mqtt_user:insert({username: "root", is_superuser: true}) - -MongoDB ACL Collection ----------------------- - -.. code-block:: json - - { - username: "username", - clientid: "clientid", - publish: ["topic1", "topic2", ...], - subscribe: ["subtop1", "subtop2", ...], - pubsub: ["topic/#", "topic1", ...] - } - -For example:: - - db.mqtt_acl.insert({username: "test", publish: ["t/1", "t/2"], subscribe: ["user/%u", "client/%c"]}) - db.mqtt_acl.insert({username: "admin", pubsub: ["#"]}) - -Load MongoDB Auth/ACL Plugin ----------------------------- - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_auth_mongo - ----------------------------------- -emq_mod_presence - Presence Module ----------------------------------- - -`Presence` module will publish presence message to $SYS topic when a client connected or disconnected: - -.. NOTE:: Released in 2.0-rc.3: https://github.com/emqtt/emq_mod_presence - -Configure Presence Module -------------------------- - -etc/plugins/emq_mod_presence.conf: - -.. code-block:: properties - - ## Enable presence module - ## Values: on | off - module.presence = on - - module.presence.qos = 0 - -Load Presence Module --------------------- - -.. NOTE:: This module will be loaded by default. - -.. code:: bash - - ./bin/emqttd_ctl plugins load emq_mod_presence - ----------------------------------- -emq_mod_retainer - Retainer Module ----------------------------------- - -`Retainer` module is responsbile for storing MQTT retained messages. - -.. NOTE:: Released in 2.0-rc.3: https://github.com/emqtt/emq_mod_retainer - -Configure Retainer Module -------------------------- - -etc/plugins/emq_mod_retainer.conf: - -.. code-block:: properties - - ## disc: disc_copies, ram: ram_copies - module.retainer.storage_type = ram - - ## Max number of retained messages - module.retainer.max_message_num = 100000 - - ## Max Payload Size of retained message - module.retainer.max_payload_size = 64KB - - ## Expired after seconds, never expired if 0 - module.retainer.expired_after = 0 - -Load Retainer Module --------------------- - -.. NOTE:: This module will be loaded by default. - -.. code:: bash - - ./bin/emqttd_ctl plugins load emq_mod_retainer - ------------------------------------------- -emq_mod_subscription - Subscription Module ------------------------------------------- - -`Subscription` module forces the client to subscribe some topics when connected to the broker: - -.. NOTE:: Released in 2.0-rc.3: https://github.com/emqtt/emq_mod_subscription - -Configure Subscription Module ------------------------------ - -etc/plugins/emq_mod_subscription.conf: - -.. code-block:: properties - - ## Subscribe the Topics automatically when client connected - module.subscription.1.topic = $client/%c - ## Qos of the subscription: 0 | 1 | 2 - module.subscription.1.qos = 1 - - ##module.subscription.2.topic = $user/%u - ##module.subscription.2.qos = 1 - - ## Load static subscriptions from backend storage - ## Values: on | off - module.subscription.backend = on - -Load Subscription Module ------------------------- - -.. NOTE:: This module will be loaded by default. - -.. code:: bash - - ./bin/emqttd_ctl plugins load emq_mod_subscription - --------------------------------------- -emq_mod_rewrite - Topic Rewrite Module --------------------------------------- - -Released in 2.0-rc.2: https://github.com/emqtt/emq_mod_rewrite - -Configure Rewrite Module ------------------------- - -etc/plugins/emq_mod_rewrite.config: - -.. code-block:: erlang - - [ - {emq_mod_rewrite, [ - {rules, [ - %% {rewrite, Topic, Re, Dest} - - %% Example: x/y/ -> z/y/ - %% {rewrite, "x/#", "^x/y/(.+)$", "z/y/$1"}, - - %% {rewrite, "y/+/z/#", "^y/(.+)/z/(.+)$", "y/z/$2"} - ]} - ]} - ]. - -Load Rewrite Module -------------------- - -.. code:: bash - - ./bin/emqttd_ctl plugins load emq_mod_rewrite - ------------------------------- -emq_coap: CoAP Protocol Plugin ------------------------------- - -CoAP Protocol Plugin: https://github.com/emqtt/emqttd_coap - -Configure CoAP Plugin ---------------------- - -.. code-block:: properties - - coap.server = 5683 - - coap.prefix.mqtt = mqtt - - coap.handler.mqtt = emq_coap_gateway - -Load CoAP Protocol Plugin -------------------------- - -.. code:: bash - - ./bin/emqttd_ctl plugins load emq_coap - -libcoap Client --------------- - -.. code:: bash - - yum install libcoap - - % coap client publish message - coap-client -m post -e "qos=0&retain=0&message=payload&topic=hello" coap://localhost/mqtt - ------------------------- -emq_sn: MQTT-SN Protocol ------------------------- - -MQTT-SN Protocol/Gateway Plugin. - -Configure MQTT-SN Plugin ------------------------- - -.. NOTE:: UDP Port for MQTT-SN: 1884 - -etc/plugins/emq_sn.conf: - -.. code-block:: properties - - mqtt.sn.port = 1884 - -Load MQTT-SN Plugin -------------------- - -.. code:: - - ./bin/emqttd_ctl plugins load emq_sn - --------------------------- -emq_stomp - STOMP Protocol --------------------------- - -Support STOMP 1.0/1.1/1.2 clients to connect to emqttd broker and communicate with MQTT Clients. - -Configure Stomp Plugin ----------------------- - -etc/plugins/emq_stomp.conf: - -.. NOTE:: Default Port for STOMP Protocol: 61613 - -.. code-block:: properties - - stomp.default_user.login = guest - - stomp.default_user.passcode = guest - - stomp.allow_anonymous = true - - stomp.frame.max_headers = 10 - - stomp.frame.max_header_length = 1024 - - stomp.frame.max_body_length = 8192 - - stomp.listener = 61613 - - stomp.listener.acceptors = 4 - - stomp.listener.max_clients = 512 - -Load Stomp Plugin ------------------ - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_stomp - --------------------------------- -emq_sockjs - STOMP/SockJS Plugin --------------------------------- - -emq_sockjs plugin enables web browser to connect to emqttd broker and communicate with MQTT clients. - -.. WARNING:: The plugin is deprecated in 2.0 - -Configure SockJS Plugin ------------------------ - -.. NOTE:: Default TCP Port: 61616 - -.. code-block:: erlang - - [ - {emq_sockjs, [ - - {sockjs, []}, - - {cowboy_listener, {stomp_sockjs, 61616, 4}}, - - %% TODO: unused... - {stomp, [ - {frame, [ - {max_headers, 10}, - {max_header_length, 1024}, - {max_body_length, 8192} - ]} - ]} - ]} - ]. - - -Load SockJS Plugin ------------------- - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emqttd_sockjs - -SockJS Demo Page ----------------- - -http://localhost:61616/index.html - ------------------------- -emq_recon - Recon Plugin ------------------------- - -The plugin loads `recon`_ library on a running *EMQ* broker. Recon libray helps debug and optimize an Erlang application. - -Load Recon Plugin ------------------ - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_recon - -Recon CLI ---------- - -.. code-block:: bash - - ./bin/emqttd_ctl recon - - recon memory #recon_alloc:memory/2 - recon allocated #recon_alloc:memory(allocated_types, current|max) - recon bin_leak #recon:bin_leak(100) - recon node_stats #recon:node_stats(10, 1000) - recon remote_load Mod #recon:remote_load(Mod) - ------------------------------- -emq_reloader - Reloader Plugin ------------------------------- - -Erlang Module Reloader for Development - -.. NOTE:: Don't load the plugin in production! - -Load `Reloader` Plugin ----------------------- - -.. code-block:: bash - - ./bin/emqttd_ctl plugins load emq_reloader - -reload CLI ----------- - -.. code-block:: bash - - ./bin/emqttd_ctl reload - - reload # Reload a Module - ------------------------- -Plugin Development Guide ------------------------- - -Create a Plugin Project ------------------------ - -Clone emq_plugin_template source from github.com:: - - git clone https://github.com/emqtt/emq_plugin_template.git - -Create a plugin project with erlang.mk and depends on 'emqttd' application, the 'Makefile':: - - PROJECT = emq_plugin_abc - PROJECT_DESCRIPTION = emqttd abc plugin - PROJECT_VERSION = 1.0 - - BUILD_DEPS = emqttd - dep_emqttd = git https://github.com/emqtt/emqttd master - - COVER = true - - include erlang.mk - -Template Plugin: https://github.com/emqtt/emq_plugin_template - -Register Auth/ACL Modules -------------------------- - -emq_auth_demo.erl - demo authentication module: - -.. code-block:: erlang - - -module(emq_auth_demo). - - -behaviour(emqttd_auth_mod). - - -include_lib("emqttd/include/emqttd.hrl"). - - -export([init/1, check/3, description/0]). - - init(Opts) -> {ok, Opts}. - - check(#mqtt_client{client_id = ClientId, username = Username}, Password, _Opts) -> - io:format("Auth Demo: clientId=~p, username=~p, password=~p~n", - [ClientId, Username, Password]), - ok. - - description() -> "Demo Auth Module". - -emq_acl_demo.erl - demo ACL module: - -.. code-block:: erlang - - -module(emq_acl_demo). - - -include_lib("emqttd/include/emqttd.hrl"). - - %% ACL callbacks - -export([init/1, check_acl/2, reload_acl/1, description/0]). - - init(Opts) -> - {ok, Opts}. - - check_acl({Client, PubSub, Topic}, Opts) -> - io:format("ACL Demo: ~p ~p ~p~n", [Client, PubSub, Topic]), - allow. - - reload_acl(_Opts) -> - ok. - - description() -> "ACL Module Demo". - -emq_plugin_template_app.erl - Register the auth/ACL modules: - -.. code-block:: erlang - - ok = emqttd_access_control:register_mod(auth, emq_auth_demo, []), - ok = emqttd_access_control:register_mod(acl, emq_acl_demo, []), - -Register Callbacks for Hooks ------------------------------ - -The plugin could register callbacks for hooks. The hooks will be run by the broker when a client connected/disconnected, a topic subscribed/unsubscribed or a message published/delivered: - -+------------------------+-----------------------------------------+ -| Name | Description | -+------------------------+-----------------------------------------+ -| client.connected | Run when a client connected to the | -| | broker successfully | -+------------------------+-----------------------------------------+ -| client.subscribe | Run before a client subscribes topics | -+------------------------+-----------------------------------------+ -| client.unsubscribe | Run when a client unsubscribes topics | -+------------------------+-----------------------------------------+ -| session.subscribed | Run after a client subscribed a topic | -+------------------------+-----------------------------------------+ -| session.unsubscribed | Run after a client unsubscribed a topic | -+------------------------+-----------------------------------------+ -| message.publish | Run when a message is published | -+------------------------+-----------------------------------------+ -| message.delivered | Run when a message is delivered | -+------------------------+-----------------------------------------+ -| message.acked | Run when a message(qos1/2) is acked | -+------------------------+-----------------------------------------+ -| client.disconnected | Run when a client is disconnnected | -+------------------------+-----------------------------------------+ - -emq_plugin_template.erl for example: - -.. code-block:: erlang - - %% Called when the plugin application start - load(Env) -> - emqttd:hook('client.connected', fun ?MODULE:on_client_connected/3, [Env]), - emqttd:hook('client.disconnected', fun ?MODULE:on_client_disconnected/3, [Env]), - emqttd:hook('client.subscribe', fun ?MODULE:on_client_subscribe/4, [Env]), - emqttd:hook('session.subscribed', fun ?MODULE:on_session_subscribed/4, [Env]), - emqttd:hook('client.unsubscribe', fun ?MODULE:on_client_unsubscribe/4, [Env]), - emqttd:hook('session.unsubscribed', fun ?MODULE:on_session_unsubscribed/4, [Env]), - emqttd:hook('message.publish', fun ?MODULE:on_message_publish/2, [Env]), - emqttd:hook('message.delivered', fun ?MODULE:on_message_delivered/4, [Env]), - emqttd:hook('message.acked', fun ?MODULE:on_message_acked/4, [Env]). - -Register CLI Modules --------------------- - -emq_cli_demo.erl: - -.. code-block:: erlang - - -module(emqttd_cli_demo). - - -include_lib("emqttd/include/emqttd_cli.hrl"). - - -export([cmd/1]). - - cmd(["arg1", "arg2"]) -> - ?PRINT_MSG("ok"); - - cmd(_) -> - ?USAGE([{"cmd arg1 arg2", "cmd demo"}]). - -emq_plugin_template_app.erl - register the CLI module to *EMQ* broker: - -.. code-block:: erlang - - emqttd_ctl:register_cmd(cmd, {emq_cli_demo, cmd}, []). - -There will be a new CLI after the plugin loaded:: - - ./bin/emqttd_ctl cmd arg1 arg2 - -Create Configuration File -------------------------- - -Create `etc/${plugin_name}.conf|config` file for the plugin. The *EMQ* broker supports two type of config syntax: - -1. ${plugin_name}.config with erlang syntax: - -.. code-block:: erlang - - [ - {plugin_name, [ - {key, value} - ]} - ]. - -2. ${plugin_name}.conf with a general `k = v` syntax: - -.. code-block:: properties - - plugin_name.key = value - -Build and Release the Plugin ----------------------------- - -1. clone emqttd-relx project: - -.. code-block:: bash - - git clone https://github.com/emqtt/emqttd-relx.git - -2. Add `DEPS` in Makefile: - -.. code-block:: makefile - - DEPS += plugin_name - dep_plugin_name = git url_of_plugin - -3. Add the plugin in relx.config: - -.. code-block:: erlang - - {plugin_name, load}, - -.. _emq_dashboard: https://github.com/emqtt/emqttd_dashboard -.. _emq_auth_clientid: https://github.com/emqtt/emq_auth_clientid -.. _emq_auth_username: https://github.com/emqtt/emq_auth_username -.. _emq_auth_ldap: https://github.com/emqtt/emq_auth_ldap -.. _emq_auth_http: https://github.com/emqtt/emq_auth_http -.. _emq_auth_mysql: https://github.com/emqtt/emq_auth_mysql -.. _emq_auth_pgsql: https://github.com/emqtt/emq_auth_pgsql -.. _emq_auth_redis: https://github.com/emqtt/emq_auth_redis -.. _emq_auth_mongo: https://github.com/emqtt/emq_auth_mongo -.. _emq_mod_rewrite: https://github.com/emqtt/emq_mod_rewrite -.. _emq_sn: https://github.com/emqtt/emq_sn -.. _emq_coap: https://github.com/emqtt/emq_coap -.. _emq_stomp: https://github.com/emqtt/emq_stomp -.. _emq_sockjs: https://github.com/emqtt/emq_sockjs -.. _emq_recon: https://github.com/emqtt/emq_recon -.. _emq_reloader: https://github.com/emqtt/emq_reloader -.. _emq_plugin_template: https://github.com/emqtt/emq_plugin_template -.. _recon: http://ferd.github.io/recon/ - -.. _emq_mod_retainer: https://github.com/emqtt/emq_mod_retainer -.. _emq_mod_presence: https://github.com/emqtt/emq_mod_presence -.. _emq_mod_subscription: https://github.com/emqtt/emq_mod_subscription diff --git a/docs/source/tables.md b/docs/source/tables.md deleted file mode 100644 index 9268e7822..000000000 --- a/docs/source/tables.md +++ /dev/null @@ -1,31 +0,0 @@ - -.. _tables: - -====== -Tables -====== - -+--------------------+--------+----------------------------------------+ -| Table | Type | Description | -+====================+========+========================================+ -| mqtt_trie | mnesia | Trie Table | -+--------------------+--------+----------------------------------------+ -| mqtt_trie_node | mnesia | Trie Node Table | -+--------------------+--------+----------------------------------------+ -| mqtt_route | mnesia | Global Route Table | -+--------------------+--------+----------------------------------------+ -| mqtt_local_route | mnesia | Local Route Table | -+--------------------+--------+----------------------------------------+ -| mqtt_pubsub | ets | PubSub Tab | -+--------------------+--------+----------------------------------------+ -| mqtt_subscriber | ets | Subscriber Tab | -+--------------------+--------+----------------------------------------+ -| mqtt_subscription | ets | Subscription Tab | -+--------------------+--------+----------------------------------------+ -| mqtt_session | mnesia | Global Session Table | -+--------------------+--------+----------------------------------------+ -| mqtt_local_session | ets | Local Session Table | -+--------------------+--------+----------------------------------------+ -| mqtt_client | ets | Client Table | -+--------------------+--------+----------------------------------------+ - diff --git a/docs/source/tune.rst b/docs/source/tune.rst deleted file mode 100644 index 71a7234d6..000000000 --- a/docs/source/tune.rst +++ /dev/null @@ -1,133 +0,0 @@ - -.. _tune: - -============ -Tuning Guide -============ - -Tuning the Linux Kernel, Networking, Erlang VM and the *EMQ* broker for one million concurrent MQTT connections. - -------------------- -Linux Kernel Tuning -------------------- - -The system-wide limit on max opened file handles:: - - # 2 million system-wide - sysctl -w fs.file-max=2097152 - sysctl -w fs.nr_open=2097152 - echo 2097152 > /proc/sys/fs/nr_open - -The limit on opened file handles for current session:: - - ulimit -n 1048576 - -/etc/sysctl.conf ----------------- - -Add the 'fs.file-max' to /etc/sysctl.conf, make the changes permanent:: - - fs.file-max = 1048576 - -/etc/security/limits.conf -------------------------- - -Persist the limits on opened file handles for users in /etc/security/limits.conf:: - - * soft nofile 1048576 - * hard nofile 1048576 - --------------- -Network Tuning --------------- - -Increase number of incoming connections backlog:: - - sysctl -w net.core.somaxconn=32768 - sysctl -w net.ipv4.tcp_max_syn_backlog=16384 - sysctl -w net.core.netdev_max_backlog=16384 - -Local Port Range:: - - sysctl -w net.ipv4.ip_local_port_range="1000 65535" - -Read/Write Buffer for TCP connections:: - - sysctl -w net.core.rmem_default=262144 - sysctl -w net.core.wmem_default=262144 - sysctl -w net.core.rmem_max=16777216 - sysctl -w net.core.wmem_max=16777216 - sysctl -w net.core.optmem_max=16777216 - - #sysctl -w net.ipv4.tcp_mem='16777216 16777216 16777216' - sysctl -w net.ipv4.tcp_rmem='1024 4096 16777216' - sysctl -w net.ipv4.tcp_wmem='1024 4096 16777216' - -Connection Tracking:: - - sysctl -w net.nf_conntrack_max=1000000 - sysctl -w net.netfilter.nf_conntrack_max=1000000 - sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30 - -The TIME-WAIT Buckets Pool, Recycling and Reuse:: - - net.ipv4.tcp_max_tw_buckets=1048576 - - # Enable fast recycling of TIME_WAIT sockets. Enabling this - # option is not recommended for devices communicating with the - # general Internet or using NAT (Network Address Translation). - # Since some NAT gateways pass through IP timestamp values, one - # IP can appear to have non-increasing timestamps. - # net.ipv4.tcp_tw_recycle = 1 - # net.ipv4.tcp_tw_reuse = 1 - -Timeout for FIN-WAIT-2 sockets:: - - net.ipv4.tcp_fin_timeout = 15 - ----------------- -Erlang VM Tuning ----------------- - -Tuning and optimize the Erlang VM in etc/emq.conf file: - -.. code-block:: properties - - ## Erlang Process Limit - node.process_limit = 2097152 - - ## Sets the maximum number of simultaneously existing ports for this system - node.max_ports = 1048576 - --------------- -The EMQ Broker --------------- - -Tune the acceptor pool, max_clients limit and sockopts for TCP listener in etc/emqttd.config: - -.. code-block:: properties - - ## TCP Listener - mqtt.listener.tcp = 1883 - mqtt.listener.tcp.acceptors = 64 - mqtt.listener.tcp.max_clients = 1000000 - --------------- -Client Machine --------------- - -Tune the client machine to benchmark emqttd broker: - -.. code-block:: bash - - sysctl -w net.ipv4.ip_local_port_range="500 65535" - sysctl -w fs.file-max=1000000 - echo 1000000 > /proc/sys/fs/nr_open - ulimit -n 100000 - ---------------- -emqtt_benchmark ---------------- - -Test tool for concurrent connections: http://github.com/emqtt/emqtt_benchmark - diff --git a/docs/source/upgrade.rst b/docs/source/upgrade.rst deleted file mode 100644 index c0ef9a391..000000000 --- a/docs/source/upgrade.rst +++ /dev/null @@ -1,33 +0,0 @@ - -.. _upgrade: - -======= -Upgrade -======= - -.. _upgrade_1.1.2: - ----------------- -Upgrade to 1.1.2 ----------------- - -.. NOTE:: 1.0+ releases can be upgraded to 1.1.2 smoothly - -Steps: - -1. Download and install emqttd-1.1.2 to the new directory, for example:: - - Old installation: /opt/emqttd_1_0_0/ - - New installation: /opt/emqttd_1_1_2/ - -2. Copy the 'etc/' and 'data/' from the old installation:: - - cp -R /opt/emqttd_1_0_0/etc/* /opt/emqttd_1_1_2/etc/ - - cp -R /opt/emqttd_1_0_0/data/* /opt/emqttd_1_1_2/data/ - -3. Copy the plugins/{plugin}/etc/* from the old installation if you loaded plugins. - -4. Stop the old emqttd, and start the new one. - From 7198e223e4af94892bb3fd474ac6f77fbd00371c Mon Sep 17 00:00:00 2001 From: Feng Date: Sun, 20 Nov 2016 19:11:44 +0800 Subject: [PATCH 2/2] rm deps/ --- deps/.placeholder | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 deps/.placeholder diff --git a/deps/.placeholder b/deps/.placeholder deleted file mode 100644 index e69de29bb..000000000

BtQ*0!9?wV8K5T_tl|U&9*tp-vmOGtatd4 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