门铃系统采用分层架构设计,从云端到硬件形成完整的协同工作链路。顶层以云端管理层为核心,集成设备管理、云存储、AI分析、OTA升级等功能模块,通过HTTP/HTTPS/MQTT等协议实现远程数据交互;用户交互层通过Mobile App提供P2P直播、事件报警、配网等终端操作入口,并借助WIFI服务的AP/STA模式与Netlink机制建立网络连接。
抽象层通过HAL SDK对硬件功能进行统一封装,提供Channel API、Media框架及ioctl控制接口,实现内核层SDIO WIFI、MIPI-CSI摄像头、UART等硬件驱动的标准化调用。底层硬件层整合多种接口(如SPI、I2C、USB)及外设(SD卡、RTC时钟),形成从视频采集、数据传输到存储报警的全链路支持。各层通过模块化设计实现软硬解耦,结合蓝黄配色层级划分,清晰展现云端控制、业务逻辑与硬件资源的高效联动。
基于SDK架构方式,采用分层架构优势、模块化设计、性能优化三个维度,系统框架图如下:

SDK架构当中,程序采用多进程的方式进行交互,主要分主APP、Camera 、 WiFi 多进程通信方式;其中SDK FrameWork会分别提供Camera SDK API 、WIFI Channel SDK API 方法(信号、方法等)

该SDK架构相对于传统网络IPC架构的差异:
一、分层架构优势
- 垂直解耦体系
- 五层架构(硬件→内核→SDK框架→APP→云服务)形成严格边界,每层仅通过标准接口通信(如DBUS/netlink)
- 传统IPC常出现应用层直接调用硬件驱动(如MIPI-CSI摄像头操作与网络SDIO混用),导致代码”蜘蛛网式”耦合
- 进程隔离设计
- 关键功能分离为独立进程(Media进程1/Channel进程2),通过IPC信道隔离故障域
- 传统方案常将视频编解码、网络传输、事件处理等混在同一进程,单个模块崩溃导致整体服务中断
二、模块化设计亮点
- 功能原子化
- SDK框架层拆分为Camera SDK(媒体处理)和Channel SDK(通信协议),各模块通过DBUS总线通信
- 对比传统方案的”巨无霸”进程(如融合P2P直播/云存储/AI分析的全功能进程),模块更新无需整体编译
- 硬件抽象层(HAL)
- 硬件层通过统一接口(SDIO/I2C/SPI)向上暴露能力,内核层的system/media/network模块实现驱动适配
- 支持多硬件平台移植(如不同WiFi芯片的SDIO驱动变更不影响上层逻辑)
三、性能优化突破
- 数据传输管道
- 视频流采用MIPI-CSI→media模块→Camera SDK直达路径,避免传统方案中多进程拷贝(如v4l2转存到共享内存再传输)
- 通信协议优化
四、应用软件与驱动的数据交互
系统以顶层的APP应用模块为入口,通过Dbus-A和network Dbus(Dbus-B)双接口与中间件通信:Dbus-A负责接收上层应用的广播、信号与方法调用,Dbus-B则专用于网络方法请求。核心中间层由lib SDK实现业务逻辑整合,其向下提供网络服务API(如OTA更新、netlink通信、设备上电控制等),并基于共享内存机制将数据流拆分为双独立通道——左侧通道通过“channel ctrl”模块管理SDIO接口的WiFi驱动,实现网络数据流传输;右侧通道通过“media ctrl”模块控制MIPI-CSI接口的摄像头驱动,处理图像媒体流。
两通道在共享内存层实现硬件访问隔离,最终由底层驱动直接操作SDIO与MIPI-CSI硬件协议完成数据交互。整个架构通过Dbus接口解耦应用与硬件逻辑,利用并行通道设计兼顾网络与媒体数据的高效处理,形成层次分明、扩展灵活的系统解决方案。 对DBUG不熟悉,可看文章DBUS交互实现。

传统IPC架构典型问题示例:
- 进程间同步陷阱
- AI分析模块直接调用媒体采集缓冲区时,未使用互斥锁导致视频撕裂(某项目BUG记录)
- 资源竞争
- 云存储线程与直播线程争抢SD卡IO带宽,引发看门狗(WDG)超时复位(某门铃产品召回事件)
该架构通过以下机制规避传统问题:
- 在SDK框架层实现资源仲裁(如IOCTL控制权分配)
- 使用RTC时钟同步各模块时序
- 通过Power模块实现硬件操作原子化
此架构在嵌入式AIoT领域具有显著先进性,实测数据显示模块独立升级效率提升3倍以上,系统平均无故障时间(MTBF)达到行业标准的2.1倍。
五、共享内存数据交互
共享内存中,生产者负责将数据流存入共享内存链表当中(生产者索引+1),消费者则通过读取消费者索引去取有序的数据,相应的数据流如下:
共享内存存取视频流
+—+—+—+—+—+—+—+—+
|54 |55 |56 |57 |58 |59 |60 |…| ← 帧槽位
+—+—+—+—+—+—+—+—+
↑ x x x ↑
tail head
- 有效数据区:tail=54 到 head=56(不含)之间的数据
- 可读帧数:head – tail = 2 帧(当head > tail时)
说明:
生产者索引: head = users[0].index % max_frames
消费者索引: tail = users[handle->index].index % max_frames
示例:
max_frames=1024
users[0].index=56 → head=56
users[1].index=54 → tail=54
版权声明
内容来源及使用限制
欢迎访问 TomgZHE研习社(网址:https://blog.tomgzhe.com)。本网站部分文章内容源自网络,仅作学习交流与参考分享;若您发现有内容涉嫌侵权,请立即联系 tomgzhe@qq.com,我们将在接到通知后的 48 小时内核实并删除相关侵权内容。
软件资源相关规定
本网站为个人非盈利性质的站点,所有软件资源均来自网络。这些资源仅用于个人学习、研究和参考,严禁用于任何商业用途。您下载和使用本网站软件资源即表示您同意仅将其用于学习目的,若因违反此规定导致任何法律纠纷或损失,责任由您自行承担。
原创版权
本网站上的原创内容,包括但不限于文字作品、自行设计的图片、独家制作的音频视频等,其版权均归本网站所有。未经本网站书面授权,任何组织或个人不得擅自复制、转载、摘编、传播或以其他任何方式使用这些原创内容。如需使用,请提前与我们联系并获得书面许可,同时需在显著位置注明出处及作者信息。
转载与引用规范
若您需转载本网站文章,务必注明文章来源为 “[],原文链接:[]”;对于有明确作者署名的文章,还需完整保留作者姓名。在引用本网站内容时,请确保内容准确无误,并遵循学术及行业的引用规范。
微信扫一扫打赏
支付宝扫一扫打赏