• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

imi-mqtt: 在 imi 框架中开发 MQTT 服务端,并且内置了一个 MQTT 客户端 ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

imi-mqtt

开源软件地址:

https://gitee.com/imiphp/imi-mqtt

开源软件介绍:

imi-mqtt

Latest VersionPhp VersionSwoole VersionIMI License

介绍

在 imi 框架中开发 MQTT 服务端,并且内置了一个 MQTT 客户端。

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

Composer

本项目可以使用composer安装,遵循psr-4自动加载规则,在你的 composer.json 中加入下面的内容:

{    "require": {        "imiphp/imi-mqtt": "^1.0.0"    }}

然后执行 composer update 安装。

使用说明

可以参考 exampletests 目录示例。

项目配置文件:

[    'components'    =>  [        'MQTT'  =>  'Imi\MQTT',    ],]

MQTT 通讯数据包类

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

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

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

MQTT 服务开发

首先,服务器配置的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\Server\Server::send()等方法,详见:https://doc.imiphp.com/utils/Server.html

MQTT 客户端开发

事件监听类:

<?phpnamespace Imi\MQTT\Test;use Imi\MQTT\Client\Contract\IMQTTClientListener;class TestClientListener implements IMQTTClientListener{    /**     * 连接确认     *     * @param \Imi\MQTT\Client\MQTTClient $client     * @param \BinSoul\Net\Mqtt\Packet\ConnectResponsePacket $packet     * @return void     */    public function connectACK(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\ConnectResponsePacket $packet)    {    }    /**     * 发布     *     * @param \Imi\MQTT\Client\MQTTClient $client     * @param \BinSoul\Net\Mqtt\Packet\PublishRequestPacket $packet     * @return void     */    public function publish(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\PublishRequestPacket $packet)    {    }    /**     * 发布确认     *     * @param \Imi\MQTT\Client\MQTTClient $client     * @param \BinSoul\Net\Mqtt\Packet\PublishAckPacket $packet     * @return void     */    public function publishAck(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\PublishAckPacket $packet)    {    }    /**     * 发布已收到(保证交付部分1)     *     * @param \Imi\MQTT\Client\MQTTClient $client     * @param \BinSoul\Net\Mqtt\Packet\PublishReceivedPacket $packet     * @return void     */    public function publishReceived(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\PublishReceivedPacket $packet)    {    }    /**     * 发布释放(确保交付的第2部分)     *     * @param \Imi\MQTT\Client\MQTTClient $client     * @param \BinSoul\Net\Mqtt\Packet\PublishReleasePacket $packet     * @return void     */    public function publishRelease(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\PublishReleasePacket $packet)    {    }    /**     * 发布完成(保证交付的第3部分)     *     * @param \Imi\MQTT\Client\MQTTClient $client     * @param \BinSoul\Net\Mqtt\Packet\PublishCompletePacket $packet     * @return void     */    public function publishComplete(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\PublishCompletePacket $packet)    {    }    /**     * 订阅确认     *     * @param \Imi\MQTT\Client\MQTTClient $client     * @param \BinSoul\Net\Mqtt\Packet\SubscribeResponsePacket $packet     * @return void     */    public function subscribeACK(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\SubscribeResponsePacket $packet)    {    }    /**     * 取消订阅确认     *     * @param \Imi\MQTT\Client\MQTTClient $client     * @param \BinSoul\Net\Mqtt\Packet\UnsubscribeResponsePacket $packet     * @return void     */    public function unsubscribeACK(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\UnsubscribeResponsePacket $packet)    {    }    /**     * Ping 响应     *     * @param \Imi\MQTT\Client\MQTTClient $client     * @param \BinSoul\Net\Mqtt\Packet\PingResponsePacket $packet     * @return void     */    public function ping(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\PingResponsePacket $packet)    {    }}

客户端调用:

use Imi\MQTT\Client\MQTTClient;$client = new MQTTClient([    'host'          =>  '127.0.0.1',    'port'          =>  8081,], new TestClientListener);$client->wait(); // 开始循环接收,直到关闭连接

客户端参数表:

参数名说明
host服务器主机名称
port服务器端口号
timeout网络通讯超时时间
pingTimespan定时 ping 的时间间隔,单位秒。默认为 NULL 则不自动 ping
protocol协议级别,默认43-MQIsdp;4-MQTT
username用户名
password密码
clientId客户端ID
keepAlive保活时间
clean清除会话
will遗嘱消息,具体结构看下面的表格
ssl使用 SSL 连接
sslCertFile证书文件
sslKeyFile证书密钥文件
sslVerifyPeer验证服务器端证书
sslAllowSelfSigned允许自签名证书
sslHostName服务器主机名称
sslCafileCA 证书
sslCapath证书目录

will 遗嘱消息参数表:

参数名说明
topic主题
payload有效载荷
qosLevel0-最多一次的传输;1-至少一次的传输;2-只有一次的传输
retain保留
duplicate重复

免费技术支持

QQ群:17916227 点击加群,如有问题会有人解答和修复。

运行环境

版权信息

imi-mqtt 遵循 MIT 开源协议发布,并提供免费使用。

捐赠

开源不求盈利,多少都是心意,生活不易,随缘随缘……


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap