往期知识点记录:
- 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
- OpenHarmony之分布式软总线coap头文件& coap组包分析
- OpenHarmony之分布式软总线discovery/coap/source/coap_socket.c
- OpenHarmony之分布式软总线nstackx_device.c(一)
- OpenHarmony之分布式软总线nstackx_device.c(二)
- OpenHarmony之分布式软总线discovery_service.h头文件
- OpenHarmony之分布式软总线discovery_service.c(一)
- OpenHarmony之分布式软总线discovery_service.c(二)
- OpenHarmony之分布式软总线discovery_service.c(三)
- OpenHarmony之分布式软总线discovery_service.c(四)
- OpenHarmony之分布式软总线discovery_service.c(五)
- OpenHarmony之分布式软总线json_payload.c(一)
- OpenHarmony之分布式软总线json_payload.c(二)
- 持续更新中……
前言
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;
}
写在最后
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请看下图提示: