概述
前言:
之前做了带有实时操作系统的接入阿里云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("当前光照:%.1fLxrn",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("当前光照:%.1fLxrn",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灯已%srn",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!rn");
status++;
}
else
{
printf("Net Init Error!rn");
status=0;
}
if(status==1)
//连接热点
{
if(_net.ConnectAP(WIFI_NAME,WIFI_PASSWD)!=0)
{
printf("Conncet AP OK!rn");
status++;
}
else
{
printf("Conncet AP Error!rn");
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!rn");
status++;
}
else
{
printf("Conncet Server Error!rn");
}
}
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!rn");
status++;
}
else
{
printf("Enter MQTT Error!rn");
status=0;
}
}
if(status==4)
//订阅主题
{
if(_mqtt.SubscribeTopic(MQTT_SUBSCRIBE_TOPIC,0,1) != 0)
{
printf("SubscribeTopic OK!rn");
}
else
{
printf("SubscribeTopic Error!rn");
}
}
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);
最后:
需要源码的可以自行下载。代码下载链接
下载操作:
最后
以上就是怡然牛排为你收集整理的STM32接入阿里云(简单版)-实现数据上传和命令下发的全部内容,希望文章能够帮你解决STM32接入阿里云(简单版)-实现数据上传和命令下发所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复