OpenHarmony之分布式软总线discovery_service.c(二)

前提

discovery_service.c 的发布服务PublishService 和 取消已发布的服务UnPublishService在 发布服务与撤销已发布的服务 分析,本文将分析服务发布过程中使用到的其他功能函数。

在开始定义配置设备信息结构:

arduino 复制代码
/*
    配置设备信息结构
    deviceId : 设备ID
    deviceName : 设备名称
    deviceType : 设备类型
*/
typedef struct {
    char deviceId[MAX_DEV_ID_LEN];
    char deviceName[MAX_DEV_NAME_LEN];
    int  deviceType;
} ConfigDeviceInfo;

声明全局变量保存相应的信息:

ini 复制代码
static int g_isServiceInit = 0; 
publishModule *g_publishModule = NULL; //存储发布模块信息
char *g_capabilityData = NULL; // 存储发布服务的数据
static MutexId g_discoveryMutex = NULL;  //发布锁

关于设备信息的功能函数:

c 复制代码
*
    函数功能: 获取设备类型
    函数参数:value : 设备类型名称的指针;
    函数返回: 设备类型类型对应的枚举值;
    详细:从头遍历g_devMap数组 比较数组中 DeviceMap结构体中的value属性,得到设备名对应的类型枚举值
*/
static int GetDevType(const char *value)
{
    if (value == NULL) {
        return UNKOWN;
    }
    for (unsigned int i = 0; i < sizeof(g_devMap) / sizeof(DeviceMap); i++) {
        if (!strcmp(g_devMap[i].value, value)) {
            return g_devMap[i].devType;
        }
    }
    return UNKOWN;
}
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.鸿蒙版性能优化指南
.......

ini 复制代码
/*
    函数功能: 备份设备信息
    函数参数:devInfo,info
    函数返回: 无
    详细:将devInfo中的设备ID,设备名称,设备类型属性复制到info中
*/
void BackupCommonDeviceInfo(const DeviceInfo *devInfo, ConfigDeviceInfo *info)
{
    if (devInfo == NULL || info == NULL) {
        return;
    }
    //复制设备id
    int ret = strcpy_s(info->deviceId, MAX_DEV_ID_LEN, devInfo->deviceId);
    if (ret != 0) {
        return;
    }
    //复制设备名字
    ret = strcpy_s(info->deviceName, MAX_DEV_NAME_LEN, devInfo->deviceName);
    if (ret != 0) {
        memset_s(info->deviceId, MAX_DEV_ID_LEN, 0, MAX_DEV_ID_LEN);
        return;
    }
    //设备类型
    info->deviceType = devInfo->deviceType;
    return;
}

ini 复制代码
/*
    函数功能 : 恢复设备信息
    函数参数 : devInfo : 备份了设备信息  info : 待恢复的设备信息
*/
void RecoverCommonDeviceInfo(const ConfigDeviceInfo *devInfo, DeviceInfo *info)
{
    if (devInfo == NULL || info == NULL) {
        return;
    }
    //将devInfo --> info    id
    int ret = strcpy_s(info->deviceId, MAX_DEV_ID_LEN, devInfo->deviceId);
    if (ret != 0) {
        return;
    }
    //名字
    ret = strcpy_s(info->deviceName, MAX_DEV_NAME_LEN, devInfo->deviceName);
    if (ret != 0) {
        memset_s(info->deviceId, MAX_DEV_ID_LEN, 0, MAX_DEV_ID_LEN);
        return;
    }
    //类型
    info->deviceType = devInfo->deviceType;
    return;
}
/*
    函数功能: 设置设备信息 (id, type ,name)
    函数参数: devInfo :设备信息数组  num : 设备信息数组的长度
    函数返回: 成功返回 0 ,失败返回非零值
    详细:
    1、首先通过GetCommonDeviceInfo()得到设备信息
    2、在修改之前通过BackupCommonDeviceInfo 进行备份
    3、根据设备信息数组中的key的值更改其所对应的属性
    4、如果设置成功,则返回0 ,否则就用备份还原到修改前的状态
*/
int SetCommonDeviceInfo(const struct CommonDeviceInfo *devInfo, unsigned int num)
{
    //检查各个条件
    if (SoftBusCheckPermission(SOFTBUS_PERMISSION) != 0 || devInfo == NULL || num == 0 ||
        num > COMM_DEVICE_KEY_MAX) {
        SOFTBUS_PRINT("[DISCOVERY] SetCommonDeviceInfo invalid para\n");
        return ERROR_FAIL;
    }
    //得到常见的设备信息
    DeviceInfo *localDev = GetCommonDeviceInfo();
    if (localDev == NULL) {
        return ERROR_FAIL;
    }
    int ret;
    int devType;
    ConfigDeviceInfo info = {0};
    //修改之前先备份一下
    BackupCommonDeviceInfo(localDev, &info);
    for (unsigned int i = 0; i < num; i++) {
        switch (devInfo[i].key) {
            case COMM_DEVICE_KEY_DEVID:
                ret = strcpy_s(localDev->deviceId, MAX_DEV_ID_LEN, devInfo[i].value);
                break;
            case COMM_DEVICE_KEY_DEVTYPE:
                ret = ERROR_FAIL;
                devType = GetDevType(devInfo[i].value);
                if (devType != UNKOWN) {
                    localDev->deviceType = devType;
                    ret = ERROR_SUCCESS;
                }
                break;
            case COMM_DEVICE_KEY_DEVNAME:
                ret = strcpy_s(localDev->deviceName, MAX_DEV_NAME_LEN, devInfo[i].value);
                break;
            default:
                ret = ERROR_FAIL;
                break;
        }
        if (ret != ERROR_SUCCESS) {
            break;
        }
    }
    //如果修改成功那么就更新设备信息,否则就从备份中恢复到原始状态
    if (ret == ERROR_SUCCESS) {
        ret = UpdateCommonDeviceInfo();
    } else {
        (void)RecoverCommonDeviceInfo(&info, localDev);
    }
    SOFTBUS_PRINT("[DISCOVERY] SetCommonDeviceInfo result = %d\n", ret);
    return ret;
}
相关推荐
蒋星熠2 分钟前
中间件架构设计与实践:构建高性能分布式系统的核心基石
开发语言·数据库·分布式·python·中间件·性能优化·硬件工程
在未来等你5 小时前
Elasticsearch面试精讲 Day 13:索引生命周期管理ILM
大数据·分布式·elasticsearch·搜索引擎·面试
roman_日积跬步-终至千里9 小时前
【系统架构设计(24)】大型网站系统架构演化:从单体到分布式的技术进阶之路
分布式·系统架构
威哥爱编程10 小时前
HarmonyOS 5.1手势事件详解
harmonyos
Luminbox紫创测控11 小时前
稳态太阳光模拟器 | 多源分布式设计的要点有哪些?
分布式
HarderCoder12 小时前
使用仓颉语言理解 SOLID 原则:概念、实战与踩坑总结
harmonyos
爱笑的眼睛1115 小时前
HarmonyOS 应用开发深度解析:ArkTS 声明式 UI 与状态管理最佳实践
华为·harmonyos
安卓开发者16 小时前
鸿蒙Next ArkWeb进程解析:多进程架构如何提升Web体验
前端·架构·harmonyos
damo王17 小时前
鸿蒙(HarmonyOS) 历史
华为·harmonyos
爱笑的眼睛1118 小时前
HarmonyOS声明式UI开发:深入ArkUI与状态管理实践
华为·harmonyos