- 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。
1、 如何在windows10上环境搭建,编译烧录代码固件,查看运行日志。
2、 GPS模块如何定位经纬度并且上报到MQTT服务器,实现远程查看模块的经纬度。
文章目录
一、小项目简介;
这个小diy项目是空闲时候做出来的,而且准备开源出来,主要功能是实现 在微信小程序上地图定位显示该 GPS模块的信息,想想都刺激啊!!
先上图,再解释一波:
全部开源(微信端和硬件端):
关注博文最下面的本人微信号二维码,回复 190828 即可获取本开源工程全部源码!
下面是实现原理:
- 采用安信可模块 A9G的开发板作为调试硬件,因为它支持 SDK 开发,插着中国移动的2G卡,再插着 GPS模块,可以实现全球定位;
- A9G模块可以实现MQTT协议连接,这个也是非常得意的,而且新版SDK支持重连机制;官网的SDK包有很多好玩的demo;
- A9G模块上面那个二维码是 IMEI信息,因此我用它作为我们与服务器通讯的主题设置;
- MQTT服务器我是自己搭建的,大家可以到我前面的博文参考怎么搭建。当然了,后面我会教大家使用阿里云物联网来实现;
- A9G模块定位的GPS出来的定位坐标系不是微信小程序的内置地图的坐标系,所以,需要进一步转换,而我使用依然是腾讯地图的开发服务,这个我后面会详细讲;
- 具体的通讯协议和睬坑记录都会在这个博文连载中一一为大家讲述;
二、前言;
上篇已经介绍了如何搭建环境,这篇就讨论如何在 A9G
模块上实现定位获取经纬度以及把经纬度通过MQTT
协议连接的推送到服务器;
玩得再好,也是参考官方的Demo
来改动的;
那么我们就开刀分析官网的工程,在 demo/gps
和 demo/mqtt
这2个工程;
三、GPS工程分析;
大致概述下这个工程的流程:GPS定位成功后,可以通过串口配置 发送close
来不再获取定位信息,发送 open
从而获取定位信息;
和 rtos 操作系统使用几乎一样,都是通过创建任务来做业务逻辑;
- 先创建主任务
gps_MainTask
,里面是个串口配置,又创建一个新任务专门读取gps
信息。 - 而剩下是不断等待死循环读取 系统的信息,这个貌似被封装过的;
- 当系统信息回调
API_EVENT_ID_NETWORK_REGISTERED_HOME
和API_EVENT_ID_NETWORK_REGISTERED_ROAMING
的时候,就判断是gprs
注册成功了! - 然后打开 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);
这里我们自定义我们的订阅和发布的主题,下篇我会详细讲下我这项目定的通讯协议,目前先上代码:
- 获取imei。
- 把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文档:https://ai-thinker-open.github.io/GPRS_C_SDK_DOC/zh/
- 安信可官网A9g开源仓库:https://github.com/Ai-Thinker-Open/GPRS_C_SDK
因为官网的代码开源仓库,在拉取时候总会出现小问题,初学者可以拉取我的仓库,我的是同步官网最新的,不用担心是否新版代码;
1. 下载代码
git clone --recursive https://github.com/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):https://github.com/xuhongv/StudyInEsp8266
- esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
- 邮箱联系或者加群联系我,就可以啦!