跳到主要内容

4G远程GPS定位器

注意:本例程使用的 4G 模块为 SB-C17(EC800 4G 模块),ML302 4G 模块由于停产这里并不推荐使用。

前言:本教程中用到了 SB-C17(EC800M)4G Cat1 模组的定位功能,将模块直接插到C2 DevKit开发板上的4G插槽即可使用。GPS天线推荐购买《3米车载GPS天线》。

product0

一、实现的功能描述

通过 EC800M 模块和指定的服务器建立 TCP 连接,每当获取到定位信息(经纬度,海拔,卫星数量等)后黄色LED灯闪烁一次,并通过TCP发送给服务器,绿色LED灯用来指示是否已经和服务器连接。

本例程的通信是基于TCP方式,如果希望改成UDP、MQTT方式,或者更多详细细节,可以参考前面的《4G TCP/UDP/MQTT通信》文章。

注意:该GPS功能须在和服务器建立TCP连接上后才可获取定位信息,同理UDP/MQTT也是,这样做的目的是因为只有和服务器建立连接后,模块的定位信息获取的才有意义,所以本方案比较适用于在线实时的定位跟踪系统,而不适合离线定位。

二、本实验教学目的

掌握基于ShineBlink的:

  • 4G TCP通信,以及 4G 模组自带GPS定位的使用

  • GPIO控制LED灯(绿灯占用D9引脚)

三、完整源代码

源码(ML302,已停产)

LIB_GpioOutputConfig("D8","STANDARD") --初始化GPIO D8控制黄色LED1(指示GPS)
LIB_GpioOutputConfig("D9","STANDARD") --初始化GPIO D9控制绿色LED2(指示服务器连接状态)
--初始化4G TCP模式,并打开4g模块自带的GPS功能
server_addr = "47.92.146.210" --这里也可以写服务器域名,比如"abc.com"等
server_port = 8888
LIB_Cat1TcpUdpConfig("UART0","D5","HIGH","D6","HIGH","47.92.146.210",8888,0,"TCP","AUTO_AGPS")
--开始大循环
while(GC(1) == true)
do
--查询是否解析到GPS/北斗定位数据(搜到星后大概每4秒能获取一个定位信息)
flag,lo_f,la_f,al_f,utc,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16 = LIB_Cat1GpsQuery()
if flag == 1 then
LIB_GpioToggle("D8")--黄色LED闪烁
--将读取到的经度、纬度、海拔、UTC时间、以及卫星数量发送给服务器
LIB_Cat1TcpUdpSend(LIB_StrToTab(string.format("longtitude:%.3f latitude:%.3f altitude:%.1fm UTC:%d nsat:%s", lo_f,la_f,al_f,utc,r16)))
end
--读取一次4G状态信息
State,IMSI,ICCID,CSQ = LIB_Cat1StatusQuery()
if State == "Connected" then
LIB_GpioWrite("D9", 0) --4G模块已和服务器建立连接,绿灯亮
else
LIB_GpioWrite("D9", 1) --4G模块未和服务器建立连接,绿灯灭
end
end

源码(EC800M,推荐)

LIB_GpioOutputConfig("D8","STANDARD") --初始化GPIO D8控制黄色LED1(指示GPS)
LIB_GpioOutputConfig("D9","STANDARD") --初始化GPIO D9控制绿色LED2(指示服务器连接状态)
--初始化4G TCP模式,并打开4g模块自带的GPS功能
server_addr = "47.92.146.210" --这里也可以写服务器域名,比如"abc.com"等
server_port = 8888
LIB_Cat1TcpUdpEC800Config("UART0","D5","HIGH","D6","HIGH","47.92.146.210",8888,0,"TCP","AUTO_AGPS")
--开始大循环
while(GC(1) == true)
do
--查询是否解析到GPS/北斗定位数据(搜到星后大概每4秒能获取一个定位信息)
flag,lo_f,la_f,al_f,utc,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16 = LIB_Cat1GpsQuery()
if flag == 1 then
LIB_GpioToggle("D8")--黄色LED闪烁
--将读取到的经度、纬度、海拔、UTC时间、以及卫星数量发送给服务器
LIB_Cat1TcpUdpEC800Send(LIB_StrToTab(string.format("longtitude:%.3f latitude:%.3f altitude:%.1fm UTC:%d nsat:%s", lo_f,la_f,al_f,utc,r16)))
end
--读取一次4G状态信息
State,IMSI,ICCID,CSQ = LIB_Cat1StatusQuery()
if State == "Connected" then
LIB_GpioWrite("D9", 0) --4G模块已和服务器建立连接,绿灯亮
else
LIB_GpioWrite("D9", 1) --4G模块未和服务器建立连接,绿灯灭
end
end

四、实验现象

开发者需自己搭建TCP服务器,并将上面代码中的 server_addr 和 server_port 改成自己服务器的。

将上面的代码复制到开发板中并开始运行,如果4G模块成功连上服务器,此时开发板上的绿灯会亮,并且成功搜到星之后,就会在大概每隔4秒看获取到一次GPS定位信息(黄灯闪烁一次)。

五、实践经验总结:

  • NORMAL_GPS模式时,冷启动时GPS首次定位搜星时间较长,即使在开阔的地方也需30~60秒定位时间
  • 开启AGPS模式后,冷启动时GPS首次定位搜星时间则减少很多,只需10~20秒
  • 定位成功率及定位速率:室外开阔地带 > 楼宇边缘 > 阳台(半封闭) > 室内(几乎不可能定位)
  • 天线定位性能:车载GPS天线 > GPS有源陶瓷天线 > 无源FPC软天线

坐标系转换(需注意):

由于定位模块设备输出的经纬度定位信息的坐标系为WGS84国际标准,所以在不同地图中需要转换成对应的坐标系。例如使用百度地图时,需要将WGS84坐标系转换为BD09坐标系;用国内其他地图时,需要将WGS84坐标系转换为GCJ-02坐标系。如果不进行这些转换会出现定位偏差多则一两公里的问题。开发者可以使用 https://tool.lu/coordinate/ 这个网络在线工具做一个简单的验证。

六、 Config 函数初始化函数中 P10 GPS参数的介绍

  • "NO_GPS":不开启GPS

  • "NORMAL_GPS": 开启GPS,但不使用AGPS功能

  • "AUTO_AGPS"::开启GPS和AGPS,并且每隔4个小时后如果再次重新上电调用LIB_Cat1TcpUdpConfig会耗费下载星历数据的流量(5KB)

  • "FORCE_AGPS"::开启GPS和AGPS,并且每次重新上电后调用LIB_Cat1TcpUdpConfig必定会耗费下载星历数据的流量(5KB),该模式适合套餐流量充足的或者追求快速定位的