鸿蒙设备开发之OpenHarmony分布式软总线json_payload.c(二)
本文分析了鸿蒙系统(HarmonyOS)中利用cJSON处理CoAP设备服务发现数据的过程。文章重点解析了两个核心函数:PrepareServiceDiscover()用于准备服务发现数据,包括获取设备信息、创建cJSON对象并添加设备信息、WiFi IP和功能位图;ParseServiceDiscover()则用于解析接收到的服务发现数据,包括提取设备信息、WiFi配置、功能位图等。文中还展示了
·
📌往期推文全新看点(文中附带最新·鸿蒙全栈学习笔记)
📃 鸿蒙(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;
}

更多推荐
所有评论(0)