前言
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;
}
DD一下:欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。
`欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。`
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.鸿蒙版性能优化指南
.......
解析与组装正好相反
/*
函数功能:解析服务发现信息
函数参数:
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;
}
写在最后
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力;
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识;
- 想要获取更多完整鸿蒙最新学习知识点,可关注B站:码牛课堂;