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;
}
相关推荐
Georgewu1 小时前
【HarmonyOS】应用开发拖拽功能详解
harmonyos
塞尔维亚大汉1 小时前
鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程
源码·harmonyos
危险、3 小时前
RabbitMQ 通过HTTP API删除队列命令
分布式·http·rabbitmq
周某某~3 小时前
windows安装RabbitMQ
分布式·rabbitmq
Bug退退退1233 小时前
RabbitMQ 高级特性之消息确认
java·分布式·rabbitmq
kumalab4 小时前
HarmonyOS ArkTS卡片堆叠滑动组件实战与原理详解(含源码)
华为·harmonyos
别说我什么都不会5 小时前
【OpenHarmony】鸿蒙开发之xml2jsDemo
harmonyos
一只程序汪6 小时前
【如何实现分布式压测中间件】
分布式·中间件
William一直在路上7 小时前
主流分布式中间件及其选型
分布式·中间件
茫茫人海一粒沙7 小时前
理解 Confluent Schema Registry:Kafka 生态中的结构化数据守护者
分布式·kafka