接收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. 不可不看!CSS3中三十一种选择器用法

    原文 The 30 CSS Selectors you Must Memorize 由 Jeffrey Way 发表于 2012 年 6 月,介绍了 30 种最常用的 CSS 选择器用法,多加了一种, ...

  2. 浅谈iOS与社交化网络

    CHENYILONG Blog 社交化网络 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong  ...

  3. 2016.5.18——leetcode:Majority Element

    Majority Element 本题收获: 1.初步了解hash,nth_element的用法 2.题目的常规思路 题目: Given an array of size n, find the ma ...

  4. 13-6_mysql索引_1_Mysql_Learning_Notes_20180719_13-6

    mysql索引_1_Mysql_Learning_Notes 二分查找/折半查找法,binary search 一种在有序数组中查找某一特定元素的搜索算法; 二分查找法的优点是比较少次数,查找速度快, ...

  5. asp.net操作word 配置在IIS上出现的问题

    异常: 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问. (异常来自 ...

  6. Python操作Excle

    python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库.可从这里下载https://pypi.python.org/pypi.下面分别记录p ...

  7. 数据库-mysql触发器

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 一:创建触发器 在MySQL中,创建触发器语法 ...

  8. Python_oldboy_自动化运维之路(四)

    本节内容 集合 字符编码与转码 函数语法及基本特性 函数参数与局部变量 返回值和嵌套函数 递归 匿名函数 高阶函数 1.集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变 ...

  9. gitlab备份与还原

    1.备份 登录原服务器,执行命令: gitlab-rake gitlab:backup:create 备份后文件在如下目录,下载该文件 /var/opt/gitlab/backups 2.还原 先安装 ...

  10. Java基础82 jsp中的EL表达式(网页知识)

    1.EL表达式的作用 EL表达式的作用:向浏览器输出域对象中的变量值或者表达式计算结果.语法:${变量或者表达式} 注: Jsp的核心语法:jsp的表达式<%= %>和jsp的脚本< ...