KanKit研发记录

2024-06-27  本文已影响0人  大侃谈

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标准的主要特点包括:

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广泛应用于各种商用车辆和工业设备中,它不仅支持基本的控制和监控功能,还支持高级诊断、设备配置和固件更新等功能。通过采用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不仅限于处理网络通信。它也可以指车辆的身体控制模块(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网关的关键功能:

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!");
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读