I2C时序
空闲:SCL=1,SDA=1
起始:SCL=1,SDA 高→低
停止:SCL=1,SDA 低→高
数据传输:SCL 高,采样 SDA,SDA 不能变化;SCL 低,SDA 允许改变电平。SDA 高 = 1,SDA 低 = 0。
ACK:接收方拉低 SDA;NACK:SDA 保持高电平。
volatile关键字的作用
禁止编译器把变量缓存到寄存器,强制每次读写访问真实内存,消除读写优化。
三大适用场景:
- 外部硬件状态寄存器(内存映射外设)
- 中断处理函数与主程序共享全局标志
- 裸机 RTOS 多任务 / 多线程共享标志位
MQTT
概念
基于TCP的轻量级、发布订阅消息协议,客户端-broker代理-客户端架构。
特点
开销小、带宽占用低,适合弱网设备。
三个角色
Publisher发布者(发消息)、Broker代理服务器(接收、转发信息)、Subscriber订阅者(接收信息)
topic主题
层级用/分割,单层通配符+(例:school/+/teacher),多层通配符#(例:school/#)
QoS服务质量
发布者与Broker之间、Broker与订阅者之间分别协商,两端取最小值。
QoS0最多一次,消息发出去就不管,不重传,可能丢包,适合不重要传感器上报。
QoS1至少一次,保证消息一定到达,可能重复。PUBLISH->PUBACK。
QoS2恰好一次,四次握手PUBLISH PUBREC PUBREL PUBCOMP,开销最大,保证不丢不重复
重要报文
- CONNECT:客户端连接 Broker
- CONNACK:Broker 回复连接结果(返回码非常重要:0 成功,1 协议不支持,2 身份拒绝等)
- PUBLISH:发布消息
- SUBSCRIBE/SUBACK:订阅主题
- UNSUBSCRIBE/UNSUBACK:取消订阅
- PINGREQ / PINGRESP:心跳保活!
保留消息
发布消息设置retain=1,Broker保存这条消息;新订阅该主题的客户端上线立即收到该最新消息。
使用场景:设备最新状态上线。
清楚保留消息:发布一条retain=1,payload为空的消息。
遗嘱消息
客户端在CONNECT报文中提前注册好遗嘱,当客户端异常断开,Broker自动向对应主题发送遗嘱消息。
端口
1883:MQTT明文
8883:MQTT+TLS加密
HTTP
概念
超文本传输协议,应用层协议,请求-应答模式:客户端发起请求,服务端返回响应,服务端不能主动推消息给客户端。
端口
HTTP80 HTTPS443
报文结构
请求报文:请求行(请求方法、请求URI、HTTP版本)、请求头(属性名:属性值)、空行、请求体
响应报文:状态行(HTTP版本、状态码、状态描述)、响应头、空行、响应体(实际返回的数据)
常用请求方法
- GET:获取资源,参数放 URL;不应该修改服务器数据。
- POST:提交数据,数据放在 body,新增操作。
- PUT:全量更新资源。
- DELETE:删除资源。
- PATCH:局部修改资源。
状态码
- 1xx 信息:100 继续
- 2xx 成功200 OK 成功;201 Created 创建成功
- 3xx 重定向301 永久重定向;302 临时重定向;304 Not Modified 协商缓存(资源没有变化,返回缓存)
- 4xx 客户端错误400 参数错误;401 未认证;403 没有权限;404 资源找不到;405 方法不允许
- 5xx 服务端错误500 服务器内部错误;502 网关错误;503 服务不可用
长连接区别
HTTP Keep-Alive:同一个tcp连接可以连续发多次http请求响应,不用每次请求建立tcp三次握手。
MQTT长连接:依靠心跳保活,broker可以随时主动推送消息给客户端。
缓存机制
强缓存:浏览器看本地缓存是否过期,不发请求到服务器,直接用本地缓存。
协商缓存:发送请求给服务器,服务器判断资源有没有修改,没有返回304,使用本地缓存。