|  | 
 
| 大家在用单片机做一些项目的时候,各类传感器肯定是常用的模块。那么如何处理传感器获得的数据呢?把他们上传到云平台是不错的选择。在这篇帖子我将分享一下利用stm32驱动esp8266wifi模块把传感器数据发送到onenet云平台的教程 
 一、onenet云平台的准备工作
 打开https://iot.10086.cn/,注册一个账号
 
 
 
 
 在首页右上角,进入控制台
 
 
 
 
 选择控制台左侧的产品开发一栏,再点击右侧的创建产品
 
 
 
 按图示方式设置(产品品类、名称、地点无所谓)
 
 
 
 在右侧操作一栏选择产品开发
 
 
 
 选择设置物模型
 
 
 
 添加自定义功能点
 
 
 
 如此设置(标识符是关键信息,之后会用到)
 
 
 
 回到这里,选择设备管理
 
 
 
 点击添加设备
 
 
 
 输入设备名称(也是会用到的关键信息)
 
 
 
 选择右侧操作一栏的详情
 
 
 
 这里的产品id和设备密钥是关键信息,可以复制到文档中,便于使用
 二、token的获取
 想连上onenet,还需要生成一个“token”,相当于密码
 在文末的压缩包中,有一个名为pass的文件,用python打开
 
 
 在末尾把username和accesskey分别替换为之前获得的产品id和设备密钥,运行后获得token
 注:产品id、设备名称、token是连接的三要素
 三、简单了解一下背景知识
 1、AT指令集介绍
 
 
 AT指令是一种文本序列,用于控制调制解调器、手机等通讯设备。“AT"代表"Attention”,其后跟随的文字指定要执行的命令。
 在ESP8266等模块中,AT指令用于设定模块参数、控制网络连接和其他功能。
 以下是一些常用的AT指令示例:
 
 AT:检测通信模块与控制端之间的连接。
 
 AT+RST:重置模块。
 AT+CWMODE:设置Wi-Fi工作模式(例如Station模式、AP模式)。
 AT+CWJAP:连接Wi-Fi网络。
 AT指令集的优势在于其简单性,使得开发者能够不必深入微控制器的复杂编程,就能够快速实现无线通信的基本功能。
 2、MQTT协议介绍
 
 
 在本项目中,esp8266通过mqtt协议与云平台建立连接
 MQTT(Message Queuing Telemetry Transport) 是一个轻量级的、基于发布/订阅模型的消息协议,专为低带宽和不稳定网络环境设计,广泛用于物联网设备之间的通信。在MQTT中,设备可以作为 发布者 发送消息,或者作为 订阅者 接收特定主题(Topic)的消息。这个模型允许多个设备共享特定的数据点并响应相应的变化。MQTT设备使用这一协议,通过轻量级的消息交换,实现设备间的有效通讯和数据传输。
 3、固件烧录
 
 简单来说,esp8266需要固件才能读懂AT指令。在文末的压缩包也中有烧录工具和两个固件,分别为wifi和mqtt的。烧录方法就先不介绍了。
 四、连接
 建议在把esp8266连到stm32之前,先用串口调试助手测试一下,以便于知道问题出在哪
 打开串口调试助手,发送以下指令
 
 1、AT
 这个指令是用来测试串口通信是否畅通的最基本指令。发送AT应该返回OK,代表通信没有问题。
 2、AT+CWMODE=1
 该指令用于设置ESP8266的Wi-Fi工作模式。CWMODE=1将模块设置为Station模式(STA模式),这意味着模块可以连到一个已存在的Wi-Fi网络。
 
 3、AT+CWJAP="<SSID>","<PASS>"
 
 该指令用于连接wifi,SSID是wifi名称,PASS是密码,自行替换(和电脑连同一个)
 4、AT+MQTTUSERCFG=0,1,"<设备名称>","<产品id>","<token>",0,0,""
 这个指令用于配置MQTT客户端的用户参数。参数0指的是客户端ID,1为MQTT版本,中间三个参数分别是设备名称、产品ID、Token,改为自己的,最后的两个0表示是否清理会话和是否启用遗嘱消息。
 
 5、AT+MQTTCONN=0,"mqtts.heclouds.com",1883,1
 此指令用于发起到MQTT服务器的连接。参数0是客户端ID,"mqtts.heclouds.com"是MQTT服务器地址,1883是服务器端口号,最后的1表示启用清理会话。
 
 6、AT+MQTTSUB=0,"$sys/<产品id>/<设备名称>/thing/property/post/reply",0
 指令用于订阅MQTT主题,向MQTT服务器表明客户端想要接收与该主题相关的消息。
 
 
 【MQTT通信的发布和订阅简单的理解:通俗易懂地讲,MQTT就像是一个邮局,而主题(Topic)好比是邮局里的个人邮箱。
 发布(Publish):
 想象你有一些信息想要告诉别人,你就把这个信息放进邮局的一个特定的邮箱(主题)里。
 订阅(Subscribe):
 如果有人想知道这个特定的信息,他们就可以告诉邮局,他们对这个邮箱(主题)感兴趣。这样,每当有新信息放入这个邮箱时,邮局就会把它送给那些订阅了这个邮箱的人。】
 
 7、AT+MQTTPUB=0,"$sys/<产品id>/<设备名称>/thing/property/post","{\"id\":\"123\"\,\"params\":{\"<标识符>\":{\"value\":数值\}}}",0,0
 通过此指令将消息发布到MQTT主题。0是客户端ID,"$sys/<产品id>/<设备名称>/thing/property/post"是要发布消息的主题。紧接着的是要发布的消息内容,其中标识符要与之前设置的一样,0,0分别表示消息的QoS等级和是否保留消息。
 
 注意:消息内容要严格遵守固定的格式,否则会发送失败
 
 
 如果一切顺利,设备详情页的属性一栏会显示发送的数值
 
 五、一些关键的程序
 在此只介绍一些关键的函数,完整的stm32驱动esp8266(HAL库)的代码大家可以参考b站up主“水手勇敢”
 
 
 这是一个用于通过 UART(串口)向 ESP 系列模块发送命令并等待指定响应的函数
 
 cmd是要发送的指令,resp是期望收到的响应(一般是OK),timeout是超时时间,HAL_UART_Transmit函数可通过串口向esp8266发送一个字符串(AT指令),下面一坨是指在timeout时间内,检查接收缓冲区是否包含目标响应,若找到响应,返回成功。
 然后就能用此函数发送AT指令
 
 
 
 
 
 
 
 这是将消息内容发布到onenet的函数,就是调用SendCommand函数发送指令,比较容易理解。但需要注意的是,字符串需要用双引号包裹,这条指令内又含双引号,就需要把內部的双引号用\转义,此外单个\也需要转义,这就意味着原指令中的\"要改为\\\",单个\或"改为\\和\"(再提醒一下消息格式:"{\"id\":\"123\"\,\"params\":{\"<标识符>\":{\"value\":数值\}}}")
 
 
 
 通过网盘分享的文件:要用到的工具(1).zip
 链接: https://pan.baidu.com/s/19L-VBkKgmL64_i5DFR-k-A 提取码: b8qy
 
 
 
 (新人第一次发帖,如有不足希望各位批评指正)
 
 
 
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?立即注册  |