尘世- 2024-04-21 21:48 采纳率: 80%
浏览 25
已结题

基于单片机的阿里云的物联网开发,用STM32F103C8T6集成MQTT协议进行数据传输,整型布尔都能上传,字符转也可以但是,数组不行,具体上传格式如下

基于单片机的阿里云的物联网开发,用STM32F103C8T6集成MQTT协议进行数据传输,整型布尔都能上传,字符转也可以但是,数组不行,具体上传格式如下

    u3_printf("AT+MQTTPUB=0,\"%s\",\"{\\\"method\\\":\\\"thing.event.property.post\\\"\\,\\\"params\\\":{\\\"%s\\\":%d\\,\\\"%s\\\":%d\\,\\\"%s\\\":%d\\,\\\"%s\\\":%d\\,\\\"%s\\\":\\\"%s\\\"}}\",0,0\r\n",pubtopic,func1,Temperature,func2,Shidu,func3,Lock,func4,Switch2,func6,User_table.Table_Mame);
    //while(RECS[0]);//等待ESP返回数据
    Delay_ms_es8266(200);//延时等待数据接收完成
    u3_printf("AT+MQTTPUB=0,\"%s\",\"{\\\"method\\\":\\\"thing.event.property.post\\\"\\,\\\"params\\\":{\\\"%s\\\":%d}}\",0,0\r\n",pubtopic,func5,User_table.Table_ID);
    Delay_ms_es8266(200);//延时等待数据接收完成
    u3_printf("AT+MQTTPUB=0,\"%s\",\"{\\\"method\\\":\\\"thing.event.property.post\\\"\\,\\\"params\\\":{\\\"%s\\\":%d}}\",0,0\r\n",pubtopic,func7,MyRTC_Time[0]);
    Delay_ms_es8266(200);//延时等待数据接收完成
    u3_printf("AT+MQTTPUB=0,\"%s\",\"{\\\"method\\\":\\\"thing.event.property.post\\\"\\,\\\"params\\\":{\\\"%s\\\":%d}}\",0,0\r\n",pubtopic,func8,MyRTC_Time[0]);
    Delay_ms_es8266(200);//延时等待数据接收完成
    if(strcmp(RECS,"ERROR")==0)

请问谁用过相似开发,上传数组用什么格式和数据类型,阿里云支持数组的解析但是不行

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-21 21:48
    关注

    引自免费微信小程序:皆我百晓生

    在基于STM32F103C8T6的阿里云IoT开发中,你需要将数组转换成JSON字符串格式再通过MQTT协议发送。由于你提供的代码片段是使用了某种特定的串口通信库(可能是u3_printf),所以我将提供一个基本的示例,然后你需要根据你实际使用的库进行调整。

    首先,确保你的项目已经包含了处理JSON字符串的库,例如cJSON。如果你还没有添加,可以从GitHub上获取:https://github.com/kbranigan/cJSON

    接下来,我们将创建一个函数,用于将数组转换为JSON字符串。这里我们假设你有一个包含四个整数的数组int array[4];

    步骤1: 添加cJSON库

    将cJSON库文件添加到你的项目中,例如cJSON.ccJSON.h

    步骤2: 编写数组转JSON的函数

    #include "cJSON.h"
    
    char* arrayToJson(int array[], int size) {
        cJSON *root = cJSON_CreateObject();
        cJSON *params = cJSON_CreateArray();
    
        for (int i = 0; i < size; ++i) {
            cJSON *item = cJSON_CreateNumber(array[i]);
            cJSON_AddItemToArray(params, item);
            cJSON_Free(item);  //释放内存
        }
    
        cJSON_AddItemToObject(root, "array", params);
    
        char *json_str;
        cJSON_PrintUnformatted(root, &json_str);  //将JSON对象转换为字符串
    
        cJSON_Delete(root);  //删除JSON对象以释放内存
    
        return json_str;
    }
    

    步骤3: 在主程序中使用这个函数

    // ...其他初始化代码...
    
    const char* pubtopic = "your_topic";
    const char* func1 = "Temperature";
    const char* func2 = "Shidu";
    const char* func3 = "Lock";
    const char* func4 = "Switch2";
    const char* func5 = "Table_ID";
    const char* func6 = "Table_Mame";
    const char* func7 = "My_RTC_Time";
    const char* func8 = "My_RTC_Time";
    
    int array[4] = {1, 2, 3, 4};  //你的数组
    
    char* json_array = arrayToJson(array, sizeof(array) / sizeof(array[0]));
    
    u3_printf("AT+MQTTPUB=0,\"%s\",\"{%q:\\n\\t%s\\n}\",0,0\r\n", pubtopic,
              func9, json_array);  //func9是你用来存储数组的键名
    Delay_ms_es8266(200);  //延时等待数据接收完成
    
    free(json_array);  //释放JSON字符串占用的内存
    
    if(strcmp(RECS,"ERROR")==0) {
        //... 处理错误...
    }
    
    // ...其他代码...
    

    在这个例子中,我们创建了一个名为func9的键,并将其值设置为包含数组的JSON对象。注意,由于你提到你的库可能不支持多行字符串,所以在这里使用了\n\t来缩进,以提高可读性。你可能需要根据实际情况调整这些细节。

    最后,别忘了在main()函数开始处包含必要的头文件,并在适当的地方调用arrayToJson()函数。

    请注意,这个答案假定你的硬件平台、串口库和MQTT客户端都是正常的,并且能正确地发送和接收数据。如果你在实际应用中遇到任何问题,可能需要检查这些部分的配置。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月30日
  • 已采纳回答 4月22日
  • 创建了问题 4月21日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀