can
CAN binding for Erlang
CAN or Controller Area Network for short, is a two wire serial protcol for industrial applications.
This implementation currently supports three different backends:
- can_usb: CANUSB is a USB dongle from LAWICEL AB.
- can_udp: This is my own invention. A simple repackaging of CAN frames into UDP/IP datagrams sent over local multicast channel.
- can_sock: A binding to linux SocketCAN interface.
Any number of backend interfaces may be started and attached to the
can_router, which is the main interface to receice and send CAN frames.
An application will typically call can_router:attach() and then
receive CAN frames from any of the interfaces. To send a frame then
simple call can:send/n, this will pass the CAN frame to all the
interfaces and connected local applications in the Erlang node.
Dependencies
To build can you will need a working installation of Erlang R15B (or
later).
Information on building and installing Erlang/OTP
can be found here
(more info).
can is built using rebar that can be found here, with building instructions here. rebar's dynamic configuration mechanism, described here, is used so the environment variable REBAR_DEPS
should be set to the directory where your erlang applications are located.
can also requires the following applications to be installed:
- dthread - https://github.com/tonyrog/dthread
- uart - https://github.com/tonyrog/uart
- can - https://github.com/Feuerlabs/lager
Downloading
Clone the repository in a suitable location:
$ git clone git://github.com/tonyrog/can.git
Configurating
Interfaces can be added and remove dynamically, but can also be initialized in the environment like:
{can, [{interfaces,
[{can_udp, 1, []},
{can_udp, 2, [{ttl,0}]},
{can_usb, 1, [{device, "/dev/tty.usbserial-LWQ6UYOM"},
{bitrate, 125000}]},
{can_usb, 2, [{device, "/dev/tty.usbserial-LWQ8CA1K"},
{bitrate, 250000}]},
{can_sock, "can0", []},
{can_sock, "vcan0", []}]}]}
The interfaces in the environment will get under supervision.
Concepts
Linux virtual can driver
load the driver
$ sudo modprobe vcan
Create a virtual CAN network interface called 'vcan0'
$ sudo ip link add dev vcan0 type vcan
Activate a virtual CAN network interface called 'vcan0'
$ sudo ifconfig vcan0 up
Remove a (virtual) CAN network interface 'vcan0'
$ sudp ip link del vcan0
Create a virtual CAN network interface
$ sudo ip link add type vcan
...
Files
...
Building
Rebar will compile all needed dependencies.
Compile:
$ cd can
$ rebar compile
...
==> can (compile)
Running
$ erl -pa <path>/can/ebin
>can_router:start().
(Instead of specifing the path to the ebin directory you can set the environment ERL_LIBS.)
Stop:
>halt().