开源⼀个安信可A9g⼩项⽬⼩程序定位器项⽬②GPS模块如何定位经纬度并且上报到MQTT。。。
本系列博客学习由⾮官⽅⼈员潜⼼所⼒所写,仅仅做个⼈技术交流分享,不做任何商业⽤途。如有不对之处,请留⾔,本⼈及时更改。
⽂章⽬录
⼀、⼩项⽬简介;
这个⼩diy项⽬是空闲时候做出来的,⽽且准备开源出来,主要功能是实现在⼩程序上地图定位显⽰该 GPS模块的信息,想想都刺激啊!!
先上图,再解释⼀波:
全部开源(端和硬件端):
关注博⽂最下⾯的本⼈号⼆维码,回复 190828 即可获取本开源⼯程全部源码!
下⾯是实现原理:
1. 采⽤安信可模块 A9G的开发板作为调试硬件,因为它⽀持 SDK 开发,插着中国移动的2G卡,再插着 GPS模块,可以实现全球定位;
2. A9G模块可以实现MQTT协议连接,这个也是⾮常得意的,⽽且新版SDK⽀持重连机制;官⽹的SDK包有很多好玩的demo;
3. A9G模块上⾯那个⼆维码是 IMEI信息,因此我⽤它作为我们与服务器通讯的主题设置;
4. MQTT服务器我是⾃⼰搭建的,⼤家可以到我前⾯的博⽂参考怎么搭建。当然了,后⾯我会教⼤家使⽤阿⾥云物联⽹来实现;
5. A9G模块定位的GPS出来的定位坐标系不是⼩程序的内置地图的坐标系,所以,需要进⼀步转换,⽽我使⽤依然是腾讯地图的开
发服务,这个我后⾯会详细讲;
6. 具体的通讯协议和睬坑记录都会在这个博⽂连载中⼀⼀为⼤家讲述;
⼆、前⾔;
上篇已经介绍了如何搭建环境,这篇就讨论如何在A9G模块上实现定位获取经纬度以及把经纬度通过MQTT协议连接的推送到服务器;
玩得再好,也是参考官⽅的Demo来改动的;
那么我们就开⼑分析官⽹的⼯程,在demo/gps和demo/mqtt这2个⼯程;
三、GPS⼯程分析;
⼤致概述下这个⼯程的流程:GPS定位成功后,可以通过串⼝配置发送close来不再获取定位信息,发送open从⽽获取定位信息;
和 rtos 操作系统使⽤⼏乎⼀样,都是通过创建任务来做业务逻辑;
1. 先创建主任务gps_MainTask,⾥⾯是个串⼝配置,⼜创建⼀个新任务专门读取gps信息。
2. ⽽剩下是不断等待死循环读取系统的信息,这个貌似被封装过的;
3. 当系统信息回调API_EVENT_ID_NETWORK_REGISTERED_HOME和API_EVENT_ID_NETWORK_REGISTERED_ROAMING的时候,就判断是gprs
注册成功了!
4. 然后打开 gps 定位,等待系统回复经纬度,当API_EVENT_ID_GPS_UART_RECEIVED就可以触发经纬度数据处理了;
我们烧录之后,过滤⽇志MMI 01看看这个过程;
过滤⽇志MMI 02看看这个经纬度?⼀开始以为这个是定位成功的,但是去官⽹⽂档提到这个是未成功定位!!我们可以把这个经纬度去查询下,竟然是腾讯总部,what ?这个显然是错误的;
GPS fix mode:1, BDS fix mode:1, fix quality:0, satellites tracked:0, gps sates total:0
, is fixed:no fix, coordinate:WGS84
, Latitude:22.589937, Longitude:113.227693
, unit:degree,altitude:0.000000
我不服,我再等待⼏分钟,因为现在 gps定位⽐较慢,⽽且我是室内开发,我弄长点数据线放窗⼝,果
然,不⼀会,就出现不⼀样的结果(由于个⼈隐私下⾯经纬度经过处理):
GPS fix mode:3, BDS fix mode:3, fix quality:1, satellites tracked:6
, gps sates total:12, is fixed:3D fix, coordinate:WGS84
, Latitude:xxxx, Longitude:xxxx, unit:degree,altitude:0.000000
所以,总结,只要is fixed的内容不是no fix,就是定位成功了!下⾯信息可以看到!
然后,我们就可以拿这个经纬度去某⽹站查询下,确实是这个模块的地址;
四、MQTT⼯程分析;
MQTT作为当前热⽕朝天的物联⽹通讯协议,想必哪个能联⽹的模块都可⽀持;
程序上都是先判断⽹络注册成功之后,才可以做mqtt的事情;
尤其注意,这⾥获取IMEI作为连接的client_id ,也就是模块那个⼆维码信息就是模块的IMEI;
当你成功连接服务器之后,发现定时不断地发送某消息到服务器,因为它这⾥有个延时发送:OS_StartCallbackTimer();
MQTT_Event_t* event=NULL;
//等待⽹络初始化成功才可以做mqtt的事情
semMqttStart = OS_CreateSemaphore(0);
OS_WaitForSemaphore(semMqttStart,OS_WAIT_FOREVER);
OS_DeleteSemaphore(semMqttStart);
semMqttStart = NULL;
Trace(1,"start mqtt test");
//这⾥获取IMEI作为连接的client_id
INFO_GetIMEI(imei);
Trace(1,"IMEI:%s",imei);
MQTT_Client_t* client = MQTT_ClientNew();
MQTT_Error_t err;
memset(&ci,0,sizeof(MQTT_Connect_Info_t));
ci.client_id = imei;
ci.client_user = CLIENT_USER;
ci.client_pass = CLIENT_PASS;
ci.keep_alive = 20;
ci.clean_session = 1;
ci.use_ssl = false;
ci.will_qos = 2;
ci.will_topic = "will";
ci.will_retain = 1;
memcpy(strstr(willMsg,"GPRS")+5,imei,15);
ci.will_msg = willMsg;
err = MQTT_Connect(client,BROKER_IP,BROKER_PORT,OnMqttConnection,NULL,&ci);
如何搭建git服务器if(err != MQTT_ERROR_NONE)
Trace(1,"MQTT connect fail,error code:%d",err);
总的来说,我们只要基于这个 MQTT ⼯程修改增加我们的 gps定位代码就可以了!
五、MQTT与GPS整合⼀起;
我们主要只是得到经纬度信息罢了,所以,我们把它组装成 json 格式,变成全局变量;以后上报信息就报这个就好啦;
sprintf(postDate, "{\"IsFix\":\"%s\",\"Lat\":%lf,\"Lon\":%lf}", isFixedStr, latitude, longitude);
这⾥我们⾃定义我们的订阅和发布的主题,下篇我会详细讲下我这项⽬定的通讯协议,⽬前先上代码:
1. 获取imei。
2. 把imei拼接成发布和订阅主题
INFO_GetIMEI(imei); // 获取imei
sprintf(subTopic, "/A9g/%s/get", imei); //设备端订阅的主题
sprintf(pubTopic, "/A9g/%s/update", imei); //设备端发布的主题
Trace(1, "subTopic: %s", subTopic); //打印下
Trace(1, "pubTopic: %s", pubTopic);//打印下
发布消息:我们把上⾯拼接好的数据postDate放进MQTT_Publish()函数⾥⾯就可以啦!当调⽤StartTimerPublish()函数就是发布函数,延迟时间⾃⼰可以定;
那么我们应该在哪发布呢?⾸先:你连接成功服务器之后,你得发布⼀次把?再者,服务器请求经纬度,你也得发布⼀次把?
//向MQTT服务器(broker)发布消息
//client:MQTT客户端对象
// topic:主题
// port:服务器端⼝
// payload:消息体
// payloadLen:消息体长度
// dup:标⽰发送重复数
// qos:服务质量
// retain:需要服务器持久保存消息
// callback:发布请求回调函数
// arg:需要传递给回调函数的参数
err = MQTT_Publish(client, pubTopic, postDate, strlen(postDate), 1, 2, 0, OnPublish, NULL);
每次上电,我们在 MQTT 后台查看,就有消息上报啦!
六、参考资料和个⼈仓库介绍;
参考资料:
安信可官⽹A9g⽂档:
安信可官⽹A9g开源仓库:
因为官⽹的代码开源仓库,在拉取时候总会出现⼩问题,初学者可以拉取我的仓库,我的是同步官⽹最新的,不⽤担⼼是否新版代码;
1. 下载代码
git clone --recursive github/xuhongv/GPRS_A9G
2. 检查代码完整性
下载完后请检查⽬录platform/csdk⽬录写是否包含debug、release⽬录。如果没有,则是下载⽅式错误,请仔细阅读第⼀步下载正确的⽂件!
3. 搭建编译环境
请移步到官⽹⽂档搭建,或者参考我这博⽂:
4. 编译⼯程
本仓库包含有官⽹的demo和我写的demo⼯程;
编译官⽅demo步骤:⽐如编译这个 gpio ,可以cd 到本⼯程⽬录,然后:
./build.bat demo gpio
编译我写的demo步骤:⽐如编译这个我分析的这个⼩程序追踪器,可以cd 到本⼯程⽬录,然后:
./build.bat mycode mini_tracer
七、其他;
另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留⾔哈!
玩转esp8266带你飞、加付费QQ,不喜的朋友勿喷勿加:434878850
esp8266源代码学习汇总(持续更新,欢迎star):github/xuhongv/StudyInEsp8266
esp32源代码学习汇总(持续更新,欢迎star):github/xuhongv/StudyInEsp32
邮箱联系或者加联系我,就可以啦!