ESP-MQTT-AT指令连接阿里云物联网平台
文章目录
- 文章背景
- 关键的关键词
- 本章使用
- 本章约定
- 所需资源
- 技术正文
- 一:连接方式
- 二:步骤(简介 3.ESP模块+stm32单片机)
- 1.创建设备复制三元素组
- 2.信息生成
- 3.使用串口工具和云平台交互
- 3.0.命令列表
- 3.1.使用AT指令连接设备
- 3.2.模块和云平台实现数据收发
- 4.stm32+esp8266实现数据收发
- 4.1坑
- 4.2代码展示
- 总结:
文章背景
文章背景:旨在完成毕设,本来准备使用STM32f4最小系统+ESP8266模块+MQTT协议实现设备上云,但是移植MQTT协议库对我来讲在程序没有调通之前感觉一切都是疑点,在那卡了很久决定先把程序调通再由浅入深,于是转变为烧MTQQ固件使用指令的方式来连接阿里云物联网平台。
关键的关键词
关键的关键词:ESP8266,MQTT,Topic,Json
摘要:以esp8266模块为媒介实现单片机数据和阿里云物联网平台进行数据的交换
参考网站:https://docs.ai-thinker.com (安信可)
https://blog.csdn.net/espressif/article/details/101713780 (CSDN乐鑫科技)
https://blog.csdn.net/espressif/article/details/107367189 (CSDN乐鑫科技)
https://blog.csdn.net/Boantong_/article/details/104791452(CSDN安信可)
本章使用
连接协议:MQTT协议
硬件:ESP8266模块,stm32f4最小系统,ST-Link,面包板,杜邦线
软件平台:阿里云物联网平台
本章约定
阿里云物联网平台——云平台
所需资源
技术正文
学习过程中间遇到很多坑,和技术上的不足,本文大概讲述一下整体路线,尽量还原学习过程,主要记录指令和阿里云连接和通讯
//…………………………………技术正文……………………………………//
一:连接方式
(通过MQTT固件,暂未使用MQTT库)
刚开始先可以先不使用模块连接阿里云,1.先学习MQTT.fx和云平台之间进行通讯这个过程主要是了解云平台,熟悉云平台的一些操作,需要什么信息才能连接到自己的设备。2.然后使用串口工具为了把第一阶段得到的数据通过一定的发送顺序连接上模块体验这个连接的过程和3.再用模块进行通讯有了前两步的经验可以快速写出自己想要数据的代码,这一过程看的是细心,串口调试的数据可以直接使用但是要把AT指令转换为字符发送出去。程序代码通讯和模块指令差不多,不过是一些转义字符容易出错,先用串口工具进行调试,调试完成之后转到代码中(涉及到指针使用,转义字符的理解)
1.MQTT.fx (熟悉云平台要什么数据)
2.ESP模块+串口工具 (熟悉怎么给云平台数据)
3.ESP模块+stm32单片机 (重点)
二:步骤(简介 3.ESP模块+stm32单片机)
1.创建设备复制三元素组
首先创建一个设备获取三元素组是基本(点击设备->查看,获取设备证书,点击一键复制)
2.信息生成
找到我资源包里面的开发小工具,生成自己需要的信息
3.使用串口工具和云平台交互
3.0.命令列表
- AT+MQTTUSERCFG - 配置 MQTT 用户属性
- AT+MQTTCONNCFG - 配置 MQTT 连接属性
- AT+MQTTCLIENTID - 配置 MQTT 客户端 ID
- AT+MQTTUSERNAME - 配置 MQTT 登录用户名
- AT+MQTTPASSWORD - 配置 MQTT 登录密码
- AT+MQTTCONN - 连接/查询 MQTT Broker
- AT+MQTTPUB - 发布字符串消息
- AT+MQTTPUBRAW - 发布二进制消息
- AT+MQTTSUB - 订阅/查询主题
- AT+MQTTUNSUB - 取消订阅主题
- AT+MQTTCLEAN - 关闭连接, 释放资源
3.1.使用AT指令连接设备
串口指令先使用串口跟阿里云通讯,然后移植到代码当中
//功能:设备上线,六步上云AT+RST
AT+CWMODE=1
AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com" //a里云端时域和 SNTP 服务器
AT+CWJAP="路由账号","路由密码"//官方:
//AT+MQTTUSERCFG=<LinkID>,<scheme>,<"client_id">,<"username">,<"password">,<cert_key_ID>,<CA_ID>,<"path">
//自己(找到之前使用小工具生成的Username Password)
AT+MQTTUSERCFG=0,1,"NULL","DeviceName&ProductKey","Password",0,0,""AT+MQTTCLIENTID=0,"DeviceName|securemode=3\,signmethod=hmacsha1|" //坑 注意第二个参数后面的每一个,前面都要要加\ 例如:t|securemode=3\,signmethod=hmacsha1\,AT+MQTTCONN=0,"ProductKey.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
3.2.模块和云平台实现数据收发
//功能:订阅发布Topic,数据收发//官方 AT+MQTTSUB=<LinkID>,<"topic">,<qos>
//自定义订阅Topic(数据下发至硬件)
AT+MQTTSUB=0,"/gcuvGKgCsUL/${deviceName}/user/get",1 //在设备Topic列表里面就可以发送数据,单片机就能收到//发布Topic(数据上发到云端)
AT+MQTTSUB=0,"/sys/gcuvGKgCsUL/${deviceName}/thing/event/property/post",1 //${deviceName}一定换成自己的DeviceName
//连接发布Topic之后就可以通过上发数据进行数据传输
//官方 AT+MQTTPUB=<LinkID>,<"topic">,<"data">,<qos>,<retain>
//自己发布数据
AT+MQTTPUB=0,"topic","data_Json",1,0 //简化的Json格式数据 {\"params\":{\"设备功能标识符\":66.6}}//简单一览Json格式{"id": "12345","version": "1.0","params": {"CurrentTemperature": 21,"CurrentHumidity":50.5,"SocketSwitch_1":1,"SocketSwitch_2":1},"method": "thing.event.property.post"}
关联的web界面,(阿里云要是只做到数据交换也就太low了,可以把收到的数据用界面展出才是最棒的)
4.stm32+esp8266实现数据收发
4.1坑
这个里面我遇到一个大坑,希望大家别入坑:
上面使用的都是串口进行模块上云和模块与云端进行的数据交换,然后我们最终还是要使用MCU进行控制的,但是MCU进行控制的时候数据格式会略有变化,主要是转义字符的带来的。
\" = " (重要)
\\ = \ (重要)
\,=,
坑:来自Json格式的数据 比如我需要一个{“params”:{“CurrentHumidity”:21.5}}我在代码里面应该怎么表示呢?
错误:
错误:
{\\"params\\":{\\"CurrentHumidity\\":21.5}} // 两个转义字符:1. \\ == \ 2.\" == "
正确:
{\\\"params\\\":{\\\"CurrentHumidity\\\":21.5}} //看似很简单不过一旦转进去就得卡好一段时间迷不过来
4.2代码展示
wifi通过串口怎么发送和接收不再展示,仅仅展示数据的收发格式
void Connect_alicloud(void)
{u8 key=0;char *m; m=mymalloc(SRAMIN,64); //申请64字节内存printf("设置a里云端时域和 SNTP 服务器\r\n");sprintf((char*)m,"AT+CIPSNTPCFG=1,8,\"%s\"",aliyun_time); atk_8266_send_cmd(m,"OK",20);printf("正在连接路由器\r\n");//设置连接到的WIFI网络名称/加密方式/密码,这几个参数需要根据您自己的路由器设置进行修改!! sprintf((char*)m,"AT+CWJAP=\"%s\",\"%s\"",wifista_ssid,wifista_password);//设置无线参数:ssid,密码while(atk_8266_send_cmd(m,"WIFI GOT IP",300)); //连接目标路由器
PRESTA:printf("正在连接a里云\r\n");sprintf((char*)m,"AT+MQTTUSERCFG=0,1,\"NULL\",\"%s&%s\",\"%s\",0,0,\"\"",DeviceName,ProductKey,Password); delay_ms(20);while(atk_8266_send_cmd(m,"OK",200)){printf("账号密码输入错误\r\n"); //printf("输入按键WK_UP开启重新连接\r\n");key=Key_Scanf(0);if(key==1)goto PRESTA;} printf("账号密码输入正确\r\n");sprintf((char*)m,"AT+MQTTCLIENTID=0,\"%s|securemode=3\\,signmethod=hmacsha1|\"",Client_ld); while(atk_8266_send_cmd(m,"OK",200)){printf("远端错误\r\n"); //printf("输入按键WK_UP开启重新连接\r\n");key=Key_Scanf(0);if(key==1)goto PRESTA; } printf("远端配置正确\r\n"); sprintf((char*)m,"AT+MQTTCONN=0,\"%s.iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883,1",ProductKey); while(atk_8266_send_cmd(m,"OK",200)){printf("a里云连接错误\r\n"); //printf("输入按键WK_UP开启重新连接\r\n");key=Key_Scanf(0);if(key==1)goto PRESTA; }printf("恭喜你已经连接到a里云服务器\r\n");printf("设备订阅Topic\r\n");//AT+MQTTSUB=0,"",1 sprintf((char*)m,"AT+MQTTSUB=0,\"%s\",1",Topic_myself_get); //自定义订阅Topicatk_8266_send_cmd(m,"OK",200);sprintf((char*)m,"AT+MQTTSUB=0,\"%s\",1",Topic_Physical_get);//物模型属性订阅Topic while(atk_8266_send_cmd(m,"OK",200)){printf("设备订阅Topic错误\r\n"); printf("输入按键WK_UP开启重新连接\r\n");key=Key_Scanf(0);if(key==1)goto PRESTA; } printf("设备订阅Topic成功\r\n");printf("设备物模型属性发布Topic\r\n");//AT+MQTTSUB=0,"",1sprintf((char*)m,"AT+MQTTSUB=0,\"%s\",1",Topic_Physical_post); //物模型属性发布Topicwhile(atk_8266_send_cmd(m,"OK",200)){printf("设备物模型属性发布Topic错误\r\n"); printf("输入按键WK_UP开启重新连接\r\n");key=Key_Scanf(0);if(key==1)goto PRESTA; }printf("设备物模型属性发布Topic成功\r\n");//当初大坑就在这,试了很多格式一直以为是自己的格式问题,仅供参考
// sprintf((char*)m,"AT+MQTTPUB=0,\"%s\",\"{\"id\":\"12345\",\"version\":\"1.0\",\"params\":{\"CurrentTemperature\":66,\"CurrentHumidity\":88.5,\"SocketSwitch_1\":1,\"SocketSwitch_2\":1},\"method\":\"thing.event.property.post\"}\",1,0",Topic_Physical_post); //物模型属性发布Topic//AT+MQTTPUB=0,"%s","{\"params\":{\"CurrentTemperature\":15\,\"CurrentHumidity\":11.5}}",1,0
//\"AT+MQTTPUB=0,\"/sys/gcuvGKgCsUL/&DeviceName/thing/event/property/post\",\"{\"params\":{\"CurrentTemperature\":15}}\",1,0\"// sprintf((char*)m,"AT+MQTTPUB=0,\"%s\",\"{\"params\":{\"CurrentTemperature\":45\\,\"CurrentHumidity\":41.5}}\",1,0",Topic_Physical_post);
// sprintf((char*)m,"AT+MQTTPUB=0,\"/sys/gcuvGKgCsUL/&DeviceName/thing/event/property/post\",\"{\"params\":{\"CurrentHumidity\":21.5}}\",1,0"); //物模型属性发布Topic // sprintf((char*)m,"AT+MQTTPUB=0,\"/sys/gcuvGKgCsUL/&DeviceName/thing/event/property/post\",\"{\\\"params\\\":{\\\"CurrentTemperature\\\":95}}\",1,0"); //物模型属性发布Topic sprintf((char*)m,"AT+MQTTPUB=0,\"%s\",\"{\\\"params\\\":{\\\"CurrentTemperature\\\":95}}\",1,0",Topic_Physical_post); //物模型属性发布Topic printf("%s\r\n",m);while(atk_8266_send_cmd(m,"OK",400)){printf("向云端发布数据错误\r\n");printf("输入按键WK_UP开启重新连接\r\n");key=Key_Scanf(0);if(key==1)goto PRESTA; } printf("向云端发布数据成功\r\n"); myfree(SRAMIN,m); //释放内存 m=NULL; //避免成为野指针
}
总结:
使用固件上云和数据交换很简单,只要不入坑,很快就搞出来了。不过还是建议大家学会这个之后,要继续学习通过移植MQTT库和Json库来实现这个功能。
本文意在让大家少走弯路,也可以总结一下自己的的零碎知识,增加自己的语言描述能力,如文章有错误,还望能慷慨指出、一起交流。
ESP-MQTT-AT指令连接阿里云物联网平台相关推荐
- ESP8266 AT指令连接阿里云物联网平台
模组:ESP-12F || ESP-12S || (保险来说,ESP模组的flash应该 大于4MB.或者说为32Mbit 才可以)待补充 ... 平台:阿里云物联网平台 固件:ESP8 ...
- STM32 通过 ESP8266 AT指令连接阿里云物联网平台
模组 :ESP-12F || ESP-12S || (保险来说,ESP模组的flash应该 大于4MB.或者说为32Mbit 才可以) 待补充 ... 平台 :阿里云物联网平台 MCU ...
- 使用arduino D1 wifi模块(WeMos D1)连接阿里云物联网平台并成功实现APP点亮板载LED(五)---MQTT.fx模拟设备连接阿里云
前文提到,物联网设备在阿里云物联网平台登记了"身份证"之后,阿里云物联网平台上的设备就处于"未激活""离线"或者"在线" ...
- 【4G模块】中移物联ML302 + GD32F407 使用支持MQTT协议AT指令接入阿里云物联网平台
目录 〇.目的.GD32.ML302相关简介 0.目的: 1.ML302: 2.LTE Cat.1: 3.GD32F407 一.GD芯片创建工程写驱动:LED.串口4.4G模块 1.创建工程 2.LE ...
- 微信小程序连接物联网(三):微信小程序远程遥控宿舍开门 基于NodeMCU通过MQTT协议连接阿里云物联网平台
索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...
- 树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制
树莓派mqtt协议连接阿里云物联网平台(三) 前面树莓派的数据已经上传到云端,可是我的android手机该如何获取树莓派上传的这些数据呢,,困惑了我好几天的疑问,解开的那一刻,真的时拨开云雾见青天啊. ...
- esp32连接阿里云物联网平台进行MQTT通信
前提:IDE是采用arduino IDE,arduino使用的库是pubsubclient 开发板可以使用esp32(esp8266也是一样的) 已经学会pubsubclient库的基本使用 使用pu ...
- 手把手教你用Arduino接入阿里云物联网平台,ESP8266连接阿里云物联网平台必看教程...
使用Ardui no 的方式快速连接阿里云物联网平台. 文中提到的 AliyunIoTSDK 这个 Arduino 库,可以在 Arduino 库商店里搜索到(搜索 AliyunIoTSDK) Ali ...
- 阿里云HaaS100物联网开发板学习笔记(四)轻应用初步--用javascript连接阿里云物联网平台
摘要:本篇文章讲解如何使用JavaScript"轻应用"连接阿里云物联网平台并上报一个数据.仍然延续前几篇文章的结构,从安装软件环境开始讲,以使零基础的同学看了本篇文章之后,也能够 ...
最新文章
- 腾讯布局移动应用商店 总下载量累计达40亿次
- java replaceall lt_static lt;Tgt; boolean replaceAll(Listlt;Tgt; list, T oldVal, T newVal)_Java...
- 关于viewport我自己的理解
- [置顶] Android开发者官方网站文档 - 国内踏得网镜像
- 迭代器生成器可迭代对象_使用迭代器时如何避免ConcurrentModificationException
- Ambari实现HTTPS登陆
- biodist r语言_R语言 Biostrings包 pairwiseAlignment()函数中文帮助文档(中英文对照)
- python爬虫之requests模块2
- 【个人笔记】OpenCV4 C++ 快速入门 00课
- 将byte数组转换成十进制字符串输出_outputStream与InputStream使用只能传输字节byte...
- SMO算法是干什么的?有什么作用?
- 《最新黑客攻防实战从入门到精通(第2版)》.(武新华, 孙振辉 ).[PDF]ckook
- 花一天时间做一个高质量飞机大战游戏,过万字Unity完整教程!漂亮学妹看了直呼666!
- 结构化程序设计知识点总结
- 初高中计算机课程有哪些,中学信息技术课程纲要(最新整理)
- yarn add 添加依赖的各种类型(指定版本安装、git中安装、tgz包安装、文件夹安装)
- Matlab 可见光波段植被指数
- 解决mysqld: [ERROR] Found option without preceding group
- 口语8000句--(2)生病、受伤时
- English Summary~October