开源一个安信可A9g小项目微信小程序定位器项目②GPS模块如何定位经纬度并且上报到MQTT服务器,实现远程查看模块的经纬度; - CoreHouse

时间:2024-03-06 10:14:50

  • 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

1、 如何在windows10上环境搭建,编译烧录代码固件,查看运行日志。

2、 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/gpsdemo/mqtt 这2个工程;


三、GPS工程分析;


     大致概述下这个工程的流程:GPS定位成功后,可以通过串口配置 发送close来不再获取定位信息,发送 open 从而获取定位信息;


     和 rtos 操作系统使用几乎一样,都是通过创建任务来做业务逻辑;

  1. 先创建主任务 gps_MainTask ,里面是个串口配置,又创建一个新任务专门读取 gps 信息。
  2. 而剩下是不断等待死循环读取 系统的信息,这个貌似被封装过的;
  3. 当系统信息回调 API_EVENT_ID_NETWORK_REGISTERED_HOMEAPI_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);
    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 后台查看,就有消息上报啦!

在这里插入图片描述


六、参考资料和个人仓库介绍;


    参考资料:

    因为官网的代码开源仓库,在拉取时候总会出现小问题,初学者可以拉取我的仓库,我的是同步官网最新的,不用担心是否新版代码;

1. 下载代码

git clone --recursive https://github.com/xuhongv/GPRS_A9G

2. 检查代码完整性

下载完后请检查目录platform/csdk目录写是否包含debugrelease目录。如果没有,则是下载方式错误,请仔细阅读第一步下载正确的文件!

3. 搭建编译环境

请移步到官网文档搭建,或者参考我这博文:传送门

4. 编译工程

本仓库包含有官网的demo和我写的demo工程;

编译官方demo步骤:比如编译这个 gpio ,可以cd 到本工程目录,然后:

 ./build.bat demo gpio

编译我写的demo步骤:比如编译这个我分析的这个 微信小程序追踪器 ,可以cd 到本工程目录,然后:

 ./build.bat mycode mini_tracer

七、其他;


另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

  • 玩转esp8266带你飞、加群付费QQ群,不喜的朋友勿喷勿加:434878850
  • esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
  • esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
  • 邮箱联系或者加群联系我,就可以啦!