KanKit研发记录

KanKit

KanKit是面向Linux CAN子系统的DotNet包装器。

名词解释

使用例子

Raw CAN Support

CanNetworkInterface vcan0 = CanNetworkInterface.GetAllInterfaces(true).First(iface => iface.Name.Equals("vcan0"));

using (var rawCanSocket = new RawCanSocket())
{
    rawCanSocket.Bind(vcan0);
    int bytesWritten = rawCanSocket.Write(new CanFrame(0x123, new byte[] { 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }));
    int bytesRead = receiverSocket.Read(out CanFrame frame);
}

ISO 15765-2 (ISO-TP) Support

ISO 15765-2,也称为网络层服务的诊断通信,是一种国际标准,它定义了基于Controller Area Network (CAN) 的车辆诊断通信的网络层。这个标准是ISO 15765标准系列的一部分,专门针对汽车行业中的诊断系统设计,使得车辆的诊断信息可以通过CAN总线高效地传输。ISO 15765-2标准的主要特点包括:

  • 传输协议:定义了如何在CAN总线上高效地传输大于8字节的数据包。由于CAN标准帧的数据字段限制最多为8字节,ISO 15765-2引入了多帧传输机制,允许将更大的数据分割成多个帧进行传输。
  • 地址方案:提供了一种机制,允许诊断工具与车辆上的一个或多个控制单元(ECU)进行通信。这包括使用特定的诊断地址,以及定义了请求和响应消息的格式。
  • 诊断服务:虽然ISO 15765-2主要关注数据的传输,它也为实现高级诊断服务(如故障码读取、实时数据监控等)提供了基础。

ISO 15765-2在汽车诊断和通信领域中非常重要,因为它确保了不同制造商和设备之间的兼容性和互操作性。通过遵循这一标准,汽车制造商和诊断设备供应商可以确保他们的产品能够在全球范围内广泛使用,同时保持高效和可靠的通信。

CanNetworkInterface vcan0 = CanNetworkInterface.GetAllInterfaces(true).First(iface => iface.Name.Equals("vcan0"));

using (var testerSocket = new IsoTpCanSocket())
{
    testerSocket.BaseOptions = new CanIsoTpOptions()
    {
        Flags = IsoTpFlags.CAN_ISOTP_TX_PADDING | IsoTpFlags.CAN_ISOTP_WAIT_TX_DONE,
    };

    testerSocket.Bind(vcan0, 0x600, 0x700);
    int bytesWritten = testerSocket.Write(new byte[] { 0x3e, 0x00 });
    var receiveBuffer = new byte[4095];
    int bytesRead = testerSocket.Read(receiveBuffer);
}

SAE J1939 Support

SAE J1939是由美国汽车工程师协会(Society of Automotive Engineers, SAE)制定的一套标准,它基于Controller Area Network (CAN)总线定义了一种高层协议,用于在重型车辆(如卡车、公交车、建筑机械、农业机械等)中的电子设备之间的通信。SAE J1939旨在促进这些设备之间的互操作性和标准化,以便制造商可以开发能够与其他设备无缝通信的产品。SAE J1939标准的主要特点包括:

  • 网络层和应用层协议:SAE J1939定义了网络层协议,用于管理数据包的传输,以及应用层协议,用于定义数据的格式和含义。
  • 参数组编号(PGN):SAE J1939使用PGN来标识消息的类型,每个PGN定义了消息的数据结构和用途。这使得设备能够识别并正确处理接收到的消息。
  • 可扩展性:SAE J1939定义了一系列标准服务和消息,同时也为自定义消息留出了空间,使得制造商可以根据需要扩展协议。
  • 地址分配:SAE J1939网络中的每个设备都有一个唯一的地址,网络上的设备可以使用这个地址来直接通信。
  • 高容错性和低成本:基于CAN总线的实现使得SAE J1939网络具有高容错性和低成本的特点,适合在恶劣的环境中使用。

SAE J1939广泛应用于各种商用车辆和工业设备中,它不仅支持基本的控制和监控功能,还支持高级诊断、设备配置和固件更新等功能。通过采用SAE J1939,行业内的设备制造商能够确保他们的产品能够与来自不同制造商的其他设备兼容,从而提高了整个行业的效率和互操作性。

var vcan0 = CanNetworkInterface.GetAllInterfaces(true).FirstOrDefault(iface => iface.Name.Equals("vcan0"));

using (var j1939Socket = new J1939CanSocket())
{
    j1939Socket.EnableBroadcast = true;
    j1939Socket.SendPriority = 3;
    j1939Socket.Bind(vcan0, SocketCanConstants.J1939_NO_NAME, 0x0F004, 0x01);
    var destAddr = new SockAddrCanJ1939(vcan0.Index)
    {
        Name = SocketCanConstants.J1939_NO_NAME,
        PGN = 0x0F004,
        Address = SocketCanConstants.J1939_NO_ADDR,
    };
    j1939Socket.WriteTo(new byte[] { 0xFF, 0xFF, 0xFF, 0x6C, 0x50, 0xFF, 0xFF, 0xFF }, MessageFlags.None, destAddr);
}

Broadcast Manager (BCM) Support

Broadcast Manager (BCM) 在软件和网络通信领域,尤其是在与汽车相关的控制器区域网络(CAN)系统中,扮演着重要的角色。BCM主要负责管理CAN网络上的广播消息,这包括消息的发送、接收以及对这些消息的过滤。在汽车电子系统中,BCM可以帮助减少网络上的数据流量,提高数据处理的效率。BCM的关键功能包括:

  • 消息过滤:BCM允许系统定义哪些消息是重要的,需要被处理,哪些可以忽略。这通过设置过滤规则来实现,从而减少了不必要的数据处理和网络拥塞。
  • 周期性消息的处理:BCM可以管理周期性消息的发送和接收。例如,某个传感器的数据需要每隔一定时间发送一次,BCM可以自动处理这种周期性的数据传输。
  • 事件触发的消息发送:BCM可以配置为在特定事件发生时发送消息。例如,当车辆启动时发送一个特定的信号。
  • 消息的组合和分发:BCM能够接收来自不同源的消息,将它们组合成一个单一的消息,然后广播给网络上的其他节点。

在汽车电子系统中,BCM不仅限于处理网络通信。它也可以指车辆的身体控制模块(Body Control Module),这是一个负责监控和控制车辆各种身体功能(如车门锁定、车窗控制、内部照明等)的电子控制单元(ECU)。虽然这两个概念在功能上有所不同,但它们都起到了在其各自领域内管理和优化操作的作用。

CanNetworkInterface vcan0 = CanNetworkInterface.GetAllInterfaces(true).First(iface => iface.Name.Equals("vcan0"));

using (var bcmCanSocket = new BcmCanSocket())
{
    bcmCanSocket.Connect(vcan0);
    var canFrame = new CanFrame(0x333, new byte[] { 0xDE, 0xAD, 0xBE, 0xEF });
    var frames = new CanFrame[] { canFrame };
    var config = new BcmCyclicTxTaskConfiguration()
    {
        Id = 0x333,
        StartTimer = true,
        SetInterval = true,
        InitialIntervalConfiguration = new BcmInitialIntervalConfiguration(10, new BcmTimeval(0, 5000)), // 10 messages at 5 ms
        PostInitialInterval = new BcmTimeval(0, 100000), // Then at 100 ms
    };
    int nBytes = bcmCanSocket.CreateCyclicTransmissionTask(config, frames);
}

CAN Gateway (CGW) Support

CAN网关(CGW)是一种在不同CAN网络之间传输和管理消息的设备或软件模块。在复杂的汽车电子架构或工业自动化系统中,可能存在多个CAN网络,它们基于不同的应用或物理位置被分隔开来。CAN网关的主要作用是允许这些分隔的网络之间进行通信,同时提供消息过滤、转换和路由的功能,以确保正确的信息传递给正确的目标。CAN网关的关键功能:

  • 消息路由:CGW负责决定哪些消息需要从一个CAN网络传输到另一个CAN网络。这通常基于消息的标识符(ID)或其他属性。
  • 消息过滤:为了减少网络负载和提高效率,CGW可以配置过滤规则,只允许特定的消息通过网关。
  • 协议转换:在一些情况下,连接的CAN网络可能使用不同的协议或数据格式。CGW可以将消息从一种格式转换为另一种格式,确保接收方能够正确解析和处理消息。
  • 数据处理:除了简单的消息转发之外,CGW还可以执行一些基本的数据处理操作,如消息组合、拆分或内容的修改。
  • 安全性:CGW也起到了安全屏障的作用,它可以防止不希望的消息传输到关键网络,从而提高系统的安全性。
    应用场景:
  • 汽车行业:在现代汽车中,不同的系统(如动力总成控制、底盘控制、车身控制等)可能使用独立的CAN网络。CGW允许这些系统之间进行必要的通信,同时保持它们的独立性和安全性。
  • 工业自动化:在大型工厂或机器人系统中,CGW可以用来连接不同区域或设备的网络,实现整个生产线的高效协调。
  • 船舶和航空:在这些领域,CGW用于连接不同的控制系统和传感器网络,确保数据在必要时可以跨网络传输。

CAN网关在确保网络间通信的同时,还提供了一层额外的安全和数据管理,这在多网络环境中是非常重要的。

var vcan0 = CanNetworkInterface.GetAllInterfaces(true).FirstOrDefault(iface => iface.Name.Equals("vcan0"));
var vcan1 = CanNetworkInterface.GetAllInterfaces(true).FirstOrDefault(iface => iface.Name.Equals("vcan1"));

using (var cgwSocket = new CanGatewaySocket())
{
    cgwSocket.ReceiveTimeout = 1000;
    cgwSocket.SendTimeout = 1000;
    cgwSocket.Bind(new SockAddrNetlink(0, 0));
    var rule = new CgwCanToCanRule(CgwCanFrameType.ClassicalCAN)
    {
        SourceIndex = (uint)vcan0.Index,
        DestinationIndex = (uint)vcan1.Index,
        EnableLocalCanSocketLoopback = true,
        ReceiveFilter = new CanFilter(0x123, 0x7FF),
        SetModifier = new ClassicalCanGatewayModifier(CanGatewayModificationType.CGW_MOD_LEN, new CanFrame(0x000, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00 })),
        ChecksumXorConfiguration = new CgwChecksumXor(0, 3, 4, 0xCC),
        UpdateIdentifier = 0xFFEEEEDD,
    };
    cgwSocket.AddOrUpdateCanToCanRule(rule);
    
    var data = new byte[8192];
    int bytesRead = cgwSocket.Read(data);
    var realData = data.Take(bytesRead).ToArray();
    NetlinkMessageHeader header = NetlinkUtils.PeekAtHeader(realData);
    if (header.MessageType == NetlinkMessageType.NLMSG_ERROR)
    {
        NetlinkMessageError nlMsgErr = NetlinkMessageError.FromBytes(realData);
        if (nlMsgErr.Error == 0)
        {
            Console.WriteLine("Successfully added CGW Rule!");
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容