OpenHarmony轻量系统服务管理|samgr_server功能详解(一)

一、前言

实现代码在distributedschedule_samgr_lite\samgr_server\source\samgr_server.c

二、宏定义及数据结构

arduino 复制代码
#define MAX_SYSCAP_NAME_LEN 64      //系统能力名称的最大长度
#define MAX_SA_SIZE 0x100            //sa中最大数目
#define RETRY_TIMES 3               //重试次数
#define RETRY_INTERVAL 1            //重试间隔
#define MAX_SYSCAP_NUM_PER_REPLY 118//对于syscap,每次响应的最大数目
//函数指针
typedef int(*ProcFunc)(SamgrServer *server, int32 option, void *origin, IpcIo *req, IpcIo *reply);
typedef enum MsgId {
    MSG_CLEAN,  //清除数据
}MsgId;//消息ID

ini 复制代码
struct SamgrProxy {
    INHERIT_SERVER_IPROXY;//继承服务端的代理
};
struct SamgrServer {
    INHERIT_SERVICE;        //继承service
    INHERIT_IPROXY_ENTRY(SamgrProxy);   //继承代理入口
    Identity identity;                  //标识服务名、功能名和消息队列
    Endpoint *samgr;                    //samgr的通信端点
    MutexId mtx;                        //锁
    SAStore store;                      //存储服务和功能的信息
    IpcAuthInterface *ipcAuth;          //继承了INHERIT_IUNKNOWN的结构体,包含GetCommunicationStrategy和IsCommunicationAllowed两个函数指针
    MutexId sysCapMtx;                  //互斥锁,用于syscap的互斥
    Vector sysCapabilitys;              //syscap的集合
};
struct SysCapImpl {
    char name[MAX_SYSCAP_NAME_LEN + 1]; //name
    BOOL isRegister;                    //标识是否注册
};
//静态全局变量,定义一个Samgr的server
static SamgrServer g_server = {
    .GetName = GetName,
    .Initialize = Initialize,
    .GetTaskConfig = GetTaskConfig,
    .MessageHandle = MessageHandle,
    SERVER_IPROXY_IMPL_BEGIN,
    .Invoke = Invoke,
    IPROXY_END,
};
//本地处理函数的集合,内部的每一个元素都是一个函数指针
static ProcFunc g_functions[] = {
    [RES_ENDPOINT] = ProcEndpoint,  //针对资源类型为ENDPOINT的处理函数
    [RES_FEATURE] = ProcFeature,    //针对资源类型为feature的处理函数
    [RES_SYSCAP] = ProcSysCap,      //针对资源类型为SysCap的处理函数
};
DD一下: 欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。
erlang 复制代码
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

三、函数实现详解

获取syscap的名称
arduino 复制代码
//获取SysCap的name
static const char *GetSysCapName(const SysCapImpl *serviceImpl)
{
    if (serviceImpl == NULL) {
        return NULL;
    }
    //返回name
    return serviceImpl->name;
}
初始化Samgr服务
scss 复制代码
/*
    函数功能:初始化g_server并注册json中的syscap信息
    函数描述:初始化g_server的各个成员,并创建一个名为samgr的通信端点作为主endpoint。
             然后解析指定文件路径下的json文件,将文件中描述的syscap信息添加到g_server的sysCapabilitys中
*/
static void InitializeRegistry(void)
{
    HILOG_INFO(HILOG_MODULE_SAMGR, "Initialize Registry!");
    //初始化锁
    g_server.mtx = MUTEX_InitValue();
    //初始化store
    SASTORA_Init(&g_server.store);
    //为当前进程创建一个IPC通信端点endpoint,用于跨进程间通信。endpoint的地址注册函数设置为RegisterSamgrEndpoint,用于配置主EndPoint的地址
    g_server.samgr = SAMGR_CreateEndpoint("samgr", RegisterSamgrEndpoint);
    //将IPC通信代理服务g_server注册到samgr中
    SAMGR_GetInstance()->RegisterService((Service *)&g_server);
    //初始化锁
    g_server.sysCapMtx = MUTEX_InitValue();
    //创建vector对象,GetSysCapName作为获取key值的函数,strcmp作为key的比较函数
    g_server.sysCapabilitys = VECTOR_Make((VECTOR_Key)GetSysCapName, (VECTOR_Compare)strcmp);
    //解析json文件,将json文件中描述的syscap添加到g_server的sysCapabilitys中
    ParseSysCap();
    HILOG_INFO(HILOG_MODULE_SAMGR, "InitializeRegistry ParseSysCap size: %d", VECTOR_Size(&(g_server.sysCapabilitys)));
}
SYS_SERVICE_INIT(InitializeRegistry);
用户鉴权
arduino 复制代码
//判断origin的userID是否符合条件
static BOOL CanRequest(const void *origin)
{
    //返回origin的userID
    pid_t uid = GetCallingUid(origin);
    //若uid小于UID_HAP,则返回true,否则返回false
    return uid < UID_HAP;
}
查询服务名
arduino 复制代码
//获取服务名称
static const char *GetName(Service *service)
{
    (void)service;
    //这里返回的是当前g_server的名称,即SAMGR_SERVICE服务
    return SAMGR_SERVICE;
}
服务初始化
ini 复制代码
/*
    函数功能:服务初始化
    函数参数:@service:SamgrServer服务
             @identity:身份标识
    函数描述:配置SamgrServer服务的信息,包括Saname和identity。然后注册到当前进程通信端点的routers中。
*/
static BOOL Initialize(Service *service, Identity identity)
{
    SamgrServer *server = (SamgrServer *)service;
    //赋值身份标识
    server->identity = identity;
    //初始化saname,包含service的name和feature的name,此时服务名为SAMGR_SERVICE,功能名无
    SaName saName = {SAMGR_SERVICE, NULL};
    //将saName, identity等信息封装成router,添加到当前进程通信端点endpoint的routers中。
    //当endpoint的routers中存在对象时,会为endpoint创建一个专门接收和分发其他进程发来的消息。
    SAMGR_AddRouter(server->samgr, &saName, &server->identity, GET_IUNKNOWN(*server));
    return TRUE;
}
相关推荐
技术小泽6 小时前
MQTT从入门到实战
java·后端·kafka·消息队列·嵌入式
不爱学英文的码字机器6 小时前
【鸿蒙PC命令行适配】基于OHOS SDK直接构建xz命令集(xz、xzgrep、xzdiff),完善tar.xz解压能力
华为·harmonyos
特立独行的猫a7 小时前
[鸿蒙PC命令行程序移植实战]:交叉编译移植最新openSSL 4.0.0到鸿蒙PC
华为·harmonyos·移植·openssl·交叉编译·鸿蒙pc
羑悻的小杀马特9 小时前
【Linux篇章】穿越网络迷雾:揭开 HTTP 应用层协议的终极奥秘!从请求响应到实战编程,从静态网页到动态交互,一文带你全面吃透并征服 HTTP 协议,打造属于你的 Web 通信利刃!
linux·运维·网络·http·操作系统·网络通信
特立独行的猫a9 小时前
[鸿蒙PC命令行适配] 移植Aria2文件下载神器最新版到鸿蒙PC的完整教程 (附可运行程序)
harmonyos·移植·交叉编译·aria2·鸿蒙pc
应该会好起来的9 小时前
基于定时器中断的多任务轮询架构
嵌入式
特立独行的猫a10 小时前
[鸿蒙PC三方库交叉编译] libtool与鸿蒙SDK工具链的冲突解决方案:从glibc污染到参数透传的深度解析
华为·harmonyos·ndk·三方库移植·鸿蒙pc·libtool
哈__10 小时前
Flutter For OpenHarmony 鸿蒙 PC 开发入门:环境搭建 + 工程初始化(附 PC 端专属配置)
flutter·华为·harmonyos
搬砖的kk11 小时前
鸿蒙PC端二进制文件签名命令行使用指南(附实战测试)
华为·harmonyos
切糕师学AI1 天前
NuttX RTOS是什么?
嵌入式·rtos