前面的话

直接进入主题,具体的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)相关推荐

  1. python实现mqtt协议_自己动手实现MQTT协议

    写在前面 前段时间弄IoT相关的东西,系统学习了一下 MQTT 协议,在此分享出来. 本文先是对 MQTT 协议做了简单的介绍:接着是对 MQTT协议的内容做了较为全面的解读:最后使用 Python ...

  2. 云服务器部署mqtt协议通信,云服务器部署mqtt协议通信

    云服务器部署mqtt协议通信 内容精选 换一换 虚拟IP(Virtual IP Address,简称VIP)是一个未分配给真实弹性云服务器网卡的IP地址.弹性云服务器除了拥有私有IP地址外,还可以拥有 ...

  3. 智慧农业系统 - 可视化大屏(Echarts)管理系统(HTTP(S)协议)物联网平台(MQTT协议)

    一.平台功能特点 农业数据实时监控,实时视频监控,历史数据分析: 支持电子地图,设备地理位置精确定位: 支持多级组织结构管理,满足集团大客户需求: 可视化大屏展示,数据指标一目了然,彰显企业数字化建设 ...

  4. 【新手入门】MQTT 协议开发入门

    文章目录 MQTT 协议开发入门 协议特点 发布订阅 服务质量 MQTT协议中的术语 MQTT 协议开发入门 [MQTT]是一个客户端-服务器发布/订阅消息传输协议. 它轻量,开放,简单, 并易于实现 ...

  5. 一文读懂MQTT协议

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

  6. 简述 MQTT协议概念

    MQTT协议官网 一.MQTT协议的原理 MQTT协议是基于Publish | Subscribe 发布订阅者的物联网通讯协议 突出点: 1.简单易实现 2.支持Qos 服务质量 3.报文小   (M ...

  7. MQTT协议(1)介绍

    物联网MQTT协议介绍 1.MQTT概述 是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发 ...

  8. MQTT协议详解(完整版)

    1 MQTT协议概念: 1.1 MQTT特点: 基于Publish/Subscribe(发布订阅)模式的物联网通信协议 简单易实现 支持Qos(服务质量) 报文精简 基于TCP/IP 发布订阅模式: ...

  9. Java物联网开发(一) —— MQTT协议

    基于 Publish/Subscribe 模式的物联网通信协议MQTT 一. 简介 二. 特点 QoS消息发布质量介绍 三. 应用场景 四. 原理 MQTT协议中的方法 五. MQTT协议数据包结构 ...

最新文章

  1. C#中out 及 ref 区别
  2. Dictionary帮助类
  3. ubuntu16.04+Virtualenv+python2.7+Caffe安装(CPU版本,无opencv)
  4. 修复windows脸部识别_如何在Windows 10中改善面部识别
  5. 当模型预测控制遇见机器学习
  6. JFreeChart的简单应用及乱码解决
  7. check_mk自定义监控增加性能数据图形展示
  8. 从0到100亿互联网金融架构发展史
  9. emu8086:如何把数组里的值全部变为FFFF
  10. ddns文件服务器,DDNS基础配置
  11. 第二章 Qt窗体应用------修改标题栏图标
  12. PS——图像处理知识点
  13. visio中将图片改为平行四边形_如何用Photoshop将一张长方形的照片变成平行四边形?...
  14. 微信后台基于时间序的新一代海量数据存储架构的设计实践
  15. ps导出的gif图片不能动,或是只能动一次的解决办法
  16. java注解保留两位小数_jackson使用@JsonSerialize格式化BigDecimal解决.00不显示问题
  17. 深度学习-第二章 卷积神经网络面试题(大厂必问,历经半年整理)
  18. 解决Error in file(con, “w“) : cannot open the connection问题
  19. 【Solidity】函数returns多个值的接收方式
  20. 小白如何搞定远程开机?黑科技智能插座真的不了解一下吗

热门文章

  1. mysql 选取数据库_mysql选取数据库
  2. 一名计算机专业新生代农民工的五年求学之路,从“低谷”到“山峰”
  3. 大数据如何进行创新与变革
  4. 如何解决AttributeError: ‘DataFrame‘ object has no attribute ‘sort‘
  5. python求5_Python 5 运算符
  6. python用正则表达式提取中文_python3.x提取中文的正则表达式示例代码
  7. linux汇编指令输出到屏幕,Linux 汇编语言(GNU GAS汇编)开发指南
  8. android新闻客户端实验报告,基于Android平台的新闻客户端设计与实现
  9. php如何连接mariadb,MariaDB 建立连接
  10. vs查询mysql返回数据_vs与数据库连接查询