插件
它们依赖于 emqx (opens new window) 的代码 API 或者 进行实现其特殊的功能。
然后通过打包编译工具 emqx-rel (opens new window) 将其与 核心项目一起编译并打包至一个可运行的软件包中。
提示
EMQX Enteprise 商业销售时不提供源代码,不支持客户自行开发、编译插件。
目前 EMQX 发行包提供的插件包括:
目前启动插件有以下四种方式:
- 默认加载
- 命令行启停插件
- 使用 Dashboard 启停插件
- 调用管理 API 启停插件
开启默认加载
如需在 EMQX 启动时就默认启动某插件,则直接在 添加需要启动的插件名称。
例如,目前 EMQX 自动加载的插件有:
在 EMQX 运行过程中,可通过 CLI - Load/Unload Plugin 的方式查看、和启停某插件。
使用 Dashboard 启停插件
若开启了 Dashboard 的插件,可以直接通过访问 http://localhost:18083/plugins
中的插件管理页面启停插件。
使用管理 API 启停插件
在 EMQX 运行过程中,可通过 的方式查看、和启停某插件。
参考 emqx_plugin_template (opens new window) 插件模版创建新的插件项目。
备注:在 <plugin name>_app.erl
文件中必须加上标签 -emqx_plugin(?MODULE).
以表明这是一个 EMQX 的插件。
创建 认证/访问控制 模块
接入认证示例代码 - emqx_auth_demo.erl
:
-module(emqx_auth_demo).
-export([ init/1
, check/2
, description/0
]).
init(Opts) -> {ok, Opts}.
check(_ClientInfo = #{clientid := ClientId, username := Username, password := Password}, _State) ->
ok.
description() -> "Auth Demo Module".
访问控制示例代码 - emqx_acl_demo.erl
:
-module(emqx_acl_demo).
-include_lib("emqx/include/emqx.hrl").
-export([ init/1
, check_acl/5
, reload_acl/1
, description/0
]).
init(Opts) ->
{ok, Opts}.
check_acl({ClientInfo, PubSub, _NoMatchAction, Topic}, _State) ->
io:format("ACL Demo: ~p ~p ~p~n", [ClientInfo, PubSub, Topic]),
allow.
reload_acl(_State) ->
ok.
description() -> "ACL Demo Module".
ok = emqx:hook('client.authenticate', fun emqx_auth_demo:check/2, []),
ok = emqx:hook('client.check_acl', fun emqx_acl_demo:check_acl/5, []).
在扩展插件中,可通过挂载 来处理客户端上下线、主题订阅、消息收发等事件。
钩子挂载示例代码 - emqx_plugin_template.erl
:
注册 CLI 命令
处理命令行命令示例代码 - emqx_cli_demo.erl
:
-module(emqx_cli_demo).
-export([cmd/1]).
cmd(["arg1", "arg2"]) ->
emqx_cli:print ("ok");
cmd(_) ->
emqx_cli:usage ([{"cmd arg1 arg2", "cmd demo"}]).
注册命令行示例代码 - emqx_plugin_template_app.erl
:
ok = emqx_ctl:register_command(cmd, {emqx_cli_demo, cmd}, []),
插件加载后,使用./bin/emqx_ctl
验证新增的命令行:
./bin/emqx_ctl cmd arg1 arg2
插件自带配置文件放置在 etc/${plugin_name}.conf|config
。 EMQX 支持两种插件配置格式:
- Erlang 原生配置文件格式 -
${plugin_name}.config
:
- sysctl 的
k = v
通用格式 -${plugin_name}.conf
:
plugin_name.key = value
注:k = v
格式配置需要插件开发者创建 priv/plugin_name.schema
映射文件。
编译和发布插件
clone emqx-rel 项目:
git clone https://github.com/emqx/emqx-rel.git
rebar.config 添加依赖:
{deps,
[ {plugin_name, {git, "url_of_plugin", {tag, "tag_of_plugin"}}}
, ....
....