STM32接入阿里云(简单版)-实现数据上传和命令下发

这篇具有很好参考价值的文章主要介绍了STM32接入阿里云(简单版)-实现数据上传和命令下发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:
之前做了带有实时操作系统的接入阿里云STM32接入阿里云(FreeRTOS),鉴于很多人不懂这个,所以做了一个简单版的接入阿里云。

功能介绍:
将传感器采集的数据上传到阿里云,同时可以下发控制板上的LED灯(PC13)

前期准备:
1、首先你得有一个阿里云的账号,没有的话就注册一个
2、在物联网平台创建产品和设备

主要硬件准备:
1、STM32F103C8T6
2、ESP8266-01S模块
3、BH1750光照传感器

模块接线:
ESP8266-01S模块:TX–PA3 RX–PA2 RST–PA4 VCC–3.3 GND–GND
BH1750光照传感器:SDA–PB7 SCL–PB6 VCC–3.3V GND–GNG ADDR–不接

实验现象:
1、串口助手界面
STM32接入阿里云(简单版)-实现数据上传和命令下发
2、成功接入阿里云
(部分图片来自上次接入阿里云)
STM32接入阿里云(简单版)-实现数据上传和命令下发
3、成功上传光照数据
STM32接入阿里云(简单版)-实现数据上传和命令下发
4、在线调试里可以下发控制命令
STM32接入阿里云(简单版)-实现数据上传和命令下发
5、查看自己是否订阅成功
STM32接入阿里云(简单版)-实现数据上传和命令下发

6、开发Web应用和移动应用,可以上物联网应用开发控制台 应用开发链接
简单开发的手机应用
STM32接入阿里云(简单版)-实现数据上传和命令下发
代码需要修改的地方
1、WIFI配置和阿里云服务器的登陆配置
STM32接入阿里云(简单版)-实现数据上传和命令下发
登陆配置前4个参数获取方式:
STM32接入阿里云(简单版)-实现数据上传和命令下发
登陆配置后2个参数获取方式:
其中${deviceName}要改为自己设备的名称
STM32接入阿里云(简单版)-实现数据上传和命令下发
2、数据流名(标识符)修改
STM32接入阿里云(简单版)-实现数据上传和命令下发
STM32接入阿里云(简单版)-实现数据上传和命令下发
标识符查看方式:
STM32接入阿里云(简单版)-实现数据上传和命令下发

部分代码展示
数据采集和上传:

		delay_ms(10);
		timeCount ++;
		if(timeCount >= 300)	//发送间隔3s
		{
			timeCount = 0;
			light = LIght_Intensity();
			printf("当前光照:%.1fLx\r\n",light);
			memset(mqtt_message, 0, 200);
			//组装数据  
			sprintf(mqtt_message,
			"{\"method\":\"thing.service.property.post\",\"id\":\"1234\",\"params\":{\
			\"Light\":%.1f},\"version\":\"1.0.0\"}", light);
			 //发布数据
			_mqtt.PublishData(MQTT_PUBLISH_TOPIC,mqtt_message,0);
		}

下发命令的处理

//串口2中断,接收远程命令
void USART2_IRQHandler(void)
{
	u8 d;
    static u8 rxlen = 0;
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //判断接收数据寄存器是否有数据
    {
		d = USART2->DR;
		rxbuf[rxlen++] = d;
		//USART1->DR = temp;//这里用作串口1打印WIFI模块发送的数据
		//命令格式:{"LED":1}	
		if(rxbuf[rxlen-4]=='D'&&rxbuf[rxlen-3]=='"'&&rxbuf[rxlen-2]==':'&&d == '1')
		{
			LED0 = 0;  //开灯
			rxlen = 0;
		}
		else if(rxbuf[rxlen-4]=='D'&&rxbuf[rxlen-3]=='"'&&rxbuf[rxlen-2]==':'&&d == '0')
		{
			LED0 = 1;   //关灯
			rxlen = 0;
		}
		//继续else if添加其他命令
		...
		...

main.c文件

#include "SysTick.h"
#include "sys.h"
#include "usart.h"
#include "led.h"
#include "bh1750.h"
#include "mqtt.h"
#include "wifi.h"
#include "string.h"

//WIFI配置
#define WIFI_NAME	            "XIAOCHUN01"          
#define WIFI_PASSWD             "3118003167"        

//阿里云服务器的登陆配置
#define MQTT_BROKERADDRESS		"a1VPyJEJRjJ.iot-as-mqtt.cn-shanghai.aliyuncs.com"
#define MQTT_CLIENTID 			"a1VPyJEJRjJ.test01|securemode=2,signmethod=hmacsha256,timestamp=1648914857644|"
#define MQTT_USARNAME 			"test01&a1VPyJEJRjJ"
#define MQTT_PASSWD 			"76599f069aff42f644669310490cdc3a9830c5431da41a81ff1467722d2bdb1b"
#define	MQTT_PUBLISH_TOPIC 		"/sys/a1VPyJEJRjJ/test01/thing/event/property/post"
#define MQTT_SUBSCRIBE_TOPIC	"/sys/a1VPyJEJRjJ/test01/thing/service/property/set"

u8 txbuf[256];
u8 rxbuf[256];
u8 status;
char mqtt_message[200];
void MQTT_Init(void);
 	
int main(void)
{	 
	unsigned short timeCount = 300;	//发送间隔变量
	float light;
	SysTick_Init(72);	    	 //延时函数初始化	  
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 	//串口初始化为115200
	uart2_init(115200);	
	LED_Init();			     //LED端口初始化
	BH1750_Init();           //光照传感器初始化
	MQTT_Init();  			 //mqtt初始化

	while(1) 
	{			
		delay_ms(10);
		timeCount ++;
		if(timeCount >= 300)	//发送间隔3s
		{
			timeCount = 0;
			light = LIght_Intensity();
			printf("当前光照:%.1fLx\r\n",light);
			memset(mqtt_message, 0, 200);
			//组装数据  
			sprintf(mqtt_message,
			"{\"method\":\"thing.service.property.post\",\"id\":\"1234\",\"params\":{\
			\"Light\":%.1f},\"version\":\"1.0.0\"}", light);
			 //发布数据
			_mqtt.PublishData(MQTT_PUBLISH_TOPIC,mqtt_message,0);
		}
		//if判断,如果第一个字节是0x30,表示收到的是服务器发来的推送数据
		if(rxbuf[0]==0x30)
		{  
			//无法使用strstr(rxbuf,"LED")来判断命令
			memset(mqtt_message, 0, 200);
			//组装数据  
			sprintf(mqtt_message,
			"{\"method\":\"thing.service.property.set\",\"id\":\"5678\",\"params\":{\
			\"LED\":%d},\"version\":\"1.0.0\"}", LED0_STA);
		
			//上传LED状态
		   _mqtt.PublishData(MQTT_PUBLISH_TOPIC,mqtt_message,0);
			//将标志位和数据清空
			memset(rxbuf, 0, sizeof(rxbuf));
			printf("LED灯已%s\r\n",LED0_STA==0?"打开":"关闭");
		}
	}
}

//串口2中断,接收远程命令
void USART2_IRQHandler(void)
{
	u8 d;
    static u8 rxlen = 0;
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //判断接收数据寄存器是否有数据
    {
		d = USART2->DR;
		rxbuf[rxlen++] = d;
		//USART1->DR = temp;//这里用作串口1打印WIFI模块发送的数据
		//命令格式:{"LED":1}	
		if(rxbuf[rxlen-4]=='D'&&rxbuf[rxlen-3]=='"'&&rxbuf[rxlen-2]==':'&&d == '1')
		{
			LED0 = 0;
			rxlen = 0;
		}
		else if(rxbuf[rxlen-4]=='D'&&rxbuf[rxlen-3]=='"'&&rxbuf[rxlen-2]==':'&&d == '0')
		{
			LED0 = 1;
			rxlen = 0;
		}
		//继续else if添加其他命令
		
		if(rxlen>=255) rxlen=0;
		rxlen %= sizeof(rxbuf);
		
		USART_ClearFlag(USART2,USART_IT_RXNE);		
    }
	
    if(USART_GetITStatus(USART2, USART_IT_IDLE))   //判断中断是否已经发生
    {
		d = USART2->DR;
		d = USART2->SR;
		_mqtt.rxlen = rxlen;
		//Mqtt_Progress(rxbuf,rxlen);//主循环做异步处理
		rxlen=0;
		USART_ClearFlag(USART2,USART_IT_IDLE);
    }
}

//连接热点、接入阿里云
void MQTT_Init(void)
{
	status=0;
	if(_net.Init(rxbuf,sizeof(rxbuf),txbuf,sizeof(txbuf))!=0) 	//检查ESP8266
	{
		printf("Net Init OK!\r\n");
		status++;
	}
	else
	{
		printf("Net Init Error!\r\n");
		status=0;
	}
	if(status==1)  		//连接热点
	{
		if(_net.ConnectAP(WIFI_NAME,WIFI_PASSWD)!=0)
		{
			printf("Conncet AP OK!\r\n");
			status++;
		}
		else 
		{
			printf("Conncet AP Error!\r\n");
			status=0;
		}
	}
	if(status==2)      //连接TCP
	{	
		if(_net.ConnectServer("TCP",MQTT_BROKERADDRESS,1883)!=0) //39.107.71.77   //47.105.141.194
		{
			printf("Conncet Server OK!\r\n");
			status++;
		}
		else
		{
			printf("Conncet Server Error!\r\n");	
		}
	}
	if(status==3)  	//登录MQTT	
	{
		_mqtt.Init(rxbuf,sizeof(rxbuf),txbuf,sizeof(txbuf));
		if(_mqtt.Connect(
		MQTT_CLIENTID,   //ClientID
		MQTT_USARNAME,   //Username
		MQTT_PASSWD       //Password
		) != 0)
		{
			printf("Enter MQTT OK!\r\n");
			status++;
		}
		else
		{
			printf("Enter MQTT Error!\r\n");
			status=0;
		}	
	}	
	if(status==4)  		//订阅主题
	{
		if(_mqtt.SubscribeTopic(MQTT_SUBSCRIBE_TOPIC,0,1) != 0)
		{
			printf("SubscribeTopic OK!\r\n");
		}
		else
		{			
			printf("SubscribeTopic Error!\r\n");
		}
	}
	status = 0;
}

如果需要上传多个数据,可以参考下面
同时上传了标识符为Light和myData的数据
STM32接入阿里云(简单版)-实现数据上传和命令下发

			//上传多个数据
			sprintf(mqtt_message,
			"{\"method\":\"thing.service.property.post\",\"id\":\"1234\",\"params\":{\
			\"Light\":%.1f,\"myData\":%d},\"version\":\"1.0.0\"}", light,myData);

最后:
需要源码的可以自行下载。代码下载链接
下载操作:
STM32接入阿里云(简单版)-实现数据上传和命令下发文章来源地址https://www.toymoban.com/news/detail-403728.html

到了这里,关于STM32接入阿里云(简单版)-实现数据上传和命令下发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32智能家居,ONENET获取数据及下发指令,代码开源!!!

    使用onenet平台进行远程传输数据和远程控制开发板,但由于onenet官方给的代码只对他家的开发板比较友好,对于初学者来说修改这些代码相对麻烦,所以我就分享STM32C8T6接入onenet云平台的代码,这款单片机是我们做课程设计中比较常用,以后大家在我这份代码的基础上进行修

    2023年04月19日
    浏览(39)
  • STM32教学——JQ8900语音模块+光照传感器+4G模块数据上传阿里云物联网

    原理图 PCB 实物图 选用EC200U模块,集成4g和GPS以及蓝牙功能 通过串口2与4G模块串口连接,串口传输数据指令。 这个时候4g模块已经成功启动,下一步注册进阿里云物联网平台 然后就是上发数据给阿里云平台 上发了之后阿里云就可以收到这些数据 根据厂家提供的手册资料,可

    2024年03月14日
    浏览(47)
  • STM32+ESP8266+APP连接阿里云监测环境温湿度系列笔记1:阿里云物联网平台配置及数据上传

            在数据传递过程中阿里云物联网平台相当于服务器,ESP8266为客户端,通过路由器连接服务器时需要在物联网平台创建设备,具体过程如下: 1. 首先 在物联网平台创建公共实例,并点击进入, 图1 2.可见设备接入物联网平台的整体流程如图2中红色方框所示, 接下

    2024年02月04日
    浏览(59)
  • TCP透传数据至Onenet平台(简单用STM32上传采集的传感器数据)

    主页点击控制台  点击全部产品服务,再点击多协议接入  选择TCP透传,点击添加产品      点击确定,然后选择立即添加设备  点击添加设备  随便起个设备名称,这里的鉴权信息等下要用来作为登录设备用,点击添加  添加数据流模板,就是绑定上传的数据      这里我

    2024年02月05日
    浏览(46)
  • 基于C语言从0开始手撸MQTT协议代码连接标准的MQTT服务器,完成数据上传和命令下发响应(华为云IOT服务器)

    近年来,物联网的发展如火如荼,已经渗透到我们生活的方方面面。从智能家居到工业自动化,从智慧城市到智慧农业,物联网正在以前所未有的速度改变着我们的生活。 大家现在可能已经习惯了通过手机控制家里的灯光、空调和电视,这就是物联网在智能家居领域的应用,

    2024年02月05日
    浏览(71)
  • 利用Proteus仿真基于stm32的智能家居并上传至阿里云

    学校组织了为期两周的实训,疫情原因只能线上,学习的是stm32,本来利用32制作智能家居并上传阿里云网上的教程很多的,但是仿真并上云暂未发现,这也是我本次实训感觉学到的东西。 实现的东西其实很简单,就是温湿度,光照传感器,然后测得的数据在LCD屏显示并实时

    2024年04月26日
    浏览(51)
  • 【物联网】手把手完整实现STM32+ESP8266+MQTT+阿里云+APP应用——第1节-阿里云配置+MQTT.fx模拟与使用AT命令发布订阅消息

    🌟博主领域:嵌入式领域人工智能软件开发 本节目标: 通过MQTT.fx模拟连接或通过串口连接ESP8266发送AT命令,实现阿里云物联网平台发送数据同时接收数据,IOT studio界面显示数据。具体来说:使用ESP8266 ESP-01来连接网络,获取设备数据发送到阿里云物联网平台并显示且oled显

    2024年02月03日
    浏览(62)
  • stm32 m5311上传gps数据上onenet云平台实现地图定位

    新手,第一次写博客,如有不足请大家见谅并指出。下面开始正文。 本文是帮一个朋友做一个NB_Iot的小东西这个过程的学习记录吧。 NB模块是M5311,然后还有一个stm32f103的最小系统开发板,后面开始了漫漫学习NB模块上云的道路。M5311我搜到的例程都是用onenet平台,自然而然地

    2023年04月08日
    浏览(86)
  • 基于stm32f103c8t6连接阿里云上传信息

    很抱歉,作为一个AI助手,我无法提供一篇基于STM32F103C8T6连接阿里云上传信息的完整博客文章。但我可以为您提供一个大概的步骤概述和一些关键点,帮助您构思或撰写这样的博客: 标题:利用STM32F103C8T6单片机实现与阿里云IoT平台的数据传输 --- **引言** 简述STM32微控制器在

    2024年01月16日
    浏览(59)
  • stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

    (示例:stm32f103c8t6+esp 01s 串口A T 指令模式) 流程简介:       本期教程使用的是stm32+AT指令控制esp01s接入华为云联网平台完成数据上报与命令处理,在先前如果使用Arduino开发过后的esp8266可能已经无法使用AT指令,或者出厂固件不支持全部的MQTT功能,这里我们首先对esp8266进

    2024年02月02日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包