json_payload
总结概述
一个完整的模块,在发现服务开启前,将本机设备的信息打包好为cJSON类型的data用于传输,一旦收到网络上发送的信息将其转为buf之后通过cJSON.c中的解析函数得到data再将其转为DeviceInfo类型的本地信息
流程分析
代码详解
json_payload.h
这里定义了两个重要的函数
- PrepareServiceDiscover(void)
- ParseServiceDiscover(const uint8_t *buf, struct DeviceInfo *deviceInfo, char **remoteUrlPtr)
第一个函数是用于发现服务发布时本地设备信息的准备,将本地的deviceInfo封装入网络流的cJSON data中
第二个函数是从网络中接收的buf中得到data将其对应的deviceInfo写入本地的DeviceInfo中
设备作为发现端和被发现端的两种操作模式
json_payload.c
与cJSON.c文件密切相关的函数模块,用于进行DeviceInfo类型和cJSON类型数据的转换,读取和写回
-
AddDeviceJsonData()
调用cJSON的对象创建和项目添加函数,将七个deviceInfo中的关键信息放入cJSON item中
-
两个单独函数用于获取data中的IP和capability相关信息存入本地设备信息中
-
解析cJSON类型的data函数将其存入DeviceInfo中
-
三个解析函数从cJSON *data中解析出IP、Hash、serviceData
-
上层的调用函数从本地获取设备信息封装入data(cJSON)中
-
与上述函数相反从data中解析出信息写入本地的deviceInfo中
//从buf中解析出data将其中的信息写入本地的deviceInfo中
int ParseServiceDiscover(const uint8_t *buf, DeviceInfo *deviceInfo, char **remoteUrlPtr)
{
char *remoteUrl = NULL;
cJSON *data = NULL;
cJSON *item = NULL;
if (buf == NULL || deviceInfo == NULL || remoteUrlPtr == NULL) {
return NSTACKX_EINVAL;
}
//从原生的buf指针所指的数据块中得到cJSON data
data = cJSON_Parse((char *)buf);
if (data == NULL) {
return NSTACKX_EINVAL;
}
//调用函数解析cJSON类型的data函数将其存入DeviceInfo中
if (ParseDeviceJsonData(data, deviceInfo) != NSTACKX_EOK) {
cJSON_Delete(data);
return NSTACKX_EINVAL;
}
//将data中一些关键的信息用函数封装进行检查和单独提取
ParseWifiApJsonData(data, deviceInfo);
ParseCapabilityBitmap(data, deviceInfo);
ParseModeJsonData(data, deviceInfo);
ParseDeviceHashData(data, deviceInfo);
ParseServiceDataJsonData(data, deviceInfo);
//获取远端url存入remoteUrl中
item = cJSON_GetObjectItemCaseSensitive(data, JSON_COAP_URI);
if (item != NULL) {
if (cJSON_IsString(item)) {
remoteUrl = strdup(item->valuestring);
}
}
//将解析完毕的data所指的数据块删除
cJSON_Delete(data);
//指针置空
data = NULL;
if (remoteUrl == NULL) {
return NSTACKX_EINVAL;
}
*remoteUrlPtr = remoteUrl;
return NSTACKX_EOK;
}
感谢阅读点赞和评论