找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4135|回复: 1
收起左侧

手机怎么查看远程GPS数据呢?

[复制链接]
ID:224249 发表于 2018-8-21 16:04 | 显示全部楼层 |阅读模式
分享学习一下,手机查看gps数据
GPS手机远程接收方案
需要材料
材料
数量
GPS模块
1
GSM模块
1
电源
1
TCP服务器
1
可编程单片机
1
杜邦线
若干
螺丝螺母
若干
设计
GPS模块是串口收发的,如果需要把接收到的信息处理后传输给手机上查看,那么我们需要先设计出无线传输方案; 无线传输方案中有几种办法:
1.蓝牙传输
2.WIFI传输
3.通过GSM模块把经纬度信息放到网络服务器中
这里我们只介绍第三种方案,前面两种相对简单,需要介绍。
无论哪种方案,我们都需要先在众多的GPS数据中提取经纬度信息,提取方法参GPS的资料文档。GSM模块需要先设定好访问网络的功能,设置方法参考GSM的资料文档。
现在准备好的模块有2个串口传输,而大多数便宜单片机只有1个串口,这时可以采取下图的方案设计。
把GSM模块的RX接到单片机的TX,并把GPS的TX接到单片机的RX,这样就可以利用一个串口分别接两个模块达成效果。
服务器
服务器方案可以自己架设或者使用网络服务器,这里我们以LINUX服务为案例;服务器的工作非常简单,仅仅建立一个TCP服务器并把两个客户端得信息互相转发。这里提供下C的参考程序给大家修改。

  1. /*
  2. * main.cpp
  3. * TCP客户端信息转发
  4. * Author: Yayi
  5. */
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <errno.h>
  9. #include <string.h>
  10. #include <netdb.h>
  11. #include <sys/types.h>
  12. #include <netinet/in.h>
  13. #include <sys/socket.h>
  14. #include <unistd.h>
  15. #include <arpa/inet.h>
  16. #include <time.h>
  17. #include <sys/wait.h>

  18. #define WAITBUF 10
  19. int main(int argc, char *argv[])
  20. {
  21.               int sockfd,clientnub,client2nub;
  22.               struct sockaddr_in server_addr;
  23.               struct sockaddr_in client_addr,client2_addr;
  24.               socklen_t sin_size;
  25.               char serverlog0[1024] = {0};
  26.               char serverlog1[1024] = {0};
  27.               char serverlog2[1024] = {0};
  28.               time_t timep;
  29.               struct tm *p;

  30.               /*服务器端开始建立socket描述符*/
  31.               if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
  32.               {
  33.         fprintf(stderr,"Socket error:%s\n",strerror(errno));
  34.         exit(1);
  35.               }

  36.               /*服务器端填充 sockaddr结构*/
  37.               bzero(&server_addr,sizeof(struct sockaddr_in));
  38.               server_addr.sin_family=AF_INET;

  39.               /*自动填充主机IP*/
  40.               server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
  41.               server_addr.sin_port=htons(8888);

  42.               /*捆绑sockfd描述符*/
  43.               if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
  44.               {
  45.                       fprintf(stderr,"Bind error:%s\n",strerror(errno));
  46.                       exit(1);
  47.               }

  48.               /*监听sockfd描述符*/
  49.               if(listen(sockfd, WAITBUF)==-1)
  50.               {
  51.                       fprintf(stderr,"Listen error:%s\n",strerror(errno));
  52.                       exit(1);
  53.               }

  54.               /*等待客户端链接*/
  55.         sin_size=sizeof(struct sockaddr_in);
  56.         clientnub=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size);

  57.         /*日志格式化*/
  58.                   time(&timep);
  59.                   p = gmtime(&timep);

  60.               sprintf(serverlog0,"[%d.%d.%d", (1900+p->tm_year), (1+p->tm_mon), p->tm_mday);
  61.               sprintf(serverlog1," %d:%d:%d] ", p->tm_hour, p->tm_min, p->tm_sec);
  62.               sprintf(serverlog2,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));

  63.               FILE* file = fopen("tcpserver.log","a+");
  64.               fwrite(serverlog0,1,strlen(serverlog0),file);
  65.               fwrite(serverlog1,1,strlen(serverlog1),file);
  66.               fwrite(serverlog2,1,strlen(serverlog2),file);
  67.               fclose(file);

  68.               /*发送链接"OK\n"信号*/
  69.               send(clientnub,"OK\n",strlen("OK\n"),0);

  70.               /*等待客户端2链接*/
  71.               sin_size=sizeof(struct sockaddr_in);
  72.               client2nub=accept(sockfd,(struct sockaddr *)(&client2_addr),&sin_size);
  73.         /*日志格式化*/
  74.                   time(&timep);
  75.                   p = gmtime(&timep);


  76.               sprintf(serverlog0,"[%d.%d.%d", (1900+p->tm_year), (1+p->tm_mon), p->tm_mday);
  77.               sprintf(serverlog1," %d:%d:%d] ", p->tm_hour, p->tm_min, p->tm_sec);
  78.               sprintf(serverlog2,"Server get connection from %s\n",inet_ntoa(client2_addr.sin_addr));

  79.               file = fopen("tcpserver.log","a+");
  80.               fwrite(serverlog0,1,strlen(serverlog0),file);
  81.               fwrite(serverlog1,1,strlen(serverlog1),file);
  82.               fwrite(serverlog2,1,strlen(serverlog2),file);
  83.               fclose(file);

  84.               /*发送链接"OK\n"信号*/
  85.               send(client2nub,"OK\n",strlen("OK\n"),0);

  86.               while(1)
  87.               {
  88.                             char recv_send_data[1024]={0};
  89.                             /*把客户端2接收转发客户端*/
  90.                             if((recv(client2nub,recv_send_data,1024,0))>0)
  91.                                           send(clientnub,recv_send_data,strlen(recv_send_data),0);
  92.                             /*把客户端接收转发客户端2*/
  93.                             if((recv(clientnub,recv_send_data,1024,0))>0)
  94.                                           send(client2nub,recv_send_data,strlen(recv_send_data),0);
  95.               }
  96.               close(sockfd);
  97.               exit(0);
  98. }
复制代码

编译后运行一下即在阻塞等待两个客户端的接入。
手机APP接收数据格式
在单片机提取出经纬度的时候必须按照以下格式发送,否则手机APP不做处理。
Latitude:xx.xxxxx,Longitude:xxx.xxxxx\r\n
效果预览
图片是带着小狗跑步,可以看到小狗就在我得身后。

完整的Word格式文档51黑下载地址:
手机远程查看GPS信息方案.docx (131.55 KB, 下载次数: 20)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:361138 发表于 2019-3-2 21:39 | 显示全部楼层
这资料也太少了吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表