Git Product home page Git Product logo

onemessage's Introduction

OneMessage

一个基于 发布-订阅模型的跨平台消息框架,纯C语言编写,性能和灵活性极高


什么是OneMessage

OneMessage核心为订阅发布的消息框架,包含了红黑树,链表,队列,crc校验和终端文本格式控制五个基本组件的完整实现。在此基础上完成了如下六个功能模块:

  • MSG 消息/话题控制: 控制消息的订阅与发布,话题和订阅者的创建与管理
  • FMT 格式化配置:为用户提供格式化字符串的方式来快速配置话题/订阅/过滤器
  • EVT 事件机制:基于topic实现的事件触发机制
  • LOG 日志系统:多等级的日志打印
  • AFL 高级过滤器:为topic提供灵活的筛选方式
  • COM 通信解析:用于跨进程/跨设备共享topic

本项目旨在为跨线程和跨设备通信提供一个通用解决方案,以较小的性能代价换取数倍的开发效率。

在STM32F103上使用-Og优化选项下的GCC编译本框架,FLASH占用增加4.2k.

相关概念

在OneMessage里只有两种主体,话题(topic)和订阅者(sub/suber/subscriber)。一个消息一定是先被发送到一个话题上,经过筛选/回调/转发等方式发送到另一个话题或订阅者。

话题可以配置filter_function,简单筛选可以发布到此话题的消息,也可以配置高级过滤器(AFL),通过一些较为复杂的规则,将此话题的数据筛选并发布到其他的话题。话题可以通过开关缓冲区来实现无拷贝发布,通过对话题加锁保证线程安全。

订阅者分为以下几种:1.用于检测话题数据更新,并导出话题数据(export)2.用于将话题数据放在队列中,防止消息丢失(queue/fifo)3.存放用户注册的回调函数,在对应话题发布消息时调用(同步方式获取数据/suber_callback)4.用于连接两个话题,源话题发布消息时转发到目标话题上(link)

几乎所有API都提供动态/静态内存分配两种接口,静态需要用户手动创建数据结构体,并保证变量一直存活,而且无法对其使用删除相关的API。

PS:不定长消息为实验功能,强烈建议每个话题的消息长度为定长。

文档

配置文件

使用说明

开发文档

系统支持

已在Linux,FreeRTOS,ThreadX上成功运行,欢迎适配到其他平台。

特性

  • 发布-订阅

    • 底层由红黑树+链表实现,查找与遍历都有良好的性能表现
    • 话题为操作的主体,匿名发布且不限制订阅者数量
    • 支持零拷贝发布
    • 订阅者可开启内置队列,防止消息丢失
  • 安全性

    • 保证线程安全
    • 允许在中断中使用
    • 提供静态API,可以实现无动态内存分配
    • 单元测试覆盖所有功能
  • 消息过滤器

    • 支持为每个话题和订阅者注册过滤器,只接受符合条件的消息
  • 订阅回调

    • 订阅者可在接收时调用用户回调函数,暂存数据或者转发到另一个话题。
  • 快速配置

    • 使用格式化输入的方式配置话题,极少的代码量就能实现整个消息网络的搭建
  • 事件触发

    • 以订阅为核心的事件触发器,在保证执行效率的同时,一个触发条件可以对应多个处理函数。
  • 批量筛选

    • 对于条件简单且分支较多的话题,可开启高级过滤器而不需要注册大量函数,现已支持 列表范围分解模式。例如针对id筛选CAN总线数据,或者将结构体拆分后发布。
  • 话题共享

    • 提供topic数据打包与解析api,可通过任意协议共享多个topic数据,实现跨进程和跨设备通信。通过fifo与crc校验保证数据完成性,在拆包/组包/错位和夹杂无效数据的情况下也能确保正确解析。
  • 日志框架

    • 使用示例程序打印的日志:效果

获取源码

克隆这个仓库

Gitee

Github

git clone https://github.com/Jiu-xiao/OneMessage.git

或者使用 git submodule将其包含在你的仓库中

git submodule add https://github.com/Jiu-xiao/OneMessage.git <path>

代码结构

OneMessage
├─config
├─src
│  ├─app
│  ├─comp
│  └─core
└─test
文件夹 功能
config 配置文件模板
doc 文档
src/app 应用
src/comp 组件
src/core 核心api
src 用户接口
test 单元测试
example 例程

C++

C++兼容层OneMessageCPP

onemessage's People

Contributors

jiu-xiao avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

onemessage's Issues

树莓派4b om_find_topic函数超时

树莓派4b,官方64位系统运行单元测试,部分用例通过,部分用例失败,日志
----------------------日志start--------------------------------
pi@raspberrypi:~/work/midea/subpub/OneMessage/build $ make; make test ARGS="-V"
[ 37%] Built target OneMessage
[ 51%] Built target Test
[100%] Built target om_test
Running tests...
UpdateCTestConfiguration from :/home/pi/work/midea/subpub/OneMessage/build/DartConfiguration.tcl
UpdateCTestConfiguration from :/home/pi/work/midea/subpub/OneMessage/build/DartConfiguration.tcl
Test project /home/pi/work/midea/subpub/OneMessage/build
Constructing a list of tests
Done constructing a list of tests
Updating test list for fixtures
Added 0 tests to meet fixture requirements
Checking test dependency graph...
Checking test dependency graph end
test 1
Start 1: om_test

1: Test command: /home/pi/work/midea/subpub/OneMessage/build/test/om_test
1: Test timeout computed to be: 10000000
1: Running suite(s): 底层API测试
1: 100%: Checks: 2, Failures: 0, Errors: 0
1: /home/pi/work/midea/subpub/OneMessage/test/om_test_base.c:8:P:内存分配测试:_MALLOC:0: Passed
1: /home/pi/work/midea/subpub/OneMessage/test/om_test_base.c:13:P:互斥锁测试:_MUTEX:0: Passed
1: Running suite(s): 模块测试
1: /home/pi/work/midea/subpub/OneMessage/src/app/om_fmt.c 40: len is 4
1: /home/pi/work/midea/subpub/OneMessage/src/app/om_fmt.c 40: len is 20
1: /home/pi/work/midea/subpub/OneMessage/src/app/om_fmt.c 40: len is 20
1: /home/pi/work/midea/subpub/OneMessage/src/app/om_fmt.c 40: len is 20
1: /home/pi/work/midea/subpub/OneMessage/src/app/om_fmt.c 40: len is 20
1: 71%: Checks: 7, Failures: 0, Errors: 2
1: /home/pi/work/midea/subpub/OneMessage/test/om_test_module.c:102:P:日志测试:_LOG:0: Passed
1: /home/pi/work/midea/subpub/OneMessage/test/om_test_module.c:43:E:订阅发布测试:_PUBLISH:0: (after this point) Test timeout expired
1: /home/pi/work/midea/subpub/OneMessage/test/om_test_module.c:76:E:静态订阅发布测试:_PUBLISH_STATIC:0: (after this point) Test timeout expired
1: /home/pi/work/midea/subpub/OneMessage/test/om_test_module.c:134:P:事件触发测试:_EVENT:0: Passed
1: /home/pi/work/midea/subpub/OneMessage/test/om_test_module.c:160:P:静态事件触发测试:_EVENT_STATIC:0: Passed
1: /home/pi/work/midea/subpub/OneMessage/test/om_test_module.c:228:P:高级过滤器测试:_FILTER:0: Passed
1: /home/pi/work/midea/subpub/OneMessage/test/om_test_module.c:294:P:静态高级过滤器测试:_FILTER_STATIC:0: Passed
1/1 Test #1: om_test ..........................***Failed 10.04 sec

0% tests passed, 1 tests failed out of 1

Total Test time (real) = 10.04 sec

The following tests FAILED:
1 - om_test (Failed)
Errors while running CTest
----------------------日志end--------------------------------

自己编写demo运行,发现是om_find_topic函数超时了,请作者看看这问题。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.