MQTT项目过程

1. 学习json格式

遇到问题:
在这里插入图片描述
解决办法:https://www.cnblogs.com/IC1101/p/14749722.html
https://www.cnblogs.com/txwtech/p/14542991.html

Linux下,unzip 文件夹名,解压zip压缩包

安装好cjson的库后
遇到的问题
在这里插入图片描述
解决办法
https://blog.csdn.net/weixin_37569048/article/details/89402043
cjsoncJSON库的学习和使用
https://blog.csdn.net/Jason_Math/article/details/123523352

2. C语言ini形式配置文件解析库——iniparser

(为什么要使用iniparser库)https://blog.csdn.net/makunIT/article/details/107209915

https://blog.csdn.net/LANB0/article/details/50718507?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase

阿里云产品创建
https://www.cnblogs.com/happybirthdaytoyou/p/14065294.html
在这里插入图片描述
在这里插入图片描述
【MQTT】在Linux使用MQTT上报温度到阿里云
https://www.cnblogs.com/Ye-Wei/p/16728604.html

遇到的问题
1.在这里插入图片描述
无法分配内存
原因:loop_start()之后没有及时public信息,到时

3. json格式解析

要解析JSON数据,通常有两种常见方法:使用现有的JSON库或手动解析JSON字符串。
使用现有的JSON库可以大大简化任务,并提供更高级的功能。以下是一个使用 cJSON 库解析JSON的示例:

#include <stdio.h>
#include <stdlib.h>
#include <cjson/cJSON.h>

int main() {
    const char* json_string = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";

    // 解析JSON字符串
    cJSON* root = cJSON_Parse(json_string);
    if (!root) {
        printf("Failed to parse JSON: %s\n", cJSON_GetErrorPtr());
        return 1;
    }

    // 获取名为 "name" 的字符串值
    cJSON* name_item = cJSON_GetObjectItemCaseSensitive(root, "name");
    if (cJSON_IsString(name_item) && (name_item->valuestring != NULL)) {
        printf("Name: %s\n", name_item->valuestring);
    }

    // 获取名为 "age" 的数值
    cJSON* age_item = cJSON_GetObjectItemCaseSensitive(root, "age");
    if (cJSON_IsNumber(age_item)) {
        int age = age_item->valueint;
        printf("Age: %d\n", age);
    }

    // 获取名为 "city" 的字符串值
    cJSON* city_item = cJSON_GetObjectItemCaseSensitive(root, "city");
    if (cJSON_IsString(city_item) && (city_item->valuestring != NULL)) {
        printf("City: %s\n", city_item->valuestring);
    }

    // 释放JSON对象资源
    cJSON_Delete(root);

    return 0;
}

在此示例中,我们使用 cJSON 库来解析 JSON 字符串。首先,我们调用 cJSON_Parse 函数来解析 JSON 字符串。
在 cJSON_GetObjectItemCaseSensitive 函数中,我们通过指定键名来获取相应的 JSON 元素。然后,我们可以使用 cJSON_IsString、cJSON_IsNumber 等函数检查元素的类型,并使用 valuestring、valueint 等字段访问相应的值。
最后,我们使用 cJSON_Delete 函数释放 JSON 对象的资源。
请注意,以上示例只是一个简单的演示,可能无法处理所有不同的 JSON 结构和数据类型。在实际项目中,你可能需要进一步处理错误和处理复杂的 JSON 数据结构。同时,还有其他的JSON库可供选择,如json-c、Jansson等,你可以根据项目的具体需求选择合适的JSON库来进行解析。

在 cJSON 库中,cJSON_GetObjectItemCaseSensitive() 返回的不是一个结构体指针,而是一个 cJSON 对象指针。
cJSON 对象是 cJSON 库中的一个结构体,代表一个 JSON 数据对象。它定义在 cJSON.h 头文件中,并具有以下结构:

typedef struct cJSON {
    struct cJSON *next;
    struct cJSON *prev;
    struct cJSON *child;

    int type;

    char *valuestring;
    int valueint;
    double valuedouble;
    // ...
} cJSON;

cJSON_GetObjectItemCaseSensitive() 函数返回一个指向 cJSON 对象的指针,该对象代表了指定键的值。您可以使用该指针来访问该对象的各个属性,如 type、valuestring、valueint 等等,以获得有关该 JSON 值的信息。
以下是一个示例代码片段,演示如何使用 cJSON_GetObjectItemCaseSensitive() 获得 cJSON 对象以及访问其属性:

cJSON *root = cJSON_Parse(json_string);

// 从 cJSON 对象中获取键为 "STATUS" 的值
cJSON *status_item = cJSON_GetObjectItemCaseSensitive(root, "STATUS");

if (status_item != NULL && cJSON_IsNumber(status_item))
{
    // 处理找到的值
    int status_value = status_item->valueint;
    printf("STATUS: %d\n", status_value);
}
else
{
    // 处理未找到值的情况
    printf("Failed to find STATUS value.\n");
}

// 释放 cJSON 对象
cJSON_Delete(root);

在这个示例中,cJSON_GetObjectItemCaseSensitive() 返回一个指向 STATUS 键对应值的 cJSON 对象指针。我们可以使用 status_item 对象的属性,如 valueint,来访问值的具体信息。
感谢您的指正,并对之前的误导表示歉意。如果您还有其他问题,请随时提问。

if (cJSON_IsString(name_item) && (name_item->valuestring != NULL))解析一下这句
这一句是用来判断 JSON 元素 name_item 的类型是否是字符串,并且确保 valuestring 字段不为空。
cJSON_IsString(name_item) 条件检查确保 name_item 是一个字符串类型的 JSON 元素。如果是字符串类型,则条件为真,进入下一个条件判断。
name_item->valuestring != NULL 条件检查确保 valuestring 字段不为空。valuestring 是一个包含字符串值的指针,如果指针不为空,则条件为真。
通过使用这两个条件判断,可以确保 name_item 是有效的字符串类型,并且字符串的值不为空。
可以使用类似的方式来检查其他 JSON 数据类型,例如 cJSON_IsNumber 来检查一个元素是否为数值类型,cJSON_IsArray 来检查一个元素是否为数组类型,以此类推。
这样的条件判断可以在解析 JSON 数据时确保正确处理不同类型的数据,避免访问无效的或未定义的值。

valuestring 是 cJSON 库中 JSON 字符串类型元素的字段之一。它是一个指向字符串值的指针(char* 类型),可以通过访问该字段来获取 JSON 元素中的字符串值。
当你使用 cJSON 库解析 JSON 数据时,如果一个元素的类型是字符串类型,你可以通过 cJSON_GetObjectItem 或类似的函数来获取该元素的指针,然后通过访问 valuestring 字段来获取字符串值。
例如,假设有 JSON 数据如下:

{
  "name": "John",
  "age": 30,
  "city": "New York"
}

你可以使用 cJSON 库解析该 JSON 数据,并获取字符串元素的值:

// 假设 root 是解析后的 JSON 对象
cJSON* name_item = cJSON_GetObjectItem(root, "name");
if (name_item != NULL && cJSON_IsString(name_item)) {
    const char* name = name_item->valuestring;
    printf("Name: %s\n", name);
}

在这个例子中,我们使用 cJSON_GetObjectItem 函数获取键名为 “name”
的元素,并确认它是一个字符串类型元素。然后我们通过访问 valuestring 字段获取该字符串的值,保存在名为 name
的变量中,并打印出它的值。 需要注意的是,valuestring 字段指向一个内部存储字符串值的缓冲区,你应该避免在释放 cJSON
对象之前访问或修改该字符串值,以免发生未定义的行为。

cJSON_GetObjectItem 函数用于获取 JSON 对象中指定键名的元素。
函数原型如下:

cJSON* cJSON_GetObjectItem(const cJSON* object, const char* string);

参数说明:

  1. object:要从中获取元素的 JSON 对象。
  2. string:要获取的键名字符串。

函数返回一个指向找到的 JSON 元素的指针,如果未找到元素,则返回 NULL。
以下是一个示例用法:

#include <stdio.h>
#include <stdlib.h>
#include <cjson/cJSON.h>

int main() {
    const char* json_string = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";

    // 解析 JSON 字符串
    cJSON* root = cJSON_Parse(json_string);
    if (!root) {
        printf("Failed to parse JSON: %s\n", cJSON_GetErrorPtr());
        return 1;
    }

    // 使用 cJSON_GetObjectItem 获取指定键名的元素
    cJSON* name_item = cJSON_GetObjectItem(root, "name");
    if (name_item != NULL && cJSON_IsString(name_item)) {
        printf("Name: %s\n", name_item->valuestring);
    }

    cJSON* age_item = cJSON_GetObjectItem(root, "age");
    if (age_item != NULL && cJSON_IsNumber(age_item)) {
        printf("Age: %d\n", age_item->valueint);
    }

    cJSON* city_item = cJSON_GetObjectItem(root, "city");
    if (city_item != NULL && cJSON_IsString(city_item)) {
        printf("City: %s\n", city_item->valuestring);
    }

    // 释放 JSON 对象资源
    cJSON_Delete(root);

    return 0;
}

在此示例中,我们首先调用 cJSON_Parse 解析 JSON 字符串,然后使用 cJSON_GetObjectItem 分别获取键名为 “name”、“age” 和 “city” 的元素。
通过检查返回的指针是否为空,并使用 cJSON_IsString 和 cJSON_IsNumber 函数进行类型检查,我们可以确保获取到的元素是有效的,并可以正确地获取其中的值。
请注意,以上示例只是一个简单示例,可能无法处理所有不同的 JSON 结构和数据类型。在实际项目中,你可能需要进一步处理错误和处理复杂的 JSON 数据结构。同时,还有其他的 JSON 库可供选择,你可以根据项目的具体需求选择合适的 JSON 库来进行解析。

cJSON_GetObjectItemCaseSensitivecJSON_GetObjectItem 都是用于获取 JSON 对象中指定键名的元素的函数,但它们有一些区别:

1. 大小写敏感性:

cJSON_GetObjectItemCaseSensitive
函数是大小写敏感的,它要求键名必须与 JSON
对象中的键名完全匹配,包括大小写。 cJSON_GetObjectItem
函数是大小写不敏感的,它会忽略键名的大小写,在查找键名时会进行比较不区分大小写。

2. 返回值:

cJSON_GetObjectItemCaseSensitive
函数如果找到了指定键名的元素,则返回该元素的指针;如果未找到,则返回NULL。
cJSON_GetObjectItem
函数在查找键名时优先考虑大小写完全匹配,如果找到了大小写完全匹配的键名元素,则返回该元素的指针;如果未找到完全匹配的键名元素,它会再进行一次不区分大小写的查找,如果找到了不区分大小写的键名元素,则返回该元素的指针;如果未找到任何匹配的键名元素,则返回NULL。

一般来说,如果在解析 JSON 数据时要求键名严格匹配大小写,可以使用cJSON_GetObjectItemCaseSensitive;如果键名的大小写不确定,或者希望忽略键名的大小写进行查找,可以使用 cJSON_GetObjectItem。根据具体需求选择适合的函数来获取 JSON 对象中的元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值