MQTT介绍:http://mqtt.org

服务器端
https://mosquitto.org/download/

PHP客户端
https://github.com/bluerhinos/phpMQTT

MQTT QOS等级订阅和发布的关系
https://www.jianshu.com/p/ebe4b2c0461d

qos = 0:仅发一次,不管是否能收到
qos = 1:没返回一直发,可能有重复接收(接收到消息可能未传递给客户端)
qos = 2:保证必须收到,并且不重复(使用MSG_ID保证不重复接收)

也就是服务器只会按pub和sub两者qos等级最小的那个qos规则来发送消息。
pub时指定的qos是服务器肯定按此规则接收,但是最终订阅者不一定。
sub时指定的qos表示订阅者可以接收的最高消息等级,也就是可能收到更低等级的消息。

遇到的问题

1.  qos=2 一直没有测试成功,mosquitto 已经收到客户端的消息,但订阅端就是接收不到。
2.  当有多个订阅端时,又是后收到的消息居然会不全,前面会有乱码出现。
3.  没有HTTP简单直接;感觉没有HTTP可靠通用;

消息发布

<?php

require("../phpMQTT.php");

$server    = '127.0.0.1';     // 服务器IP
$port = 1883; // 服务器端口
$username = ''; // 用户名
$password = ''; // 密码
$client_id = 'pub_' . uniqid(); $mqtt = new Bluerhinos\phpMQTT($server, $port, $client_id); if ($mqtt->connect(true, NULL, $username, $password))
{
for ($i=0; $i<100; $i++)
{
$topic = 'topic01';
$msg = 'Hello World! at (' . $i . ') ' . date('Y-m-d H:i:s');
echo date('Y-m-d H:i:s') . ' SEND [' . $topic . '] ' . $msg . PHP_EOL; // qos = 0:仅发一次,不管是否能收到
// qos = 1:没返回一直发,可能有重复接收
// qos = 2:保证必须收到,并且不重复
$mqtt->publish($topic, $msg, 0);
usleep(100000);
} $mqtt->close();
}
else
{
echo "Time out!\n";
}

消息订阅

<?php

require("../phpMQTT.php");

$server    = '127.0.0.1';     // 服务器IP
$port = 1883; // 服务器端口
$username = ''; // 用户名
$password = ''; // 密码
$client_id = 'sub_' . uniqid(); $mqtt = new Bluerhinos\phpMQTT($server, $port, $client_id); $mqtt->debug = true; if(!$mqtt->connect(true, NULL, $username, $password))
{
echo "连接失败!\n";
exit(1);
} // 订阅列表
$topics = [
'topic01' => ['qos' => 0, 'function' => 'procmsg'],
]; $mqtt->subscribe($topics, 0); while ($mqtt->proc()){} $mqtt->close(); // 消息处理函数
function procmsg($topic, $msg)
{
echo date('Y-m-d H:i:s') . ' [' . $topic . '] ' . $msg . PHP_EOL;
}

PHP MQTT 实践的更多相关文章

  1. MQTT协议学习及实践(Linux服务端,Android客户端的例子)

    前言 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提 ...

  2. 海鑫智圣:物联网漫谈之MQTT协议

    什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端 ...

  3. 云巴:基于MQTT协议的实时通信编程模型

    概要 有人常问,云巴实时通信系统到底提供了一种怎样的服务,与其他提供推送或 IM 服务的厂商有何本质区别.其实,从技术角度分析,云巴与其它同类厂商都是面向开发者的通信服务,宏观的编程模型都是大同小异, ...

  4. Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践

    目录 [TOC] 1.RabbitMQ介绍 1.1.什么是RabbitMQ?   RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol ...

  5. 物联网 MQTT 服务质量级别

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 翻译人:Tnecesoc,该成员来自云+社区翻译社 消息队列遥测传输(MQTT)是一种客户端服务器发布 / 订阅消息传输协议.它轻量,开放, ...

  6. 从Uber微服务看最佳实践如何炼成?

    导读:Uber成长非常迅速,工程师团队快速扩充,据说Uber有2000名工程师,8000个代码仓库,部署了1000多个微服务.微服务架构是Uber应对技术团队快速增长,功能快速上线很出色的解决方案.本 ...

  7. 基于 Docker 的微服务架构实践

    本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...

  8. 子弹短信光鲜的背后:网易云信首席架构师分享亿级IM平台的技术实践

    本文原文内容来自InfoQ的技术分享,本次有修订.勘误和加工,感谢原作者的分享. 1.前言 自从2018年8月20日子弹短信在锤子发布会露面之后(详见<老罗最新发布了“子弹短信”这款IM,主打熟 ...

  9. MQTT详解以及在IoT中的应用

    MQTT定义: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台, ...

随机推荐

  1. 《linux就该这么学》课堂笔记11 LVM、防火墙初识

    1.常用的LVM部署命令 功能/命令 物理卷管理 卷组管理 逻辑卷管理 扫描 pvscan vgscan lvscan 建立 pvcreate vgcreate lvcreate 显示 pvdispl ...

  2. k8s运维处理

    k8s运维处理 驱逐节点容器,进行docker,等重要组件的重启时,打驱逐标记 kubectl drain [option --node ip] 进行重启docker或kubelet等其他操作,操作完 ...

  3. Linux运维技术之LVM(逻辑卷管理)

    DM :逻辑设备(模块)--->LVM 优点: 个分区) 2.1.partprobe  /dev/sdb : 使用partprobe可以不用重启系统即可配合fdisk工具创建新的分区 2.2.c ...

  4. SaltStack--数据系统

    saltstack数据系统 数据系统Grains 1.Grains是SaltStack收集的有关底层管理系统的静态信息.包括操作系统版本.域名.IP地址.内存.内核.CPU.操作系统类型以及许多其他系 ...

  5. (八)Kubernetes Ingress资源

    前言 Kubernetes提供了两种内建的云端负载均衡机制(cloud load balancing)用于发布公共应用,一种是工作于传输层的Service资源,它实现的是“TCP负载均衡器”,另一种是 ...

  6. PAT甲级1019水题飘过

    题目分析: 将n转成对应大小的b进制数之后判断是否为回文串,是则Yes,否则No #include<iostream> using namespace std; ]; //存放从0开始b进 ...

  7. 2019年牛客多校第四场 B题xor(线段树+线性基交)

    题目链接 传送门 题意 给你\(n\)个基底,求\([l,r]\)内的每个基底是否都能异或出\(x\). 思路 线性基交板子题,但是一直没看懂咋求,先偷一份咖啡鸡板子写篇博客吧~ 线性基交学习博客:传 ...

  8. httprunner学习15-运行用例命令行参数详解

    前言 HttpRunner 在命令行中启动测试时,通过指定参数,可实现丰富的测试特性控制. 命令行参数CLI 使用 -h 查看相关命令行参数 hrun -h 参数名称 参数值 参数说明 -h, --h ...

  9. python应用-输入三个数,输出其最大值

    """ 输入三个数,输出其最大值 Author:罗万财 Date:2017-7-6 """ a=int(input('a=')) b=int ...

  10. MongoDB远程连接-命令行客户端mongo.exe

    命令行客户端mongo.exe 位于安装目录bin子目录下.MongoDB的所有可执行程序都在其中. 双击打开mongo.exe应该是默认连接本地数据库服务,因此需要用Cmd或Powershell的方 ...