前提
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;
}