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;
}
相关推荐
鸿蒙布道师6 小时前
鸿蒙NEXT开发Base64工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
java1234_小锋6 小时前
Kafka中的消息是如何存储的?
分布式·kafka
老友@6 小时前
Kafka 深度解析:高性能设计、部署模式、容灾机制与 KRaft 新模式
分布式·kafka·kraft·高性能·容灾机制
余子桃6 小时前
Kafka的安装与使用(windows下python使用等)
分布式·kafka
java1234_小锋7 小时前
Kafka中的消息如何分配给不同的消费者?
分布式·kafka
小样vvv7 小时前
【Kafka】深入探讨 Kafka 如何保证一致性
分布式·kafka
The 旺7 小时前
《HarmonyOS Next开发实战:从零构建响应式Todo应用的基石》
华为·harmonyos
Industio_触觉智能7 小时前
鸿蒙北向开发OpenHarmony5.0 DevEco Studio开发工具安装与配置
harmonyos·鸿蒙系统·openharmony·开源鸿蒙·鸿蒙开发·嵌入式开发板
快来卷java11 小时前
深入剖析雪花算法:分布式ID生成的核心方案
java·数据库·redis·分布式·算法·缓存·dreamweaver
秋叶先生_12 小时前
HarmonyOS NEXT——【鸿蒙监听网络状态变化】
华为·harmonyos·鸿蒙