MQTT 服务端

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

安装:composer require imiphp/imi-mqtt

项目配置文件:[

'components' => [

'MQTT' => 'Imi\MQTT',

],

]MQTT 功能要求 PHP >= 7.2

配置

首先,服务器配置的type设为MQTT,并且定义好控制器。

控制器需要继承Imi\Server\MQTT\BaseMQTTController类,并且实现方法。

如果你是主服务器,配置如下:'mainServer' => [

'namespace' => 'ImiApp\MQTTServer',

'type' => 'MQTT',

'host' => '127.0.0.1',

'port' => 8081,

'controller' => \ImiApp\MQTTServer\Controller\MQTTController::class,

// 'configs' => [

// // 启用 MQTTS 配置证书

// 'ssl_cert_file' => dirname(__DIR__) . '/ssl/server.crt',

// 'ssl_key_file' => dirname(__DIR__) . '/ssl/server.key',

// ],

],

如果你是子服务器,配置如下下:// 子服务器(端口监听)配置

'subServers' => [

'xxxServer' => [

'namespace' => 'ImiApp\MQTTServer',

'type' => 'MQTT',

'host' => '127.0.0.1',

'port' => 8081,

'controller' => \ImiApp\MQTTServer\Controller\MQTTController::class,

// 'configs' => [

// // 启用 MQTTS 配置证书

// 'ssl_cert_file' => dirname(__DIR__) . '/ssl/server.crt',

// 'ssl_key_file' => dirname(__DIR__) . '/ssl/server.key',

// ],

],

],

通讯数据包类

imi-mqtt 基于 binsoul/net-mqtt 开发,使用的都是这个包中的数据包结构类。

类名一般是BinSoul\Net\Mqtt\Packet\XXX

如:\BinSoul\Net\Mqtt\Packet\SubscribeRequestPacket

控制器<?php

namespace ImiApp\MQTTServer\Controller;

use Imi\Server\MQTT\BaseMQTTController;

use Imi\Server\MQTT\Message\ReceiveData;

use BinSoul\Net\Mqtt\Packet\PublishAckPacket;

use BinSoul\Net\Mqtt\Packet\PingRequestPacket;

use BinSoul\Net\Mqtt\Packet\PingResponsePacket;

use BinSoul\Net\Mqtt\Packet\ConnectRequestPacket;

use BinSoul\Net\Mqtt\Packet\PublishReleasePacket;

use BinSoul\Net\Mqtt\Packet\PublishRequestPacket;

use BinSoul\Net\Mqtt\Packet\ConnectResponsePacket;

use BinSoul\Net\Mqtt\Packet\PublishCompletePacket;

use BinSoul\Net\Mqtt\Packet\PublishReceivedPacket;

use BinSoul\Net\Mqtt\Packet\SubscribeRequestPacket;

use BinSoul\Net\Mqtt\Packet\DisconnectRequestPacket;

use BinSoul\Net\Mqtt\Packet\SubscribeResponsePacket;

use BinSoul\Net\Mqtt\Packet\UnsubscribeRequestPacket;

use BinSoul\Net\Mqtt\Packet\UnsubscribeResponsePacket;

class MQTTController extends BaseMQTTController

{

/**

* 连接

*

* @param \BinSoul\Net\Mqtt\Packet\ConnectRequestPacket $request

* @param \Imi\Server\MQTT\Message\ReceiveData $receiveData

* @return \BinSoul\Net\Mqtt\Packet\ConnectResponsePacket|null

*/

public function connect(ConnectRequestPacket $request, ReceiveData $receiveData): ?ConnectResponsePacket

{

$success = 'root' === $request->getUsername() && '123456' === $request->getPassword();

$response = new ConnectResponsePacket;

if($success)

{

$response->setReturnCode(0);

}

else

{

$response->setReturnCode(4);

}

return $response;

}

/**

* 断开连接

*

* @param \BinSoul\Net\Mqtt\Packet\DisconnectRequestPacket $request

* @param \Imi\Server\MQTT\Message\ReceiveData $receiveData

* @return void

*/

public function disconnect(DisconnectRequestPacket $request, ReceiveData $receiveData): void

{

}

/**

* Ping

*

* @param \BinSoul\Net\Mqtt\Packet\PingRequestPacket $request

* @param \Imi\Server\MQTT\Message\ReceiveData $receiveData

* @return \BinSoul\Net\Mqtt\Packet\PingResponsePacket|null

*/

public function ping(PingRequestPacket $request, ReceiveData $receiveData): ?PingResponsePacket

{

return new PingResponsePacket;

}

/**

* 发布

*

* @param \BinSoul\Net\Mqtt\Packet\PublishRequestPacket $request

* @param \Imi\Server\MQTT\Message\ReceiveData $receiveData

* @return \BinSoul\Net\Mqtt\Packet\PublishAckPacket|\BinSoul\Net\Mqtt\Packet\PublishReceivedPacket|\BinSoul\Net\Mqtt\Packet\PublishReleasePacket|\BinSoul\Net\Mqtt\Packet\PublishCompletePacket|null

*/

public function publish(PublishRequestPacket $request, ReceiveData $receiveData)

{

switch($request->getTopic())

{

case 'a':

$response = new PublishAckPacket;

break;

case 'b':

$response = new PublishReceivedPacket;

break;

case 'c':

$response = new PublishReleasePacket;

break;

case 'd':

$response = new PublishCompletePacket;

break;

}

$response->setIdentifier($request->getIdentifier());

return $response;

}

/**

* 订阅

*

* @param \BinSoul\Net\Mqtt\Packet\SubscribeRequestPacket $request

* @param \Imi\Server\MQTT\Message\ReceiveData $receiveData

* @return \BinSoul\Net\Mqtt\Packet\SubscribeResponsePacket|null

*/

public function subscribe(SubscribeRequestPacket $request, ReceiveData $receiveData): ?SubscribeResponsePacket

{

$response = new SubscribeResponsePacket;

$response->setIdentifier($request->getIdentifier());

$response->setReturnCodes([0]);

return $response;

}

/**

* 取消订阅

*

* @param \BinSoul\Net\Mqtt\Packet\UnsubscribeRequestPacket $request

* @param \Imi\Server\MQTT\Message\ReceiveData $receiveData

* @return \BinSoul\Net\Mqtt\Packet\UnsubscribeResponsePacket|null

*/

public function unsubscribe(UnsubscribeRequestPacket $request, ReceiveData $receiveData): ?UnsubscribeResponsePacket

{

$response = new UnsubscribeResponsePacket;

$response->setIdentifier($request->getIdentifier());

return $response;

}

}

mqtt服务器搭建php,MQTT 服务端相关推荐

  1. 一步一步来:MQTT服务器搭建、MQTT客户端使用

    物联网应用如火如荼,本文就物联网应用中最受青睐的协议 MQTT相关测试工具的使用进行简单说明. 希望此文能给需要用到的朋友一些微薄的帮助-- 一.MQTT服务器( emqx )搭建 1. 下载服务器M ...

  2. 腾讯云服务器搭建MC私服服务端启动后仍然Connection timed out问题

    服务器端CentOS8系统 mc服务端正常启动 服务器控制台25565端口已开放 仍然是Connection timed out 是因为CentOS防火墙没有打开 输入指令:systemctl sta ...

  3. Windows上Mqtt服务器搭建与使用客户端工具MqttBox进行测试

    场景 MQTT协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的" ...

  4. php对接AliGenie天猫精灵服务器控制智能硬件esp8266② 全面认识第三方授权机制 oauth2.0 协议,如何在 php 上搭建 oauth2.0服务端!(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. php对接AliGenie天猫精灵服务器控制智能硬件esp82 ...

  5. 从零开始开发物联网项目(1)——mqtt服务器搭建

    去年开发了一个物联网的项目,入了很多坑,花了很多时间,不过最后终于做出了一个初代版本,也算完成了项目.为了避免自己遗忘,也为了让有兴趣学习物联网的同学少入点坑,我整理了一下,写成一个系列教程.通过这个 ...

  6. Mqtt开发笔记:Mqtt服务器搭建

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  7. MQTT服务器搭建和测试步骤及遇见的问题

    MQTT服务器搭建和测试步骤及遇见的问题 前言:MQTT服务器有好多种,查看:Servers/Brokers Apache-Apollo:一个代理服务器,在ActiveMQ基础上发展而来,可以支持ST ...

  8. 阿里云MQTT服务器搭建与测试(全图文,非常详细)

    阿里云MQTT服务器搭建与测试 一. MQTT概念 二. 阿里云MQTT服务器搭建 1 阿里云平台注册及认证 2 添加平台 2 创建产品与设备 获取MQTT连接相关信息 三.MQTT.fx测试 1 M ...

  9. 基于ZigBee的智能家居设计与实现—MQTT服务器搭建+APP开发

    目录 MQTT服务器搭建 APP开发 易安卓环境搭建 易安卓基础介绍 关于易安卓 新建工程 界面介绍 易安卓使用到的操作演示 易语言使用到的语法演示 MQTT实现 MQTT组件介绍与添加 重点介绍 A ...

最新文章

  1. html 如何实现一条竖线边上有 刻度_记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背||CSDN博文精选...
  2. .NET Core程序中使用User Secrets存储敏感数据
  3. c++ string 字符串
  4. 06-密码学基础-混合密码系统
  5. Thanks, TuSimple!
  6. ado.net 插入一条数据
  7. LR 监控mysql
  8. 不能说的秘密-重载、重写与继承中的构造方法
  9. vecm模型怎么写系数_时变秩和时变系数VECM模型与“费雪效应”机制检验
  10. java POI excel导出自定义分页问题
  11. ios storyboard 传参 返回传参(segue)
  12. UVA 177 PaperFolding 折纸痕 (分形,递归)
  13. 小鑫鑫的平均分(排序问题)
  14. PSNR SSIM BD-rate BD-PSNR
  15. 云计算与大数据考试重点
  16. stata怎么画分类图_Stata中的图形制作(绝对自己总结)
  17. 超级白熊啤酒虎年限定礼盒正式发售;迪桑特限量发售新款针织滑雪服 | 知消...
  18. QQ防红跳转PHP代码,最新版防红代码!完虐市场上所有防红!!仅需一段代码在QQ打开任意网址即可跳转...
  19. 腾讯云轻量应用服务器卡死怎么连接?
  20. 要求输出事故报告,线上日志文件却不见了!!

热门文章

  1. [附源码]java毕业设计医院门诊信息管理系统
  2. git push -u origin master 本地代码上传gitlab远程仓库出错
  3. 苹果企业应用开发分享之一:苹果账户开户的悲惨经历
  4. python 类的封装
  5. NumPy 图解教程
  6. 微信小程序示例 - 小相册
  7. eolinker本地部署教程
  8. 用pytorch框架搭建一个写藏头诗的模型
  9. x86/x64/x86_64/i386/ia32/ia64/amd/amd64 辨析
  10. 聊一下 Gradle 相关,BuildConfig 这个类是如何生成的?