平台介绍
主机操作系统:Centos6.7
开发平台: FL2440
GPS模块:FIT-GPS-SF2820
编程思想
SF2820的GPS信息通过串口发送给FL2440,FL2440通过socket上报给服务器,服务器获取到GPS数据信息进行解析后显示,详细见代码。
详细代码
以下代码模块中要是不理解可以翻阅前面的博文,都有详细的解说。
服务端:
存放的文件有
gps.c 与gps.h可见博文
https://blog.csdn.net/m0_38022615/article/details/81386652
socket_server.c源代码:
功能:与客户端进行通信,接收客户端发来的数据,进行解析
/*********************************************************************************
* Copyright: (C) 2018 NULL
* All rights reserved.
*
* Filename: socket_server.c
* Description: This file
*
* Version: 1.0.0(2018年08月05日)
* Author: DingHuanhuan <[email protected]>
* ChangeLog: 1, Release initial version on "2018年08月05日 19时30分27秒"
*
********************************************************************************/
#include "gps.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
/* sockaddr_in{} and other Internet define */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/* strerror(),perror(), errno head file */
#include <errno.h>
#define BUF_SIZE 1024
#define port 12345
int main(int argc, char **argv)
{
int listen_fd,accept_fd; //创建两个套接字,一个开启连接,一个通信
struct sockaddr_in server_addr;//服务器端地址,是一个结构体,等下要填充ipV4或者ipV6的结构
char buf[BUF_SIZE];
GPRMC gprmc_data;
listen_fd = socket(AF_INET,SOCK_STREAM,0);
if(listen_fd < 0)
{
printf("Creat socket failure:%s\n",strerror(errno));
return -1;
}
printf("Socket creat fd is %d\n",listen_fd);
/*服务器设置,设置server地址和端口号,用于接受任何client端*/
memset(&server_addr,0,sizeof(server_addr)); //清空再设置ipV4地址
server_addr.sin_family = AF_INET; //设置为ipV4地址
server_addr.sin_port = htons(port); //端口号,主机字节序转网络字节序,short是16位
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //设置host主机地址
if(bind(listen_fd,(struct sockaddr *)&server_addr,sizeof(server_addr))<0)
{
printf("Bind socket failure %s\n",strerror(errno));
return -2;
}
printf("socket bind ok\n");
listen(listen_fd,15);//等待连接,最大连接数设为15
printf("socket listen ok\n");
printf("Start accept %d\n",listen_fd);
accept_fd = accept(listen_fd,NULL,NULL);
//accept接受的参数必须经过listen和bing处理过,返回一个新的socket码
//新的socket传送数据,旧的socket还能继续用accept接受请
//后面两个参数设置为NULL,那么会在系统连接时自动根据客户端信息填入
if(accept_fd <0)
{
printf("Listen socket failure: %s\n", strerror(errno)); //如果监听失败,打印错误信息
return -3;
}
printf("socked accept fd is %d\n",accept_fd);
while(1)
{
sleep(2);
memset(buf,0,BUF_SIZE);
if(recv(accept_fd,buf, BUF_SIZE,0)<0)
{
printf("recv failure:%s\n",strerror(errno));
return -4;
}
//printf("gps_buff: %s\n",buf);
memset(&gprmc_data,0,sizeof(gprmc_data));
Analyse_GPRMC(buf,&gprmc_data);
Print_GPRMC(&gprmc_data);
}
close(accept_fd);
close(listen_fd);
return 0;
}
makefile编译
#This Makefile used to call function to compile all the C source in current folder and links all the objects file into a excutable binary file.
PWD=$(shell pwd)
prom = server
export CC=gcc
VPATH= .
SRCS = $(wildcard ${VPATH}/*.c)
DEPS = $(shell find ${VPATH}/*.h)
OBJS = $(patsubst %.c,%.o,$(SRCS))
$(prom): $(OBJS)
@$(CC) -o $(prom) $(OBJS)
@rm -rf *.o
clean:
@rm -rf *.o
编译后生成server的可执行文件。
FL2440上:
编译FL2440上可执行的文件所存放的文件夹见如图:
comport.c 和comport.h 见博文
https://blog.csdn.net/m0_38022615/article/details/81294028
socket_cilent.c源代码:
/*********************************************************************************
* Copyright: (C) 2018 NULL
* All rights reserved.
*
* Filename: socket_server.c
* Description: This file
*
* Version: 1.0.0(2018年08月04日)
* Author: DingHuanhuan <[email protected]>
* ChangeLog: 1, Release initial version on "2018年08月04日 19时18分17秒"
*
********************************************************************************/
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
/* sockaddr_in{} and other Internet define */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/* strerror(),perror(), errno head file */
#include <errno.h>
#include "comport.h"
#define BUF_SIZE 1024
#define Serv_IP "192.168.0.5"
#define port 12345
int main(int argc, char **argv)
{
int sockfd = -1; //创建一个套接字
int read_fd = 0;
struct sockaddr_in serv_addr;//定义网络通信通用兼容的IPV4/IPV6结构体
char buf[BUF_SIZE]; //定义缓冲区
char *devname = "/dev/ttyS1";
unsigned long baudrate = 4800;
COM_PORT *comport;
comport = Comport_Init(devname, baudrate, "8N1");
if(NULL == comport)
{
printf("init serial port failure\n");
return -1;
}
Comport_open(comport);
if(comport->fd <0)
{
printf("open error :%s\n",strerror(errno));
exit(1);
}
printf("OPEN THE DEVICE\n");
sockfd = socket(AF_INET,SOCK_STREAM,0);//创建一个套接字,IPV4面向TCP连接
if(sockfd < 0) //若创建套接字出错
{
printf("creat socket failure:%s\n",strerror(errno));
return -1;
}
printf("socket create fd is %d \n",sockfd); //打印套接字的文件描述符
/* 连接服务器的准备,设置要连接的服务器的IP地址和端口号 */
memset(&serv_addr,0,sizeof(serv_addr));//清空处理网络通信的地址的结构体
serv_addr.sin_family = AF_INET; //设置为IPV4地址
serv_addr.sin_port = htons(port); //端口号,主机字节序转网络字节序
//inet_aton(Serv_IP,&serv_addr.sin_addr);//把字符串IP地址转换为一个32位网络序列IP地址
//printf ("设置 IP地址端口号成功\n");
if(inet_pton(AF_INET, Serv_IP, &serv_addr.sin_addr) <=0)
{
printf("inet_pton error for %s\n",strerror(errno));
return -2;
}
printf("inet_pton : %s\n",Serv_IP);
/* 连接服务端 */
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)
{
printf("connect to the server failure:%s\n",strerror(errno));
return -3;
}
while(1)
{
sleep(2);
memset(buf, 0, BUF_SIZE);
//printf("start to read\n");
if(read(comport->fd, buf ,sizeof(buf))<0)//分段
{
printf ("read failure :%s\n",strerror(errno));
return -4;
}
printf ("read from the comport:%s\n",buf);
sleep(2);
// printf("start to send\n");
if(send(sockfd,buf,strlen(buf),0)<0)
{
printf ("send failure :%s\n",strerror(errno));
return -3;
}
//printf ("send is ok\n");
}
close(sockfd);
close(comport->fd);
free(comport);
return 0;
}
makefile编译:(因为要在FL2440上运行,用到交叉编译器)
#This Makefile used to call function to compile all the C source in current folder and links all the objects file into a excutable binary file.
PWD=$(shell pwd)
prom = comport
CROSS_COMPILE=/opt/xtools/arm920t/bin/arm-linux-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export AS=${CROSS_COMPILE}as
export RANLIB=${CROSS_COMPILE}ranlib
export STRIP=${CROSS_COMPILE}strip
VPATH= .
SRCS = $(wildcard ${VPATH}/*.c)
DEPS = $(shell find ${VPATH}/*.h)
OBJS = $(patsubst %.c,%.o,$(SRCS))
$(prom): $(OBJS)
@$(CC) -o $(prom) $(OBJS)
@rm -rf *.o
clean:
@rm -rf *.o
生成可执行文件comport,将其发到PC 端,后连接FL2440,通过命令下载此文件:
tftp -gr comport 192.168.0.192
然后在服务端运行server文件: ./server
在FL2440上运行 :./comport
执行结果如图(左为服务端,右为FL2440执行端)
此篇文章的代码必须先执行服务端后再运行客户端(FL2440)才可正常运行。