JSON的基礎知識
cJSON的使用方法主要看這一篇文章就行,https://blog.csdn.net/fengxinlinux/article/details/53121287
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式,易于人閱讀和撰寫,同時也易于機器決議和生成,它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集, JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等),這些特性使JSON成為理想的資料交換語言,
cJSON從名字可知,整個專案都是以極標準的C來寫的,意思說,可以跨各種平臺使用了, cJSON 是一個超輕巧,攜帶方便,單檔案,簡單的可以作為ANSI-C標準的JSON決議器,
cJSON,目前來說,就只有兩個檔案,一個cJSON.c 一個cJSON.h檔案,使用的時候,自己創建好一個main.c檔案后,將頭檔案include進去,
JSON串保存到本地的兩種方法
創建一個這樣的JSON串,
{
“name”: “default”,
“desc”: “”,
“timePolicy”: [{
“action”: “ALLOW”,
“dayType”: “CUSTOM”,
“title”: “all”,
“type”: “CYCLE”,
“weekDays”: [2, 3, 4, 5, 6, 7, 1],
“interval”: {
“end”: {
“hour”: “23”,
“minute”: “59”,
“second”: “59”
},
“start”: {
“hour”: “00”,
“minute”: “00”,
“second”: “59”
}
}
}],
“personIds”: [],
“id”: “default”,
“passModes”: [“FACE”, “IC”, “PASSWORD”]
}
使用CJSON一層一層的創建
char * req_body_str;
int weekDay=1;
cJSON *json_default_policy = cJSON_CreateObject();
cJSON *timePolicy = cJSON_CreateArray();
cJSON *timePolicy_root = cJSON_CreateObject();
cJSON *weekDays = cJSON_CreateArray();
cJSON *interval_root = cJSON_CreateObject();
cJSON *end_root = cJSON_CreateObject();
cJSON *start_root = cJSON_CreateObject();
cJSON *personIds = cJSON_CreateArray();
cJSON *passModes = cJSON_CreateArray();
cJSON_AddItemToObject(json_default_policy, "name", cJSON_CreateString("default"));
cJSON_AddItemToObject(json_default_policy, "desc", cJSON_CreateString(""));
cJSON_AddItemToObject(json_default_policy, "timePolicy", timePolicy);
cJSON_AddItemToObject(timePolicy_root, "action", cJSON_CreateString("ALLOW"));
cJSON_AddItemToObject(timePolicy_root, "dayType", cJSON_CreateString("CUSTOM"));
cJSON_AddItemToObject(timePolicy_root, "title", cJSON_CreateString("all"));
cJSON_AddItemToObject(timePolicy_root, "weekDays", weekDays);
while (weekDay<=7)
{
cJSON_AddItemToArray(weekDays,cJSON_CreateNumber(weekDay));
weekDay++;
}
cJSON_AddItemToObject(timePolicy_root, "interval", interval_root);
cJSON_AddItemToObject(interval_root, "end", end_root);
cJSON_AddItemToObject(end_root, "hour", cJSON_CreateString("23"));
cJSON_AddItemToObject(end_root, "minute", cJSON_CreateString("59"));
cJSON_AddItemToObject(end_root, "second", cJSON_CreateString("59"));
cJSON_AddItemToObject(interval_root, "start", start_root);
cJSON_AddItemToObject(start_root, "hour", cJSON_CreateString("00"));
cJSON_AddItemToObject(start_root, "minute", cJSON_CreateString("00"));
cJSON_AddItemToObject(start_root, "second", cJSON_CreateString("59"));
cJSON_AddItemToObject(json_default_policy, "personIds", personIds);
cJSON_AddItemToObject(json_default_policy, "id", cJSON_CreateString("default"));
cJSON_AddItemToObject(json_default_policy, "passModes", passModes);
cJSON_AddItemToArray(passModes,cJSON_CreateString("FACE"));
cJSON_AddItemToArray(passModes,cJSON_CreateString("IC"));
cJSON_AddItemToArray(passModes,cJSON_CreateString("PASSWORD"));
cJSON_AddItemToArray(timePolicy, timePolicy_root);
req_body_str = cJSON_Print(json_default_policy);
printf("%s\r\n",req_body_str);
這種方法使用JSON的介面,根據JSON串一條一條的創建比較繁瑣,
直接使用字串操作進行創建并保存
int device_data_write_default_pass_rules()
{
int ret = 0;
int fd = -1;
int policy_fd = -1;
char fullname[128];
char policy_fullname[128];
char str[] = {"[{\"action\":\"ALLOW\",\"customDays\":[2, 3, 4, 5, 6, 7, 1],\"dayType\": \"CUSTOM\",\
\"timeRange\":{\"end\":{\"hour\":\"23\",\"minute\":\"59\",\"second\":0},\"start\":{\"hour\":\"00\",\
\"minute\":\"00\",\"second\":0}},\"title\":\"default\",\"type\":\"CYCLE\"}]}"};
char dpolicy[] = {"{\"name\":\"default\",\"desc\":\"\",\"timePolicy\":[{\"action\":\"ALLOW\",\"dayType\":\"CUSTOM\",\
\"title\":\"all\",\"type\":\"CYCLE\",\"weekDays\":[2, 3, 4, 5, 6, 7, 1],\"interval\":{\"end\":{\"hour\":\
\"23\",\"minute\":\"59\",\"second\":\"59\"},\"start\":{\"hour\":\"00\",\"minute\":\"00\",\"second\":\"59\"}}}],\
\"personIds\":[],\"id\":\"default\",\"passModes\":[\"FACE\",\"IC\",\"PASSWORD\"]}"};
#ifdef WIN32
sprintf(fullname, "%s\\%s", DEVICE_CONFIG_PATH, CONF_POLICY_DEVICE_RULES_FILENAME);
#else
sprintf(fullname, "%s/%s", DEVICE_CONFIG_PATH, CONF_POLICY_DEVICE_RULES_FILENAME);
sprintf(policy_fullname, "%s/%s", DEVICE_POLICY_CONFIG_PATH, CONF_PERSON_POLICY_FILENAME);
#endif
fd = aos_open(fullname, O_RDWR | O_CREAT | O_TRUNC);
if (fd < 0) {
ret = -1;
goto exit;
}
if(aos_write(fd, str, sizeof(str)) != sizeof(str))
{
ret = -1;
goto exit;
}
policy_fd = aos_open(policy_fullname, O_RDWR | O_CREAT | O_TRUNC);
if (policy_fd < 0) {
ret = -1;
goto exit;
}
if(aos_write(policy_fd, dpolicy, sizeof(dpolicy)) != sizeof(dpolicy))
{
ret = -1;
goto exit;
}
exit:
if(fd >= 0){
aos_close(fd);
}
if(policy_fd >= 0){
aos_close(policy_fd);
}
return ret;
}
這種方法直接將字串保存為JSON檔案,方便快捷
char dpolicy[] = {"{\"name\":\"default\",\"desc\":\"\",\"timePolicy\":[{\"action\":\"ALLOW\",\"dayType\":\"CUSTOM\",\
\"title\":\"all\",\"type\":\"CYCLE\",\"weekDays\":[2, 3, 4, 5, 6, 7, 1],\"interval\":{\"end\":{\"hour\":\
\"23\",\"minute\":\"59\",\"second\":\"59\"},\"start\":{\"hour\":\"00\",\"minute\":\"00\",\"second\":\"59\"}}}],\
\"personIds\":[],\"id\":\"default\",\"passModes\":[\"FACE\",\"IC\",\"PASSWORD\"]}"};
字串的寫法,要在引號的內容內將"作為字串需要加\,也就\",換行的時候用兩條反斜杠\\,而且在JOSN不需要寫成JSON串的排版,只要內容對就行,決議的時候會自動排版
C語言的一些知識
列印占用的位元組數大小用%d,sizeof()回傳的是整形
printf(“size is %d\r\n”,sizeof(dpolicy));
結構體也可以作為函式回傳值

Makefile的相關知識
Makefile主要在大的專案中用來判斷哪些檔案需要編譯,哪些檔案不需要編譯,現在我的水平只會根據實際水平進行修改,還不會完全寫,這里分享一個makefile,
NAME := XX
$(NAME)_MBINS_TYPE := app
$(NAME)_VERSION := 1.0.1
$(NAME)_SUMMARY := XX
$(NAME)_SOURCES := app_main.c
$(NAME)_COMPONENTS += osal_aos osal_posix littlevGL bootpara cli flash led vfs debug openmax ifv kv fatfs cjson \
mbedtls http libiot_mqtt alicrypto minizip libjpeg usrcmds ota_process libg711 debug_perf
GLOBAL_DEFINES += AOS_NO_WIFI
$(NAME)_INCLUDES += ./ \
./smart_dev \
./imageusbtask \
./imagetask \
./qspi_flash \
./test_hist \
./uart_task \
./user_task \
./gpio \
./dev_mgnt \
./iad/dal/ ./iad/devicedb/ ./iad/webapi/ ./iad/xmesh/ ./iad/ctrl/ \
$(NAME)_SOURCES += ./*.c \
./smart_dev/*.c \
./imageusbtask/*.c \
./imagetask/*.c \
./qspi_flash/*.c \
./test_hist/*.c \
./uart_task/*.c \
./user_task/*.c \
./dev_mgnt/*.c \
./gpio/*.c \
./iad/dal/*.c \
./iad/devicedb/*.c \
./iad/ctrl/*.c \
./iad/webapi/*.c \
./iad/xmesh/*.c \
./imageusbtask/*.c \
./lv_user_api/*.c
$(NAME)_INCLUDES += ./face_task/ \
./ui_task/ \
./ui_task/ui_activity/ \
./ui_task/ui_lv_obj/ \
./ui_task/ui_resources/ \
./ui_task/ui_theme/ \
./ui_task/lvgl_app/ \
$(NAME)_SOURCES += ./face_task/*.c
$(NAME)_SOURCES += ./ui_task/*.c \
./ui_task/ui_activity/*.c \
./ui_task/ui_lv_obj/*.c \
./ui_task/ui_resources/*.c \
./ui_task/ui_theme/*.c \
./ui_task/lvgl_app/*.c
$(NAME)_INCLUDES += ./ui_middleware/ \
$(NAME)_SOURCES += ./ui_middleware/*.c
$(NAME)_SOURCES += ./analysislog/*.c
GLOBAL_INCLUDES += ./ ./imagetask/
GLOBAL_INCLUDES += ../../../include/utility/debug_tools
GLOBAL_INCLUDES += ./iad/dal/
GLOBAL_INCLUDES += ./iad/devicedb/
GLOBAL_INCLUDES += ./iad/webapi/
GLOBAL_INCLUDES += ./iad/xmesh/
GLOBAL_INCLUDES += ./analysislog
GLOBAL_INCLUDES += ../../../components/peripherals/iot_comm_module
GLOBAL_INCLUDES += ./imageusbtask/ ./lv_user_api/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289775.html
標籤:其他
