EMX介绍

  Emx的开发目标是让新产品可以更快速的推出,下图是Emx的框架图,其向上为不同的应用开发提供统一的调用接口,向下为各种不同的IPC芯片提供统一的移植接口,所以理论上,新的平台产品想要接入,可以选择任意已完成接入的IPC芯片,新的IPC芯片接入完成后也可使得所有平台产品都可使用。

  Emx被设计为芯片无关的,其编译仅依赖于编译链,而不依赖于不同IPC芯片的SDK。Emx对IPC的功能进行了充分的抽象,同时又会保留特定场景下特异性接口操作的灵活性。为了保证系统整体运行的稳定性以及充分的解耦,Emx使用多进程模式进行开发,音视频相关功能由Emx中的EmxMediaServer程序提供,进程间通信功能由Emx中的EmxCoreServer提供,并且所有进程间通信的细节都已经进行了封装,可以让用户像使用本地函数调用的方式调用远程服务,用户可以很大程度上仅仅基于Emx进行开发,而无需在意使用的是何种芯片。

Emx框架图

  另外值得一提的是,Emx的设计大量采用了Reactor的模式,很多涉及到状态获取的功能,都会提供监听接口,例如网络状态的改变或SD卡的热插拔或按键的触发等,都会提供相应的回调注册接口,用来监听这类状态的改变事件,同时获取到事件改变后的状态信息,这种事件驱动的模型可以让问题的处理更加的专注与统一。

  整体上,Emx提供的主要功能可以被划分为3个,分别是EmxCore,EmxMedia和EmxModules。

  • EmxCore Emx的核心模块,提供了EmxCoreServer服务程序运行于后台,为其他所有模块间的通信做转发和调度,分别提供了RPC方式和Topic方式的接入。另外还有日志服务,参数加密存取服务等。EmxCore提供了libEmxCore.so和EmxCore.hpp方便客户轻松的使用EmxCoreServer提供的所有服务  
  • EmxMedia 媒体模块,提供了EmxMediaServer服务程序运行于后台,EmxMediaServer会提供IPC产品所需要的所有媒体相关的功能,例如音视频编解码,实时流获取,缩略图抓拍,AI侦测识别,OSD等等。功能的使用需要通过进程间的调用,当然这部分的调用的复杂细节也被封装到了libEmxMedia.so中,仅提供简单的接口,方便用户轻松调用  
  • EmxModules 通用模块,IPC的功能不仅仅只是媒体相关的,同时还有一些其他操作,这部分通常会涉及到芯片底层的功能开发,为了让用户更专注于上层业务的实现,Emx将这些涉及底层开发的部分也封装到了sdk中,例如sd卡,按键,云台和固件升级等等。这些功能会同时提供后台的服务程序与相应的远程调用接口库方便用户使用,另外考虑到多进程的启动开销,这些后台服务程序也同步提供了静态库,用户可以不启动后台服务程序,而是将相应的静态库连接到自己的应用程序中作为一个线程运行,从而节省内存  

  EmxSdk的目录结构如下所示,

├── change.log # 修改日志
├── EmxAiPluginDevelop # 用户使用Emx进行AI插件开发所需要的工程模板
├── EmxMediaDevelop # 用户使用Emx进行芯片对接开发所需要的工程模板
├── EmxProductDevelop # 用户使用Emx进行应用开发所需要的工程模板
├── configs # 存放工程编译过程中需要使用的一些固定的cmake和json配置文件
├── cross # 各个交叉编译链下的应用程序和库文件
└── include # Emx的头文件

Emx作为一款中间件,同时允许用户基于它进行应用开发和芯片接入