利用MQTT协议,实现物联网数据通讯。
MQTT服务器软件选择RabbitMQ。
RabbitMQ安装配置
安装RabbitMQ服务
1 2 3
| sudo apt-get install erlang-nox sudo apt update sudo apt-get install rabbitmq-server
|
添加用户并授权
1 2 3 4 5 6 7
| 添加用户 sudo rabbitmqctl add_user [username] [password] sudo rabbitmqctl set_user_tags [username] administrator
# 授权 sudo rabbitmqctl set_permissions [-p <vhost>] <user> <conf> <write> <read> 例子:sudo rabbitmqctl set_permissions -p / admin '.*' '.*' '.*'
|
启用插件
1 2 3 4 5
| sudo rabbitmq-plugins enable rabbitmq_management //后台管理系统 sudo rabbitmq-plugins enable rabbitmq_web_stomp //stomp消息通道插件 sudo rabbitmq-plugins enable rabbitmq_web_stomp_examples //stomp消息通道插件 sudo rabbitmq-plugins enable rabbitmq_mqtt // 启用MQTT插件 sudo rabbitmq-plugins enable rabbitmq_web_mqtt // 启用MQTT插件
|
允许外网访问
1 2
| /etc/rabbitmq/rabbitmq-env.conf//编辑配置文件 NODE_IP_ADDRESS=0.0.0.0 //允许外网访问
|
启动/停止服务
1 2
| systemctl start rabbitmq-server systemctl stop rabbitmq-server
|
开放端口
1 2 3 4 5 6 7
| 4369 epmd(Erlang Port Mapper Daemon),erlang服务端口 5672 //client端通信口 AMQP 15672 //后台管理系统端口 25672 节点间通信(Erlang分发服务器端口) 61613 //Stomp 协议端口 1883 // MQTT 协议端口 15675 // MQTT Web 协议端口
|
Web管理界面
1 2
| http://your server ip:15672/ 用户名/密码为添加的用户。
|
登录web管理界面后,在Queues新增一个queue,名称为test
再切换到 exchanges ,点 amq.topic ,在bindings添加一个Bind,to queue填test,Routing key填push_test_topic
用MQTTX模拟生产端电子秤
注意MQTT版本选3.1
添加3个连接。两个名称为电子秤1、2,模拟生产端。
一个名称为server模拟消费端,server订阅push_test_topic主题。
在两个生产端向push_test_topic主题发消息,server订阅了push_test_topic可以收到。
Laravel 端订阅主题
用 https://packagist.org/packages/php-mqtt/laravel-client 这个MTQQ PHP库。
安装并配置完后,建立一个 Commands, ElectronicRabbitMQ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php
namespace App\Console\Commands; use Illuminate\Console\Command; use PhpMqtt\Client\Facades\MQTT; use Log;
// 电子秤消费端 class ElectronicRabbitMQ extends Command { ... public function handle() { $mqtt = MQTT::connection(); $mqtt->subscribe('push_test_topic', function (string $topic, string $message) { Log::info($message); }, 1); $mqtt->loop(true); } }
|
运行命令 php artisan ElectronicRabbitMQ
再次在电子秤1、2中发送消息到主题push_test_topic
laravel订阅的主题push_test_topic的消息,会自动写到log中