文章目录
- 通讯协议制定之交互方式、步骤介绍
- 1. 前言
- 2. 通讯协议发送类型
- 2.1 周期发送
- 2.2 事件发送
- 3. 通讯协议数据包类型
- 3.1 握手
- 3.2 心跳
- 3.1 数据包
- 4. 小结
通讯协议制定之交互方式、步骤介绍
1. 前言
通讯协议
又称通信规程,是指通信双方对数据传送控制的一种约定,约定中包括对数据格式
,同步方式
,传送速度
,传送步骤
,检纠错方式
以及控制字符定义
等问题做出统一规定,通信双方必须共同遵守,它也叫做链路控制规程
- 根据项目中的实际应用,本人总结了嵌入式开发中通讯协议制定的相关考虑因素和经验技巧,具体包含如下内容,可供参考学习了解 ( 介绍中阐述的相关术语使用了开发交流沟通中的讲法,可能存在说法不同;因本人技术水平有限,分享创作的内容可能存在不合理的地方,欢迎相互交流沟通、批评指正)
1.通讯协议制定之前言、背景介绍
2.通讯协议制定之交互方式、步骤介绍
3.通讯协议制定之数据包结构介绍
4.通讯协议制定之数据传输类型及传输规则介绍
5.通讯协议制定之数据消息传输方式介绍
6.通讯协议制定之数据包校验算法介绍
7.通讯协议制定之常见问题、注意事项总结
- 通信双方在两个系统独自运行,那么通信数据什么时候开始发送?如何确保数据发送接收成功?数据交互的过程如何设定?为了解决这些疑问,本文将从通讯协议的
发送数据方式
,发送步骤
方面,介绍通信的周期发送
和事件发送
的含义和过程;详细介绍握手、心跳、数据包
的具体含义和交互方式步骤等内容
2. 通讯协议发送类型
- 如下示例,两块MCU芯片通过某种通信链路相互发送数据,发送的具体数据内容如何规定之后来详细介绍,本文从
发送数据方式
,发送步骤
等内容进行介绍
- 根据通信的同步方式可以分成
周期发送
和事件发送
两种类型
2.1 周期发送
周期发送
:按照某个固定的周期,连续不断的持续发送,即发送的数据内容按照相同的间隔发送传输- 周期发送用于
数据频繁变化
场景或者固定时间间隔发送
的场景 - 如下示例为MCU A按照周期20ms的时间间隔,给MCU B发送数据内容
2.2 事件发送
事件发送
:当某个事件触发发生,需要将该变化数据内容通知给另一方,则在事件触发后发送数据内容
- 事件发生后,为了保证数据准确发送成功,常有2种处理方法:一是
事件发送后,将数据内容发送N次
,比如连续发送3次(这个3次也可看成是周期发送过程),确保数据成功传输;二是采用一发一应答模式
,即事件发送后,发送方发送数据,接受方接受数据后,回复一个应答消息,表示发送的数据接收成功 - 如下示例为MCU A检测到事件M发生后,将数据内容M发送给MCU B;之后MCU B检测到事件N发生后,将数据内容N发送给MCU A
3. 通讯协议数据包类型
3.1 握手
- 当MCU A和MCU B启动开始工作后,为了确定什么时候可以开始相互发送数据进行交互,从而引入了
握手
的概念 握手
:通信的双方开始建立通信联系,确认可以相互发送数据的过程- 通信的双方一般会确认一个
主从关系
,一般由做主的那方发起握手
;或者将发起握手的那方,称为主导方 3次握手
:一个全双工的通信,对于发送端和接收端来说,发送的消息一定是要有回复的,达到有去有回
,才能代表着建立的道路是稳定连通的,因此至少需要3次交互
,才能确保握手成功- 如下示例图是一个3次握手的流程:
- MCU B发送握手请求给MCU A
- MCU A接收到握手请求后,发送握手回复给MCU B,MCU B接收到该回复后,认为自己和MCU A通信建立成功
- MCU B还需要发送一个应答ACK,告诉MCU A,发送的握手回复也收到了,MCU A接收到ACK后,握手完成
- 用俗语来表示3次握手过程;
- B : 你好,我是B
- A : 你好B,我是A
- B : 你好A
- 3次握手的次数必须为3次,才能建立一个稳定的通信,缺少一次,都有可能发生问题;如果超过3次也没有必要,会浪费通信资源,造成不必要的开销
3.2 心跳
- 当MCU A和MCU B握手成功后,建立了通信联系,但是之后时间,如何确保双方都在线,通信一直没有断开,因此引入
心跳
概念 心跳
: 在通信连接中,通信双方之间定期发送的一种特殊的数据包
,用于通知对方自己还在线,以确保连接的有效性; 由于其发送的时间间隔往往是固定的持续的
,就像是心跳一样一直存在,所以我们称之为心跳消息
- 和握手消息一样,一般由
做主的那方发起心跳
,另外一方接收到心跳后,发送心跳回复 - 如下示例图是一个心跳的流程,每隔500ms,MCU B发送一次心跳,MCU A接收后,发送心跳回复
3.1 数据包
- 数据包:通信双方相互发送的数据内容
- 按照
通信的过程步骤
,常将数据包分成如下4类:通知包
:通信的一方,主动将自己的数据发送给另一方,即通知给另一方,这个过程中发送的数据内容称为通知包请求包
:通信一方需要知道另一方数据内容,发送的查询请求指令数据回复包
:接收到查询请求指令后,回复该指令发送的内容数据应答包
:接收到了对方的数据后,需要发送一个应答,告诉发送方,自己接收到了该数据;应答又称为ACK
- 如果通知包是周期发送且周期较短,丢失数据不会造成影响,不需要和应答包配合;但是如果是事件发送,必须和应答包配合,达到
一通知一应答
- 请求包和回复包必然配合出现,组成
一问一答
;一般都是采用事件的形式,因此需要加上应答,即组成一问一答一确认
的3次交互,和3次握手原理一样 - 如下示例图是
一通知一应答
和一问一答一确认的3次交互
模式示例图
- 上述交互过程可以根据实际需求,来规定具体的交互过程,比如在某些场景下,
A
发送请求包后,接收方B
不能立马回复信息,需要经过处理后才能回复,业务逻辑时序交互过程应该规定成如下步骤:
(1) A --> B 请求
(2) B --> A 应答(成功接收请求应答)
(3) B --> A 回复
(4) A --> B 应答(成功接收回复应答)
4. 小结
- 一个完整、稳定的通信过程周期步骤总结如下:
- 通信建立:
3次握手
- 通信建立后:根据交互需要,发送周期通知包;事件发送采用
一通知一应答
模式或者一问一答一确认
模式 - 通信期间:
持续发送心跳
- 重复上述过程
- 异常断开后,重新从步骤1握手建立开始
- 通信建立:
- 通信中存在诸多异常场景,导致数据丢失,因此设置通信交互过程时,必须考虑到:
应答确认
必不可少- 必须设置
重发机制
,检测到未完成完整的通信流程,通过重发机制避免错误
感谢阅读 若有错误 欢迎指正 !!!