前言:
之前做了带有实时操作系统的接入阿里云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
17delay_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接入阿里云(简单版)-实现数据上传和命令下发内容请搜索靠谱客的其他文章。
发表评论 取消回复