Feng 10 лет назад
Родитель
Сommit
a0e6e5da83
49 измененных файлов с 1624 добавлено и 0 удалено
  1. 36 0
      docs/Catalogs
  2. 177 0
      docs/Makefile
  3. 3 0
      docs/README.md
  4. 242 0
      docs/make.bat
  5. BIN
      docs/source/_images/emqttd.png
  6. 0 0
      docs/source/_static/.placeholder
  7. 0 0
      docs/source/_templates/.placeholder
  8. 2 0
      docs/source/apps/chat.rst
  9. 9 0
      docs/source/apps/index.rst
  10. 2 0
      docs/source/apps/push.rst
  11. 342 0
      docs/source/conf.py
  12. 14 0
      docs/source/design/architecture.rst
  13. 5 0
      docs/source/design/clustering.rst
  14. 21 0
      docs/source/design/guid.rst
  15. 15 0
      docs/source/design/index.rst
  16. 3 0
      docs/source/design/metrics.rst
  17. 3 0
      docs/source/design/pool.rst
  18. 3 0
      docs/source/design/pubsub.rst
  19. 13 0
      docs/source/design/qos.rst
  20. 4 0
      docs/source/design/route.rst
  21. 3 0
      docs/source/design/stats.rst
  22. 2 0
      docs/source/dev/backends.rst
  23. 2 0
      docs/source/dev/hooks.rst
  24. 9 0
      docs/source/dev/index.rst
  25. 2 0
      docs/source/dev/modules.rst
  26. 5 0
      docs/source/dev/plugins.rst
  27. 75 0
      docs/source/index.rst
  28. 21 0
      docs/source/intro/features.rst
  29. 0 0
      docs/source/intro/getting_started.rst
  30. 9 0
      docs/source/intro/index.rst
  31. 28 0
      docs/source/intro/overview.rst
  32. 30 0
      docs/source/intro/quick_start.rst
  33. BIN
      docs/source/mqtt/MQTT_V3.1_Protocol_Specific.pdf
  34. 5 0
      docs/source/mqtt/index.rst
  35. 2 0
      docs/source/mqtt/intro.rst
  36. BIN
      docs/source/mqtt/rfc6455.pdf
  37. 2 0
      docs/source/tune/etc_app_config.rst
  38. 4 0
      docs/source/tune/etc_vm_args.rst
  39. 9 0
      docs/source/tune/index.rst
  40. 4 0
      docs/source/user/acl.rst
  41. 5 0
      docs/source/user/admin.rst
  42. 3 0
      docs/source/user/authentication.rst
  43. 0 0
      docs/source/user/clustering.rst
  44. 382 0
      docs/source/user/configuration.rst
  45. 5 0
      docs/source/user/http.rst
  46. 15 0
      docs/source/user/index.rst
  47. 99 0
      docs/source/user/install.rst
  48. 4 0
      docs/source/user/logs.rst
  49. 5 0
      docs/source/user/websocket.rst

+ 36 - 0
docs/Catalogs

@@ -0,0 +1,36 @@
+ReadMe
+    Overview
+    C1000K
+    Goals
+    Features
+    Plugins
+    Supports
+    Twitter
+QuickStart
+
+Getting Started
+    Overview
+    Goals
+    Features
+    Plugins
+    Supports
+    Twitter
+    FAQ
+
+UserGuide
+    Installation
+    Configuration
+    Administration
+    Cluster
+
+PluginGuide
+
+    Plugin Guide
+    Plugins
+
+DesignGuide
+    Architecture
+
+TuningGuide
+
+

+ 177 - 0
docs/Makefile

@@ -0,0 +1,177 @@
+# 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 <target>' where <target> 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."

+ 3 - 0
docs/README.md

@@ -0,0 +1,3 @@
+
+Documents for eMQTT Projects
+

+ 242 - 0
docs/make.bat

@@ -0,0 +1,242 @@
+@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 ^<target^>` where ^<target^> 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

BIN
docs/source/_images/emqttd.png


+ 0 - 0
docs/source/_static/.placeholder


+ 0 - 0
docs/source/_templates/.placeholder


+ 2 - 0
docs/source/apps/chat.rst

@@ -0,0 +1,2 @@
+Chat
+====

+ 9 - 0
docs/source/apps/index.rst

@@ -0,0 +1,9 @@
+
+Applications
+============
+
+.. toctree::
+
+   push
+   chat
+

+ 2 - 0
docs/source/apps/push.rst

@@ -0,0 +1,2 @@
+Push
+====

+ 342 - 0
docs/source/conf.py

@@ -0,0 +1,342 @@
+# -*- coding: utf-8 -*-
+#
+# Erlang MQTT Broker documentation build configuration file, created by
+# sphinx-quickstart on Tue Jan 12 22:54:45 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
+from recommonmark.parser import CommonMarkParser
+
+# 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.doctest',
+    'sphinx.ext.intersphinx',
+    'sphinx.ext.todo',
+    'sphinx.ext.coverage',
+    'sphinx.ext.ifconfig',
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+source_parsers = {'.md': CommonMarkParser}
+
+# 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'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 = '0.15'
+# The full version, including alpha/beta/rc tags.
+release = '0.15.0'
+
+# 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
+# "<project> v<release> 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 <link> 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'Erlang MQTT Broker 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'Erlang MQTT Broker 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}

+ 14 - 0
docs/source/design/architecture.rst

@@ -0,0 +1,14 @@
+
+Architecture
+===========
+
+Philosophy
+----------
+
+Focuse on scalable, stable transport and router.
+
+Control plane and Flow plane.
+
+Multiple Backends
+
+

+ 5 - 0
docs/source/design/clustering.rst

@@ -0,0 +1,5 @@
+
+Clustering
+==========
+
+

+ 21 - 0
docs/source/design/guid.rst

@@ -0,0 +1,21 @@
+GUID
+====
+
+Each QoS1/2 MQTT message is identified by a 128 bits, k-ordered GUID(global unique ID).
+
+Structure
+---------
+
+::
+
+  --------------------------------------------------------
+  |        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
+

+ 15 - 0
docs/source/design/index.rst

@@ -0,0 +1,15 @@
+Design Guide
+------------
+
+.. toctree::
+
+   architecture
+   clustering
+   pubsub
+   route
+   qos
+   pool
+   guid
+   metrics
+   stats
+

+ 3 - 0
docs/source/design/metrics.rst

@@ -0,0 +1,3 @@
+
+Metrics
+=======

+ 3 - 0
docs/source/design/pool.rst

@@ -0,0 +1,3 @@
+Pool
+====
+

+ 3 - 0
docs/source/design/pubsub.rst

@@ -0,0 +1,3 @@
+
+PubSub
+======

+ 13 - 0
docs/source/design/qos.rst

@@ -0,0 +1,13 @@
+
+QoS
+===
+
+PacketId
+
+MessageId
+
+QoS0
+
+QoS1
+
+QoS2

+ 4 - 0
docs/source/design/route.rst

@@ -0,0 +1,4 @@
+
+Route
+=====
+

+ 3 - 0
docs/source/design/stats.rst

@@ -0,0 +1,3 @@
+Statistics
+==========
+

+ 2 - 0
docs/source/dev/backends.rst

@@ -0,0 +1,2 @@
+Backends
+========

+ 2 - 0
docs/source/dev/hooks.rst

@@ -0,0 +1,2 @@
+Hooks
+=====

+ 9 - 0
docs/source/dev/index.rst

@@ -0,0 +1,9 @@
+Developer Guide
+---------------
+
+.. toctree::
+
+   modules
+   hooks
+   plugins
+

+ 2 - 0
docs/source/dev/modules.rst

@@ -0,0 +1,2 @@
+Modules
+=======

+ 5 - 0
docs/source/dev/plugins.rst

@@ -0,0 +1,5 @@
+
+Plugins
+=======
+
+

+ 75 - 0
docs/source/index.rst

@@ -0,0 +1,75 @@
+.. Erlang MQTT Broker documentation master file, created by
+   sphinx-quickstart on Tue Jan 12 22:54:45 2016.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to Erlang MQTT Broker's documentation!
+==============================================
+
+Overview
+--------
+
+TODO: emqttd is a massively scalable and clusterable MQTT V3.1/V3.1.1 broker written in Erlang/OTP. emqttd support both MQTT V3.1/V3.1.1 protocol specification with extended features.
+
+Features
+--------
+
+* Feature1
+* Feature2
+
+QuickStart
+----------
+
+``hahal``
+
+Contents
+--------
+
+.. _get-started:
+
+.. toctree::
+   :maxdepth: 2
+
+   intro/index
+
+.. _user-guide:
+
+.. toctree::
+   :maxdepth: 2
+
+   user/index
+
+.. _dev-guide:
+
+.. toctree::
+   :maxdepth: 2
+
+   dev/index
+
+.. _tune-guide:
+
+.. toctree::
+   :maxdepth: 2
+
+   tune/index
+
+.. _design-guide:
+
+.. toctree::
+   :maxdepth: 2
+
+   design/index
+
+.. _apps-guide:
+
+.. toctree::
+   :maxdepth: 2
+
+   apps/index
+
+Supports
+----------
+
+* Feature1
+* Feature2
+

+ 21 - 0
docs/source/intro/features.rst

@@ -0,0 +1,21 @@
+Featrues
+========
+
+* Full MQTT V3.1/V3.1.1 protocol specification support
+* QoS0, QoS1, QoS2 Publish and Subscribe
+* Session Management and Offline Messages
+* Retained Messages Support
+* Last Will Message Support
+* TCP/SSL Connection Support
+* MQTT Over Websocket(SSL) Support
+* HTTP Publish API Support
+* .. _$SYS/brokers/#: https://github.com/emqtt/emqtt/wiki/$SYS-Topics-of-Broker Support
+* Client Authentication with clientId, ipaddress
+* Client Authentication with username, password.
+* Client ACL control with ipaddress, clientid, username.
+* Cluster brokers on several servers.
+* Bridge brokers locally or remotely
+* 500K+ concurrent clients connections per server
+* Extensible architecture with plugin support
+* Passed eclipse paho interoperability tests
+

+ 0 - 0
docs/source/intro/getting_started.rst


+ 9 - 0
docs/source/intro/index.rst

@@ -0,0 +1,9 @@
+Getting Started
+---------------
+
+
+.. toctree::
+
+   overview
+   features
+

+ 28 - 0
docs/source/intro/overview.rst

@@ -0,0 +1,28 @@
+Overview
+========
+
+emqttd is a massively scalable and clusterable MQTT V3.1/V3.1.1 broker written in Erlang/OTP. emqttd support both MQTT V3.1/V3.1.1 protocol specification with extended features.
+
+emqttd could connect Sensor, Mobile, Web Browser and Application Server with asynchronous PUB/SUB messsages.
+
+.. image:: ../_images/emqttd.png
+
+
+Philosophy
+----------
+
+Focuse on scalable connection layer and message router layer.
+
+
+Goals
+-----
+
+TODO:...
+
+emqttd is aimed to provide a solid, enterprise grade, extensible open-source MQTT broker for IoT(M2M) applications that need to support ten millions of concurrent MQTT clients.
+
+* Easy to install
+* Massively scalable
+* Easy to extend
+* Solid stable
+

+ 30 - 0
docs/source/intro/quick_start.rst

@@ -0,0 +1,30 @@
+
+Download and Install
+=====================
+
+Download binary packeges for linux, mac and freebsd from http://emqtt.io/downloads
+
+::
+
+    tar xvf emqttd-ubuntu64-0.7.0-alpha.tgz && cd emqttd
+
+    # start console
+    ./bin/emqttd console
+
+    # start as daemon
+    ./bin/emqttd start
+
+    # check status
+    ./bin/emqttd_ctl status
+
+    # stop
+    ./bin/emqttd stop
+
+Build from Source
+==================
+
+::
+
+    git clone https://github.com/emqtt/emqttd.git
+
+    cd emqttd && make && make dist

BIN
docs/source/mqtt/MQTT_V3.1_Protocol_Specific.pdf


+ 5 - 0
docs/source/mqtt/index.rst

@@ -0,0 +1,5 @@
+
+.. toctree::
+
+   intro
+

+ 2 - 0
docs/source/mqtt/intro.rst

@@ -0,0 +1,2 @@
+MQTT Introduce
+==============

BIN
docs/source/mqtt/rfc6455.pdf


+ 2 - 0
docs/source/tune/etc_app_config.rst

@@ -0,0 +1,2 @@
+etc/app.config
+==============

+ 4 - 0
docs/source/tune/etc_vm_args.rst

@@ -0,0 +1,4 @@
+
+etc/vm.args
+==============
+

+ 9 - 0
docs/source/tune/index.rst

@@ -0,0 +1,9 @@
+Tune Guide
+----------
+
+.. toctree::
+   :maxdepth: 1
+
+   etc_vm_args
+   etc_app_config
+

+ 4 - 0
docs/source/user/acl.rst

@@ -0,0 +1,4 @@
+
+ACL
+===
+

+ 5 - 0
docs/source/user/admin.rst

@@ -0,0 +1,5 @@
+
+Admin
+=====
+
+

+ 3 - 0
docs/source/user/authentication.rst

@@ -0,0 +1,3 @@
+Authentication
+==============
+

+ 0 - 0
docs/source/user/clustering.rst


+ 382 - 0
docs/source/user/configuration.rst

@@ -0,0 +1,382 @@
+
+Configuration
+=============
+
+TODO:...
+
+Configuration files include:
+
++-------------------+-----------------------------------+
+| File              | Description                       |
++-------------------+-----------------------------------+
+| etc/vm.args       | Erlang VM Arguments               |
++-------------------+-----------------------------------+
+| etc/app.config    | emqttd Broker Configuration       |
++-------------------+-----------------------------------+
+| etc/acl.config    | ACL Rules Config                  |
++-------------------+-----------------------------------+
+| etc/clients.config| Authentication with clientId      |
++-------------------+-----------------------------------+
+| etc/ssl/*         | SSL certificate and key files     |
++-------------------+-----------------------------------+
+
+
+etc/vm.args
+-----------
+
+Configure/Optimize the Erlang VM::
+
+    ##-------------------------------------------------------------------------
+    ## Name of the node
+    ##-------------------------------------------------------------------------
+    -name emqttd@127.0.0.1
+
+    ## Cookie for distributed erlang
+    -setcookie emqttdsecretcookie
+
+    ##-------------------------------------------------------------------------
+    ## Flags
+    ##-------------------------------------------------------------------------
+
+    ## Heartbeat management; auto-restarts VM if it dies or becomes unresponsive
+    ## (Disabled by default..use with caution!)
+    ##-heart
+    -smp true
+
+    ## Enable kernel poll and a few async threads
+    +K true
+
+    ## 12 threads/core.
+    +A 48
+
+    ## max process numbers
+    +P 8192
+
+    ## Sets the maximum number of simultaneously existing ports for this system
+    +Q 8192
+
+    ## max atom number
+    ## +t
+
+    ## Set the distribution buffer busy limit (dist_buf_busy_limit) in kilobytes.
+    ## Valid range is 1-2097151. Default is 1024.
+    ## +zdbbl 8192
+
+    ## CPU Schedulers
+    ## +sbt db
+
+    ##-------------------------------------------------------------------------
+    ## Env
+    ##-------------------------------------------------------------------------
+
+    ## Increase number of concurrent ports/sockets, deprecated in R17
+    -env ERL_MAX_PORTS 8192
+
+    -env ERTS_MAX_PORTS 8192
+
+    -env ERL_MAX_ETS_TABLES 1024
+
+    ## Tweak GC to run more often
+    -env ERL_FULLSWEEP_AFTER 1000
+
+
+.. NOTE:: +P Number > 2 * Max Connections
+
+
+etc/app.config
+--------------
+
+TODO: The main configuration file for emqttd broker. Configure authentication, ACL, mqtt protocol parameters and listeners of the broker.
+
+TODO: The file is erlang format.
+
+Authentication and ACL::
+
+    %% Authentication and Authorization
+    {access, [
+        %% Authetication. Anonymous Default
+        {auth, [
+            %% Authentication with username, password
+            %{username, []},
+            
+            %% Authentication with clientid
+            %{clientid, [{password, no}, {file, "etc/clients.config"}]},
+
+            %% Authentication with LDAP
+            % {ldap, [
+            %    {servers, ["localhost"]},
+            %    {port, 389},
+            %    {timeout, 30},
+            %    {user_dn, "uid=$u,ou=People,dc=example,dc=com"},
+            %    {ssl, fasle},
+            %    {sslopts, [
+            %        {"certfile", "ssl.crt"},
+            %        {"keyfile", "ssl.key"}]}
+            % ]},
+
+            %% Allow all
+            {anonymous, []}
+        ]},
+        %% ACL config
+        {acl, [
+            %% Internal ACL module
+            {internal,  [{file, "etc/acl.config"}, {nomatch, allow}]}
+        ]}
+    ]},
+
+
+MQTT Packet, Client, Session, MQueue::
+
+    {mqtt, [
+        %% Packet
+        {packet, [
+            %% Max ClientId Length Allowed
+            {max_clientid_len, 1024},
+            %% Max Packet Size Allowed, 64K default
+            {max_packet_size,  65536}
+        ]},
+        %% Client
+        {client, [
+            %% Socket is connected, but no 'CONNECT' packet received
+            {idle_timeout, 20} %% seconds
+            %TODO: Network ingoing limit
+            %{ingoing_rate_limit, '64KB/s'}
+            %TODO: Reconnet control
+        ]},
+        %% Session
+        {session, [
+            %% Max number of QoS 1 and 2 messages that can be “in flight” at one time.
+            %% 0 means no limit
+            {max_inflight, 100},
+
+            %% Retry interval for redelivering QoS1/2 messages.
+            {unack_retry_interval, 60},
+
+            %% Awaiting PUBREL Timeout
+            {await_rel_timeout, 20},
+
+            %% Max Packets that Awaiting PUBREL, 0 means no limit
+            {max_awaiting_rel, 0},
+
+            %% Statistics Collection Interval(seconds)
+            {collect_interval, 0},
+
+            %% Expired after 2 days
+            {expired_after, 48}
+
+        ]},
+        %% Session
+        {queue, [
+            %% Max queue length. enqueued messages when persistent client disconnected, 
+            %% or inflight window is full.
+            {max_length, 100},
+
+            %% Low-water mark of queued messages
+            {low_watermark, 0.2},
+
+            %% High-water mark of queued messages
+            {high_watermark, 0.6},
+
+            %% Queue Qos0 messages?
+            {queue_qos0, true}
+        ]}
+    ]},
+
+Broker Options::
+
+    {broker, [
+        %% System interval of publishing broker $SYS messages
+        {sys_interval, 60},
+
+        %% Retained messages
+        {retained, [
+            %% Expired after seconds, never expired if 0
+            {expired_after, 0},
+
+            %% Max number of retained messages
+            {max_message_num, 100000},
+
+            %% Max Payload Size of retained message
+            {max_playload_size, 65536}
+        ]},
+
+        %% PubSub and Router
+        {pubsub, [
+            %% Default should be scheduler numbers
+            %% {pool_size, 8},
+            
+            %% Subscription: disc | ram | false
+            {subscription, ram},
+
+            %% Route shard
+            {route_shard, false},
+
+            %% Route delay, false | integer
+            {route_delay, false},
+
+            %% Route aging time(seconds)
+            {route_aging, 5}
+        ]},
+
+        %% Bridge
+        {bridge, [
+            %%TODO: bridge queue size
+            {max_queue_len, 10000},
+
+            %% Ping Interval of bridge node
+            {ping_down_interval, 1} %seconds
+        ]}
+    ]},
+
+Extended Modules::
+
+    {modules, [
+        %% Client presence management module.
+        %% Publish messages when client connected or disconnected
+        {presence, [{qos, 0}]}
+
+        %% Subscribe topics automatically when client connected
+        %% {subscription, [
+        %%    %% Subscription from stored table
+        %%    stored,
+        %%
+        %%   %% $u will be replaced with username
+        %%    {"$Q/username/$u", 1},
+        %%
+        %%   %% $c will be replaced with clientid
+        %%    {"$Q/client/$c", 1}
+        %% ]}
+
+        %% Rewrite rules
+        %% {rewrite, [{file, "etc/rewrite.config"}]}
+    ]},
+
+Listeners:: 
+
+    {listeners, [
+        {mqtt, 1883, [
+            %% Size of acceptor pool
+            {acceptors, 16},
+
+            %% Maximum number of concurrent clients
+            {max_clients, 8192},
+
+            %% Socket Access Control
+            {access, [{allow, all}]},
+
+            %% Connection Options
+            {connopts, [
+                %% Rate Limit. Format is 'burst, rate', Unit is KB/Sec
+                %% {rate_limit, "100,10"} %% 100K burst, 10K rate
+            ]},
+
+            %% Socket Options
+            {sockopts, [
+                %Set buffer if hight thoughtput
+                %{recbuf, 4096},
+                %{sndbuf, 4096},
+                %{buffer, 4096},
+                %{nodelay, true},
+                {backlog, 1024}
+            ]}
+        ]},
+
+        {mqtts, 8883, [
+            %% Size of acceptor pool
+            {acceptors, 4},
+
+            %% Maximum number of concurrent clients
+            {max_clients, 512},
+
+            %% Socket Access Control
+            {access, [{allow, all}]},
+
+            %% SSL certificate and key files
+            {ssl, [{certfile, "etc/ssl/ssl.crt"},
+                   {keyfile,  "etc/ssl/ssl.key"}]},
+
+            %% Socket Options
+            {sockopts, [
+                {backlog, 1024}
+                %{buffer, 4096},
+            ]}
+        ]},
+        %% WebSocket over HTTPS Listener
+        %% {https, 8083, [
+        %%  %% Size of acceptor pool
+        %%  {acceptors, 4},
+        %%  %% Maximum number of concurrent clients
+        %%  {max_clients, 512},
+        %%  %% Socket Access Control
+        %%  {access, [{allow, all}]},
+        %%  %% SSL certificate and key files
+        %%  {ssl, [{certfile, "etc/ssl/ssl.crt"},
+        %%         {keyfile,  "etc/ssl/ssl.key"}]},
+        %%  %% Socket Options
+        %%  {sockopts, [
+        %%      %{buffer, 4096},
+        %%      {backlog, 1024}
+        %%  ]}
+        %%]},
+
+        %% HTTP and WebSocket Listener
+        {http, 8083, [
+            %% Size of acceptor pool
+            {acceptors, 4},
+            %% Maximum number of concurrent clients
+            {max_clients, 64},
+            %% Socket Access Control
+            {access, [{allow, all}]},
+            %% Socket Options
+            {sockopts, [
+                {backlog, 1024}
+                %{buffer, 4096},
+            ]}
+        ]}
+    ]},
+
+
+etc/acl.config
+--------------
+
+Configuration file for ACL::
+
+    %%%-----------------------------------------------------------------------------
+    %%%
+    %%% -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}.
+
+.. NOTE:: Allow 'localhost' to pubsub '$SYS/#' and '#' by default.
+
+etc/clients.config
+------------------
+
+TODO:
+
+testclientid0
+testclientid1 127.0.0.1
+testclientid2 192.168.0.1/24
+
+
+

+ 5 - 0
docs/source/user/http.rst

@@ -0,0 +1,5 @@
+
+HTTP API
+========
+
+

+ 15 - 0
docs/source/user/index.rst

@@ -0,0 +1,15 @@
+User Guide
+----------
+
+
+.. toctree::
+
+   install
+   configuration
+   authentication
+   acl
+   http
+   websocket
+   admin
+   logs
+

+ 99 - 0
docs/source/user/install.rst

@@ -0,0 +1,99 @@
+Installation
+============
+
+TODO: ...
+
+emqttd is cross-platform, could run on windows, linux, freebsd and mac os x.
+
+emqttd is easy to install and takes about 5 minutes to download and startup.
+
+Install on Linux, Freebsd and Mac OS X
+--------------------------------------
+
+Download binary packages from http://emqtt.io/downloads, and then:: 
+
+    unzip emqttd-platform-0.x.y-beta.zip && cd emqttd
+
+Startup with console for debug::
+
+    ./bin/emqttd console
+
+All the MQTT Packets(RECV/SENT) will be printed on console.
+
+Startup as daemon::
+
+    ./bin/emqttd start
+
+TCP Ports used by emqttd:
+
++-----------+-----------------------------+
+|  Port     | Description                 |
++-----------+-----------------------------+
+|  1883     |  MQTT                       |
++-----------+-----------------------------+
+|  8883     |  MQTT(SSL)                  |
++-----------+-----------------------------+
+|  8083     |  MQTT Over WebSocket        |
++-----------+-----------------------------+
+
+
+Check the broker status::
+
+    ./bin/emqttd_ctl status
+
+Stop the broker::
+
+    ./bin/emqttd stop
+
+
+Install on Windows
+------------------
+
+Download windows package from http://emqtt.io/downloads.
+
+Start console to check if emqttd works::
+
+    .\bin\emqttd console
+
+.. NOTE:: execute '.\bin\emqttd', should not cd to 'bin' folder.
+
+A console window will show if the broker started successfully.
+
+Register emqttd as window service::
+
+    .\bin\emqttd install
+
+Starte emqttd service::
+
+    .\bin\emqttd start
+
+.. NOTE:: The console window should be closed if opened.
+
+Stop emqttd service::
+
+    .\bin\emqttd stop
+
+Uninstall emqttd service::
+
+    .\bin\emqttd uninstall
+
+
+Build from Source
+-----------------
+
+emqttd requires Erlang R17+ to build from source.
+
+Erlang R17+ and git client should be installed before building emqttd.
+
+::
+
+    git clone https://github.com/emqtt/emqttd.git
+
+    cd emqttd
+
+    git submodule update --init --recursive
+
+    make && make dist
+
+    cd rel/emqttd && ./bin/emqttd console
+

+ 4 - 0
docs/source/user/logs.rst

@@ -0,0 +1,4 @@
+
+Logs
+====
+

+ 5 - 0
docs/source/user/websocket.rst

@@ -0,0 +1,5 @@
+
+MQTT Over WebSocket
+===================
+
+