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;
}
相关推荐
黄雪超41 分钟前
Kafka——关于Kafka动态配置
大数据·分布式·kafka
bing_1581 小时前
如何利用 Redis 的原子操作(INCR, DECR)实现分布式计数器?
数据库·redis·分布式
simple_lau2 小时前
鸿蒙开发中如何快速定位丢帧
harmonyos·arkts·arkui
爱思德学术7 小时前
中国计算机学会(CCF)推荐学术会议-A(软件工程/系统软件/程序设计语言):FSE 2026
分布式·软件工程·软件构建
云_杰7 小时前
利用AI开发我又又上架了一个鸿蒙产品——青蓝程序员工具箱
harmonyos·trae
撬动未来的支点8 小时前
简化理解I2C总线
嵌入式·i2c
萤火虫儿飞飞9 小时前
鸿蒙智选携手IAM进驻长隆熊猫村,为国宝打造智慧健康呼吸新空间
华为·harmonyos
御承扬10 小时前
HarmonyOS NEXT系列之定制化构建制品
华为·harmonyos
大土豆的bug记录11 小时前
鸿蒙拉起系统定位和app授权定位
前端·javascript·harmonyos
Code季风12 小时前
API 网关与服务发现:实现动态路由与智能请求转发的原理揭秘
分布式·微服务