项目教程地址: 无线定位器极速入门教程-Android Studio-Air780EG-百度地图SDK-阿里云_哔哩哔哩bilibili_教程
项目演示视频: 基于STM32+Air780EG-C模块+Android Studio+阿里云平台+百度地图SDK实现无线定位器_哔哩哔哩bilibili
项目简介
本项目基于Android Studio+百度地图SDK+Air780EG-C 4G模块+阿里云平台实现远程无线定位。
STM32驱动Air780EG代码
Air780EG初始化
/**
* @brief AIR780EG初始化函数 初始化化RST、串口
* @param 无
* @param 无
* @retval 无
*/
void Air780EG_Init(void)
{
/* 开启时钟 */
USART_UX_CLK_ENABLE(); // 开启 USART_UX 的时钟
USART_TX_GPIO_CLK_ENABLE(); // 开启 USART_TX 的时钟
USART_RX_GPIO_CLK_ENABLE(); // 开启 USART_RX 的时钟
AIR780EG_RST_GPIO_CLK_ENABLE(); // 开启 AIR780EG 复位引脚的时钟
/* GPIO 初始化 */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = AIR780EG_RST_GPIO_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(AIR780EG_RST_GPIO_PORT, &GPIO_InitStructure); // 将 PB1 引脚初始化为推挽输出 用于复位4G模块
GPIO_WriteBit(AIR780EG_RST_GPIO_PORT, AIR780EG_RST_GPIO_PIN, Bit_RESET);// 将默认电平设置为低电平 模块高电平复位
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = USART_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(USART_TX_GPIO_PORT, &GPIO_InitStructure); // 将 PB10 引脚初始化为复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(USART_RX_GPIO_PORT, &GPIO_InitStructure); // 将 PB11 引脚初始化为上拉输入
/* USART 初始化 */
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200; // 波特率
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART_UX, &USART_InitStructure);
/* 中断输出配置 */
USART_ITConfig(USART_UX, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART_UX, USART_IT_IDLE, ENABLE);
/* NVIC 配置 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //将中断优先级分组设置为2
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART_UX_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
/* USART 使能 */
USART_Cmd(USART_UX, ENABLE);
}
连接阿里云
/**
* @brief Air780EG连接阿里云平台
* @param 无
* @param 无
* @retval 0 :连接成功
x :错误信息
*/
uint8_t Air780EG_ConnectAliyun(void)
{
Air780EG_Reset();
/* 1.1确认开机 ACK=OK*/
if(Air780EG_SendRevAck("AT\r\n","OK",2000,2)!=0) return 1;
/* 1.2关闭回显 ACK=OK*/
if(Air780EG_SendRevAck("ATE0\r\n","OK",2000,2)!=0) return 1;
/* 1.3确认SIM卡插好,查询SIM卡ICCID ACK=OK*/
if(Air780EG_SendRevAck("AT+ICCID\r\n","OK",2000,2)!=0) return 1;
/* 1.4确认是否附着网络,要为1后才执行下面操作 ACK=1*/
if(Air780EG_SendRevAck("AT+CGATT?\r\n","OK",2000,2)!=0) return 1;
/* 2.1设置PDP承载类型,固定 ACK=OK*/
if(Air780EG_SendRevAck("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n","OK",2000,2)!=0) return 2;
/* 2.2设置PDP承载的APN,固定 ACK=OK*/
if(Air780EG_SendRevAck("AT+SAPBR=3,1,\"APN\",\"\"\r\n","OK",2000,2)!=0) return 2;
/* 2.3激活PDP,固定 ACK=OK*/
if(Air780EG_SendRevAck("AT+SAPBR=1,1\r\n","OK",2000,2)!=0) return 2;
/* 2.4查询PDP IP地址,获取到IP地址后详细执行 ACK=1,1*/
if(Air780EG_SendRevAck("AT+SAPBR=2,1\r\n","1,1",2000,2)!=0) return 2;
/* 3.1设置MQTT参数客户端ID,用户名,密码,遗嘱一般不设置 ACK=OK*/
sprintf((char*)air780eg_dev.txbuff, "AT+MCONFIG=\"%s\",\"%s\",\"%s\"\r", clientId, username, passwd);
if(Air780EG_SendRevAck((char*)air780eg_dev.txbuff,"OK",2000,2)!=0) return 3;
/* 3.2连接MQTT服务器,设置服务器地址和端口 ACK=OK*/
sprintf((char*)air780eg_dev.txbuff, "AT+MIPSTART=\"%s\",\"%d\"\r", mqttHostUrl, port);
if(Air780EG_SendRevAck((char*)air780eg_dev.txbuff,"OK",2000,2)!=0) return 3;
Delay_ms(200);
/* 3.3发起会话请求,注意在AT+MIPSTART成功后,马上发送这个命令 ACK=OK*/
if(Air780EG_SendRevAck("AT+MCONNECT=1,120\r\n","OK",2000,2)!=0) return 3;
Delay_ms(200);
return 0;
}
获取基站定位
如果有GPS天线,可以使用GPS定位,精准度较高,基站定位有几米的误差
c/**
* @brief Air780EG获取基站定位
* @param 无
* @param 无
* @retval 0 :获取数据成功
1 :获取数据失败
*/
uint8_t Air780EG_Base_Location(__Location_Message *location_massage)
{
if(Air780EG_SendRevAck("AT+CIPGSMLOC=1,1\r\n","OK",2000,2) == 0) /* 发送请求基站定位指令 */
{
// 假设 buff 已经包含了响应数据,例如:+CIPGSMLOC: 0,35.3025538,113.9506925,2024/11/14,12:22:08
char *start_lat = NULL, *start_lon = NULL;
char lat[20], lon[20];
// 查找第一个逗号(跳过0和第一个逗号)
start_lat = strchr((char*)air780eg_dev.rxbuff, ',');
if (start_lat != NULL) {
start_lat++; // 跳过逗号,指向纬度数据
// 查找第二个逗号
start_lon = strchr(start_lat, ',');
if (start_lon != NULL) {
// 提取纬度
int lat_len = start_lon - start_lat;
strncpy(lat, start_lat, lat_len);
lat[lat_len] = '\0'; // 终止符
start_lon++; // 跳过第二个逗号,指向经度数据
// 查找第三个逗号
char *end_lon = strchr(start_lon, ',');
if (end_lon != NULL) {
// 提取经度
int lon_len = end_lon - start_lon;
strncpy(lon, start_lon, lon_len);
lon[lon_len] = '\0'; // 终止符
}
// 将经纬度从字符串转换为数字
location_massage->latitude = atof(lat); // 或者使用 strtof(lat, NULL) 更精确
location_massage->longitude = atof(lon); // 或者使用 strtof(lon, NULL) 更精确
// 检查经纬度是否有效,范围可以根据需要定义,通常经纬度范围分别是 [-90, 90] 和 [-180, 180]
if (location_massage->latitude && location_massage->longitude) {
return 0; // 获取数据有效
}
}
}
}
location_massage->latitude = 0.0;
location_massage->longitude = 0.0; // 数据获取失败
return 1;
}
数据上传
Air780EG_Base_Location(&location_massage); //Air780EG获取基站定位
sprintf((char*)air780eg_dev.txbuff, "AT+MPUB=\"/sys/iphnfvZeCGJ/Locator_Device/thing/event/property/post\",0,0,\"{\\22params\\22:{\\22Longitude\\22:%f,\\22Latitude\\22:%f}}\"\r", location_massage.longitude, location_massage.latitude);
Air780EG_SendStr((char*)air780eg_dev.txbuff);
阿里云平台配置
请查看教程视频:8-阿里云平台配置_哔哩哔哩_bilibili
百度地图SDK移植Android
请查看教程视频:4-百度地图SDK移植_哔哩哔哩_bilibili
完整代码示例,请添加嵌入式学习交流群:799387145获取
转载自CSDN-专业IT技术社区
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_67404238/article/details/143779669