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;
}
相关推荐
predisw2 小时前
kafka connect 大概了解
分布式·kafka
计算机毕设定制辅导-无忧学长4 小时前
RabbitMQ 快速上手:安装配置与 HelloWorld 实践(二)
分布式·rabbitmq·ruby
啾啾Fun5 小时前
【Java微服务组件】分布式协调P1-数据共享中心简单设计与实现
java·分布式·微服务
梦想画家8 小时前
Scrapy进阶实践指南:从脚本运行到分布式爬取
分布式·scrapy·数据工程
东阳马生架构9 小时前
Seata源码—5.全局事务的创建与返回处理二
分布式·seata·分布式事务
落叶挽歌9 小时前
鸿蒙ArkUI体验:Hexo博客客户端开发心得
华为·harmonyos
特立独行的猫a10 小时前
uni-app 开发HarmonyOS的鸿蒙影视项目分享:从实战案例到开源后台
uni-app·开源·harmonyos·鸿蒙·影视
掘金-我是哪吒10 小时前
分布式微服务系统架构第133集:运维服务器6年经验,高并发,大数据量系统
运维·服务器·分布式·微服务·系统架构
交叉编译之王 hahaha11 小时前
RK3568-鸿蒙5.1镜像烧录与调试
华为·harmonyos
Raink老师11 小时前
鸿蒙页面布局入门
华为·harmonyos·鸿蒙·移动端布局