【问题标题】:How to make CAN bus operate from within a docker container?如何使 CAN 总线在 docker 容器内运行?
【发布时间】:2021-09-06 17:44:01
【问题描述】:

我成功地将运行在 Beaglebone black 上的 nodejs 应用程序 docker 化。但是现在我想从 docker 容器中访问 CAN,但它不起作用。

请注意,我已成功配置主机中的 CAN 端口,并且 candump 显示它可以正常工作。

$ candump can1
  can1  18FF30D0   [8]  00 00 00 00 00 00 00 00
  can1  18FF02D0   [4]  00 00 00 00
  can1  18FF21D0   [3]  00 00 00
  can1  18FF3CD0   [4]  00 7D 28 7D
  can1  18FF30D0   [8]  00 03 00 00 00 00 00 00
  can1  18FF02D0   [4]  00 00 00 00

我在我的 Dockerfile 中构建 socketcan 节点模块如下:

 #If you don't have node/npm already, add that first
RUN apk add --no-cache nodejs

# Add the necessary build and runtime dependencies (see https://stackoverflow.com/questions/36202095/node-serialport-failing-on-alpine-linux)
RUN apk add --no-cache make gcc g++ python3 linux-headers udev

#RUN apk add --no-cache --virtual .gyp python3 make g++
RUN  npm install 

一旦我从容器中运行我的应用程序,就会出现以下异常:

 -- ????- ???? Canbus:can0: switched to channel "can0"…
Pepsr v2.1.192 5:36:40 PM ???? [pepsr-iingenierie]  -- ????- ???? Canbus:can0: cancel CAN as other channel "can0" doesn’t work either
Pepsr v2.1.192 5:36:40 PM ???? [pepsr-iingenierie]  -- ????- ???? Canbus:can0: Error: Error while creating channel
    at Object.exports.createRawChannel (/home/debian/Desktop/devel/iot/node_modules/socketcan/socketcan.js:38:12)
    at Canbus._connect (/home/debian/Desktop/devel/iot/pepsr.ddk.protocol.canBus.js:308:34)
    at Canbus.connect (/home/debian/Desktop/devel/iot/pepsr.module.js:272:9)
    at Object.<anonymous> (/home/debian/Desktop/devel/iot/pepsr.js:608:20)
    at Module._compile (internal/modules/cjs/loader.js:1015:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1035:10)
    at Module.load (internal/modules/cjs/loader.js:879:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
    at internal/main/run_main_module.js:17:47 

【问题讨论】:

    标签: node.js docker beagleboneblack can-bus


    【解决方案1】:

    感谢帮助我找到解决方案的贡献者。

    我终于发现让容器访问主机CAN总线最简单的方法是使用--network参数如下:

    $ docker run --rm --network=host <your image>
    

    【讨论】:

      【解决方案2】:

      这里或多或少地描述了向 Docker 转发网络接口:Sharing virtual network with docker container

      【讨论】:

      • 知道了。但是……我不知道如何在我的 debian 主机上找到 /dev/canx 等效项,该主机运行在带有 cape comm2 的 Beaglebone black 上。有什么想法吗?
      • beaglebone CAN shield 是一种网络设备。您可以使用 ifconfig 找到它。
      • 啊,对不起 - 我不知道这是一个网络接口。在这种情况下,它涉及更多。见stackoverflow.com/questions/63019226/…
      • 我在 ifconfig 中看到了 can1,但是我应该如何按照 --device 的要求提供到 can1 的绝对路径? (/dev/can1 不存在)
      • 忽略我之前的回答,它仅适用于设备文件。网络接口不能那样工作。检查我粘贴的链接。
      猜你喜欢
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 2018-11-19
      相关资源
      最近更新 更多