我是靠谱客的博主 怡然牛排,这篇文章主要介绍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、数据流名(标识符)修改
在这里插入图片描述
在这里插入图片描述
标识符查看方式:
在这里插入图片描述

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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); }

下发命令的处理

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//串口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文件

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#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的数据
在这里插入图片描述

复制代码
1
2
3
4
5
6
//上传多个数据 sprintf(mqtt_message, "{"method":"thing.service.property.post","id":"1234","params":{ "Light":%.1f,"myData":%d},"version":"1.0.0"}", light,myData);

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

最后

以上就是怡然牛排最近收集整理的关于STM32接入阿里云(简单版)-实现数据上传和命令下发的全部内容,更多相关STM32接入阿里云(简单版)-实现数据上传和命令下发内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部