基于NB-IoT的GPS定位系统(STM32、WH-NB73、U-BLOX NEO-7N )
本系统采用的是STM32控制U-BLOX NEO-7N GPS模块获取位置信息,通过有人物联网系列的WH-NB73 NB模块传输数据,最终在谷雨云平台可视化显示。
前期准备
GPS模块测试
将GPS模块接上串口,通过串口调试工具可以看到多种格式的定位信息,本系统使用的是推荐定位信息,因此要将改信息提取出来,主要代码如下:
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
if(Res == '$')
{
point1 = 0;
}
USART_RX_BUF[point1++] = Res;
if(USART_RX_BUF[0] == '$' && USART_RX_BUF[4] == 'M' && USART_RX_BUF[5] == 'C') //确定是否收到"GPRMC/GNRMC"这一帧数据
{
if(Res == '\n')
{
memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length); //清空Save_Data.GPS_Buffer
memcpy(Save_Data.GPS_Buffer, USART_RX_BUF, point1); //保存数据
Save_Data.isGetData = true;
point1 = 0;
memset(USART_RX_BUF, 0, USART_REC_LEN); //清空 USART_RX_BUF
}
}
通过串口调试工具可以看到编码后获取的获这样获取到的数据格式如下图所示:
NB73模块测试
主要是测试NB-IoT模块能否与云平台正常通信。将NB-IoT模块通过USB TO TTL与电脑相连。通过稳恒科技的串口软件可以对NB-IoT模块的各种信息进行一键自动检测,可以快速的查看到模块的是否出现异常。下图为通过检测示意图。
NB73模块与云平台数据交互测试
按照有人物联网提供的CoAP透传配置方案,配置方案参考以下链接:https://www.usr.cn/Faq/371.html,主要参考前部分配置,数据交互部分在谷雨云完成。
将NB-IoT模块配置成CoAP透传模式后,可以通过串口工具与谷雨云平台进行数据交互,在串口工具中上报数据云平台可以接收,云平台将数据下发串口工具中也可以查看到。我们在配置成功后,使用串口工具发送ceshi给NB-IoT模块,云平台可以接收到;在云平台发送ceshi给NB-IoT模块,可以在串口工具中接收。因此可以表明该模块可正常配置为CoAP透传模式并与云平台通信。测试数据交互成功如下图所示。
GPS数据处理
在前面获取到了GPS的经纬度原始数据了,但是原始数据不是百度地图可以识别的经纬度坐标,因此需要将GPS的原始坐标线转换为度分格式,再转换为火星坐标,最后才能转换成百度坐标。(转换的代码网上有很多可以参考就不贴了,如果调用百度API就可以不用自己转换)转换完成百度坐标后再转换成为谷雨云规定的上报GPS数据格式,这样才能在谷雨云的图形化调试模式中的地图内定位。下图为转换后上报到谷雨云的数据格式,通过在串口中显示出来,实时查看上报的数据,便于找出问题。
NB73模块与云平台通信
NB73模块要与谷雨云平台交互数据,需要将NB73模块在指令模式中配置成CoAP透传模式,NB73模块进入指令模式和退出指令模式的操作步骤如下:
1)串口给模块连续发送“+++”,NB 模块收到“+++”后,会给设备发送一个‘a’。
2) 串口接收‘a’后,必须在 3 秒内给 NB 模块发送一个‘a’。
3) NB 模块在接收到‘a’后,给设备返回“+ok”,并进入“临时指令模式”。
4)当用户设备接收到“+ok”后,可以向 NB 模块发送 AT 指令。
NB的配置代码过程过程就不过多叙述,参考了其他博主的一些配置方式,然后做出了一些改进,主要参考代码的链接如下:https://blog.csdn.net/he__yuan/article/details/101625458。下面贴部分代码简述一下做出的改进。
由于NB73模块收到数据的反应时间的不确定性,可能会导致配置错误,因此加入一行代码判断串口是否接收到数据再进行后续判断,这样就可以保证NB73模块发送给单片机的数据不会丢失。
u8 NB_IoT_ack_chack(u8 *str) //检查NB模块应答是否符合预期
{
// Delay_Ms(10);
while (!USART2_RX_STA);
if(USART2_RX_STA!=0)
{
USART2_RX_STA=0;
if(strstr((const char*)USART2_RX_BUF,(const char*)str))//符合预期
{
memset(USART2_RX_BUF,0, sizeof USART2_RX_BUF);
return 0;
}
else //不符合预期
{
memset(USART2_RX_BUF,0, sizeof USART2_RX_BUF);
return 1;
}
}
else
{
memset(USART2_RX_BUF,0, sizeof USART2_RX_BUF); //清空数组
return 1;
}
}
下面首先是修改成先发送AT+ENTM\r\n命令退出指令模式,然后再发送一系列AT指令配置NB73模块进入指令模式,这样就可以保证模块每次都重新进行配置,而不会因为上一次配置错误而停留在指令模式内。
u8 NB_IotConect() //进入命令模式
{
u8 x=1;
send_NB_IoT("AT+ENTM\r\n");
Delay_Ms (2000);
send_NB_IoT("+++");
if(!NB_IoT_ack_chack("a"))
{
send_NB_IoT("a");
if(!NB_IoT_ack_chack("+ok"))
{
x=0;
}
else
{
x = 1;
}
}
else
{
x = 1;
}
return x;
}
演示
对单片机上电后,进入谷雨云平台的控制台中心,进入设备的图形化调试界面,可以发现在地图中对上报的数据进行了定位。效果图如下所示。
由于谷雨云图形化界面的下发命令正在完善,因此对下发命令停止和开启上报数据需要在数据调试模式中进行。
现在数据调试模式对设备下发STOP,设备将停止上传位置信息,系统停止定位。下发STOP命令停止定位如下图。
由于NB-IoT的在PSM模式下低功耗特性,需要在数据上报的20S内下发数据设备才能接收到,因此在20S内下发BEGIN,设备才会重新开始上报数据继续定位。(小白也是后面才知道为什么是20S,不懂的可以百度百度,大神们写的很完善了)下发命令继续定位如下图。