php 协议头,入门PHP实现MQTT协议的固定头部(Fix header)
前面的话
直接进入主题,具体的mqtt协议请参考mqtt协议
固定头的结构
简单描述下固定头
第一个字节总共8位, 前四位表示消息类型,最大的十进制值是15(二进制是1111)。
第三位表示消息是否重复,十进制值只能保存0或者1
第一、二位是消息的QoS值,十进制值能存0(二进制00)到3(二进制11)的任意值
最后一位是服务器是否需要保存此消息的标识,十进制值存0或者1
第二个字节标识 除了固定头部之外的 消息的 长度(可变头+消息体),这里先不讨论
_ 更具体的,请看mqtt协议。_
编码
// 先定义一个变量,值为0, 一个数字占用一个字节。
// 所以 firstByte 的二进制值是 0000 0000
// 注:有些实现使用的是16进制,使用16进制和10进制没啥区别,
// 只是16进制转换为2进制方便些,为了好理解,这里全部用10进制
$firstByte = 0;
// 假设Message Type 是5,所以构造出来的头部
// 第一字节前四位应该是 0101(5的二进制),其他位都为0的时候
// 第一字节二进制是 0101 0000
$firstByte |= 5; // 原值 0000 0000 和 0101(可以看作是:0000 0101) 做或运算,得到的值是 0000 0101
// 需要将 0000 0101 变成 0101 0000 只需要左移4位
$firstByte << 4; // $firstByte 二进制是 0101 0000 ,至此 message type 就编到了第一自己的前四位中了。
// 接下来是第三位,dup 的标识,假设我们的dug flag 值是1,我们需要将第三位设置为1
// 将firstByte 从 0101 0000 变成 0101 1000,只需要 0101 0000 和 0000 1000 做一次 或运算即可
// 0000 1000的十进制值是 8
$firstByte |= 8; // firstByte 的二进制是 0101 1000,至此 dup flag 就编到了第三位中
// 接下来是第一、二位,用存储qos level的值
// 假设qos level 的值是3(这里只是假设,3的是mqtt预留字段),3的二进制是 11
// 那么放入存储3以后,firstByte 的二进制值应该是 0101 1110
// 我们只需要将 0101 1000 和 0000 0110 作或运算即可,0000 0110 的十进制是 6
$firstByte |= 6; // firstByte 的二进制是 0101 1110
// 如何编码 retain, 相信,你已经会了
// 最后一步,我们需要将上面得到的结果转换成一个字符串
$firstChr = chr($firstByte)
// 然后发送出去
解析
//在上一步中,假设我们把 retain = 1 也编进了第一字节,那会得到 一个二进制 0101 1111。
// 通过 chr 转换为一个字符串后发出来的,我们需要还原。假设$buffer 是收到的数据.
$firstChr = substr($buffer, 0, 1); // 取第一个字节
$firstByte = ord($firstChr); // 转换回asiic码,这个时候我们就得到了一个二进制为 0101 1111的变量
// 首先取前四位,也就是message type, 只需要右移 4 位即可
$messageType = $firstByte >> 4; // 0101 1111 >> 4 = 0000 0101,值为十进制的5
// 现在要取第三位 dug flag
$dupFlag = ($firstByte & 8) >> 3; // 0101 1111 & 000 1000(8 的二进制) = 000 1000 >> 3 = 0000 0001 = 十进制1
// 取 qos level
$qos = ($firstByte & 6) >> 1; // 0101 1111 & 0000 0110(6 的二进制) = 0000 0110 >> 1 = 0000 0011 = 十进制3
// 最后一位怎么取, firstByte 和 1 作与运算即可。
结语
首先,位运算是一些很有技巧性,上面只是一种方式,你还可以通过其他的位运算方式实现
其次,不要工作几年就忘记了基础,[捂脸]
php 协议头,入门PHP实现MQTT协议的固定头部(Fix header)相关推荐
- python实现mqtt协议_自己动手实现MQTT协议
写在前面 前段时间弄IoT相关的东西,系统学习了一下 MQTT 协议,在此分享出来. 本文先是对 MQTT 协议做了简单的介绍:接着是对 MQTT协议的内容做了较为全面的解读:最后使用 Python ...
- 云服务器部署mqtt协议通信,云服务器部署mqtt协议通信
云服务器部署mqtt协议通信 内容精选 换一换 虚拟IP(Virtual IP Address,简称VIP)是一个未分配给真实弹性云服务器网卡的IP地址.弹性云服务器除了拥有私有IP地址外,还可以拥有 ...
- 智慧农业系统 - 可视化大屏(Echarts)管理系统(HTTP(S)协议)物联网平台(MQTT协议)
一.平台功能特点 农业数据实时监控,实时视频监控,历史数据分析: 支持电子地图,设备地理位置精确定位: 支持多级组织结构管理,满足集团大客户需求: 可视化大屏展示,数据指标一目了然,彰显企业数字化建设 ...
- 【新手入门】MQTT 协议开发入门
文章目录 MQTT 协议开发入门 协议特点 发布订阅 服务质量 MQTT协议中的术语 MQTT 协议开发入门 [MQTT]是一个客户端-服务器发布/订阅消息传输协议. 它轻量,开放,简单, 并易于实现 ...
- 一文读懂MQTT协议
1 概述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级 ...
- 简述 MQTT协议概念
MQTT协议官网 一.MQTT协议的原理 MQTT协议是基于Publish | Subscribe 发布订阅者的物联网通讯协议 突出点: 1.简单易实现 2.支持Qos 服务质量 3.报文小 (M ...
- MQTT协议(1)介绍
物联网MQTT协议介绍 1.MQTT概述 是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发 ...
- MQTT协议详解(完整版)
1 MQTT协议概念: 1.1 MQTT特点: 基于Publish/Subscribe(发布订阅)模式的物联网通信协议 简单易实现 支持Qos(服务质量) 报文精简 基于TCP/IP 发布订阅模式: ...
- Java物联网开发(一) —— MQTT协议
基于 Publish/Subscribe 模式的物联网通信协议MQTT 一. 简介 二. 特点 QoS消息发布质量介绍 三. 应用场景 四. 原理 MQTT协议中的方法 五. MQTT协议数据包结构 ...
最新文章
- C#中out 及 ref 区别
- Dictionary帮助类
- ubuntu16.04+Virtualenv+python2.7+Caffe安装(CPU版本,无opencv)
- 修复windows脸部识别_如何在Windows 10中改善面部识别
- 当模型预测控制遇见机器学习
- JFreeChart的简单应用及乱码解决
- check_mk自定义监控增加性能数据图形展示
- 从0到100亿互联网金融架构发展史
- emu8086:如何把数组里的值全部变为FFFF
- ddns文件服务器,DDNS基础配置
- 第二章 Qt窗体应用------修改标题栏图标
- PS——图像处理知识点
- visio中将图片改为平行四边形_如何用Photoshop将一张长方形的照片变成平行四边形?...
- 微信后台基于时间序的新一代海量数据存储架构的设计实践
- ps导出的gif图片不能动,或是只能动一次的解决办法
- java注解保留两位小数_jackson使用@JsonSerialize格式化BigDecimal解决.00不显示问题
- 深度学习-第二章 卷积神经网络面试题(大厂必问,历经半年整理)
- 解决Error in file(con, “w“) : cannot open the connection问题
- 【Solidity】函数returns多个值的接收方式
- 小白如何搞定远程开机?黑科技智能插座真的不了解一下吗
热门文章
- mysql 选取数据库_mysql选取数据库
- 一名计算机专业新生代农民工的五年求学之路,从“低谷”到“山峰”
- 大数据如何进行创新与变革
- 如何解决AttributeError: ‘DataFrame‘ object has no attribute ‘sort‘
- python求5_Python 5 运算符
- python用正则表达式提取中文_python3.x提取中文的正则表达式示例代码
- linux汇编指令输出到屏幕,Linux 汇编语言(GNU GAS汇编)开发指南
- android新闻客户端实验报告,基于Android平台的新闻客户端设计与实现
- php如何连接mariadb,MariaDB 建立连接
- vs查询mysql返回数据_vs与数据库连接查询