1、 如何在windows10上环境搭建,编译烧录代码固件,查看运行日志。
2、 GPS模块如何定位经纬度并且上报到MQTT服务器,实现远程查看模块的经纬度。
这个小diy项目是空闲时候做出来的,而且准备开源出来,主要功能是实现 在微信小程序上地图定位显示该 GPS模块的信息,想想都刺激啊!!
先上图,再解释一波:
关注博文最下面的本人微信号二维码,回复 190828 即可获取本开源工程全部源码!
下面是实现原理:
上篇已经介绍了如何搭建环境,这篇就讨论如何在 A9G
模块上实现定位获取经纬度以及把经纬度通过MQTT
协议连接的推送到服务器;
玩得再好,也是参考官方的Demo
来改动的;
那么我们就开刀分析官网的工程,在 demo/gps
和 demo/mqtt
这2个工程;
大致概述下这个工程的流程:GPS定位成功后,可以通过串口配置 发送close
来不再获取定位信息,发送 open
从而获取定位信息;
和 rtos 操作系统使用几乎一样,都是通过创建任务来做业务逻辑;
gps_MainTask
,里面是个串口配置,又创建一个新任务专门读取 gps
信息。API_EVENT_ID_NETWORK_REGISTERED_HOME
和 API_EVENT_ID_NETWORK_REGISTERED_ROAMING
的时候,就判断是 gprs
注册成功了!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的事情;
尤其注意,这里获取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);
我们主要只是得到经纬度信息罢了,所以,我们把它组装成 json 格式,变成全局变量;以后上报信息就报这个就好啦;
sprintf(postDate, "{\"IsFix\":\"%s\",\"Lat\":%lf,\"Lon\":%lf}", isFixedStr, latitude, longitude);
这里我们自定义我们的订阅和发布的主题,下篇我会详细讲下我这项目定的通讯协议,目前先上代码:
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);
参考资料:
因为官网的代码开源仓库,在拉取时候总会出现小问题,初学者可以拉取我的仓库,我的是同步官网最新的,不用担心是否新版代码;
git clone --recursive https://github.com/xuhongv/GPRS_A9G
下载完后请检查目录platform/csdk
目录写是否包含debug
、release
目录。如果没有,则是下载方式错误,请仔细阅读第一步下载正确的文件!
请移步到官网文档搭建,或者参考我这博文:传送门
本仓库包含有官网的demo和我写的demo工程;
编译官方demo步骤:比如编译这个 gpio ,可以cd 到本工程目录,然后:
./build.bat demo gpio
编译我写的demo步骤:比如编译这个我分析的这个 微信小程序追踪器 ,可以cd 到本工程目录,然后:
./build.bat mycode mini_tracer
esp8266
带你飞、加群付费QQ
群,不喜的朋友勿喷勿加:434878850