跳转至

ESP01S 进行 MQTT 通信 发送 JSON 字符串遇到的问题

项目说明

最近将记录一些使用 ESP01S 遇到的问题和解决思路。所有文章中所提及的工具和代码均整理免费分享。

手机上可以点击下方的右上角复制,然后软件就可以自动打开了。在获取的网盘链接中找到编号 B007 的项目资料。

我用夸克网盘给你分享了「32项目集」,点击链接或复制整段内容,打开「夸克APP」即可获取。 /~58423bH72w~:/ 链接:https://pan.quark.cn/s/0d502be9f165
网页上可以点击链接:https://pan.quark.cn/s/0d502be9f165

有问题可以展开联系我

微信号:Qhua_Li7

使用 STA 的工作模式,串口连接 STM32,代码在文件夹Stm32Code中,和笔记序号一致。

使用的固件是 (1471)ESP8266-AT-1M.bin。

说明一下,ESP01S接的是串口3,调试打印接的是串口1。

本篇文章说明一下,我在使用 MQTT 想要发送 JSON 字符串时遇到的问题,主要就是代码转义。

代码设计

为了通过 ESP01S 的 AT+MQTTPUB 命令发送 JSON 数据,需要处理 C 语言转义 → AT 指令转义 两层转换。

比如我们现在有一个目标发送格式

{"roll":"12.34","pitch":"56.78"}

JSON 整体作为 AT+MQTTPUB 的第三个参数,参数内双引号和逗号必须用 \ 转义,写成\"和\,:

AT+MQTTPUB=0,"ESP01S/angles","{\"roll\":\"12.34\"\,\"pitch\":\"56.78\"}",0,0

然后在 C 语言中,我们要把上面这条指令写成字符串,那么这个字符串中的双引号和\需要用 \ 转义,写成\"和\\,为什么C语言中不用再把,转义一遍,因为那只是AT+MQTTPUB中的转义要求,不是C的转义要求,C中我们的转义只要能获得上面的字符串就可以。就需要如此写入:

sprintf(mqtt_put_message,
"AT+MQTTPUB=0,\"ESP01S/angles\",\"{\\\"roll\\\":\\\"12.34\\\"\\,\\\"pitch\\\":\\\"56.78\\\"}\",0,0")

为了方便看,我做了换行,换行可以在换行头尾加上"表示续接字符串。 也就是下面这种状态了。

1
2
3
4
5
6
7
8
9
    // 上报状态信息
    sprintf(mqtt_put_message,
        "AT+MQTTPUB=0,\"ESP01S/angles\","
        "\"{\\\"roll\\\":\\\"%.2f\\\""
        "\\,\\\"pitch\\\":\\\"%.2f\\\"}\","
        "0,0\r\n",
        12.34, 56.78); 
    esp_at_cmd(&esp01s_device, mqtt_put_message , "OK", 2000);  
    printf("AT+MQTTSUB resp: %s\n", esp01s_device.resp_buf); 

所以上面这条信息,真的发送出去的时候就是如下,然后你把这个发送到ESP01S中后,他会再转义一遍有\的部分

AT+MQTTPUB=0,"ESP01S/angles","{\"roll\":\"12.34\"\,\"pitch\":\"56.78\"}",0,0

最后发送到服务器就是:

{"roll":"12.34","pitch":"56.78"}