基于STM32+Air780EG+Android+百度地图SDK实现无线定位器
项目教程地址: 无线定位器极速入门教程-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获取
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。