1

我需要使用 socketcan 发送一条没有数据的 CAN 总线 J1939 消息。消息需要发送无数据的原因是遵循规范 J1939-73 DM11 (PGN=0x00FED3)。

下面的 C 代码在发送长度至少为 1 字节的数据时可以正常工作。当 sizeof(dat) == 0 时,sendto() 函数根本不发送消息。我们可以用 来验证这一点candump vcan0

有什么方法可以使用 socket(PF_CAN, SOCK_DGRAM, CAN_J1939) 发送带有 0 字节数据的消息?它可以确认它可以使用套接字(AF_CAN,SOCK_RAW,CAN_RAW)在原始 CAN 中完成,但我需要它与 J1939 协议套接字一起使用。

我们如何联系内核开发人员提交错误/增强请求?

J1939 linux 内核文档可以在这里找到:https ://www.kernel.org/doc/html/v5.8/networking/j1939.html

谢谢你。

#include <inttypes.h>
#include <linux/can/j1939.h>
#include <sys/socket.h>
#include <net/if.h>

int main() {
    int sock;
    const char device[] = "vcan0";
    uint8_t dat[2];
    dat[0] = 0;
    dat[1] = 1; 

    struct sockaddr_can baddr = {
        .can_family = AF_CAN,
        .can_addr.j1939 = {
            .name = J1939_NO_NAME,
            .addr = 0x20,
            .pgn = J1939_NO_PGN,
        },
        .can_ifindex = if_nametoindex(device),
    };

    sock = socket(PF_CAN, SOCK_DGRAM, CAN_J1939);
    bind(sock, (void *)&baddr, sizeof(baddr));

    struct sockaddr_can saddr = {
        .can_family = AF_CAN,
        .can_addr.j1939 = {
            .name = J1939_NO_NAME,
            .addr = 0x30,
            .pgn = 0xFED3,
        },
    };

    // sendto(sock, dat, sizeof(dat), 0, (const struct sockaddr *)&saddr, sizeof(saddr));
    sendto(sock, dat, 0, 0, (const struct sockaddr *)&saddr, sizeof(saddr));

    return 0;
}
4

0 回答 0