A Node.js CAN library supporting multiple transports & protocols, heavily inspired by python-can.
This is an early alpha version, do not use in production.
npm install node-can
const can = require('node-can');
const bus = new can.Bus('protocolName', 'transportName', options);
Exemple usage :
const can = require('node-can');
const bus = new can.Bus('raw', 'USBCanAnalyserV7', {
port: '/dev/tty.wchusbserial14110',
});
// Initialize bus communication
bus.run().then(() => {
console.log('Bus ready');
bus.on('message', console.log);
});
This transport implement support for the USBCanAnalyserV7 serial to can adapter.
Serial communication are done with node-serialport. So it support MacOS, Linux and Windows. See node-serialport supported environments for more informations.
node-can
take care to send initialization parameters to the serial adapater, and configure it to transfert frames in normal mode (Extended frame will be supported soon).
const can = require('node-can');
const bus = new can.Bus('raw', 'USBCanAnalyserV7', {
port: '/some/serial/port', // String, required
});
SocketCan is available only on linux. The transport should working on all linux distributions built with socketCAN support.
const can = require('node-can');
const bus = new can.Bus('raw', 'socketCan', {
interface: 'can0', // String, required
});
const can = require('node-can');
const bus = new can.Bus('raw', 'USBCanAnalyserV7', {
interface: 'can0',
});
// Listen for messages
bus.protocol.on('message', console.log);
// Write message
bus.transport.write({ ...messageProps });
CanOPEN is not fully implemented !
const can = require('node-can');
const bus = new can.Bus('canopen', 'USBCanAnalyserV7', {
port: '/some/serial/port',
});
bus.run().then(() => {
const applyNetworkDef = bus.protocol.dic.loadEdsFile('filepath.eds');
// Scan for slave nodes
bus.protocol.network.scanner.search().then((nodeIds) => {
if (nodeIds.length) {
// Slaves are present in network
const node = bus.protocol.network.addNode(nodeIds[0], applyNetworkDef());
node.pdo.read().then(() => {
console.log(`Node ${node.id} : PDO OK`);
// Listen for change on a given signal
const pdoSignal = node.pdo.get('SOME_SIGNAL');
pdoSignal.on('change', console.log);
// Read SDO
node.sdo.get('SOME_RECORD').get('SOME_VARIABLE').read().then(console.log);
// Write SDO
const sdoVal = 0x01;
node.sdo.get('SOME_RECORD').get('SOME_VARIABLE').setRaw(sdoVal).save().then(console.log);
});
} else {
console.error('Node slave node found');
}
});
});
- Write tests
- Write real documentation
- More comments in code
Prepbuild library with babel at installation, instead of using@babel/register
- Ability to configure extended frame mode using
USBCanAnalyserV7
transport - Create an interface to allow developers to extending protocols & transports
- Implement .kcd parser for
raw
protocol Implementsocket can
support (need a native interface)CanOPEN
protocol- Ability to auto download object dictionary from a slave node
- Implement LSS
PDO write- Implement SYNC
- Implement TIME PRODUCER
- Implement
xml
dictionary parser - Implement segment download
- Implement block uploads / downloads