智慧花园(每天推进一点点)- STM32H743+ESP8266+LED下发命令控制LED灯

首先感谢以下链接博主,提供MQTT AT 指令说明。

https://blog.csdn.net/espressif/article/details/101713780

1. 将ESP8266模块通过USB转串口模块连接到电脑上,通过串口调试助手发送AT指令,测试指令的正确性。上行发送数据过程笔记参考前面的文章:

智慧花园(每天推进一点点)-STM32H743+ESP8266+OneNet-CSDN博客

2. 云平台上使用的是物模型,MQTT协议+OneJson数据,设备采集的数据上传到云端,使用的是POST方式,需要先订阅POST响应Topic,此命令是云平台回复的上报数据是否成功信息的订阅服务,命令是

$sys/{pid}/{device-name}/thing/property/post/reply

对应代码笔记:   #define subtopic   "$sys/3UF574jq1d/test1/thing/property/post/reply"

                             sprintf(cmd, "AT+MQTTSUB=0,\"%s\",1\r\n",subtopic);
                             ret = atk_mw8266d_send_at_cmd(cmd, "OK", 10000);

然后再使用设备上报Topic传递数据到云平台,命令是

$sys/{pid}/{device-name}/thing/property/post

对应的代码笔记:#define pubtopic   "$sys/3UF574jq1d/test1/thing/property/post"

                            #define func1      "power"

    sprintf(cmd, "AT+MQTTPUB=0,\"%s\",\"{\\\"id\\\":\\\"123\\\"\\,\\\"params\\\": {\\\"%s\\\": {\\\"value\\\":%d\\}}}\",0,0\r\n",pubtopic,func1,power);
    ret = atk_mw8266d_send_at_cmd(cmd, "OK", 10000);

atk_mw8266d_mqtt_pub(pubtopic, func1, 20);

此段代码实现向云平台发送power的数据值20。

3. 云平台下发数据控制设备使用的是Set属性设置命令,需要先订阅Set设置Topic,再等待云平台下发数据,根据下发数据反馈一个Setreply命令。这个部分网上描述不多,折腾了快两天了,总算是测试成功了。如果Set命令不能成功发送到云平台,云平台发送的下行命令会提示设备未订阅的错误提示。如果下发命令没有及时收到设备的接收成功响应报文,云平台的调试日志会记录超时错误。

订阅Set的命令是: 

$sys/{pid}/{device-name}/thing/property/set

 #define setcmd     "$sys/3UF574jq1d/test1/thing/property/set"

  sprintf(cmd, "AT+MQTTSUB=0,\"%s\",1\r\n",setcmd);
    ret = atk_mw8266d_send_at_cmd(cmd, "OK", 10000);

     运行调用:  printf("11. mqtt_set");    atk_mw8266d_mqtt_set(setcmd); 

此命令成功返回OK,然后等待云平台发送配置下行命令。下行命令包含配置的数据,如LED灯的控制状态等。在收到下行命令数据报文以后,需要立即回复一条接收成功的报文,命令如下:

$sys/{pid}/{device-name}/thing/property/set_reply

代码笔记:#define setreply   "$sys/3UF574jq1d/test1/thing/property/set_reply"

            ret1=atk_mw8266d_get_id(id);  //获取下发报文的id值
      if (ret1 == ATK_MW8266D_EOK)
            {
                printf("====reply\r\n");
                atk_mw8266d_mqtt_setreply(setreply, id);  //上传相同id的接收成功报文
                atk_mw8266d_uart_rx_restart();
            }

 上报接收成功的命令拼接方法如下,其中报文的id必须与收到的id保持一致,且拼接格式一定要正确,有很多转义符号!!!错一个命令就错了。回复时间慢了,云平台就会认为超时。不过这个超时好像不影响数据的接收。注意:串口收到的数据都是字符串类型。

sprintf(cmd, "AT+MQTTPUB=0,\"%s\",\"{\\\"id\\\":\\\"%s\\\"\\,\\\"code\\\":200\\,\\\"msg\\\":\\\"success\\\"}\",0,0\r\n",setreply,replyid);
//      printf("**%s",cmd);
    ret = atk_mw8266d_send_at_cmd(cmd, "OK", 10000);

至此,串口可以正常接收到云平台下发的数据报文,解析此报文,就可以根据报文设置的变量处理对应的硬件模块。

整个调试过程中,建议使用手机热点连接,不用担心WIFI接入名称问题。

需要解决的问题:STM32与ESP8266连接的串口之间有很多数据互相传递,云平台何时有下发数据的时间是不固定的,而收到下发数据就需要立刻马上处理。这个处理流程怎么设计?

解析收到的报文,提取LED字段后控制板上LED灯亮灭,从云平台发出控制报文,到看到板上LED灯状态变化,大约需要3秒钟。如果使用微信小程序,预计时间会更多一点,网络延时,也许可以通过提高串口传输速率试试?改变速率,需要把ESP8266的速率一起修改,不能只改STM32代码!!

---- 补充笔记:

微信小程序在传指令给云平台修改灯的状态时,首先要求设备端订阅了SET主题,同时在设备端收到云端下发的LED灯属性配置SET报文时,要给云端及时回复一个setply响应,通知微信小程序设备端已经收到了命令。但是此回复报文必须在几秒内完成。

考虑到设备执行的实时性有可能无法在几秒内及时回复响应报文,可以在修改了LED灯的状态后,设备使用post主动上报LED灯的状态,微信小程序稍后从云平台获取灯的状态数据,再更新微信小程序的界面按钮状态。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值