深度解析应用层协议-----HTTP与MQTT(涵盖Paho库)
HTTP协议概述
1.1 HTTP的基本概念
HTTP是一种应用层协议,使用TCP作为传输层协议,默认端口是80,基于请求和响应的方式,即客户端发起请求,服务器响应请求并返回数据(HTML,JSON)。在HTTP/1.1中,使用了长连接技术,允许一个连接复用多个请求和响应,减少了TCP三次握手的消耗。
1.2 HTTP的基本结构
HTTP请求部分:
- 请求行:包含请求方法(GET, POST等)、请求URL、协议版本。
- GET:请求资源,通常用于获取数据。
- POST:提交数据,用于发送数据到服务器进行处理。
- PUT:更新数据,用于上传或修改资源。
DELETE:删除资源。- URL:资源标识符,表示请求的资源地址,包含协议、主机名、路径、查询参数等
- 请求头:包括各种元数据,如Connection、Host、Content-Type等。
- Content-Type:指示请求体的数据类型,通常在POST或PUT请求中使用(例如
Content-Type: application/json)。 - Host:指定请求的主机名和端口号,必需字段
- Connection:指定控制连接的方式(例如
keep-alive表示保持连接)
- Content-Type:指示请求体的数据类型,通常在POST或PUT请求中使用(例如
- 空行:标识头部与载荷的分界线,如果没有空行会发送TCP粘包,strstr解析/r/n获得载荷
- 请求体:通常在POST请求中出现,包含请求的具体数据。
- 对于GET请求,通常不携带请求体。GET请求的数据是通过URL中的查询参数传递的,例如:GET /path/to/resource?name=John&age=30 HTTP/1.1
完整的HTTP请求示例
POST /submit HTTP/1.1Host: www.example.com
Content-Type: application/json
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json{"username": "test_user","password": "test_pass"
}
HTTP响应部分:
- 响应行:包括协议版本、状态码(200,404,500)、状态描述(OK,not found,sever error)。
- 响应头:包含响应的元数据,如Content-Type、Content-Length等。
- Content-Type:指定响应体的内容类型,例如
text/html、application/json等。 - Content-Length:指定响应体的长度(字节数)。
- Content-Type:指定响应体的内容类型,例如
- 空行:/r/n,头部和内容的分隔
- 响应体:包含实际的返回数据,对于
GET请求,响应体通常是请求的资源(如HTML、JSON、图像等)。对于POST请求,响应体可能包含处理结果或其他数据。
完整的HTTP响应示例
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 112
Date: Tue, 21 Mar 2023 10:10:00 GMT
Server: Apache/2.4.1<html><body><h1>Welcome to the website</h1></body>
</html>
1.3 HTTP的局限性
- 无状态性:HTTP是无状态协议,每次请求都是独立的,不会记录上一次请求的任何信息,如果需要记录用户状态,需要额外机制如:
- Cookies:浏览器在发送请求时,可以携带上次访问时服务器存储的Cookies(小型文本数据),服务器通过这些Cookies来识别用户的身份或维持会话状态。
- 高开销:每次请求都需要建立TCP连接,导致网络开销较大,尤其在频繁请求的场景下。
- 实时性差:HTTP通常是客户端主动发起请求,服务器无法主动推送数据。
HTTP可以传哪些数据?
- 文本数据(如HTML、JSON、XML等)
- 二进制数据(如图片、音频、视频、PDF等)
MQTT协议概述
2.1 MQTT的基本概念
MQTT是一种轻量级的、基于发布/订阅模式的消息传输协议,使用TCP协议进行传输,端口为1883(非加密)和8883(加密),客户端通过发布(Publish)消息到某个主题(Topic),而其他订阅(Subscribe)该主题的客户端会接收到消息。
2.2 MQTT的基本结构
MQTT协议的消息主要包括以下内容:
- 主题(Topic):消息的标签,决定了消息的去向。订阅者根据主题来接收消息。
- QoS(Quality of Service)级别:决定消息传输的可靠性。MQTT支持三个级别的QoS:
- QoS 0:最多一次发送,不保证消息送达。
- QoS 1:至少一次发送,确保消息至少送达一次。
- QoS 2:只有一次发送,确保消息只送达一次。
- 保留标志:用于确保客户端在订阅时能接收到最后一条消息。
MQTT报文格式
MQTT报文格式具有简洁、高效的特点,主要由固定报文头、可变报文头和有效载荷(Payload)三部分组成。
固定报文头(Fixed Header)
固定报文头是每个MQTT报文的基本部分,长度是固定的,始终包含报文类型(Message Type)和报文标志(Flags)。
2.1 报文类型(Message Type)
MQTT定义了不同类型的报文,报文类型都由低四位表示
| 报文类型 | 描述 | 说明 |
|---|---|---|
| 1(0001) | CONNECT | 客户端连接到服务器 |
| 2 | CONNACK | 服务器确认客户端连接 |
| 3 | PUBLISH | 发布消息 |
| 8 | SUBSCRIBE | 订阅请求 |
可变报文头(Variable Header)
可变报文头的内容依赖于报文类型,某些类型的报文没有可变报文头。一般来说,可变报文头部分包括协议版本号、连接标志、客户端ID、订阅主题等信息。
3.1 CONNECT报文的可变报文头
- 协议名称:
MQTT - 协议版本:当前版本一般是
4(即MQTT 3.1.1) - Keep Alive:心跳间隔时间,单位为秒。
- 客户端ID:用于标识客户端的唯一标识符。
3.2 PUBLISH报文的可变报文头
- 主题名(Topic):消息的目标主题,用于订阅者筛选消息。
- 消息标识符(Message Identifier):如果QoS > 0,则会有消息标识符,用于确认消息的投递状态。
有效载荷(Payload)
有效载荷部分就是实际传递的数据内容,报文的有效载荷内容根据报文类型而不同。比如:
- PUBLISH报文的有效载荷包含消息体(即客户端发布的消息内容)。
- CONNECT报文的有效载荷包含用户名、密码、客户端ID等连接信息。
MQTT Paho库概述、使用方法、API函数
Paho的设计目标是简化MQTT客户端的实现,提供易于使用的API,使开发者能够专注于业务逻辑而不需要深入理解MQTT协议的细节。
MQTTClient_create:创建一个MQTT客户端实例,指定代理的URI和客户端ID。MQTTClient_connect:连接到MQTT代理,使用连接选项配置(如用户名、密码等)。MQTTClient_publish:向指定主题发布消息,可以指定消息的QoS、保留标志等。MQTTClient_subscribe:订阅一个主题,接收该主题的消息。MQTTClient_unsubscribe:取消订阅主题。
相关文章:
深度解析应用层协议-----HTTP与MQTT(涵盖Paho库)
HTTP协议概述 1.1 HTTP的基本概念 HTTP是一种应用层协议,使用TCP作为传输层协议,默认端口是80,基于请求和响应的方式,即客户端发起请求,服务器响应请求并返回数据(HTML,JSON)。在H…...
Kubernetes的Ingress和Service有什么区别?
在Kubernetes中,Ingress和Service是两个不同的概念,它们在功能、作用范围、应用场景等方面存在明显区别,具体如下: 功能 Ingress:主要用于管理集群外部到内部服务的HTTP和HTTPS流量路由。它可以根据域名、路径等规则…...
WordPress“更新失败,响应不是有效的JSON响应”问题的修复
在使用WordPress搭建网站时,许多人在编辑或更新文章时,可能会遇到一个提示框,显示“更新失败,响应不是有效的JSON响应”。这个提示信息对于不了解技术细节的用户来说,太难懂。其实,这个问题并不复杂&#x…...
【回溯算法2】
力扣17.电话号码的字母组合 链接: link 思路 这道题容易想到用嵌套的for循环实现,但是如果输入的数字变多,嵌套的for循环也会变长,所以暴力破解的方法不合适。 可以定义一个map将数字和字母对应,这样就可以获得数字字母的映射了…...
【RabbitMQ业务幂等设计】RabbitMQ消息是幂等的吗?
在分布式系统中,RabbitMQ 自身不直接提供消息幂等性保障机制,但可通过业务逻辑设计和技术组合实现消息处理的幂等性。以下是 8 种核心实现方案及最佳实践: 一、消息唯一标识符 (Message Deduplication) 原理 每条消息携带全局唯一IDÿ…...
layui 远程搜索下拉选择组件(多选)
模板使用(lay-module/searchSelect),依赖于 jquery、layui.dist 中的 dropdown 模块实现(所以data 格式请参照 layui文档) <link rel"stylesheet" href"layui-v2.5.6/dist/css/layui.css" /&g…...
【开源】思维导图:思绪思维导图 (Simple Mind Map)
目录 1. 思绪思维导图 2. 本地使用 3. 在线网页 1. 思绪思维导图 思绪思维导图,英文名称为Simple mind map,简称为SSM。 开源、免费 GitHub网址 支持多平台:Windows,Mac和Linux 支持在线和离线使用 2. 本地使用 安装包下载地址…...
国产编辑器EverEdit -告别东找西找!一键打开当前文件所在目录!
1 文件操作 2 应用场景 在文件编辑过程中,有时需要对文件进行一些操作,比如:在命令窗口输入文件路径、文件名,进入到文件目录,对文件进行压缩等,如果没有直达命令,用户需要通过文件管理器找到目…...
STM32MP157A单片机移植Linux驱动
在stm32mp157a单片机移植Linux操作系统,并移植内核驱动,在应用程序中使用3个线程,分别实现控制单片机上3个led流水灯的功能、蜂鸣器控制的功能、风扇控制的功能。 需求整理: 1.驱动程序-->led1.c,led2.cÿ…...
UE引擎游戏加固方案解析
据VGinsights的报告,近年来UE引擎在过去几年中市场占比显著增长,其中亚洲市场增幅达到了30%,随着UE5的推出和技术的不断进步,UE引擎在独立开发者和移动游戏开发中的应用也在逐步增加。 UE引擎的优势在于强大的画面表现与视觉特效…...
[kubelet-check] It seems like the kubelet isn‘t running or healthy.
执行k8s时报错: [kubelet-check] It seems like the kubelet isn’t running or healthy. [kubelet-check] The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz’ failed with error: Get "http://localhost:10248/heal ** 解决办法如下&a…...
C# 背景 透明 抗锯齿 (效果完美)
主要是通过 P/Invoke 技术调用 Windows API 函数 gdi32.dll/user32.dll,同时定义了一些结构体来配合这些 API 函数的使用,常用于处理图形绘制、窗口显示等操作。 运行查看效果 局部放大,抗锯齿效果很不错,尾巴毛毛清晰可见。 using System; u…...
关于uniApp的面试题及其答案解析
我的血液里流淌着战意!力量与智慧指引着我! 文章目录 1. 什么是uniApp?2. uniApp与原生小程序开发有什么区别?3. 如何使用uniApp实现条件编译?4. uniApp支持哪些平台,各有什么特点?5. 在uniApp中…...
Ubuntu编译ZLMediaKit
下载 git clone https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init安装工具 sudo apt install -y build-essential sudo apt install -y gcc g sudo apt install -y cmakesudo apt install -y build-essential cmake git libssl-dev libsdl1.…...
【Java场景题】MySQL死锁排查
大家好,今天XiXi给大家分享一个MySQL死锁排查的实验,文章主要有: 通过show engine innodb status,查看最近一次死锁信息开启innodb_print_all_deadlocks,在错误日志中能够记录所有死锁信息通过解析binlog日志定位死锁…...
Nginx解决前端跨域问题
1. 理解 CORS 和同源策略 1.1 同源策略 同源策略是一种浏览器安全机制,用于阻止不同源(不同域名、协议或端口)的 Web 应用相互访问数据。它确保了 Web 应用的隔离性,防止恶意网站访问用户数据或执行不安全的操作。 同源策略下&…...
Bootstrap Blazor UI 中 <Table> 组件 <TableColumn> 使用备忘01:EF Core 外码处理
应用场景:将外码转换为对应的文本进行显示、编辑。 例如,有一个【用户】表,其中有一个【用户类型ID】字段;另有一个【用户类型】表,包含【ID】、【名称】等字段。现在要求在 <Table> 组件显示列表中,…...
LabVIEW心音信号采集与分析系统
基于LabVIEW软件的心音信号采集与分析系统能够实现心音的采集、去噪和分析。系统利用LabVIEW的强大功能和灵活性,通过模块化设计,实现了心音信号的高效处理和分析,具备深度学习和身份识别的实验能力,适用于医学和生物工程领域的研…...
python:多重继承、MRO(方法解析顺序)
在 Python 中,当类存在多重继承时,方法的调用顺序由 方法解析顺序(Method Resolution Order, MRO) 决定。 Python 使用 C3线性化算法 来确定类的继承顺序(MRO),其核心规则是: 子类优…...
vue 父组件和子组件中v-model和props的使用和区别
一、v-model 1、v-model 可以在组件上使用以实现双向绑定。即父组件的值可以传递给子组件,子组件的值修改后,父组件的值会同步更新。 从 Vue 3.4 开始,推荐的实现方式是使用 defineModel() 宏; 2、示例:最常用的使用…...
【Scrapy】Scrapy教程7——存储数据
上一节我们对爬虫程序的默认回调函数parse做了改写,提取的数据可以在Scrapy的日志中打印出来了,光打印肯定是不行的,还需要把数据存储,数据可以存到文件,也可以存到数据库,我们一一来看。 存储数据到文件 首先我们看看如何将数据存储到文件,在讲[[【Scrapy】Scrapy教程…...
基础入门-算法解密散列对称非对称字典碰撞前后端逆向MD5AESDESRSA
知识点: 0、算法类型-单向散列&对称性&非对称性 1、算法识别加解密-MD5&AES&DES&RSA 2、解密条件寻找-逻辑特征&源码中&JS分析 应用场景: 1、发送数据的时候自动将数据加密发送(只需加密即可) 安全…...
在UBUNTU下搭建Deepseek
在UBUNTU下搭建Deepseek 一、安装UBUNTU 这个就不多说了,无外乎下载UBUNTU的iso,然后用UltraIso制作U盘,然后重启设置启动盘,安装… 二、安装Ollama curl -sSfL https://ollama.com/install.sh | sh这里可能需要你先安装curl工…...
O1 Embedder:让检索器思考后再行动
25年2月来自中科大和北京智源研究院的论文“O1 Embedder: Let Retrievers Think Before Action”。 大语言模型 (LLM) 的功能日益强大,彻底改变人们获取和利用信息的方式。值得注意的是,LLM 擅长执行细粒度数据表示,这有助于精确检索信息。它…...
【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记
本文内容为重写上一节课中的单链表,将其重构成更易于用户使用的链表,实现多种操作链表的方法。 1. 重构单链表SLList 在上一节课中编写的 IntList 类是裸露递归的形式,在 Java 中一般不会这么定义,因为这样用户可能需要非常了解…...
Ubuntu系统3分钟本地部署DeepSeek-R1蒸馏模型,支持联网
本文提供Ubuntu ollama Page Assist,3步快速安装DeepSeek-R1蒸馏模型,支持联网,支持API。 目录 DeepSeek-R1安装分3步: Step 1, 安装ollama(已安装可忽略) Step 2, 下载DeepSeek-R1模型 Step 3, 从…...
Linux按照日期定时删除elasticsearch索引
使用sh脚本删除 searchIndexfilebeat elastic_url192.168.98.136 elastic_port9200 saveday7date2stamp () {date --utc --date "$1" %s }dateDiff (){case $1 in-s) sec1; shift;;-m) sec60; shift;;-h) sec3600; shift;;-d) sec86400; shift;;…...
谷粒商城—分布式高级②.md
认证服务 1. 环境搭建 创建gulimall-auth-server模块,导依赖,引入login.html和reg.html,并把静态资源放到nginx的static目录下 2. 注册功能 (1) 验证码倒计时 //点击发送验证码按钮触发下面函数 $("#sendCode").click(function () {//如果有disabled,说明最近…...
向量的点乘的几何意义
源自AI 向量的点乘(Dot Product)在几何和图形学中有重要的意义。它不仅是数学运算,还可以用来描述向量之间的关系。以下是点乘的几何意义及其应用: 1. 点乘的定义 对于两个向量 a 和 b,它们的点乘定义为:…...
Python Cookbook-2.2 写入文件
任务 写入文本或者二进制数据到文件中。 解决方案 下面是最方便的将一个长字符串写人文件的办法: open(thefile.txt,w).write(all_the_text)#写入文本到文本文件 open(abinfiler,wb).write(all_the_data)#写入数据到二进制文件不过,最好还是给文件对象指定个名字…...
