{"id":24091631,"url":"https://github.com/RT-Thread-packages/cmux","last_synced_at":"2025-09-17T01:31:33.489Z","repository":{"id":50154603,"uuid":"257770565","full_name":"RT-Thread-packages/cmux","owner":"RT-Thread-packages","description":"connection multiplexing protocol for RT-Thread, support GSM0710 .etc","archived":false,"fork":false,"pushed_at":"2022-10-26T03:43:49.000Z","size":331,"stargazers_count":31,"open_issues_count":0,"forks_count":17,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-01-10T07:51:06.972Z","etag":null,"topics":["at","gsm0710","ppp"],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RT-Thread-packages.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-04-22T02:31:16.000Z","updated_at":"2024-10-15T08:31:49.000Z","dependencies_parsed_at":"2023-01-20T10:00:28.061Z","dependency_job_id":null,"html_url":"https://github.com/RT-Thread-packages/cmux","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/RT-Thread-packages/cmux","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RT-Thread-packages%2Fcmux","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RT-Thread-packages%2Fcmux/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RT-Thread-packages%2Fcmux/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RT-Thread-packages%2Fcmux/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RT-Thread-packages","download_url":"https://codeload.github.com/RT-Thread-packages/cmux/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RT-Thread-packages%2Fcmux/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275519644,"owners_count":25479424,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-16T02:00:10.229Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["at","gsm0710","ppp"],"created_at":"2025-01-10T07:44:38.666Z","updated_at":"2025-09-17T01:31:32.802Z","avatar_url":"https://github.com/RT-Thread-packages.png","language":"C","readme":"# CMUX\n\n## 1. 简介\n\nCMUX（Connection Multiplexing ），即连接（串口）多路复用，其功能主要在一个真实的物理通道上虚拟多个通道，每个虚拟通道上的连接和数据通讯可独立进行。\n\nCMUX 软件包常用于蜂窝模块串口复用功能（PPP + AT 模式），以及串口硬件资源受限的设备。\n\nCMUX 软件包特点如下：\n\n- 支持通过真实串口虚拟出多个串口；\n- 支持所有基于 GSM0707/ 0710 协议的蜂窝模块；\n- 支持无缝接入 PPP 功能；\n\n目前 CMUX 的 GSM 功能支持 Luat Air720, SIM7600, SIM800C 模块，后续会接入更多蜂窝模块。\n\n### 1.1 框架图\n\n![](docs/figures/cmux_frame.png)\n\n- CMUX 是一种类似于传输层的协议，用户使用时无法感知该层；数据传输依赖一个真实串口传输，cmux 层负责解析数据用以分发到不同的 virtual uart ；从而实现一个真实串口虚拟出多个 UART 的目的\n\n- CMUX 在应用场景中多用于 UART, 如有必要也可以支持 SPI 方式\n\n  ### 1.2 目录结构\n```shell\ncmux\n├───docs\n│   └───figures                     // 文档使用图片\n├───inc                             // 头文件\n│   │───gsm\n│   │   └─── cmux_chat.h\n│   └─── cmux.h\n├───sample                          // 示例文件\n│   └─── cmux_sample_gsm.c\n├───src                             // 源码文件\n│   ├───gsm\n│   │   ├─── cmux_chat.c\n│   │   └─── cmux_gsm.c\n│   ├─── cmux_utils.c\n│   └─── cmux.c\n├───LICENSE                         // 软件包许可证\n├───README.md                       // 软件包使用说明\n└───SConscript                      // RT-Thread 默认的构建脚本\n```\n\n### 1.3 许可证\n\ncmux 软件包遵循 Apache-2.0 许可，详见 LICENSE 文件。\n\n## 2. 获取方式\n\n​\t**CMUX 软件包相关配置选项介绍**\n\n```c\n  [*] cmux protocol for rt-thread.  ---\u003e\n      [ ] using cmux debug feature (NEW)\n      [*] using for gsm0710 protocol (NEW)\n      (5) set cmux max frame list length (NEW)\n      (uart2) the real cmux serial prot (NEW)\n      (3) the number of cmux modem port (NEW)\n      Version (latest)  ---\u003e\n```\n\n- **using cmux debug feature:** 开启调试日志功能\n- **using for gsm0710 protocol:** 打开以支持蜂窝模块\n- **set cmux max frame list length:** 设置虚拟端口的 frame 链的最大长度\n- **the real cmux serial prot:** cmux 使用的真实串口名称\n- **the number of cmux modem port:** 蜂窝模块支持的虚拟串口数量\n- **the command for cmux function:** 进入 cmux 模式的命令\n- **Version:** 软件包版本号\n\n## 3. 使用方式\n\ncmux 软件包初始化函数如下所示：\n\n**cmux 功能启动函数，该函数自动调用**\n\n```c\nint cmux_sample(void)\n{\n    rt_err_t result;\n\n    /* find cmux object through the actual serial name \u003c the actual serial has been related in the cmux.c file \u003e */\n    sample = cmux_object_find(CMUX_DEPEND_NAME);\n    if (sample == RT_NULL)\n    {\n        result = -RT_ERROR;\n        LOG_E(\"Can't find %s\", CMUX_DEPEND_NAME);\n        goto end;\n    }\n    /* startup the cmux receive thread, attach control chananel and open it */\n    result = cmux_start(sample);\n    if (result != RT_EOK)\n    {\n        LOG_E(\"cmux sample start error. Can't find %s\", CMUX_DEPEND_NAME);\n        goto end;\n    }\n    LOG_I(\"cmux sample (%s) start successful.\", CMUX_DEPEND_NAME);\n\n    /* attach AT function into cmux */\n    result = cmux_attach(sample, CMUX_AT_PORT, CMUX_AT_NAME, RT_DEVICE_FLAG_DMA_RX, RT_NULL);\n    if (result != RT_EOK)\n    {\n        LOG_E(\"cmux attach (%s) failed.\", CMUX_AT_NAME);\n        goto end;\n    }\n    LOG_I(\"cmux object channel (%s) attach successful.\", CMUX_AT_NAME);\n\n    /* attach PPP function into cmux */\n    result = cmux_attach(sample, CMUX_PPP_PORT, CMUX_PPP_NAME, RT_DEVICE_FLAG_DMA_RX, RT_NULL);\n    if (result != RT_EOK)\n    {\n        LOG_E(\"cmux attach %s failed.\", CMUX_PPP_NAME);\n        goto end;\n    }\n    LOG_I(\"cmux object channel (%s) attach successful.\", CMUX_PPP_NAME);\nend:\n    return RT_EOK;\n}\n#ifdef CMUX_ATUO_INITIZATION\n// 自动初始化\nINIT_APP_EXPORT(cmux_sample_start);\n#endif\n// 命令导出到MSH( cmux_sample_start 变更为cmux_start )\nMSH_CMD_EXPORT_ALIAS(cmux_sample_start, cmux_start, a sample of cmux function);\n```\n\n* 模块进入 cmux 模式，注册 AT 和 PPP 接口到 CMUX 上；\n\n\n\n模块上电后，自动初始化流程如下：\n\n```shell\n \\ | /\n- RT -     Thread Operating System\n / | \\     4.0.2 build Apr 14 2020\n 2006 - 2019 Copyright by rt-thread team\nlwIP-2.0.2 initialized!\n[I/sal.skt] Socket Abstraction Layer initialize success.\n[I/ppp.dev] ppp_device(pp) register successfully.\n[I/cmux] cmux rely on (uart3) init successful.\n[I/cmux.air720] cmux has been control uart3.\nmsh \u003e[W/chat] \u003ctx: AT, want: OK, retries: 10, timeout: 1\u003e timeout\n[I/cmux.sample] cmux sample (uart3) start successful.\n[I/cmux.sample] cmux object channel (cmux_at) attach successful.\n[I/cmux.sample] cmux object channel (cmux_ppp) attach successful.\n```\n\n设备上电初始化完成，模块提示模块已经进入 CMUX 模式，可以使用已经注册的虚拟串口。\n\n\n\n你也可以同时使用 PPP_DEVICE 提供 ppp 功能，效果如下：\n\n```shell\n \\ | /\n- RT -     Thread Operating System\n / | \\     4.0.2 build Apr 14 2020\n 2006 - 2019 Copyright by rt-thread team\nlwIP-2.0.2 initialized!\n[I/sal.skt] Socket Abstraction Layer initialize success.\n[I/ppp.dev] ppp_device(pp) register successfully.\n[I/cmux] cmux rely on (uart3) init successful.\n[I/cmux.air720] cmux has been control uart3.\nmsh \u003e[I/cmux.sample] cmux sample (uart3) start successful.\n[I/cmux.sample] cmux object channel (cmux_at) attach successful.\n[I/cmux.sample] cmux object channel (cmux_ppp) attach successful.\nmsh \u003eppp_start\n[I/ppp.dev] ppp_device connect successfully.\nping www.baidu.com\n60 bytes from 39.156.66.14 icmp_seq=0 ttl=49 time=126 ms\n60 bytes from 39.156.66.14 icmp_seq=1 ttl=49 time=129 ms\n60 bytes from 39.156.66.14 icmp_seq=2 ttl=49 time=111 ms\n60 bytes from 39.156.66.14 icmp_seq=3 ttl=49 time=111 ms\nmsh \u003eready\nmsh \u003e[D/main] cmux control channel has been open.\n[D/main] write data : 9\n[D/main] 15 ,Recieve\n+CSQ: 29,99\n\n[D/main] 6 ,Recieve\nOK\n```\n在使用 PPP 功能的同时，可以使用虚拟出的 cmux_at 串口同时读取模块信号强度值，具体可以参考[\u003c使用文档\u003e](./docs/cmux_port.md)\n\n## 4. 注意事项\n\n* 使用 PPP 功能详情参考 [PPP_DEVICE](https://github.com/RT-Thread-packages/ppp_device)\n* 只有在虚拟串口注册到 rt_device 框架后才能通过 rt_device_find 找到虚拟串口，要注意先后顺序\n* 虚拟串口 attach 后并不能直接使用，必须通过 rt_device_open 打开后才能使用，符合 rt_device 的操作流程\n* 只有进入 cmux 的命令，没有退出 cmux 的命令；所以说，只能通信模块硬重启，而不能软重启，使用时候要注意\n\n## 5. 联系方式\n\n联系人：xiangxistu\n\nEmail: liuxianliang@rt-thread.com\n\n\n\n对 CMUX 有疑惑，或者对 CMUX 感兴趣的开发者欢迎入群详细了解。\n\nQQ群：749347156 [\u003c传送门\u003e](https://jq.qq.com/?_wv=1027\u0026k=5KcuPGI)\n\n## 6. 相关文档\nCMUX 详细介绍：[\u003c文档\u003e](./docs/cmux_basic.md)\n\n通过 CMUX 使用 PPP_DEVICE 文档：[\u003c使用文档\u003e](./docs/cmux_port.md)\n\n## 7. 致谢\n\n感谢网友 @ya-jeks 在 github 上的 gsmmux 参考代码","funding_links":[],"categories":["Packages"],"sub_categories":["IoT"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FRT-Thread-packages%2Fcmux","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FRT-Thread-packages%2Fcmux","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FRT-Thread-packages%2Fcmux/lists"}