嵌入式中自定义协议的一些典型例子
xsobi 2024-11-24 00:34 2 浏览
关于自定义协议,对于会的人很简单,对于不会的人就摸不着头脑。下面分享一些关于自定义协议的笔记。
什么是协议?
协议这个概念我觉得挺杂的。就像嵌入式的概念一样,说法不一,比如大家常常争论FPGA是不是嵌入式、单片机是不是属于嵌入式等等。下面简单看一下嵌入式中协议这个概念。
在互联网领域,协议常常指的是网络协议。
在嵌入式中,协议按大类分主要可分为底层协议(硬件层协议/物理层协议)与上层协议(用户层协议应用层协议),根据实际还可细分成很多层。底层协议如串口等,底层协议决定着数据传输的方式(传输数据需要多少条信号线,传输数据的时序是怎样的)。上层协议决定着这些数据是拿来干什么用的。太难解释了。。看实例吧:
这是多功能电能表的协议通讯协议,其中底层协议是485通讯,上层协议有很多条,但格式基本都统一:
每一帧(包)数据的格式都类似是这样子的格式,例如读数据协议:
主站往从站发送数据(控制器->智能电表):
从站往主站发送数据(智能电表->控制器):
明确了协议之后,该发什么数据、收到的数据是怎么样我们都心里有数,那么这个通信的过程就很明朗了。一般控制器往外发送协议数据都比较简单,重点是返回数据的处理(解析),解析方式根据协议的不同而有不同的方法。
协议(上层协议)按照通用性来分可以分为专有协议与自定义协议,例如上面电表的协议其实是专有协议(具有一些标准的协议):
自定义协议就是我们开发者可以针对一些应用、一些需求自己制定的一些协议。下面来分享一些常见的自定义协议:
常见的自定义协议
在我们嵌入式开发中,自定义协议的应用很多。例如上下位机之间的通讯、控制器与控制器之间的通讯、服务器与设备终端之间的通讯等。自定义协议也没有什么特定的规范、标准,可以很灵活地制定,只要能满足开发需要即可。下面依旧以实例来做分享:
例子一(典型):
之前有个物联网项目,服务器往我们终端设备发送的协议数据类似于:
我们设备终端需要用到协议数据中字段的实际数据,整个数据包是字符串的形式,这时候可以用sscanf函数来做解析:
关于sscanf函数就不做解释了,不会的朋友自行百度。sscanf函数在做类似的解析非常好用,很多时候都可以使用。如:
因为是两端通讯,当然要确保通讯的正确性。比如服务器往设备发送数据,怎么知道有没有发送,这就得设备端在收到数据的同时回应相应的数据包。可以使用与sscanf函数相对应的sprintf函数做组包操作。比如(这个sprintf例子与上例无关,只是为了说明一下sprintf的用法):
一端给另一端发送数据一般有两种,以设备端在往服务端发送数据为例:
(1)当设备收到服务端的数据时,会回应与之对应的数据,这称为被动应答。
(2)设备主动给服务端发送数据,例如设备常常定时、主动地给服务端发送一些时间戳信息等(俗称心跳包),这样服务端就知道设备是在正常工作的(活着的状态)。这称为主动发送或主动申请。
在处理这些字符串形式的协议数据的时候用sscanf、sprintf、strcmp、strstr、strcat等函数非常方便,有时候可以搭配正则表达式来做匹配。
例子二(典型):
之前有个项目需要从控制板显示主控制板的运行状态,两控制板之间使用的底层协议为485协议。上层协议(从控板接收数据协议)如:
这里省略的部分为其他信息,比如整个数据包的长度等。
解析函数如:
这里的应用比较简单,只是解析一个报警信息来显示。有时候需要用到整个数据包里的数据,这时候我们可以建立一个结构体来保存所有我们需要的数据,这样方便我们清晰、有条理地对数据进行处理。例如:
例子三(其它):
上面的两个例子中的自定义协议是比较典型的、用得比较多的。下面也分享其它我自己的一些例子,很多时候为了满足我们自己通讯应用的需要,我们也会自己建立一些自己的小协议来满足我们的需求。
(1)例子一
之前使用串口屏与STM32通讯的时候,我们有制定一些对应的协议。
为了让STM32能识别我串口屏不同页面发送的数据,必须要制定一条协议来识别页面:
这样,每切换至不同的页面时,就会往STM32发送关于页面的协议数据,这样我们就可以知道当前处于哪个界面。
为了让STM32能接收到正确的WiFi设置信息(如何区分WiFi名与密码),必须要给WiFi信息添加一些辅助协议数据,如:
相应的解析处理函数:
(2)例子二
之前在一个单相用电器监测的应用中,有用到zigbee无线通讯,即其中一块控制板做采集板。另一块控制板做显示板,有些朋友可能会有疑问为什么不做在同一块板上?其实这是一道全国大学生电赛题,我们只是根据题目要求来做的:
我们当时在做这个通讯时也是有制定一个简单的协议,在数据前面加个标识,就像JSON格式数据的键值对。
我们制定的协议如:
相应的解析及结果:
类似这样子的协议解析实际上是有套路的,摸清楚这些套路之后以后在做类似应用的时候其实就很简单了。重点掌握sscanf、sprintf、strcmp、strstr、strcat等函数以及上面的两种典型例子。小编在三个地方搬过砖,每个地方都有用到类似的自定义协议,而且都形成专门的协议文档,每次做类似通讯类的应用的时候,都会按照这样已份协议文档来修改以适应不同的项目。
以上就是本次分享的关于嵌入式中自定义协议的一些笔记,希望各位看官喜欢。如有错误,欢迎指出,谢谢!
相关推荐
- 好用的云函数!后端低代码接口开发,零基础编写API接口
-
前言在开发项目过程中,经常需要用到API接口,实现对数据库的CURD等操作。不管你是专业的PHP开发工程师,还是客户端开发工程师,或者是不懂编程但懂得数据库SQL查询,又或者是完全不太懂技术的人,通过...
- 快速上手:Windows 平台上 cURL 命令的使用方法
-
在工作流程中,为了快速验证API接口有效性,团队成员经常转向直接执行cURL命令的方法。这种做法不仅节省时间,而且促进了团队效率的提升。对于使用Windows系统的用户来说,这里有一套详细...
- 使用 Golang net/http 包:基础入门与实战
-
简介Go的net/http包是构建HTTP服务的核心库,功能强大且易于使用。它提供了基本的HTTP客户端和服务端支持,可以快速构建RESTAPI、Web应用等服务。本文将介绍ne...
- #小白接口# 使用云函数,人人都能编写和发布自己的API接口
-
你只需编写简单的云函数,就可以实现自己的业务逻辑,发布后就可以生成自己的接口给客户端调用。果创云支持对云函数进行在线接口编程,进入开放平台我的接口-在线接口编程,设计一个新接口,设计和配置好接口参...
- 极度精神分裂:我家没有墙面开关,但我虚拟出来了一系列开关
-
本内容来源于@什么值得买APP,观点仅代表作者本人|作者:iN在之前和大家说过,在iN的家里是没有墙面开关的。...
- window使用curl命令的注意事项 curl命令用法
-
cmd-使用curl命令的注意点前言最近在cmd中使用curl命令来测试restapi,发现有不少问题,这里记录一下。在cmd中使用curl命令的注意事项json不能由单引号包括起来json...
- Linux 系统curl命令使用详解 linuxctrl
-
curl是一个强大的命令行工具,用于在Linux系统中进行数据传输。它支持多种协议,包括HTTP、HTTPS、FTP等,用于下载或上传数据,执行Web请求等。curl命令的常见用法和解...
- Tornado 入门:初学者指南 tornados
-
Tornado是一个功能强大的PythonWeb框架和异步网络库。它最初是为了处理实时Web服务中的数千个同时连接而开发的。它独特的Web服务器和框架功能组合使其成为开发高性能Web...
- PHP Curl的简单使用 php curl formdata
-
本文写给刚入PHP坑不久的新手们,作为工具文档,方便用时查阅。CURL是一个非常强大的开源库,它支持很多种协议,例如,HTTP、HTTPS、FTP、TELENT等。日常开发中,我们经常会需要用到cur...
- Rust 服务器、服务和应用程序:7 Rust 中的服务器端 Web 应用简介
-
本章涵盖使用Actix提供静态网页...
- 我给 Apache 顶级项目提了个 Bug apache顶级项目有哪些
-
这篇文章记录了给Apache顶级项目-分库分表中间件ShardingSphere提交Bug的历程。说实话,这是一次比较曲折的Bug跟踪之旅。10月28日,我们在GitHub上提...
- linux文件下载、服务器交互(curl)
-
基础环境curl命令描述...
- curl简单使用 curl sh
-
1.curl--help#查看关键字2.curl-A“(添加user-agent<name>SendUser-Agent<name>toserver)”...
- 常用linux命令:curl 常用linux命令大全
-
//获取网页内容//不加任何选项使用curl时,默认会发送GET请求来获取内容到标准输出$curlhttp://www.baidu.com//输出<!DOCTYPEh...
- 三十七,Web渗透提高班之hack the box在线靶场注册及入门知识
-
一.注册hacktheboxHackTheBox是一个在线平台,允许测试您的渗透技能和代码,并与其他类似兴趣的成员交流想法和方法。它包含一些不断更新的挑战,并且模拟真实场景,其风格更倾向于CT...
- 一周热门
- 最近发表
-
- 好用的云函数!后端低代码接口开发,零基础编写API接口
- 快速上手:Windows 平台上 cURL 命令的使用方法
- 使用 Golang net/http 包:基础入门与实战
- #小白接口# 使用云函数,人人都能编写和发布自己的API接口
- 极度精神分裂:我家没有墙面开关,但我虚拟出来了一系列开关
- window使用curl命令的注意事项 curl命令用法
- Linux 系统curl命令使用详解 linuxctrl
- Tornado 入门:初学者指南 tornados
- PHP Curl的简单使用 php curl formdata
- Rust 服务器、服务和应用程序:7 Rust 中的服务器端 Web 应用简介
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- patch补丁 (31)
- strcat (25)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- element style (30)
- dedecms模版 (53)
- vs打不开 (29)
- nmap (30)
- webgl开发 (24)
- parse (24)
- c 视频教程下载 (33)
- paddleocr (28)
- listview排序 (33)
- firebug 使用 (31)
- transactionmanager (30)
- characterencodingfilter (33)
- getmonth (34)
- commandtimeout (30)
- hibernate教程 (31)
- label换行 (33)
- curlpost (31)