SocketCANソケットを設定するためのUdevルールは、手動で実行した場合にのみ機能します。

SocketCANソケットを設定するためのUdevルールは、手動で実行した場合にのみ機能します。

始めたいslcand(シリアルラインCANインタフェースドライバ用のユーザ空間デーモン)LawicelCanUSBドングルが接続されています。フォローするPascal Walterのステップバイステップガイドすべてがうまくいくようです(スカン0ありますか?バインディング(2)candump)、実際には何も受信しないことを除いて(Wiresharkでは発信メッセージのみが表示されます)。

udevルールは次のとおりです。

# Lawicel CANUSB module
ACTION=="add", ENV{ID_MODEL}=="CANUSB", ENV{SUBSYSTEM}=="tty", RUN+="/usr/bin/logger [udev] Lawicel CANUSB detected - running slcan_add.sh!", RUN+="/usr/local/bin/slcan_add.sh $kernel"
ACTION=="remove", ENV{ID_MODEL}=="CANUSB", ENV{SUBSYSTEM}=="usb", RUN+="/usr/bin/logger [udev] Lawicel CANUSB removed - running slcan_remove.sh!", RUN+="/usr/local/bin/slcan_remove.sh"

そして/usr/local/bin/slcan_add.sh

#!/bin/sh
# Bind the USBCAN device
slcand -o -c -f -s8 /dev/$1 slcan0
sleep 2
ifconfig slcan0 up 

そして/usr/local/bin/slcan_remove.sh

#!/bin/sh
# Remove the USBCAN device
pkill slcand

ただし、手動で実行すると、sudo /usr/local/bin/slcan_remove.sh && sudo /usr/local/bin/slcan_add.sh ttyUSB0すべてが期待どおりに機能し、を使用してcandump slcan0すべてのCANメッセージを表示できます。

インターフェイスはudevと同じです。ip link show slcan0以下を提供します。

91: slcan0: <NOARP,UP,LOWER_UP> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10

NetworkManagerのslcan0に問題があり、上記のように手動でslcan0を作成した場合にも発生します。tail -f /var/log/syslog挿入時の出力は次のとおりです。

May 26 18:29:18 laurenz-T440p logger: [udev] Lawicel CANUSB detected - running slcan_add.sh
May 26 18:29:18 laurenz-T440p slcand[14924]: starting on TTY device /dev/ttyUSB0
May 26 18:29:18 laurenz-T440p slcand[14925]: attached TTY /dev/ttyUSB0 to netdevice slcan0
May 26 18:29:18 laurenz-T440p slcand[14925]: netdevice slcan0 renamed to slcan0
May 26 18:29:18 laurenz-T440p NetworkManager[866]:    SCPlugin-Ifupdown: devices added (path: /sys/devices/virtual/net/slcan0, iface: slcan0)
May 26 18:29:18 laurenz-T440p NetworkManager[866]:    SCPlugin-Ifupdown: device added (path: /sys/devices/virtual/net/slcan0, iface: slcan0): no ifupdown configuration found.
May 26 18:29:18 laurenz-T440p NetworkManager[866]: <warn> /sys/devices/virtual/net/slcan0: couldn't determine device driver; ignoring...

ps -fauxw | grep can(手動起動の場合は上記と同じ):

root      1221  0.0  0.0   4336   100 ?        Ss   11:38   0:00          \_ slcand -o -c -f -s8 /dev/ttyUSB0 slcan0

ps -fauxw | grep can(再度挿入するとudevの起動が始まります):

root      1362  0.0  0.0   4336    96 ?        Ss   11:45   0:00 slcand -o -c -f -s8 /dev/ttyUSB0 slcan0

udevにはどのような問題がありますか?どうすれば解決できますか?

修正する:さて、Ixxat USB-to-CAN V2を追加し、対応するSocketCanドライバをインストールしました。同じ問題があります。 Txはうまく機能しますが、Rxは機能しません。
興味深いことに、2つを一緒に接続できます(中間120R)。その後、candump -d -e -c -x -t absolute any,0:0,#FFFFFFFF端末で実行します。別の例では、CANフレームcansend can0 000#(CanID 0、長さ0〜can0(Ixxatアダプタ)のフレーム)を送信します。結果は、slcandを手動で起動するのか、udevを介して起動するのかによって異なります。

マニュアル(上記のように):

$ candump -d -e -c -x -t absolute any,0:0,#FFFFFFFF
(1464614442.246548)  can0  TX - -  000   [0] 
(1464614442.249320)  slcan0  RX - -  000   [0]

寄稿者: Udev:

$ candump -d -e -c -x -t absolute any,0:0,#FFFFFFFF
 (1464614643.800545)  can0  RX - -  20000020   [8]  00 00 00 00 00 00 00 00   ERRORFRAME
    no-acknowledgement-on-tx
 (1464614643.807361)  can0  RX - -  20000020   [8]  00 00 00 00 00 00 00 00   ERRORFRAME
    no-acknowledgement-on-tx
 (1464614643.814058)  can0  RX - -  20000020   [8]  00 00 00 00 00 00 00 00   ERRORFRAME
    no-acknowledgement-on-tx
 (1464614643.820840)  can0  RX - -  20000020   [8]  00 00 00 00 00 00 00 00   ERRORFRAME
    no-acknowledgement-on-tx
[and so on...]

これは私のものですlsmod | grep can

vcan                   16384  0 
slcan                  16384  1 
can_dev                24576  2 ixx_pci,ixx_usb
can_raw                20480  0 
can                    45056  1 can_raw

私は4.4カーネルを持つUbuntu 14.04システムを使用しています。uname -rv:

4.4.0-21-generic #37~14.04.1-Ubuntu SMP Wed Apr 20 16:33:38 UTC 2016

答え1

したがって、Canusbがudevで動作するようにするソリューションは次のとおりです。カート・ヴァン・ダイクが発見しました。:

時にはueventが起動したときにすべての属性が存在しないため、udevルールに競合条件がある可能性があります。

このアップデートでは、/usr/local/bin/slcan_add.sh次の挿入時にCanUsbがudevと正しく機能することがあります。

#!/bin/sh
# Bind the USBCAN device
sleep 1
/usr/local/bin/slcand -o -c -f -s8 /dev/$1 slcan0
sleep 2
ifconfig slcan0 up

Ixxat Can-to-Usb V2をSocketCanと連携させる方法を見つける必要があります。

答え2

このようだudevは長期実行プロセスを処理できません。
slcand は長期実行プロセスを開始します。上記のスレッドの答えの1つを使用すると、問題が解決します。

私の解決策は次のとおりです。マルチインスタンスサービスアダプタが追加または削除されると、起動および停止します。

提供する

[Unit]
Description="Instance of slcand for can #%i"

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/slcan_add %i

slcan_add

#!/bin/sh
/usr/bin/slcand -o -c -f -s8 /dev/tty$1 $1
sleep 2
/sbin/ip link set up $1
/sbin/ip link set $1 txqueuelen 80

while :; do sleep 86400; done

udevルール

SUBSYSTEM=="tty", ..., ACTION=="add", SYMLINK+="name1", RUN+="/usr/sbin/service can@name1 start"
SUBSYSTEM=="tty", ..., ACTION=="remove", RUN+="/usr/sbin/service can@name1 stop"

.. idVendor、idProduct、およびCANアダプタのシリアル番号が含まれています。

指示:

デバイスに対して複数のslcanインスタンスを実行すると、問題が発生する可能性があります。 slcanインスタンスがすでに実行されていることを確認する
ために使用されます。次のコマンドは、次を含むコマンドで始まったすべてのプロセスを終了します。ps aux | grep slcan
slcan

sudo kill $(ps aux | grep slcand | awk -F ' ' '{print $2}' | head -1)

関連情報