接收CAN总线上的数据并将其发送出去

创建客户端:

/********************************************************************
* copyright (C) 2018 all rights reserved
* @file: server.c
* @Created: 2018-4-16 13:22nd
* @Author: Yinrui Zhu
* @Description: test user eth0
* @Modify Date: 2018-4-13
*********************************************************************/ #include <limits.h>
#include <stdint.h>
#include <getopt.h>
#include <libgen.h>
#include <signal.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <linux/can.h>
#include <linux/can/raw.h> #include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h> #define SERVER_PORT 8000
#define BUFFER_SIZE 1024
#define ipaddr "192.168.200.110"
#define FILE_NAME_MAX_SIZE 512 int main()
{
int nbytes,i,addrlen;
char abuf[];
char bbuf[];
char cbuf[];
char dbuf[];
char ebuf[]; int s;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
struct can_filter rfilter[];
int family = PF_CAN, type = SOCK_RAW, proto = CAN_RAW; system("ip link set can0 type can bitrate 125000 triple-sampling on");
sleep();
system("ip link set can0 up"); s = socket(family, type, proto); //创建套接字 strcpy(ifr.ifr_name, "can0");
ioctl(s, SIOCGIFINDEX,&ifr); //指定can0设备 addr.can_family = family;
//addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind( s, (struct sockaddr *)&addr, sizeof(addr) ); //将套接字与can0设备绑定 /*定义接收规则*/
rfilter[].can_id = 0x10; //接收ID为0x10的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x20; //接收ID为0x20的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x40; //接收ID为0x40的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x80; //接收ID为0x80的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x800; //接收ID为0x800的报文
rfilter[].can_mask = CAN_EFF_MASK; if( setsockopt( s,SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter,
sizeof(rfilter) ) != ) //设置过滤规则
{
perror("setsockopt");
exit();
} /*服务端地址*/
struct sockaddr_in server_addr;
bzero( &server_addr, sizeof(server_addr) );
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(ipaddr);
server_addr.sin_port = htons(SERVER_PORT);
addrlen = sizeof(server_addr); /*创建socket*/
int client_socket_fd = socket(AF_INET, SOCK_DGRAM, );
if( client_socket_fd == - )
{
perror("Creat Socket Failed!");
exit();
} /*数据传输*/
while()
{
/*can接收数据*/
if( nbytes = read(s, &frame, sizeof(frame)) < )
{
perror("read");
return ;
} switch(frame.can_id)
{
case 0x10:
abuf[] = ((frame.can_id>>)&0xFF);
abuf[] = ((frame.can_id>>)&0xFF);
abuf[] = ((frame.can_id>>)&0xFF);
abuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
abuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d abuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, abuf[i]);
}
break; case 0x20:
bbuf[] = ((frame.can_id>>)&0xFF);
bbuf[] = ((frame.can_id>>)&0xFF);
bbuf[] = ((frame.can_id>>)&0xFF);
bbuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
bbuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d bbuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, bbuf[i]);
}
break; case 0x40:
cbuf[] = ((frame.can_id>>)&0xFF);
cbuf[] = ((frame.can_id>>)&0xFF);
cbuf[] = ((frame.can_id>>)&0xFF);
cbuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
cbuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d cbuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, cbuf[i]);
}
break; case 0x80:
dbuf[] = ((frame.can_id>>)&0xFF);
dbuf[] = ((frame.can_id>>)&0xFF);
dbuf[] = ((frame.can_id>>)&0xFF);
dbuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
dbuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d dbuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, dbuf[i]);
}
break; case 0x80000800:
ebuf[] = ((frame.can_id>>)&0xFF);
ebuf[] = ((frame.can_id>>)&0xFF);
ebuf[] = ((frame.can_id>>)&0xFF);
ebuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
ebuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d ebuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, ebuf[i]);
}
break; default :
printf("The recive can indetifer ID is wrong!\n");
break;
} sendto(client_socket_fd,abuf,,,(struct sockaddr*)&server_addr, addrlen);
sendto(client_socket_fd,bbuf,,,(struct sockaddr*)&server_addr, addrlen);
sendto(client_socket_fd,cbuf,,,(struct sockaddr*)&server_addr, addrlen);
sendto(client_socket_fd,dbuf,,,(struct sockaddr*)&server_addr, addrlen);
sendto(client_socket_fd,ebuf,,,(struct sockaddr*)&server_addr, addrlen);
printf("Hello.\n"); /*接收数据*/
/*
size_t recv_len = 0;
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
recv_len = recvfrom(server_socket_fd, buffer, BUFFER_SIZE, 0 ,(struct sockaddr*)&client_addr, &client_addr_length);
if( recv_len == -1 )
{
perror("Receive Data Failed:");
exit(1);
}
*/
/*从buffer中拷贝出file_name*/
/*
char file_name[FILE_NAME_MAX_SIZE +1];
bzero(file_name,FILE_NAME_MAX_SIZE+1);
strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE:strlen(buffer));
printf("%s\n",file_name);
printf("%s\n",buffer);
*/ }
system("ip link set can0 down");
close(client_socket_fd);
return ;
}

编译生成client_can 使用说明:

、运行可执行文件client_can(./client_can)
、利用网络调试工具Socket_Tool.exe(F:\嵌入式资料\AM335X\BeagleBone\UDP_test\Socket_Tool.exe)
创建服务其端口:
a、192.168.200.110()
、另一快开发板can0设置:
a、ip link set can0 down
b ip link set can0 type can bitrate triple-sampling on
c ip link set can0 up
d cansend can0 -i 0x80 0xaa 0x11 0x55 0x44 0x11 0x22 0x33 0x66
、当can0的CANL、CANH上面有数据时:运行。/client_can的开发板就可以接收的相应的数据(
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0xaa
ID=0x80 DLC= dbuf[]=0xaa
ID=0x80 DLC= dbuf[]=0xaa
ID=0x80 DLC= dbuf[]=0xac
Hello. ),同时将数据通过网络发送给PC机的server服务器端

:: 收到数据:{ AA AA AA AC }
:: 收到数据:{ 0D FE B6 }ii
:: 收到数据:{ FD F7 BE }$
:: 收到数据:{ AA AA AA AC }
:: 收到数据:{B8 7B FC B6 4D 8C }竰
)。

PC端的服务器端口配置:

服务器端口:

/********************************************************************
* copyright (C) 2018 all rights reserved
* @file: server.c
* @Created: 2018-4-16 13:22nd
* @Author: Yinrui Zhu
* @Description: test user eth0
* @Modify Date: 2018-4-13
*********************************************************************/ #include <limits.h>
#include <stdint.h>
#include <getopt.h>
#include <libgen.h>
#include <signal.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <linux/can.h>
#include <linux/can/raw.h> #include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h> #define SERVER_PORT 8000
#define BUFFER_SIZE 1024
#define ipaddr "192.168.200.110"
#define FILE_NAME_MAX_SIZE 512 int main()
{
int nbytes,i,addrlen;
char abuf[];
char bbuf[];
char cbuf[];
char dbuf[];
char ebuf[]; int s;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
struct can_filter rfilter[];
int family = PF_CAN, type = SOCK_RAW, proto = CAN_RAW; system("ip link set can0 type can bitrate 125000 triple-sampling on");
sleep();
system("ip link set can0 up"); s = socket(family, type, proto); //创建套接字 strcpy(ifr.ifr_name, "can0");
ioctl(s, SIOCGIFINDEX,&ifr); //指定can0设备 addr.can_family = family;
//addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind( s, (struct sockaddr *)&addr, sizeof(addr) ); //将套接字与can0设备绑定 /*定义接收规则*/
rfilter[].can_id = 0x10; //接收ID为0x10的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x20; //接收ID为0x20的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x40; //接收ID为0x40的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x80; //接收ID为0x80的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x800; //接收ID为0x800的报文
rfilter[].can_mask = CAN_EFF_MASK; if( setsockopt( s,SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter,
sizeof(rfilter) ) != ) //设置过滤规则
{
perror("setsockopt");
exit();
} /*创建UDP套接口*/
struct sockaddr_in server_addr;
bzero( &server_addr, sizeof(server_addr) );
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT); /*创建socket*/
int server_socket_fd = socket(AF_INET, SOCK_DGRAM, );
if( server_socket_fd == - )
{
perror("Creat Socket Failed!");
exit();
} /*绑定套接口*/
if(- == ( bind( server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr) ) ) )
{
perror("Server Bind Failed: ");
exit();
} /*数据传输*/
while()
{
/*can接收数据*/
if( nbytes = read(s, &frame, sizeof(frame)) < )
{
perror("read");
return ;
} switch(frame.can_id)
{
case 0x10:
abuf[] = ((frame.can_id>>)&0xFF);
abuf[] = ((frame.can_id>>)&0xFF);
abuf[] = ((frame.can_id>>)&0xFF);
abuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
abuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d abuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, abuf[i]);
}
break; case 0x20:
bbuf[] = ((frame.can_id>>)&0xFF);
bbuf[] = ((frame.can_id>>)&0xFF);
bbuf[] = ((frame.can_id>>)&0xFF);
bbuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
bbuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d bbuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, bbuf[i]);
}
break; case 0x40:
cbuf[] = ((frame.can_id>>)&0xFF);
cbuf[] = ((frame.can_id>>)&0xFF);
cbuf[] = ((frame.can_id>>)&0xFF);
cbuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
cbuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d cbuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, cbuf[i]);
}
break; case 0x80:
dbuf[] = ((frame.can_id>>)&0xFF);
dbuf[] = ((frame.can_id>>)&0xFF);
dbuf[] = ((frame.can_id>>)&0xFF);
dbuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
dbuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d dbuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, dbuf[i]);
}
break; case 0x80000800:
ebuf[] = ((frame.can_id>>)&0xFF);
ebuf[] = ((frame.can_id>>)&0xFF);
ebuf[] = ((frame.can_id>>)&0xFF);
ebuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
ebuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d ebuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, ebuf[i]);
}
break; default :
printf("The recive can indetifer ID is wrong!\n");
break;
} /*定义一个地址,用于蒱获客户端地址*/
struct sockaddr_in client_addr;
socklen_t client_addr_length = sizeof(client_addr); /*接收数据*/
size_t recv_len = ;
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
recv_len = recvfrom(server_socket_fd, buffer, BUFFER_SIZE, ,(struct sockaddr*)&client_addr, &client_addr_length);
if( recv_len == - )
{
perror("Receive Data Failed:");
exit();
} /*从buffer中拷贝出file_name*/
char file_name[FILE_NAME_MAX_SIZE +];
bzero(file_name,FILE_NAME_MAX_SIZE+);
strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE:strlen(buffer));
printf("%s\n",file_name);
printf("%s\n",buffer); sendto(server_socket_fd,buffer,recv_len,,(struct sockaddr*)&client_addr, client_addr_length); sendto(server_socket_fd,abuf,,,(struct sockaddr*)&client_addr, client_addr_length);
sendto(server_socket_fd,bbuf,,,(struct sockaddr*)&client_addr, client_addr_length);
sendto(server_socket_fd,cbuf,,,(struct sockaddr*)&client_addr, client_addr_length);
sendto(server_socket_fd,dbuf,,,(struct sockaddr*)&client_addr, client_addr_length);
sendto(server_socket_fd,ebuf,,,(struct sockaddr*)&client_addr, client_addr_length);
printf("Hello.\n"); }
system("ip link set can0 down");
close(server_socket_fd);
return ;
}

PC端客户端配置:

编译生成server.can 使用说明:

、运行可执行文件server_can(./server_can)
、利用网络调试工具Socket_Tool.exe(F:\嵌入式资料\AM335X\BeagleBone\UDP_test\Socket_Tool.exe)
创建客户端口:
a、192.168.200.70()
、另一快开发板can0设置:
a、ip link set can0 down
b ip link set can0 type can bitrate triple-sampling on
c ip link set can0 up
d cansend can0 -i 0x80 0xaa 0x11 0x55 0x44 0x11 0x22 0x33 0x66
、当can0的CANL、CANH上面有数据时:运行。/server_can的开发板就可以接收的相应的数据(
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0xaa
ID=0x80 DLC= dbuf[]=0xaa
ID=0x80 DLC= dbuf[]=0xaa
ID=0x80 DLC= dbuf[]=0xac
Hello. ),但是接收到的数据只能发送一次。因为该板子作为服务器端口,需要客户端给该板子发送一个信号(any)。最为客户端的PC机才能接收服务器端(开发板)发过来的数据

:: 收到数据:{ DD D4 BE }$
:: 收到数据:{ C5 8F }(
:: 收到数据:{B8 3B F1 B6 8F }?穸
:: 发送数据:猍1次]
:: 收到数据:{AA }
:: 收到数据:{ AA AA AA AC }
:: 收到数据:{ 0D F3 B6 }ii
:: 收到数据:{ DD D4 BE }$
:: 收到数据:{ C5 8F }(
:: 收到数据:{B8 3B F1 B6 8F }?穸
)。

Linux-UDP-Socket编程的更多相关文章

  1. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  2. Linux的SOCKET编程详解(转)

    Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系 ...

  3. 【ARM-Linux开发】Linux的SOCKET编程详解

    Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系 ...

  4. Linux下socket编程基本知识

    本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...

  5. Linux下Socket编程的端口问题( Bind error: Address already in use )

    Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...

  6. linux下socket编程实例

    linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...

  7. 3、linux下Socket编程-TCP/UDP

    1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...

  8. linux下socket编程

    相关结构 //下边这两个结构定义在<sys/types.h>里 //一般的地址结构,只能用于覆盖(把其他地址转换为此类型),且只能引用该地址的sa_family字段 struct sock ...

  9. Linux的SOCKET编程详解

    1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 U ...

  10. [转]Linux的SOCKET编程详解

    From : http://blog.csdn.net/hguisu/article/details/7445768 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在 ...

随机推荐

  1. [整理]前端模块化开发AMD CMD

    前端模块化开发的价值 AMD (中文版) CMD 模块定义规范 标准构建 http://seajs.org http://chaoskeh.com/blog/why-seajs.html http:/ ...

  2. 【BZOJ】1828: [Usaco2010 Mar]balloc 农场分配(经典贪心)

    [算法]贪心+线段树 [题意]给定n个数字ci,m个区间[a,b](1<=a,b<=10^5),每个位置最多被ci个区间覆盖,求最多选择多少区间. 附加退化问题:全部ci=1,即求最多的不 ...

  3. F. Make It Connected(krustra+)

    题目链接:http://codeforces.com/contest/1095/problem/F 题目大意:首先给你n个点,然后给你每个点的权值,再给你m条边,这些边可以选也可以不选,然后问你要使这 ...

  4. _csv.Error: line contains NULL byte

    原因是表格保存时扩展名为 xls,而我们将其改为csv文件通常是重命名: 解决方法只需把它另存为 csv 文件.

  5. Count of Smaller Number before itself

    Give you an integer array (index from 0 to n-1, where n is the size of this array, value from 0 to 1 ...

  6. linux之发送邮件--sendmail服务配置

    新手入门也不知道什么日志分析服务好,鸟哥说logwatch,那我就从logwatch开始吧! logwatch用到了emai发邮件,先从配置邮件发送sendmail开始: 安装sendmail服务,我 ...

  7. ActiveMQ之VirtualTopic是什么?

    一句话总结: VirtualTopic是为了解决持久化模式下多消费端同时接收同一条消息的问题.   想象这样一个场景:   生产端产生了一笔订单,作为消息MessageOrder发了出去. 这笔订单既 ...

  8. java基础74 XML解析中的SAX解析相关知识点(网页知识)

    1.SAX解析工具 SAX解析工具:是Sun公司提供的,内置JDK中.org.xml.sax.*         点击查看: DOM解析相关知识:以及DOM和SAX解析的原理(区别) 2.SAX解析的 ...

  9. MFC的定时函数 SetTimer和结束killTimer

    什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了. 使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以 ...

  10. 解决Url带中文参数乱码问题

    这里我来介绍下如何配置Tomcat 来解决Url带中文参数乱码问题: 首先打开Tomcat安装目录,以Tomcat7为例,其他版本基本一样: 打开conf文件 打开server.xml 大概在70行左 ...