📌往期推文全新看点(文中附带最新·鸿蒙全栈学习笔记)

📃 鸿蒙(HarmonyOS)北向开发知识点记录~

📃 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~

📃 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?

📃 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~

📃 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?

📃 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?

📃 记录一场鸿蒙开发岗位面试经历~

📃 持续更新中……


前言

Harmony使用cJSON格式来组织coap设备服务发现数据。在 cJSON介绍 对cJSON主要结构体和接口函数做了介绍。下面将分析Harmony如何利用cJSON组织和解析设备数据。

json_payload.c分析

首先json_payload.c中的主要函数就是准备服务发现数据char *PrepareServiceDiscover(void);和解析服务发现数据int ParseServiceDiscover(const uint8_t *buf, struct DeviceInfo *deviceInfo, char **remoteUrlPtr);。接下来会从这两个函数入手,逐步分析服务发现数据准备过程和解析过程。

准备服务发现数据需要设备信息,ip地址和功能对应的整型数

/*
   函数功能: 准备服务发现信息
   函数返回: JSON转换后的字符串
   详细:
       1. 获取本地设备数据
       2. 创建CJSON对象
       3. 将设备信息,wifi IP和 功能位图添加到CJSON对象
       4. 将JSON对象转换位普通字符串
       5. 当上述过程都成功完成,将cJSON对象转换为字符串,否则删除cJSON对象
*/
char *PrepareServiceDiscover(void)
{
   char *formatString = NULL;
   const DeviceInfo *deviceInfo = GetLocalDeviceInfo(); //获取设备信息
   cJSON *data = NULL;
   //创建cjson对象
   data = cJSON_CreateObject();  //创建头结点,并将头指针指向头结点
   //创建失败
   if (data == NULL) {
       goto L_END_JSON;
   }
   //以JSON格式添加设备信息
   if ((AddDeviceJsonData(data, deviceInfo) != NSTACKX_EOK) || (AddWifiApJsonData(data) != NSTACKX_EOK) ||
       (AddCapabilityBitmap(data, deviceInfo) != NSTACKX_EOK)) {
       goto L_END_JSON;
   }
   //将JSON对象转换为普通的字符串
   formatString = cJSON_PrintUnformatted(data);
   if (formatString == NULL) {
       SOFTBUS_PRINT("[DISCOVERY] PrepareServiceDiscover format fail\n");
   }
L_END_JSON:
   //删除cJSON对象
   if (data != NULL) {
       cJSON_Delete(data);
       data = NULL;
   }
   return formatString;
}

解析与组装正好相反

/*
   函数功能:解析服务发现信息
   函数参数:
           1. buf:  数据缓存区存储接收的服务发现信息
           2. deviceInfo :  用来保存解析出的远端设备信息
           3. remoteUrlPtr : 指向所有远端url
   函数返回值: 成功返回NSTACKX_EOK(0),否则返回非零表示的错误
   详细:
           1.初始化变量(cJSON对象,cJSON数据元素,远端url)
           2.检查各个参数(buf,deviceInfo,remoteUrlPtr)
           3.解析JSON数据包,并按照cJSON结构体的结构序列化整个数据包
           4.解析出设备信息,wifi ip, 功能位图,发布模式,设备hash,服务数据
           5.解析出远端url
*/
int ParseServiceDiscover(const uint8_t *buf, DeviceInfo *deviceInfo, char **remoteUrlPtr)
{
   //远端Url
   char *remoteUrl = NULL;
   cJSON *data = NULL;
   cJSON *item = NULL;
   if (buf == NULL || deviceInfo == NULL || remoteUrlPtr == NULL) {
       return NSTACKX_EINVAL;
   }
   //解析JSON数据包,并按照cJSON结构体的结构序列化整个数据包
   data = cJSON_Parse((char *)buf);
   if (data == NULL) {
       return NSTACKX_EINVAL;
   }
   //解析出设备信息
   if (ParseDeviceJsonData(data, deviceInfo) != NSTACKX_EOK) {
       cJSON_Delete(data);
       return NSTACKX_EINVAL;
   }
   //
   ParseWifiApJsonData(data, deviceInfo);
   ParseCapabilityBitmap(data, deviceInfo);
   ParseModeJsonData(data, deviceInfo);
   ParseDeviceHashData(data, deviceInfo);
   ParseServiceDataJsonData(data, deviceInfo);
   //访问 data对象的JSON_COAP_URI元素
   item = cJSON_GetObjectItemCaseSensitive(data, JSON_COAP_URI);
   if (item != NULL) {
       //判断是否是字符串
       if (cJSON_IsString(item)) {
           //复制远端URL
           remoteUrl = strdup(item->valuestring);
       }
   }
   //释放json对象
   cJSON_Delete(data);
   data = NULL;
   if (remoteUrl == NULL) {
       return NSTACKX_EINVAL;
   }
   *remoteUrlPtr = remoteUrl;
   return NSTACKX_EOK;
}

在这里插入图片描述

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐