当前位置: 首页 > article >正文

一种比较精简的协议

链接地址为:ctLink: 一个比较精简的支持C/C++的嵌入式通信的中间协议。

本文采用的协议格式如下

*帧头       uint8_t        起始字节:0XAF\
*协议版本    uint8_t     使用的协议版本号:当前为0X01\
*负载长度    uint8_t     数据段内容长度\
*指令       uint8_t        指令编号\
*头校验     uint8_t        协议版本+负载长度+指令的和校验\
*发送者     uint8_t     协议发送者\
*接收者     uint8_t     协议接收者\
**数据负载   uint8_tXn        负载内容\

*CRC校验    uint32_t        数据负载段的CRC校验值\

##使用方法

可以使用C/C++语言进行开发

cmake使用add_subdirectory方法加target_link_libraries引入到自己的项目中即可

本协议自行编写之后未对协议本身做特别的规定,使用者可以在获取源码之后可以自行对协议进行改进,只需要进行协议上进行结构对齐就可以使用打包和解包函数进行换算。

使用说明:

​        *本代码支持C和C++语言,只需要引入到自己的平台即可。

​        *假设自身有新的命令需求可以在命令行里面加入自己的命令,需要符合规范依次向下添加0x05,0x06。。。。。。

```
typedef enum{
    CMDLF=0x01,
    CMDRG=0x02,
    CMDFT=0x03,
    CMDBA=0x04,

}CMD_t;
```

        *使用该协议的时候需要对data进行补充,符合协议的情况下都可以使用下列的函数进行封包
        uint16_t packet_data(
    uint8_t* buffer,
    const void *head,
    const uint8_t *data,
    uint8_t data_len) 
    
    *同理符合协议的情况下都可以使用以下代码进行解包获取协议的发送者、接收者、CMD命令、以及接收到的实际数据
    uint16_t Unpack_data(
    uint8_t* parse_data, 
    const uint8_t* received_data, 
    uint16_t data_len, 
    const void *head)
​        *本协议是支持局域网内通信的,只需要明确发送者和接收者双方就能知道通信双方是谁

​        *最后也是最重要一点---》本协议后期空闲了会继续更新目前更新方向为增加回调函数的机制并给出心跳接口自动进行通信解析

已经在Linux和ESP32进行验证,Linux下验证串口发送和接收,ESP32下验证UDP发送

 

最新加入OneMessage,举出示例发布-》订阅例子,实现发布消息-》解析消息。使用udp进行通信,使用发布订阅机制,使得异步通信变得容易。

目前实现了对oneMessage进行封装,可以直接进行仅需两个函数即可进行发布订阅实现异步通信。

使用方法为:add_subdirectory(CT_Message) 进行引入,然后使用ct_message_init进行初始化,ct_message_pub进行发布,ct_getmessage进行订阅。
ct_message_init参数为CT_PUB_HEAD_T的结构体,void *Type,如果Type为NULL则为发布者,如果Type不为NULL则为订阅者。只使用一个同一个函数完成初始化避免无效做功。

ct_message_pub参数为CT_MESSAGE_TYPE_T的结构体,void* buff, uint16_t len,发布消息,buff为发布的数据,len为数据长度。

ct_getmessage参数为CT_MESSAGE_TYPE_T的结构体,void* buff,订阅消息,buff为订阅的数据。

详细例子可以参考udp_pub.c和udp_sub.c,感谢OneMessage的作者提供的开源文件。

希望各位大佬给出修改意见帮助我更好修改协议。

http://www.lryc.cn/news/2387739.html

相关文章:

  • 网络常识:网线和光纤的区别
  • OpenCV CUDA模块图像过滤------创建一个 Scharr 滤波器函数createScharrFilter()
  • html css js网页制作成品——HTML+CSS+js醇香咖啡屋网页设计(5页)附源码
  • [特殊字符] 构建高内聚低耦合的接口架构:从数据校验到后置通知的分层实践
  • brep2seq 源码笔记2
  • UE5 蓝图,隐藏一个Actor,同时隐藏它的所有子物体
  • 人工智能AI之机器学习基石系列 第 2 篇:数据为王——机器学习的燃料与预处理
  • 代码随想录算法训练营 Day58 图论Ⅷ 拓扑排序 Dijkstra
  • 实现单例模式的6种方法(Python)
  • 基于 STM32 的智慧农业温室控制系统设计与实现
  • 深度学习优化器相关问题
  • 【免费】【无需登录/关注】度分秒转换在线工具
  • 常见的垃圾回收算法原理及其模拟实现
  • fpga-编程线性序列机和状态机
  • 力扣面试150题--完全二叉树的节点个数
  • Qt 多线程环境下的全局变量管理与密码安全
  • 内网映射有什么作用,如何实现内网的网络地址映射到公网连接?
  • BLIP3-o:一系列完全开源的统一多模态模型——架构、训练与数据集
  • DNS解析流程入门篇
  • spring4第2课-ioc控制反转-依赖注入,是为了解决耦合问题
  • 大模型系列22-MCP
  • 【监控】Prometheus+Grafana 构建可视化监控
  • vscode里几种程序调试配置
  • RAGFlow源码安装操作过程
  • Unity使用XCharts动态配置数据——折线图(LineChart)
  • 【HITCSAPP 哈工大计算机系统期末大作业】 程序人生-Hello’s P2P
  • DAY9 热力图和箱线图的绘制
  • 如何查看 GitLab 内置的 PostgreSQL 版本?
  • VR 技术与病毒分离鉴定:一场奇妙的邂逅​
  • 解释一下NGINX的反向代理和正向代理的区别?