马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
项目教程所在: 无线定位器极速入门教程-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获取
|