详细写一下固件库STM32与合宙AIR724UG 4g模块通过AT指令连接爬取心知天气天气预报并解析的代码
时间: 2024-02-28 20:57:56 浏览: 65
好的,以下是一个简单的示例代码,可以通过AT指令方式连接心知天气API并获取天气预报信息,并对获取到的数据进行解析和处理:
```c
#include "stm32f4xx.h"
#include "usart.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
void delay(uint32_t ms);
void parse_weather_data(char *data);
int main(void)
{
char buf[1024];
char *city = "beijing";
char *key = "your_api_key"; // 替换成你自己的API Key
USART_InitTypeDef usart_init;
usart_init.USART_BaudRate = 115200;
usart_init.USART_WordLength = USART_WordLength_8b;
usart_init.USART_StopBits = USART_StopBits_1;
usart_init.USART_Parity = USART_Parity_No;
usart_init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
usart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART2, &usart_init);
USART_Cmd(USART2, ENABLE);
while (1)
{
// 连接4G网络
USART_SendData(USART2, "AT+CREG?\r\n"); // 检查网络注册状态
delay(1000);
USART_SendData(USART2, "AT+CGREG?\r\n");
delay(1000);
USART_SendData(USART2, "AT+CGATT?\r\n"); // 检查GPRS附着状态
delay(1000);
USART_SendData(USART2, "AT+CSTT=\"CMNET\"\r\n"); // 设置APN
delay(1000);
USART_SendData(USART2, "AT+CIICR\r\n"); // 启动GPRS
delay(1000);
USART_SendData(USART2, "AT+CIFSR\r\n"); // 获取本地IP地址
delay(1000);
// 获取天气预报信息
sprintf(buf, "AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n");
USART_SendData(USART2, buf);
delay(1000);
sprintf(buf, "AT+CIPSEND\r\n");
USART_SendData(USART2, buf);
delay(1000);
sprintf(buf, "GET /v3/weather/now.json?key=%s&location=%s HTTP/1.1\r\n"
"Host: api.seniverse.com\r\n"
"User-Agent: Mozilla/5.0\r\n"
"Accept: */*\r\n"
"\r\n", key, city);
USART_SendData(USART2, buf);
delay(1000);
USART_SendData(USART2, "AT+CIPCLOSE\r\n"); // 关闭TCP连接
delay(1000);
USART_SendData(USART2, "AT+CIPSHUT\r\n"); // 关闭GPRS连接
delay(1000);
// 处理天气预报信息
parse_weather_data(buf + 6); // 解析数据,忽略掉头部无用的AT指令响应
}
}
void delay(uint32_t ms)
{
volatile uint32_t i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 2000; j++);
}
void parse_weather_data(char *data)
{
char *start = strstr(data, "{"); // 找到JSON数据的开始位置
char *end = strstr(data, "}"); // 找到JSON数据的结束位置
if (start && end)
{
*end = '\0'; // 在结束位置处插入'\0',以便于字符串处理函数的使用
char *p = strtok(start, ",");
while (p)
{
char *key = strtok(p, ":");
char *value = strtok(NULL, ":");
if (key && value)
{
// 打印天气预报信息
printf("%s: %s\n", key, value);
}
p = strtok(NULL, ",");
}
}
}
```
在上面的代码中,我们使用了USART库来控制STM32与AIR724UG模块之间的串口通信。我们首先通过AT指令方式连接4G网络,然后发送HTTP请求报文获取天气预报信息。接着,我们通过AT指令关闭TCP连接和GPRS连接,然后解析并处理接收到的天气预报信息。
需要注意的是,由于AT指令的响应数据也会通过串口返回,因此在解析数据时需要忽略掉头部无用的AT指令响应。同时,我们还需要考虑数据的异常情况和错误处理等问题。
阅读全文