基于STM32+Air780EG+Android+百度舆图SDK实现无线定位器

[复制链接]
发表于 2025-9-18 04:44:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
项目教程所在: 无线定位器极速入门教程-Android Studio-Air780EG-百度舆图SDK-阿里云_哔哩哔哩bilibili_教程
项目演示视频: 基于STM32+Air780EG-C模块+Android Studio+阿里云平台+百度舆图SDK实现无线定位器_哔哩哔哩bilibili
项目简介

本项目基于Android Studio+百度舆图SDK+Air780EG-C 4G模块+阿里云平台实现远程无线定位。

STM32驱动Air780EG代码

Air780EG初始化
  1. /**
  2. * @brief    AIR780EG初始化函数 初始化化RST、串口
  3. * @param    无
  4. * @param    无
  5. * @retval   无
  6. */
  7. void Air780EG_Init(void)
  8. {
  9.         /* 开启时钟 */
  10.         USART_UX_CLK_ENABLE();                                        // 开启 USART_UX 的时钟
  11.         USART_TX_GPIO_CLK_ENABLE();                                    // 开启 USART_TX 的时钟
  12.         USART_RX_GPIO_CLK_ENABLE();                             // 开启 USART_RX 的时钟
  13.     AIR780EG_RST_GPIO_CLK_ENABLE();                         // 开启 AIR780EG 复位引脚的时钟
  14.         /* GPIO 初始化 */
  15.     GPIO_InitTypeDef GPIO_InitStructure;
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  17.         GPIO_InitStructure.GPIO_Pin = AIR780EG_RST_GPIO_PIN;
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.         GPIO_Init(AIR780EG_RST_GPIO_PORT, &GPIO_InitStructure);                                        // 将 PB1 引脚初始化为推挽输出 用于复位4G模块
  20.    
  21.     GPIO_WriteBit(AIR780EG_RST_GPIO_PORT, AIR780EG_RST_GPIO_PIN, Bit_RESET);// 将默认电平设置为低电平 模块高电平复位
  22.    
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  24.         GPIO_InitStructure.GPIO_Pin = USART_TX_GPIO_PIN;
  25.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  26.         GPIO_Init(USART_TX_GPIO_PORT, &GPIO_InitStructure);                                        // 将 PB10 引脚初始化为复用推挽输出
  27.        
  28.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  29.         GPIO_InitStructure.GPIO_Pin = USART_RX_GPIO_PIN;
  30.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  31.         GPIO_Init(USART_RX_GPIO_PORT, &GPIO_InitStructure);                                        // 将 PB11 引脚初始化为上拉输入
  32.        
  33.         /* USART 初始化 */
  34.         USART_InitTypeDef USART_InitStructure;
  35.         USART_InitStructure.USART_BaudRate = 115200;                                // 波特率
  36.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  37.         USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  38.         USART_InitStructure.USART_Parity = USART_Parity_No;
  39.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  40.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  41.         USART_Init(USART_UX, &USART_InitStructure);
  42.        
  43.         /* 中断输出配置 */
  44.         USART_ITConfig(USART_UX, USART_IT_RXNE, ENABLE);
  45.         USART_ITConfig(USART_UX, USART_IT_IDLE, ENABLE);
  46.        
  47.         /* NVIC 配置 */
  48.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);             //将中断优先级分组设置为2
  49.         NVIC_InitTypeDef NVIC_InitStructure;
  50.         NVIC_InitStructure.NVIC_IRQChannel = USART_UX_IRQn;
  51.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  52.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  53.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  54.         NVIC_Init(&NVIC_InitStructure);
  55.        
  56.         /* USART 使能 */
  57.         USART_Cmd(USART_UX, ENABLE);
  58. }
复制代码
毗连阿里云
  1. /**
  2. * @brief    Air780EG连接阿里云平台
  3. * @param    无
  4. * @param    无
  5. * @retval   0  :连接成功
  6.              x  :错误信息
  7. */
  8. uint8_t Air780EG_ConnectAliyun(void)
  9. {
  10.     Air780EG_Reset();
  11.     /* 1.1确认开机 ACK=OK*/
  12.         if(Air780EG_SendRevAck("AT\r\n","OK",2000,2)!=0) return 1;
  13.     /* 1.2关闭回显 ACK=OK*/
  14.         if(Air780EG_SendRevAck("ATE0\r\n","OK",2000,2)!=0) return 1;
  15.     /* 1.3确认SIM卡插好,查询SIM卡ICCID ACK=OK*/
  16.         if(Air780EG_SendRevAck("AT+ICCID\r\n","OK",2000,2)!=0) return 1;
  17.     /* 1.4确认是否附着网络,要为1后才执行下面操作 ACK=1*/
  18.         if(Air780EG_SendRevAck("AT+CGATT?\r\n","OK",2000,2)!=0) return 1;
  19.     /* 2.1设置PDP承载类型,固定 ACK=OK*/
  20.         if(Air780EG_SendRevAck("AT+SAPBR=3,1,"CONTYPE","GPRS"\r\n","OK",2000,2)!=0) return 2;
  21.     /* 2.2设置PDP承载的APN,固定 ACK=OK*/
  22.         if(Air780EG_SendRevAck("AT+SAPBR=3,1,"APN",""\r\n","OK",2000,2)!=0) return 2;
  23.     /* 2.3激活PDP,固定 ACK=OK*/
  24.     if(Air780EG_SendRevAck("AT+SAPBR=1,1\r\n","OK",2000,2)!=0) return 2;
  25.     /* 2.4查询PDP IP地址,获取到IP地址后详细执行 ACK=1,1*/
  26.         if(Air780EG_SendRevAck("AT+SAPBR=2,1\r\n","1,1",2000,2)!=0) return 2;
  27.     /* 3.1设置MQTT参数客户端ID,用户名,密码,遗嘱一般不设置 ACK=OK*/
  28.     sprintf((char*)air780eg_dev.txbuff, "AT+MCONFIG="%s","%s","%s"\r", clientId, username, passwd);
  29.         if(Air780EG_SendRevAck((char*)air780eg_dev.txbuff,"OK",2000,2)!=0) return 3;
  30.     /* 3.2连接MQTT服务器,设置服务器地址和端口 ACK=OK*/
  31.     sprintf((char*)air780eg_dev.txbuff, "AT+MIPSTART="%s","%d"\r", mqttHostUrl, port);
  32.         if(Air780EG_SendRevAck((char*)air780eg_dev.txbuff,"OK",2000,2)!=0) return 3;
  33.     Delay_ms(200);
  34.     /* 3.3发起会话请求,注意在AT+MIPSTART成功后,马上发送这个命令 ACK=OK*/
  35.     if(Air780EG_SendRevAck("AT+MCONNECT=1,120\r\n","OK",2000,2)!=0) return 3;
  36.     Delay_ms(200);
  37.         return 0;
  38. }
复制代码
获取基站定位

假如有GPS天线,可以使用GPS定位,精准度较高,基站定位有几米的偏差
  1. c/**
  2. * @brief    Air780EG获取基站定位
  3. * @param    无
  4. * @param    无
  5. * @retval   0  :获取数据成功
  6.              1  :获取数据失败
  7. */
  8. uint8_t Air780EG_Base_Location(__Location_Message *location_massage)
  9. {
  10.     if(Air780EG_SendRevAck("AT+CIPGSMLOC=1,1\r\n","OK",2000,2) == 0)    /* 发送请求基站定位指令 */
  11.     {
  12.         // 假设 buff 已经包含了响应数据,例如:+CIPGSMLOC: 0,35.3025538,113.9506925,2024/11/14,12:22:08
  13.         char *start_lat = NULL, *start_lon = NULL;
  14.         char lat[20], lon[20];
  15.         // 查找第一个逗号(跳过0和第一个逗号)
  16.         start_lat = strchr((char*)air780eg_dev.rxbuff, ',');
  17.         if (start_lat != NULL) {
  18.             start_lat++;  // 跳过逗号,指向纬度数据
  19.             // 查找第二个逗号
  20.             start_lon = strchr(start_lat, ',');
  21.             if (start_lon != NULL) {
  22.                 // 提取纬度
  23.                 int lat_len = start_lon - start_lat;
  24.                 strncpy(lat, start_lat, lat_len);
  25.                 lat[lat_len] = '\0';  // 终止符
  26.                
  27.                 start_lon++;  // 跳过第二个逗号,指向经度数据
  28.                 // 查找第三个逗号
  29.                 char *end_lon = strchr(start_lon, ',');
  30.                 if (end_lon != NULL) {
  31.                     // 提取经度
  32.                     int lon_len = end_lon - start_lon;
  33.                     strncpy(lon, start_lon, lon_len);
  34.                     lon[lon_len] = '\0';  // 终止符
  35.                 }
  36.                 // 将经纬度从字符串转换为数字
  37.                 location_massage->latitude = atof(lat);  // 或者使用 strtof(lat, NULL) 更精确
  38.                 location_massage->longitude = atof(lon); // 或者使用 strtof(lon, NULL) 更精确
  39.                 // 检查经纬度是否有效,范围可以根据需要定义,通常经纬度范围分别是 [-90, 90] 和 [-180, 180]
  40.                 if (location_massage->latitude && location_massage->longitude) {
  41.                     return 0;           // 获取数据有效
  42.                 }
  43.             }
  44.         }
  45.     }
  46.     location_massage->latitude = 0.0;
  47.     location_massage->longitude = 0.0;  // 数据获取失败
  48.     return 1;
  49. }
复制代码
数据上传
  1. Air780EG_Base_Location(&location_massage);       //Air780EG获取基站定位
  2. 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);
  3. Air780EG_SendStr((char*)air780eg_dev.txbuff);
复制代码
阿里云平台设置

 请查察教程视频:8-阿里云平台设置_哔哩哔哩_bilibili
百度舆图SDK移植Android

请查察教程视频:4-百度舆图SDK移植_哔哩哔哩_bilibili
完备代码示例,请添加嵌入式学习799387145获取
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表