OpenHarmony之分布式软总线json.payload.c(三)

前言

在上篇博客分析了json_payload.c两个主要的函数--组织服务发布数据和解析服务发布数据 准备与解析数据 。下面继续介绍其他功能函数,这些函数主要是组织和解析的细节。

json_payload.c分析

组织数据细节

ini 复制代码
/*
    函数功能: 将设备信息封装成JSON数据
    函数参数: 
        data : 一个cJSON结构体指针,也是JSON数据的头节点。封装过程就是在其后添加节点
        deviceInfo : 设备信息
    返回值:成功返回0,否则返回-1
    详细: 
        1.创建一个由字符串对象,返回一个cJSON结构体类型的指针
        2.向JOSN对象中添加一个链表节点{"deviceId": deviceInfo->deviceId
        3.封装设备名{"devicename": deviceInfo->devicename}
        4.添加设备类型 {"type": deviceInfo->type}
        5.添加版本 {"version": deviceInfo->vesion}
        6.添加发布模式
        7.添加设备hash
        8.添加服务信息
*/
static int AddDeviceJsonData(cJSON *data, const DeviceInfo *deviceInfo)
{
    //创建一个由字符串对象,返回一个cJSON结构体类型的指针
    cJSON *item = cJSON_CreateString(deviceInfo->deviceId);
    //向JOSN对象中添加一个链表节点{"deviceId": deviceInfo->deviceId}
    if (item == NULL || !cJSON_AddItemToObject(data, JSON_DEVICE_ID, item)) {
        goto ERROR;
    }
    //封装设备名{"devicename": deviceInfo->devicename}
    item = cJSON_CreateString(deviceInfo->deviceName);
    if (item == NULL || !cJSON_AddItemToObject(data, JSON_DEVICE_NAME, item)) {
        goto ERROR;
    }
    //{"type": deviceInfo->type}
    item = cJSON_CreateNumber(deviceInfo->deviceType);
    if (item == NULL || !cJSON_AddItemToObject(data, JSON_DEVICE_TYPE, item)) {
        goto ERROR;
    }
    //添加版本
    item = cJSON_CreateString(deviceInfo->version);
    if (item == NULL || !cJSON_AddItemToObject(data, JSON_HICOM_VERSION, item)) {
        goto ERROR;
    }
    //发布模式 
    item = cJSON_CreateNumber(deviceInfo->mode);
    if (item == NULL || !cJSON_AddItemToObject(data, JSON_REQUEST_MODE, item)) {
        goto ERROR;
    }
    item = cJSON_CreateString(deviceInfo->deviceHash);
    if (item == NULL || !cJSON_AddItemToObject(data, JSON_DEVICE_HASH, item)) {
        goto ERROR;
    }
    item = cJSON_CreateString(deviceInfo->serviceData);
    if (item == NULL || !cJSON_AddItemToObject(data, JSON_SERVICE_DATA, item)) {
        goto ERROR;
    }
    return NSTACKX_EOK;
ERROR:
    //如果添加节点失败,那么该条JSON数据
    if (item != NULL) {
        cJSON_Delete(item); 
    }
    return NSTACKX_EFAILED;
}
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.鸿蒙版性能优化指南
.......

objectivec 复制代码
/*
    函数功能:将wifi IP封装CJSON
    函数参数: data: 一个cJSON结构体指针,也是JSON数据的头节点。封装过程就是在其后添加节点
    函数返回值: 成功返回0,否则返回非零
    详细: 
        1.初始化一个cJSON结构体类型的指针
        2.获取点分十进制形式ip
        3.item = 创建一个由字符串对象
        4.向data中添加一对元素,key : JSON_DEVICE_WLAN_IP,value : item
        5.添加成功返回,否则删除这一对数据
*/
static int AddWifiApJsonData(cJSON *data)
{
    cJSON *item = NULL;
    char ipString[INET_ADDRSTRLEN] = {0};
    //获取点分十进制形式ip
    if (GetLocalIpString(ipString, sizeof(ipString)) != NSTACKX_EOK) {
        return NSTACKX_EFAILED;
    }
    //添加到JSON数据链表中
    item = cJSON_CreateString(ipString);
    if (item == NULL) {
        return NSTACKX_EFAILED;
    }
    //向data中添加一对元素,object为json对象,string为加入一对元素中的name,item为加入一对元素中的value
    if (!cJSON_AddItemToObject(data, JSON_DEVICE_WLAN_IP, item)) {
        cJSON_Delete(item);
        return NSTACKX_EFAILED;
    }
    return NSTACKX_EOK;
}

ini 复制代码
/*
    函数功能: 将设备功能封装成JOSN
    函数参数: 
        data: 一个cJSON结构体指针,也是JSON数据的头节点。封装过程就是在其后添加节点
        deviceInfo : 设备信息结构里含功能位图
    函数返回值: 成功返回0,否则返回非零
    详细:
        1. 初始化capabilityArray,capability cJSON结构体类型的指针
        2. 判断设备信息功能位图是否为0
        3. capabilityArray = 创建一个cJSON 数组对象
        4. 遍历deviceInfo->capabilityBitmapNum,每个功能都创建一个数据对,依次加入到数组对象中
        5. 将这个数组对象加入data链表中
        6. 上述过程都执行成功,直接返回,否则删除cJSON数组对象
*/
static int AddCapabilityBitmap(cJSON *data, const DeviceInfo *deviceInfo)
{
    cJSON *capabilityArray = NULL;
    cJSON *capability = NULL;
    uint32_t i;
    if (deviceInfo->capabilityBitmapNum == 0) {
        return NSTACKX_EOK;
    }
    //创建一个数组项
    capabilityArray = cJSON_CreateArray();
    if (capabilityArray == NULL) {
        goto L_END_JSON;
    }
    //往数组项中添加数据
    for (i = 0; i < deviceInfo->capabilityBitmapNum; i++) {
        capability = cJSON_CreateNumber(deviceInfo->capabilityBitmap[i]);
        if (capability == NULL) {
            goto L_END_JSON;
        }
        cJSON_AddItemToArray(capabilityArray, capability);
    }
    //将该数据项添加到JSON链表
    cJSON_AddItemToObject(data, JSON_CAPABILITY_BITMAP, capabilityArray);
    return NSTACKX_EOK;
L_END_JSON:
    if (capabilityArray != NULL) {
        cJSON_Delete(capabilityArray);
        capabilityArray = NULL;
    }
    return NSTACKX_EFAILED;
}
相关推荐
Vic23347 分钟前
Kafka简要介绍与快速入门示例
分布式·kafka
Lethehong2 小时前
崖山YashanDB:下一代国产分布式数据库的架构革新与行业实践
数据库·分布式·架构
遇码12 小时前
单机快速部署开源、免费的分布式任务调度系统——DolphinScheduler
大数据·运维·分布式·开源·定时任务·dolphin·scheduler
纪元A梦13 小时前
分布式锁算法——基于ZooKeeper的分布式锁全面解析
java·分布式·算法·zookeeper
小样vvv13 小时前
【分布式】Hystrix 的核心概念与工作原理
分布式·hystrix
喝醉的小喵15 小时前
分布式环境下的主从数据同步
分布式·后端·mysql·etcd·共识算法·主从复制
别说我什么都不会16 小时前
OpenHarmony 5.0(API 12)关系型数据库relationalStore 新增本地数据变化监听接口介绍
api·harmonyos
酷爱码16 小时前
hive相关面试题以及答案
hive·分布式
老友@16 小时前
Kafka 全面解析
服务器·分布式·后端·kafka
MardaWang16 小时前
HarmonyOS 5.0.4(16) 版本正式发布,支持wearable类型的设备!
华为·harmonyos