# unifi-platform **Repository Path**: bighawk/unifi-platform ## Basic Information - **Project Name**: unifi-platform - **Description**: 一个统一式资源共享平台 - **Primary Language**: Delphi - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 5 - **Created**: 2022-10-15 - **Last Updated**: 2025-09-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # unifi-platform #### 介绍 一个统一的资源共享平台 #### 软件架构 1.总体上采用根主机和分布式主机以及其相互互通结构。 2.根主机负责各个分布式主机的注册和提供其他分布式主机互相查询(不光是分布式主机的联系地址,还包括其共享的服务内容)。另外还提供新版本的更新服务(由分布式主机主动获取)。 3.分布式主机向根主机注册自身的位置以及提交其向外提供的服务。 4.使用同一套代码,只是部署时候的配置不同。 #### 安装教程 1.部署文件说明 以上编译成功以后会产生如下一些文件: Service.exe:这是一个运行于Windows下的服务映像,它可以读取配置文件来加载文件指定的进程并监视其运行,一旦因意外以及故意原因(自更新以及其他调度原因等)停止,可以再次将其运行起来,以保证提供的服务能延续。 SvrMainModule.exe:这是被以上服务进程默认加载的主进程(无配置文件的情形),它实现了根主机和分布式主机的实体。其他提供服务的项目以动态链接库的形式存在并被此映像加载和分配执行线程,当然也可以合并到本模块中,很简单通过dpr文件直接引用其他组件的实现单元即可。 NETM.dll:实现网络模块,它负责所有网络部分功能,包括路由到指定分布式主机,以及大型文件的传输。 SvrMngM.dll:服务器管理模块,提供本机日志服务、统一对象表服务、编译服务器、一个小型的文件同步服务以及自更新服务。 AAAM.dll:用来认证传入的连接账户,允许登录并提供一些管理功能;这个模块暂时没有使用。 CompileSvr.dll:编译模块。 VideoAndAudioSvr:提供图片库功能,指定图片库存放路径以后在Platform中可以添加图片到此库,它自动移动图片到库中,而且根据图片的hash保证不会存储多余的图片。 以上所有的dll在当前版本中已经全部被移动到SvrMainModule主程序中,但是保留了其目录结构和dpr文件,开发新库可以借鉴这些文件,物理隔绝的情况下比较容易分清异常爆发的模块。 Platform.exe:全功能配置管理界面程序。 DLCnt:一个小型界面程序。 borlndmm.dll:大家都懂。 2.部署配置文件细目 2.1.Service运行的时候会读取当前目录下的Service.config文件,这是一个文本文件;每一行为一个解析单元,以名值对的方式存储,名称必须以MonitorProc、MonitorProcParam、MonitorType开头,然后其后跟分辨字符,只要后面跟的字符一样,则会解释为同一个受其监控的进程的属性:MonitorProc表示被监控的进程的映像全路径,本服务将在此路径下找到并运行受监控的进程;MonitorProcParam是此进程运行时候的参数;MonitorType是表明此进程结束方式,当前只有一种方式:msg,它表示受监控进程运行的时候会将其窗口句柄放置在一个文件中,则服务被关闭的时候会获取到受监控进程的窗口句柄并以消息通知其停止并等待此受监控进程的主动停止(给予其退出的时候处理机会);如果不指定此标志,则服务在结束的时候会直接杀掉(KillProcess)此受监控进程并不给它处理退出机会。 2.2.SvrMainModule.exe启动的时候会在当前目录下寻找obj.config文件并根据其内容创建本机的服务对象树,这也是一个文本文件;其结构大致如下: obj : TObjRoot objidx = 0 hostid = F0F0F0F0F0F0F0F0F0F0F0F0 obj : TNetProcObj objidx = 3 end obj : TAAAProcObj objidx = 1 end obj : TSvrMngProcObj objidx = 8 end obj : TFileAndTransObj objidx = 11 end obj : TAVISvrProcObj objidx = 13 AviRootPath = X:\PhotosLib end End 此文件结构表示为对象树方式,每一个对象以对象类型开头(冒号后面的文本,这个必须有二进制实现,能被搜索到;一般包含在同目录下的动态链接库中),以end关键字结尾;每一个对象可以包含其他对象,但是从顶层到树枝的最末端只能有三层(包含顶层);每一个对象包含可以从配置文件读取的属性,以及下一层对象的配置数据。当SvrMainModule运行的时候此进程内部的处理对象实例表现为一个树状结构(与配置文件对应),最顶层的是TObjRoot类型实例,这个对象实例负责内部对象树消息投放和执行线程的分配。其下的每一个对象都是一个业务处理实例,并可以再包含一层子实例以便于编码;但是子实例以下并不能再包括实例,这是无法路由的(当然,实例内部编码的时候不必管此约束,只要内存空间允许可以包括无限级下层实例)。注意:每一层实例有一个编号,在配置文件中以objidx表示,如果不指定此对象实例编号,则加载的时候实例会被自动分配一个;objidx指定的编号不能等于0和大于254,就是说每一层实例最多只能有253个子实例(因为存储它们的结构是一个Word,所以只能路由两层以及每层的实例数受限)。TObjRoot还接受一个属性关键字为hostid,它指明了当前运行的这个进程是作为根主机还是分布式主机;根主机的主机ID(12字节的主机地址)必定是F0F0F0F0F0F0F0F0F0F0F0F0。这是本平台的约定,其他的主机ID可以自行产生。 2.3.其他说明 当架设服务器的时候,为了体现根主机和其他主机之间的不同,需要指定根主机的地址,请打开Common目录下的unitCommonDataStruct.pas定位到此文件的S_ROOTDOMAIN定义并修改此处的域名为你打算架设主机的域名,如果直接使用当前包中的已经编译文件而且架设是分布式主机,则其会将我的根主机器当作其根主机…… 为了体现一下这个平台的一些功能,已经实现了一些服务组件,比如一个图片服务器TAVISvrProcObj;如以上的配置文件表示,它接受一个属性名为AviRootPath的配置,其指定的是一个存储图片的路径。自行配置以后可以在Platform里面导入你自己的照片,注意,它会将照片移动到这个属性指定的路径下,并以以下路径结构进行存储;然后在Platform里面展示出来;当然,共享图片的功能还没实现,暂时还只是在本机进行展示,共享需要根主机的参与,这也是前面编译的时候需要把根主机地址改变过来的一个原因……。 另外就是一个TFileAndTransObj,这是一个传输服务器,在Platform里面配置好了以后可以在根主机和分布式主机之间传输大型文件,分布式主机之间的直接传输呢,也还没有实现 2.4.备注 #### 编译指南 压缩包内除了Common目录,每一个目录都是一个独立的工程;每个工程编译的时候需要指定搜索路径为上层的Common目录;当然也可以全部组件编译到一个可执行文件中:SvrMainModule(不过此种情形下需要将其他工程的路径增加到SvrMainModule的搜索路径中),除了Platform,DLCnt以外的工程编译都不需要其他编译指令指定,这两需要增加一个编译指令:UI。当前项目在XE11.3 Community版本下编译成功,本来想使用FPC编译(为了版权因素以及以后往RISC-V一类的指令架构扩展),但由于使用还不熟练,所以暂时放在后面处理。 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)