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、串口助手界面
在这里插入图片描述
2、成功接入阿里云
(部分图片来自上次接入阿里云)
在这里插入图片描述
3、成功上传光照数据
在这里插入图片描述
4、在线调试里可以下发控制命令
在这里插入图片描述
5、查看自己是否订阅成功
在这里插入图片描述

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

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

		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的数据
在这里插入图片描述

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

最后:
需要源码的可以自行下载。代码下载链接
下载操作:
在这里插入图片描述

  • 57
    点赞
  • 419
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 58
    评论
要将STM32接入阿里云平台实现数据上传命令下发,首先需要进行以下步骤。 1. 准备硬件:选择合适的STM32开发板,并连接必要的传感器或执行器。确保能够通过STM32从设备获取所需的数据或执行相应的操作。 2. 创建阿里云账号:在阿里云官网注册账号并登录。 3. 创建物联网平台实例:进入物联网平台控制台,在实例列表中点击"创建实例"按钮。根据实际需求选择合适的计费方式、区域和规格,然后点击"创建"完成实例创建。 4. 创建产品和设备:在物联网平台控制台,点击"设备管理",然后点击"创建产品"。填写产品名称、节点类型、数据格式等信息。创建产品后,点击产品详情页面中的"设备管理",再点击"添加设备",填写设备名称和设备标识码,并将设备与产品进行绑定。 5. 编写STM32代码:使用合适的开发环境编写STM32代码,实现阿里云平台的通信。需要安装并使用阿里云提供的物联网软件开发套件(SDK),通过SDK提供的API实现数据上传命令下发功能。 6. 配置设备连接参数:在STM32代码中配置设备连接参数,包括设备的产品Key、设备Key、设备密钥等。这些参数可以在物联网平台控制台的"设备管理"页面中找到。 7. 数据上传:使用SDK提供的API,将STM32获取到的数据封装成阿里云平台所定义的数据格式,然后通过SDK的数据上传接口将数据发送到阿里云平台。 8. 命令下发阿里云平台提供了远程管理设备的功能,可以通过控制台或API发送命令给设备。在STM32代码中,使用SDK提供的命令接收接口来接收来自阿里云平台的命令,并根据命令内容执行相应的操作。 通过以上步骤,我们可以实现STM32阿里云平台的连接,实现数据上传命令下发的功能。
评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

⁽⁽ଘ晴空万里ଓ⁾⁾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值