我正在尝试过滤具有某些 ID 的 CAN 帧,如下所述:https ://landlock.io/linux-doc/landlock-v8/networking/can.html#raw-protocol-sockets-with-can-filters-sock -生的
我的部分代码:
struct can_filter rfilter[4];
if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
fprintf(stderr, "Error while opening socket.\n");
exit(EXIT_FAILURE);
}
rfilter[0].can_id = 0x0D6 | CAN_INV_FILTER;
rfilter[0].can_mask = CAN_SFF_MASK;
rfilter[1].can_id = 0x0D8 | CAN_INV_FILTER;
rfilter[1].can_mask = CAN_SFF_MASK;
rfilter[2].can_id = 0x0E4 | CAN_INV_FILTER;
rfilter[2].can_mask = CAN_SFF_MASK;
rfilter[3].can_id = 0x77F | CAN_INV_FILTER;
rfilter[3].can_mask = CAN_SFF_MASK;
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
如果我只使用我的四个过滤器中的一个并注释掉其他三个,它会按预期工作。如果我使用所有四个过滤器,它根本不起作用。在那种情况下,我仍然可以在 CANbus 接口上接收所有内容。
所以,我的猜测是我的过滤器以某种方式相互抵消?!我需要更改什么来过滤 CAN ID 0x0D6、0x0D8、0x0E4 和 0x77F?