RabbitMQ实现一个简单的MQTT服务器

前言

这里使用的是RabbitMQ的MQTT插件作为MQTT服务器,也可以考虑专门的MQTT服务器EMQ,搭建更简便,有兴趣可以参考一下使用EMQ搭建MQTT服务器.
操作系统:Unbuntu16.04LTS

Erlang

如果没有安装autoconf需要执行sudo apt install autoconf安装下先
因为rabbitmq需要erlang环境,所以需要先安装erlang:

git clone https://github.com/erlang/otp.git
cd otp
./otp_build autoconf
./configure
make
make install

详细可见这里


上面这个我自己尝试会报错,于是使用了这个:

  • 添加存储库条目

要将Erlang解决方案资源库(包括我们的公钥apt-secure)添加到您的系统,请调用以下命令:

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
sudo dpkg -i erlang-solutions_1.0_all.deb

或者:手动添加存储库条目
添加下列行中的一个到您的/etc/apt/sources.list(根据您的分布):

deb https://packages.erlang-solutions.com/ubuntu trusty contrib
deb https://packages.erlang-solutions.com/ubuntu saucy contrib
deb https://packages.erlang-solutions.com/ubuntu precise contrib

要验证您正在运行的发行版,请lsb_release -c在控制台中运行。
接下来,添加Erlang Solutions公钥以apt-secure使用以下命令:

wget https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc
sudo apt-key add erlang_solutions.asc
  • 安装Erlang

刷新存储库缓存并安装erlang包:

sudo apt-get update
sudo apt-get install erlang

或esl-erlang包:

sudo apt-get update
sudo apt-get install esl-erlang

具体细节可参阅这里

RabbitMQ

将rabbitmq的apt存储库添加到apt源列表目录(/etc/apt/sources.list.d)

echo "deb https://dl.bintray.com/rabbitmq/debian xenial main" | sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list

接下来使用apt-key(8)将公钥添加到可信密钥列表中 :

wget -O- https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc |sudo apt-key add -

然后更新软件包列表:

sudo apt-get update

打包安装

sudo apt install rabbitmq-server
sudo service rabbitmq-server start

如果出现

node with name "rabbit" already running
需要先杀死进程
通过端口查看查看PID

lsof -i:PORT(15672)
kill -s 9 PID

再运行服务

sudo service rabbitmq-server start

环境配置

这里是几个重要的配置路径:

  • Config file /etc/rabbitmq/rabbitmq.config
  • Database directory /var/lib/rabbitmq/mnesia/rabbit@VM-42-237-ubuntu
  • Log file /var/log/rabbitmq/[email protected]
  • SASL log file /var/log/rabbitmq/[email protected]

详细配置参阅:
http://www.rabbitmq.com/configure.html
配置示例:
rabbitmq.conf.example
advanced.config.example
一些关于插件的状态信息:
https://www.rabbitmq.com/man/rabbitmq-plugins.8.html
设置两个插件:
[rabbitmq_management,rabbitmq_mqtt].
路径:/etc/rabbitmq/enabled_plugins

应用配置

接下来再增加一些简单应用配置,详细配置参阅http://www.rabbitmq.com/man/rabbitmqctl.8.html“>这里

增加vhost

sudo rabbitmqctl add_vhost vhost
vhost:要创建的虚拟主机项的名称.

增加用户

sudo rabbitmqctl add_user username password
username要创建的用户的名称。
password创建的用户将用来登录代理的密码.

标记用户

sudo rabbitmqctl set_user_tags username administrator
可设置用户username 为超级管理员

vhost权限

sudo rabbitmqctl set_permissions [-p vhost]user conf write read
vhost要向其授予用户访问权限的虚拟主机的名称, 默认为 “/”。
user要授予对指定虚拟主机的访问权限的用户的名称。
conf与用户被授予配置权限的资源名称匹配的正则表达式。
write与用户被授予写入权限的资源名称匹配的正则表达式。
read与用户被授予读取权限的资源名称匹配的正则表达式。
例如:

sudo rabbitmqctl set_permissions -p /test_vhost username "^test-.*" ".*" ".*"

此命令指示 RabbitMQ 代理授予用户名为 “username ” 的虚拟主机访问权 (称为 “/test_vhost”), 并对其名称以 “test” 开头的所有资源配置权限, 并对所有资源写入和读取权限
值得注意的是,经过对RabbitMQ中MQTT文档的理解,这里需要端口映射或者使用SSL证书主题的可分辨名称映射到其目标虚拟主机来实现MQTT用户分配不同vhost,但是目前不是刚需,先放一放,暂时权限设置成如下才能正常使用mqtt:

sudo rabbitmqctl set_permissions -p / username .*" ".*" ".*"

主题权限

set_topic_permissions [-p vhost] user exchange write read
vhost:授予用户访问权的虚拟主机的名称,默认为“/”。
user:目标虚拟主机中的权限适用的用户的名称。
exchange:主题交换授权检查名称将应用于。
write:与发布的消息的路由键匹配的正则表达式。
read:与消费消息的路由键匹配的正则表达式。
设置用户主题权限。

sudo rabbitmqctl set_topic_permissions -p /test_vhost tester amq.topic "^tester-.*" "^tester-.*"

该命令指示RabbitMQ代理让名为“tonyg”的用户发布和使用以“tonyg-”开头的路由密钥通过“/ myvhost”虚拟主机的“amp.topic”交换消息.

sudo rabbitmqctl set_topic_permissions -p /test_vhost tester amq.topic "^{username}-.*" "^{username}-.*"

主题权限支持以下变量的变量扩展:username,vhost和client_id。
请注意,client_id仅在使用MQTT时才展开。前面的例子可以通过使用“^ {username} - 。*”来更加通用

你可能感兴趣的:(物联网,服务器)