首页 > 其他分享 >基于UDS的DoIp实现(六) -- 通信协议实现:Socket 通信

基于UDS的DoIp实现(六) -- 通信协议实现:Socket 通信

时间:2023-04-19 11:33:50浏览次数:60  
标签:UDS 0x08 Socket 通信协议 mSocket len id socket

  ISO14229、UDS诊断服务文档,都说明UDS是基于Can通信实现,其接收的数据格式,也是Can数据格式。但是,一方面是在本地模拟Can通信比较麻烦,另一方面,也是想单独的将UDS抽出来,不依赖于通信协议,仅仅作为一个单独的功能进行实现,所以,这里才使用比较简单的Socket通信进行数据收发。

一、Socket服务端实现

二、Socket客户端实现

三、测试数据

 

一、Socket服务端实现

void SocketPeriodicTask(void) {
    //创建socket ID
    socket_create(&mSocket)
    //绑定ID
    socket_bind(&mSocket)
        //监听ID
    socket_listen(mSocket.id, 5)
        //等待客户端数据
    socket_accept(&mSocket)
    
    while (1) {
                //读取数据
        len = socket_read(mSocket.conn_sock, buf, MSG_RECEIVE_SIZE);
                //对接收的数据进行处理
        ReceiveMsg(buf, len)

        sleep(1);
    }
}

 

二、Socket客户端实现

  1. 构造测试数据:
    const u_uint8_t firstFrame[] = {0x10, 0x20, 0x2E, 0xF1, 0x8C, 0x00, 0x00, 0x00};
    
    const u_uint8_t continuationFrames[][8] = {
        {0x21, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06},
        {0x22, 0x08, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D},
        {0x23, 0x08, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14},
        {0x24, 0x08, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B}
    };
    firstFrame:首帧数据;
    continuationFrames:连续帧数据。
  2. 发送接收流程:
    while (remaining_data_len > 0) {
        // 接收流控帧
        int byte_count;
        if (uds_recv_flow_control(sock, &byte_count) < 0) {
            printf("Error \r\n");
            break;
        }
        remaining_data_len -= byte_count;
    
        // 发送连续帧数据
        printf("send consecutive len:%d \r\n", send_data_len);
        for (int id = 0; id < 8; id++) {
            printf("0x%02X ", continuationFrames[i][id]);
        }
        printf("\r\n");
        write(sock, continuationFrames[i++], send_data_len);
    }

     

三、测试数据

 

   其中,服务器端去掉了客户端的第一个字节0x20 | 块数。最后输出的CallBack_F18C,去掉了前三个字节(0x2E、0xF1、0x8C),0xF1与0x8C是CallBack_F18C标记,也就是客户需求。

标签:UDS,0x08,Socket,通信协议,mSocket,len,id,socket
From: https://www.cnblogs.com/liuqiongcn/p/17272677.html

相关文章

  • UDS之19服务中04子服务:读取快照数据
    背景介绍  在车载诊断中常用的诊断协议有ISO14229等,在协议中主要定义了诊断请求、诊断响应的报文格式及ECU该如何处理诊断请求的应用。其中ISO14229系列标准协议定义了用于行业内诊断通信的需求规范,也就是UDS。UDS主要应用于OSI七层模型的第七层——应用层,它支持的汽车总线......
  • 7.Java 网络编程之 Socket
    Java网络编程之Socket一、课程目标网络模型TCP协议与UDP协议区别Http协议底层实现原理。二、什么是网络模型网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然......
  • Socket是什么/怎么理解Socket
    Socket先来看一下百度百科对于Socket的介绍:套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。我们将一个小......
  • 基于UDS的DoIp实现(五) -- UDS单帧、多帧处理
    通常来讲,上位机一般只会发送8个字节数据,那么对于UDS,只需要处理这个8个字节就可以,这里也不会涉及大数据传输。但是,有些机器,比如毫米波雷达,其设计是64位,那么每次发送的数据,按照单帧的处理,是无法接收完全的,这个时候就需要进行多帧处理。一、单帧二、多帧 以下列举部分帧类型,......
  • 基于TCP协议的Socket通信
    上节中我们给大家接触了Socket的一些基本概念以及使用方法,相信大家对Socket已经有了初步的掌握。本节我们学习使用Socket来实现大文件的断点续传!在这里我们以他人的案例进行讲解,这是别人写好的一个Socket上传大文件的例子,不要求我们自己可以写出来,需要的时候会用就好!1.运行效果图1.......
  • WebSocket和Socket编程
    面试一般会问socket原理socket为啥要有端口:确定一个链路的是一个四元组Socket编程socket通信你做过socket编程吗,socket是怎么实现知道有连接过来的说说WebSocket与socket的区别先谈谈Websocket与Socket的区别首先Socket==不属于协议范畴,它把TCP/IP层复杂的操作抽象为几个简......
  • 基于UDS的DoIp实现(三) -- UDS服务实现
    一、UDSTask处理voidUDSPeriodicTask(void){//其它功能处理if(mRequest_Received){mRequest_Received=FALSE;UDS_CAN_Service_Manager();}}UDSPeriodicTask,是属于轮训功能的处理,当接收到数据时,就会对数据进行解析。数据解析:void......
  • 基于UDS的DoIp实现(二) -- DCM实现
    一、平台环境二、代码实现 一、平台环境VirtualBox7.0Ubuntu18.04cmakeversion3.10.2gcc(Ubuntu7.5.0-3ubuntu1~18.04)7.5.0  二、代码实现DCM的功能,主要是接收Tcp/IP传入的数据,从中提取服务ID,然后处理对应的服务,这里以0x19服务为例进行说明,sub-funct......
  • Apifox 更新 | WebSocket 接口调试功能上线!
    Apifox 新版本上线啦!欢迎升级使用:界面右上角【设置】-> 【关于Apifox】->【检查更新】看看本次版本更新主要涵盖的重点内容,有没有你所关注的功能特性:支持WebSocketAPI;自动化测试功能升级;Web端新增部分功能快捷键;支持自定义设置版本更新及安装提醒。01支持WebSocketAPI最新......
  • 论 java.net.SocketException: sendto failed: EPIPE (Broken pipe) 的解决办法
    这里只是针对我昨天遇到的问题(上传文件过大,导致出现Socket异常)的解决办法。众所周知,tomcat是有默认的文件传输大小限制的(跟android前端),后来跟服务器的哥们协调了一下,他那边改成多少都不管用,这是其一。其二是后来查google得知,tomcat设置服务器的超时时间,后来还是一样,设置成多少都不......