关注

基于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获取

转载自CSDN-专业IT技术社区

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_67404238/article/details/143779669

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--