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!");
}
}
}