分享學習一下,手機查看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的參考程序給大家修改。
- /*
- * main.cpp
- * TCP客戶端信息轉發
- * Author: Yayi
- */
- #include <stdlib.h>
- #include <stdio.h>
- #include <errno.h>
- #include <string.h>
- #include <netdb.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <sys/socket.h>
- #include <unistd.h>
- #include <arpa/inet.h>
- #include <time.h>
- #include <sys/wait.h>
-
- #define WAITBUF 10
- int main(int argc, char *argv[])
- {
- int sockfd,clientnub,client2nub;
- struct sockaddr_in server_addr;
- struct sockaddr_in client_addr,client2_addr;
- socklen_t sin_size;
- char serverlog0[1024] = {0};
- char serverlog1[1024] = {0};
- char serverlog2[1024] = {0};
- time_t timep;
- struct tm *p;
-
- /*服務器端開始建立socket描述符*/
- if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
- {
- fprintf(stderr,"Socket error:%s\n",strerror(errno));
- exit(1);
- }
-
- /*服務器端填充 sockaddr結構*/
- bzero(&server_addr,sizeof(struct sockaddr_in));
- server_addr.sin_family=AF_INET;
-
- /*自動填充主機IP*/
- server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
- server_addr.sin_port=htons(8888);
-
- /*捆綁sockfd描述符*/
- if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
- {
- fprintf(stderr,"Bind error:%s\n",strerror(errno));
- exit(1);
- }
-
- /*監聽sockfd描述符*/
- if(listen(sockfd, WAITBUF)==-1)
- {
- fprintf(stderr,"Listen error:%s\n",strerror(errno));
- exit(1);
- }
-
- /*等待客戶端鏈接*/
- sin_size=sizeof(struct sockaddr_in);
- clientnub=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size);
-
- /*日志格式化*/
- time(&timep);
- p = gmtime(&timep);
-
- sprintf(serverlog0,"[%d.%d.%d", (1900+p->tm_year), (1+p->tm_mon), p->tm_mday);
- sprintf(serverlog1," %d:%d:%d] ", p->tm_hour, p->tm_min, p->tm_sec);
- sprintf(serverlog2,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));
-
- FILE* file = fopen("tcpserver.log","a+");
- fwrite(serverlog0,1,strlen(serverlog0),file);
- fwrite(serverlog1,1,strlen(serverlog1),file);
- fwrite(serverlog2,1,strlen(serverlog2),file);
- fclose(file);
-
- /*發送鏈接"OK\n"信號*/
- send(clientnub,"OK\n",strlen("OK\n"),0);
-
- /*等待客戶端2鏈接*/
- sin_size=sizeof(struct sockaddr_in);
- client2nub=accept(sockfd,(struct sockaddr *)(&client2_addr),&sin_size);
- /*日志格式化*/
- time(&timep);
- p = gmtime(&timep);
-
-
- sprintf(serverlog0,"[%d.%d.%d", (1900+p->tm_year), (1+p->tm_mon), p->tm_mday);
- sprintf(serverlog1," %d:%d:%d] ", p->tm_hour, p->tm_min, p->tm_sec);
- sprintf(serverlog2,"Server get connection from %s\n",inet_ntoa(client2_addr.sin_addr));
-
- file = fopen("tcpserver.log","a+");
- fwrite(serverlog0,1,strlen(serverlog0),file);
- fwrite(serverlog1,1,strlen(serverlog1),file);
- fwrite(serverlog2,1,strlen(serverlog2),file);
- fclose(file);
-
- /*發送鏈接"OK\n"信號*/
- send(client2nub,"OK\n",strlen("OK\n"),0);
-
- while(1)
- {
- char recv_send_data[1024]={0};
- /*把客戶端2接收轉發客戶端*/
- if((recv(client2nub,recv_send_data,1024,0))>0)
- send(clientnub,recv_send_data,strlen(recv_send_data),0);
- /*把客戶端接收轉發客戶端2*/
- if((recv(clientnub,recv_send_data,1024,0))>0)
- send(client2nub,recv_send_data,strlen(recv_send_data),0);
- }
- close(sockfd);
- exit(0);
- }
復制代碼
編譯后運行一下即在阻塞等待兩個客戶端的接入。 手機APP接收數據格式 在單片機提取出經緯度的時候必須按照以下格式發送,否則手機APP不做處理。 Latitude:xx.xxxxx,Longitude:xxx.xxxxx\r\n 效果預覽 圖片是帶著小狗跑步,可以看到小狗就在我得身后。
完整的Word格式文檔51黑下載地址: |