单片机stm32使用ESP8266MQTT AT指令发送json字符串

2023-11-15

一、问题描述

    基于文章<单片机stm32使用rt-thread软件包at-device的AT指令>,测试发现使用MQTT AT指令发送主题信息时,直接发送字符串正常,发送json字符串时出问题,提示错误。数据格式的区别如下:

"%s"//正常发送
"\"%s\""//提示错误有,发送失败

二、解决办法

    查看文档,发现指令AT+MQTTPUBRAW:发布 MQTT 消息(二进制),该指令格式如下:

AT+MQTTPUBRAW=<LinkID>,<"topic">,<length>,<qos>,<retain>

6eb7ee7cdc65693f722b16659d74ff5c.png

参数:

<LinkID>:当前仅支持 link ID 0。

<topic>:MQTT topic,最大长度:128 字节。

<length>:MQTT 消息长度,不同 ESP 设备的最大长度不同:

对于 ESP32 设备:最大长度受到可利用内存的限制;

对于 ESP8266 设备,最大长度受到可利用内存和 MQTT_BUFFER_SIZE_BYTE 宏的限制。该宏的默认值为 512,可在 build.py menuconfig 中设置它的值,以此更改对最大长度的限制。该宏的值 = 消息的最大长度 + MQTT 报头长度(取决于 topic 名称的长度)。

<qos>:发布消息的 QoS,参数可选 0、1、或 2,默认值:0。

<retain>:发布 retain。

三、代码修改

修改代码如下:

#include <rtthread.h>
#include <rtdevice.h>
#include <at.h>
#include <at_device.h>
#include <at_log.h>


#define AT_SEND_MQTT_CMD(client, resp, cmd)                                 \
    do {                                                                   \
        (resp) = at_resp_set_info((resp), 256, 0, 10 * RT_TICK_PER_SECOND); \
        if (at_obj_exec_cmd((client), (resp), (cmd)) < 0)                  \
        {                                                                  \
            result = -RT_ERROR;                                            \
            goto __exit;                                                   \
        }                                                                  \
    } while(0)                                                             \


//mqtt 发布主题,测试不同的信息,看是否可以正常发布json信息
static int mqtt_at_send(int argc, char **argv)
{
    rt_uint8_t retry_num=3;
    at_response_t resp = RT_NULL;
    int result=-RT_ERROR;
    int i=0;
    at_client_t client=RT_NULL;
    struct at_device *device = RT_NULL;


    device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, "esp0");
    if(device == RT_NULL)
    {
        rt_kprintf("no find esp0.\r\n");
        return -1;
    }
    client=device->client;
    resp = at_create_resp(128, 0, 10 * RT_TICK_PER_SECOND);
    if (resp == RT_NULL)
    {
        rt_kprintf("no memory for resp create.\r\n");
        return -1;
    } 
    while (retry_num--)
    { 


            if(argc == 1)//字符串发送
            {
                /*mqtt pubTopic*/
                //AT_SEND_MQTT_CMD(client, resp, "AT+MQTTPUB=0,\"testTopic1\",\"{\"testTopic1\":\"data_test1\"}\",0,0");
                AT_SEND_MQTT_CMD(client, resp, "AT+MQTTPUB=0,\"testTopic1\",\"test123456\",0,0");
            }
            else if(argc == 2)//字符串发送
            {
                AT_SEND_MQTT_CMD(client, resp, "AT+MQTTPUB=0,\"testTopic1\",\"{key0:data_test1}\",0,0");
                
            }
            else if(argc == 3)//二进制发送信息
            {
//                if (at_obj_exec_cmd(client, at_resp_set_info(resp, 128, 0, 20 * RT_TICK_PER_SECOND),
//                    "AT+MQTTPUB=0,\"testTopic1\",\"%s%s\",0,0", argv[1], argv[2]) != RT_EOK)
//                {
//                    LOG_D("device send failed.\r\n");
//                }
                
                    AT_SEND_MQTT_CMD(client, resp, "AT+MQTTPUBRAW=0,\"testTopic1\",30,0,0");
                    /* show pubTopic message */
//                    for (i = 0; i < resp->line_counts - 1; i++)
//                    {
//                        LOG_D("%s", at_resp_get_line(resp, i + 1));
//                    }
                    rt_device_write(client->device,0,"{\"key0\":\"data_test1\",\"key1\":1}",rt_strlen("{\"key0\":\"data_test1\",\"key1\":1}"));
                        
                
            }
            
                
                /* show pubTopic message */
            for (i = 0; i < resp->line_counts - 1; i++)
            {
                LOG_D("%s", at_resp_get_line(resp, i + 1));
            }       
        //rt_thread_mdelay(5000);
        /* initialize successfully  */
        result = RT_EOK;
        break;




    __exit:
        if (result != RT_EOK)
        {
            rt_thread_mdelay(1000);
            rt_kprintf("%s device send retry...", device->name);
        }
    }
    if (resp)
    {
        at_delete_resp(resp);
    }
    if(result != RT_EOK)
    {
        return -1;
    }
    return 0;
    
}
MSH_CMD_EXPORT(mqtt_at_send, esp8266 mqtt at send message);


static int esp8266_mqtt_at_init(void)
{
    rt_uint8_t retry_num=3;
    at_response_t resp = RT_NULL;
    int result=-RT_ERROR;
    int i=0;
    at_client_t client=RT_NULL;
    struct at_device *device = RT_NULL;


    device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, "esp0");
    if(device == RT_NULL)
    {
        rt_kprintf("no find esp0.\r\n");
        return -1;
    }
    client=device->client;
    resp = at_create_resp(128, 0, 10 * RT_TICK_PER_SECOND);
    if (resp == RT_NULL)
    {
        rt_kprintf("no memory for resp create.\r\n");
        return -1;
    }
    while (retry_num--)
    { 
        /* mqtt para  */
        AT_SEND_MQTT_CMD(client, resp, "AT+MQTTUSERCFG=0,1,\"123cli\",\"\",\"\",0,0,\"\"");
        rt_thread_mdelay(3000);
        /* mqtt connect para*/
        AT_SEND_MQTT_CMD(client, resp, "AT+MQTTCONNCFG=0,120,0,\"lwt_topic\",\"lwt_msg\",0,0");
        rt_thread_mdelay(3000);
        /* mqtt connect */
        AT_SEND_MQTT_CMD(client, resp, "AT+MQTTCONN=0,\"47.107.99.203\",1883,1");
        /* show connect info */
        for (i = 0; i < resp->line_counts - 1; i++)
        {
            rt_kprintf("%s", at_resp_get_line(resp, i + 1));
        }
        //rt_thread_mdelay(5000);
        /*mqtt subTopic*/ 
        AT_SEND_MQTT_CMD(client, resp, "AT+MQTTSUB=0,\"testTopic1\",0");
        rt_thread_mdelay(3000);
        /* initialize successfully  */
        result = RT_EOK;
        break;


    __exit:
        if (result != RT_EOK)
        {
            rt_thread_mdelay(1000);
            rt_kprintf("%s device initialize retry...", device->name);
        }
    }
    if (resp)
    {
        at_delete_resp(resp);
    }
    if(result != RT_EOK)
    {
        return -1;
    }
    return 0;
    
}
//mqtt 参数初始化,订阅主题
void mqtt_at_init(int argc, char **argv)
{
    int result=-1;
    result = esp8266_mqtt_at_init();


    if (result!=RT_EOK)
    {
        rt_kprintf("mqtt at cmd err.\r\n");
    }
}
MSH_CMD_EXPORT(mqtt_at_init, esp8266 mqtt at cmd demo);

四、测试结果

4a884986c7929f48744d9ef9915c25a7.png

欢迎关注个人公众号:嵌入式学习与实践

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机stm32使用ESP8266MQTT AT指令发送json字符串 的相关文章

  • 如何在notepad++中格式化JSON

    我想在记事本 中格式化JSON字符串 请指导我该怎么做 我研究了这个解决方案记事本 JSON 格式 https stackoverflow com questions 1560464 how to reformat json in note
  • 如何在 REST WCF 服务中接受任意 JSON 对象?

    我想实现这样的服务方法 OperationContract WebInvoke RequestFormat WebMessageFormat Json ResponseFormat WebMessageFormat Json public
  • 替换 JSON 中的转义字符

    我想用空格替换 JSON 字符串中的 字符 我怎样才能做到这一点 我发现从 JSON 字符串中删除所有转义字符的最简单 最好的方法是将字符串传递到正则表达式 Unescape 方法 此方法返回一个没有转义字符的新字符串 甚至删除了 n t
  • 使用 PHP 和 jSON 从 MySQL 获取 UIImage

    我正在开发一个小型新闻阅读器 它通过对 URL 执行 POST 请求来从网站检索信息 响应是一个带有未读新闻的 JSON 对象 例如 应用程序上的最新新闻的时间戳为 2013 03 01 当用户刷新表时 它会发布 domain com ap
  • 将文件读取为 JSON

    我想读取几个文件 index html style css main js 来创建用于上传的 JSON 有效负载 我知道使用 Nodejs 我可以开始创建我想要的东西 如下所示 var fs require fs fs readFile i
  • MongoDB 和 Mongoose 访问一个数据库,同时针对另一个数据库进行身份验证(NodeJS、Mongoose)

    我有几个数据库 不想为每个数据库创建单独的用户帐户 MongoDB 支持使用另一个数据库中定义的帐户来验证对数据库的访问的概念 但语法示例很难获得 当我终于弄清楚时 我正准备提出一个问题 如果它对其他人有帮助 就放在这里 这是 mongod
  • 加密 mongodb 中的密码字段

    我有以下代码 它插入userName and password进入数据库 但密码以纯文本格式存储 我的意思是 当我查看数据库时 我可以看到插入的密码 我想存储password in encrypted format MongoClient
  • 从 JSON 数组创建标记 php mySQL Google Maps v2 android

    我正在尝试从 mySQL 数据库在 Google Maps v2 上创建标记 但它不起作用 地图确实出现了 但没有标记 谁能告诉我出了什么问题以及我需要改变什么 我也尝试过让 getDouble 为 getDouble 0 和 getDou
  • 当字段不为空时创建部分索引

    我正在尝试在字段上创建部分索引 但仅当该字段不为空时 换句话说 我希望能够让许多文档能够存储 null 但对于在字段中实际具有值的文档 我希望该值是唯一的 这是我尝试使用的代码 db account createIndex email 1
  • mongo objectid“包含”查询

    我想查询 MongoDB 数据库中的集合以查找包含部分 ObjectID 的所有记录 对于普通字符串 我可以使用如下正则表达式 db teams find some string 51eed 但是我该如何对 ObjectID 执行类似的操作
  • 如何以 JSON-LD 返回 SPARQL 结果?

    返回 SPARQL 查询结果的好方法是什么JSON LD http www w3 org TR 2014 REC json ld 20140116 最好靠近标准化 JSON 格式 http www w3 org TR 2013 REC sp
  • 更新插入 MongoDB 时如何防止出现“_t”字段?

    我有一个应用程序 它使用 MongoDB 的 C 驱动程序将 Upsert 插入 MongoDB 数据库 当我打电话给Update函数 我无法指定我要更新的类型 然后 t字段插入元素的类型 这是我用来更新插入的代码 collection U
  • com.fasterxml.jackson.databind.JsonMappingException:无法反序列化 org.springframework.data.domain.Sort 的实例 START_ARRAY 令牌

    我的 objectMapper 正在获取类型的值Page
  • 使用 AWS MSK 连接器连接到 AWS VPC 内的 MongoDB atlas

    我正在尝试使用MongoDB使用更改流Kafka 我选择 AWS MSK 是因为我的整个基础设施都位于 AWS 内 并且可以轻松与其他 AWS 服务集成 I created an AWS MSK cluster within the VPC
  • 无法解析 JSON 文件中的 TAB

    我在加载 JSON 文件时遇到解析问题 这些文件似乎具有TAB他们身上的性格 当我去http jsonlint com http jsonlint com 然后我输入带有 TAB 字符的部分 My String Foo bar Bar fo
  • Play框架:单属性案例类的JSON读取

    我正在尝试为包含单个属性的案例类创建隐式 JSON Reads 但收到错误 Reads Nothing 不符合预期类型 这是代码 import play api libs functional syntax import play api
  • jq - 按值排序

    我有以下结构 ID XX guid 1 ID YY guid 2 我尝试过运行 jq sort by guid conn json 但是我收到一个错误 Cannot index string with string guid 请您告诉我如何
  • Mongodb聚合数组大小大于匹配项[重复]

    这个问题在这里已经有答案了 我有一个集合 其中投资是 mongodb 文档内的一个数组 现在使用聚合 我尝试过滤投资长度超过 5 倍的结果 然后使用匹配查询进行下一步处理 Collection id 000000 investments h
  • 元素数组中数组的 MongoDB 全文

    当元素数组中的数组包含应与我的搜索匹配的文本时 我无法检索文档 以下是两个示例文档 id foo name Thing1 data text X X name Thing2 data text X Y id foo
  • Mongo按动态字段排序

    所以我传入了一个动态变量 它是我想要排序的字段的名称 假设下面的 sortVariable 可能等于 price createdAt name 等 这不起作用 我该怎么做 function findStuff sortVariable va

随机推荐

  • 如何使用JMeter进行压力测试

    一 前期准备 首先需要在官网下载jmeter 下载完之后打开bin目录下的jmeter bat 在jmeter bat中对所要压测的接口进行压力测试 二 具体步骤 1 创建线程组 在线程组中设置线程的个数 持续时间和循环次数 如下图所示 2
  • PMI632

    1 目录 drivers power supply qcom qpnp smb5 c charger driver drivers power supply qcom smb5 lib c 依赖的SMB library arch arm64
  • CTF_Web:php伪随机数mt_rand()函数+php_mt_seed工具使用

    CTF Web php伪随机数mt rand函数漏洞 0x00 问题描述 0x01 mt rand函数 0x02 CTF例题 0x03 php mt seed工具使用 0x04 参考文章 0x00 问题描述 最近在题目练习的时候遇到了一个伪
  • Gulp入门使用(一)

    Gulp入门使用教程 Gulp的简介 为什么是Gulp 安装Gulp 创建Gulp项目 目录结构 第一个Gulp任务 Gulp执行预处理 Node中的通配符 监听Sass文件 使用Browser Sync自动刷新 Gulp的简介 gulp
  • 开学c语言测试,初学c语言之开学第一次打卡

    近日开学 忙了好多事 因此隔了好久才写了这篇博客 话少 就直接进入正题了 数数字问题 这是题目 输入一个整数 输出每个数字对应的拼音 当整数为负数时 先输出fu字 十个数字对应的拼音如下 0 ling 1 yi 2 er 3 san 4 s
  • 签约多方共建石嘴山智慧康养新模式

    5月13日 百度智能云与石嘴山市民政局 中国电信股份有限公司石嘴山分公司 中国银行股份有限公司石嘴山市分行 石嘴山市青鸟颐居养老服务有限公司在宁签订 石嘴山市智慧康养战略合作协议 将发挥各自优势 合力推进智慧康养产业高质量发展 提高智慧养老
  • 解决 ios 输入框属性--placeholder--不显示

    在我们写移动端项目时 会发现在IOS手机上 部分输入框的默认文字会隐藏 在此提供一套解决方法 此方法已经历过实际项目的测试 可放心的应用于实战 将此段js代码放置在项目的公共js文件中即可 if placeholder in documen
  • 海湾汉字编码表全部_汉字编码简明对照表

    汉字编码简明对照表 说明 1 下列汉字取自国标 GB 2312 80 中的分级与排列内容 包含所有的第一级汉字和第二级汉字中的常用部分 2 第一级汉字 16 55区的汉字 以拼音字母为序进行排列 同音字以笔形顺序横 竖 撇 捺 折为序 起笔
  • 生成式对抗网络(GAN)-(Generative Adversarial Networks)算法总结(从原始GAN到....目前)

    本文将按时间顺序总结gan的paper 非所有 会挑选个人认为比较重要的 并将参考其它博客 会给出链接 如有侵权 请私信删除 更新于 19 IS 可以反应图像的生成质量 越大越好 FID 则会更假注重生成的多样性 越小越好 IS score
  • mysql评审_第3章 代码检查、走查与评审

    代码检查与走查 代码检查 走查以及可用性测试是三种主要的人工测试方法 人工测试技术在查找错误方面非常有效 应该在程序开始编码之后 基于计算机的测试开始之前使用这些方法 本章主要介绍的是代码检查与走查的相似之处 而它们的不同之处将在后续章节中
  • Apache和Tomcat

    一 Apache和Tomcat的区别 Apache只是一个Web服务器 可以作为独立的web服务器来运行 不过只支持静态网页 如 asp PHP cgi jsp 等动态网页的就显得无能为力 Tomcat也可以作为独立的web服务器来运行 但
  • 什么是docker?docker有什么优缺点?

    Docker的思想来自于集装箱 集装箱解决了什么问题 在一艘大船上 可以把货物规整的摆放起来 并且各种各样的货物被集装箱标准化了 集装箱和集装箱之间不会互相影响 那么我就不需要专门运送水果的船和专门运送化学品的船了 只要这些货物在集装箱里封
  • UE4 C++ 编辑器模式下属性被修改时触发对应事件

    pragma once include CoreMinimal h include GameFramework Actor h include TestActors generated h UCLASS class TESTACTOR AP
  • 【Python】发布一个简单好用的日志记录器bestlog

    需求 日志是非常重要的一个东西 我们往往习惯于在开发一个新项目的第一行代码时 就用 logging info 代替 print 随时保持记录的好习惯 等代码上线以后也无需修改替换那些 print 直接开跑 有了完善的日志 才便于分析生产环境
  • 微信月活9亿的高效运维之路

    微信业务量增长的时候 其实我们比较关心的是效率 前期可能两三个月就涨了1倍的量 我们怎么能够保证我们的运营效率是跟得上的 后期可能主要是关心成本 我们在2014年以后增长有点放缓 所以主要的精力会在成本这个方面 分为四块来说 运营规范 云化
  • 团队项目负责人的一些感悟

    我们项目随着项目的越来越来 各种问题越来越多 比如表字段的问题 java对象的设计问题 下面是我们项目后期遇到的问题 一一罗列下 以后带团队必须注意的问题 java中 1 同一个意思的字段 在不同对象中具有不同的写法 比如说A类中金额的字段
  • Java中的String(1)

    目录 String不可变 一个例子 是字符串常量的情况下 是对象的情况下 常用的方法 String不可变 摘自JDK1 8 API文档 Strings are constant their values cannot be changed
  • springboot:异步调用@Async

    一 概述 springboot是基于spring框架的 在springboot环境下演示 Async注解的使用方式 先看下该注解的定义 复制代码 Target ElementType METHOD ElementType TYPE Rete
  • JFS及JFS2文件系统

    复杂度2 5 机密度2 5 最后更新2021 04 29 JFS和JFS2都是AIX支持的文件系统类型 JFS2是JFS的增强版 目前JFS结构已经开源 可以下载到jfs for linux的源代码 JFS开源网站 JFS JFS2都是日志
  • 单片机stm32使用ESP8266MQTT AT指令发送json字符串

    一 问题描述 基于文章 lt 单片机stm32使用rt thread软件包at device的AT指令 gt 测试发现使用MQTT AT指令发送主题信息时 直接发送字符串正常 发送json字符串时出问题 提示错误 数据格式的区别如下 s 正