(十三)、MQTT3.1.1-MQTT服务端数据结构设计
为进一步实现一个简易的MQTT服务端,做如下服务端数据结构设计。
1、服务端协议相关的函数
连接 | rx_connect() | 接收连接请求 | Socket中监听,通过第一个字节switch,根据数据创建client对象 |
tx_connectack() | 回复连接响应 | 处理完成rx_connect后,自动处理。 | |
发布 Qos=0 | rx_publish() Qos=0 | 接收发布数据 Qos=0 | Socket中监听,通过第一个字节switch,根据Topic查找client,分发message。 |
发布 Qos=1 | rx_publish() Qos=1 | 接收发布数据 Qos=1 | Socket中监听,通过第一个字节switch,根据Topic查找client,分发message。 |
tx_puback() | 回复发布响应 | 处理完成rx_publish()后,自动处理。 | |
发布 Qos=2 | rx_publish() Qos=2 | 接收发布数据 Qos=2 | Socket中监听,通过第一个字节switch,根据Topic查找client,分发message,并且标记状态。 |
tx_pubrec() | 回复发布响应1 | 处理完成rx_publish()后,自动处理。 | |
rx_pubrel() | 接收pubrel数据 | Socket中监听,通过第一个字节switch,根据Topic查找client,标记message。 | |
tx_pubcomp() | 回复发布响应2 | 处理完成rx_pubrel()后,自动处理。 | |
订阅 | rx_subscribe() | 接收订阅数据 | Socket中监听,通过第一个字节switch,根据Topic查找Topics列表,将该client添加至topic中。 |
tx_suback() | 回复订阅响应 | 处理完成rx_suback()后,自动处理。 | |
取消订阅 | rx_unsubscribe() | 接收取消订阅数据 | Socket中监听,通过第一个字节switch,根据Topic查找Topics列表,将该client从topic中删除。 |
tx_unsuback() | 回复取消订阅响应 | 处理完成rx_unsuback()后,自动处理。 | |
心跳 | rx_pingreq() | 接收心跳数据 | Socket中监听,通过第一个字节switch,根据TCP/IP查找client,更新pingtime。 |
tx_pingresp() | 回复心跳响应 | 处理完成rx_pingreq()后,自动处理。 | |
断开连接 | rx_disconnect | 接收断开连接数据 | Socket中监听,通过第一个字节switch,根据TCP/IP查找client,将该client从clients中删除。并且将topics中的该client一并删除。 |
2、服务端数据结构
列表Clients{ Connect; TCP/IP; Messages; Subscribes; Next_client;} | Client对象列表,clinet属性有连接、TCP/IP、未处理完成的消息、未处理完成的订阅,指向下一个clinet的指针。 | |
Connect{ Protocolname; protocolLevel; Connectflage; Keepalive; Clientid; Willtopic; Willmessage; Username; Password connectflage;} | 其中: Connectflage{ Bit Usernameflag; Bit Passwordflag; Bit Willretain; Bit Willqos; Bit Willflag; Bit Cleansession; Bit Reserved; } | 每个client对象都有一个连接结构体,记录该client的连接参数。 |
TCP/IP{ IPaddr; Port; Pingtime;} | Client对象使用的传输物理实现。 | |
列表Messages{ Dup; Qos; Retain; M_uuid; Messagedata; Messageflag; Next_message;} | 其中: Messageflag; Qos=0: 0->pub; Qos=1: 0->pub,1->ack Qos=2: 0->pub,1->ack,2->rel,3->comp | Client对象未处理完成的消息。 |
列表Subscribes{ Topicfilter; S_uuid; Subscribeflag; Next_subscribe;} | 其中: Subscribeflag; 0->tx,1->ack | Client对象的订阅。 |
列表topics{ Topicname; Topic; Nexttopic;} | 其中topic{ Client; Nextclient; } | topics列表中存放了所有的topic,每个topic中存放了所有订阅该topic的client。 |
相关文章:
(十三)、MQTT3.1.1-MQTT服务端数据结构设计
为进一步实现一个简易的MQTT服务端,做如下服务端数据结构设计。 1、服务端协议相关的函数 连接 rx_connect() 接收连接请求 Socket中监听,通过第一个字节switch,根据数据创建client对象 tx_connectack() 回复连接响应 处理完成rx_conn…...
StackOverFlowError常见原因及解决方法总结
StackOverFlowError常见原因及解决方法总结 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一下 Java 中一个常见的错误:StackOverFl…...
【安全】Linux Fanotify使用入门
1 Fanotify vs Inotify 在实现某些功能时,可能需要获取某个文件执行的操作,一种可能的方案是用Audit的路径监控,但是Audit存在性能和内核稳定性问题,这个时候就可以其他的文件变更检测机制。 inotify可以监控文件被创建、修改和…...

java的输出流File OutputStream
一、字节输出流FileOutput Stream 1、定义 使用OutputStream类的FileOutput Stream子类向文本文件写入的数据。 2.常用构造方法 3.创建文件输出流对象的常用方式 二、输出流FileOutputStream类的应用示例 1.示例 2、实现步骤 今天的总结就到此结束啦,拜拜&#x…...

32 - 判断三角形(高频 SQL 50 题基础版)
32 - 判断三角形 select *,if(xy>z and xz>y and zy > x,Yes,No) triangle fromTriangle;...
QT 中ListView和ListWidget有什么区别
ListView和ListWidget在Qt框架中都是用于显示列表数据的控件,但它们在使用方法和特性上存在一些明显的差异。以下是关于它们用法不一样的地方的详细分析: 数据管理方式: ListView:使用QAbstractItemModel数据模型来管理和显示列表…...

Python酷库之旅-第三方库openpyxl(07)
目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…...
使用Python进行Web开发:从基础到实战
使用Python进行Web开发:从基础到实战 Python不仅是一门数据科学的利器,也是一门强大的Web开发语言。得益于其简洁的语法和丰富的生态系统,Python在Web开发领域同样大放异彩。本文将介绍Python在Web开发中的基础知识、常用框架以及一个完整的实战项目,帮助读者从基础入门到…...
打包体积分析和优化
webpack分析工具:webpack-bundle-analyzer 1. 通过<script src"./vue.js"></script>方式引入vue、vuex、vue-router等包(CDN) // webpack.config.js if(process.env.NODE_ENVproduction) {module.exports {devtool:…...
numpy的array/asarray/asanyarray的格式转化错误问题解决
关于numpy的array()、asarray()、asanyarray() 当前numpy版本:1.26.3 有时一些依赖numpy的旧项目,在运行时,会出现如下错误 ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1…...

C++:STL容器-map
C:STL容器-map 1. map构造和赋值2. map大小和交换3. map插入和删除4. map查找和统计5. map容器排序 map中所有元素都是pair(对组) pair中第一个元素为key(键),起到索引作用,第二个元素为value(实…...

你好,复变函数2.0
第一行:0 或 1 第二行:(空格)函数(后缀) #pragma warning(disable:4996) #include <easyx.h> #include <stdio.h> #include <math.h> #define PI 3.141592653589793 #define E 2.71828…...

汉语拼音字母表 (声母表和韵母表)
汉语拼音字母表 [声母表和韵母表] 1. 汉语拼音声母表2. 汉语拼音韵母表References 1. 汉语拼音声母表 声母是韵母前的辅音,与韵母一起构成一个完整的音节。 辅音是发声时,气流在口腔中受到各种阻碍所产生的声音,发音的过程即是气流受阻和克…...

C++20中的Feature Test Mocros
C20定义了一组预处理器宏,用于测试各种语言和库的feature。 Feature Test Mocros(特性测试宏)是C20中引入的一种强大机制,用于应对兼容性问题。Feature Test Mocros作为预处理器指令(preprocessor directives)出现,它使你能够在编译过程中仔细…...

运维iptables与firewalld详解
iptables与firewalld 一、iptables 1.1 iptables简介 iptables 是一个在 Linux 系统上用来配置 IPv4 数据包过滤规则的工具。它允许系统管理员控制数据包的流向,实现网络安全、网络地址转换(NAT)和端口转发等功能。 具体来说,…...

适用于 Android 的 几种短信恢复应用程序
Android 设备上的短信丢失可能由于多种原因而丢失,例如意外删除、恢复出厂设置、系统崩溃或病毒攻击。是否有应用程序可以恢复 Android 上已删除的短信?幸运的是,有几款短信恢复应用程序可以扫描您的 Android 手机并从内存或 SIM 卡中检索已删…...
Lodash-js工具库
1. Lodash 简介 Lodash 是一个现代 实用工具库,提供了许多有用的函数,帮助开发者处理常见的编程任务,如数组操作、对象处理、字符串处理等。Lodash 使得代码更简洁、更高效,极大地提高了开发效率。Lodash 的设计灵感来自于 Under…...
Makefile实战论(一)
为什么写这个呢,其实我有系统学过Makefile和CMake。但是因为用的不是很多或者说没有深入的使用场景,导致我不是很熟练,或者说没法优雅地使用。刚好最近对Linux的嵌入式编程比较感兴趣,借着demo来分析一下资深工程师写的Makefile&a…...

Hi3861 OpenHarmony嵌入式应用入门--PWM 三色灯
这篇文章是讲解的pwm控制三色灯的部分,这部分也是后续全彩智能灯的基础。 硬件原理如下 IO管脚定义在hi-12f_v1.1.2-规格书-20211202.pdf文档中 GPIO API API名称 说明 unsigned int IoTGpioInit(unsigned int id); GPIO模块初始化 hi_u32 hi_io_set_func(hi_i…...

CH5xx USB下载工具
文章目录 CH5xx USB下载工具1.前言2.介绍3. USB下载4. 串口免按键下载4.SWD下载 CH5xx USB下载工具 1.前言 CH5xx USB下载工具是一款专为沁恒 CH5xx系列 BLE SOC设计的程序的下载工具。这款工具与串口下载相比较,不仅提供了稳定的数据传输能力,而且提高…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...