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} - 。*”來更加通用

發佈了34 篇原創文章 · 獲贊 21 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章