{"id":19036009,"url":"https://github.com/angelodlfrtr/node-can","last_synced_at":"2025-04-23T19:04:16.311Z","repository":{"id":47409949,"uuid":"151573221","full_name":"angelodlfrtr/node-can","owner":"angelodlfrtr","description":"node-can is a NodeJS CAN library supporting multiple transports \u0026 protocols, heavily inspired by python-can.","archived":false,"fork":false,"pushed_at":"2024-11-18T20:16:48.000Z","size":1876,"stargazers_count":9,"open_issues_count":1,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-23T19:03:55.852Z","etag":null,"topics":["can","canbus","canopen","node-can","nodejs","socketcan"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/angelodlfrtr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-10-04T13:08:34.000Z","updated_at":"2025-03-06T06:20:49.000Z","dependencies_parsed_at":"2025-04-17T15:08:26.074Z","dependency_job_id":null,"html_url":"https://github.com/angelodlfrtr/node-can","commit_stats":{"total_commits":44,"total_committers":2,"mean_commits":22.0,"dds":"0.045454545454545414","last_synced_commit":"c577d89f6847733ad9653975e27cff7071906cd3"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angelodlfrtr%2Fnode-can","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angelodlfrtr%2Fnode-can/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angelodlfrtr%2Fnode-can/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angelodlfrtr%2Fnode-can/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/angelodlfrtr","download_url":"https://codeload.github.com/angelodlfrtr/node-can/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250496987,"owners_count":21440231,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["can","canbus","canopen","node-can","nodejs","socketcan"],"created_at":"2024-11-08T21:52:54.701Z","updated_at":"2025-04-23T19:04:16.253Z","avatar_url":"https://github.com/angelodlfrtr.png","language":"JavaScript","readme":"# Node CAN\n\nA Node.js CAN library supporting multiple transports \u0026 protocols, heavily inspired by [python-can](https://python-can.readthedocs.io/en/2.1.0/).\n\n**This is an early alpha version, do not use in production.**\n\n## Installation\n\n```sh\nnpm install node-can\n```\n\n## Usage\n\n```\nconst can = require('node-can');\nconst bus = new can.Bus('protocolName', 'transportName', options);\n```\n\nExemple usage :\n\n```js\nconst can = require('node-can');\nconst bus = new can.Bus('raw', 'USBCanAnalyserV7', {\n\tport: '/dev/tty.wchusbserial14110',\n});\n\n// Initialize bus communication\nbus.run().then(() =\u003e {\n\tconsole.log('Bus ready');\n\tbus.on('message', console.log);\n});\n```\n\n## Transports\n\n### USBCanAnalyserV7\n\nThis transport implement support for the [USBCanAnalyserV7](https://www.seeedstudio.com/USB-CAN-Analyzer-p-2888.html) serial to can adapter.\n\n#### OS support\n\nSerial communication are done with [node-serialport](https://github.com/node-serialport/node-serialport).\nSo it support MacOS, Linux and Windows. See [node-serialport supported environments](https://serialport.io/docs/guide-platform-support) for more informations.\n\n#### Initialization sequence\n\n`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).\n\n#### Usage\n\n```js\nconst can = require('node-can');\nconst bus = new can.Bus('raw', 'USBCanAnalyserV7', {\n\tport: '/some/serial/port', // String, required\n});\n```\n\n### SocketCAN\n\n#### OS support\n\nSocketCan is available only on linux. The transport should working on all linux distributions built with socketCAN support.\n\n#### Usage\n\n```js\nconst can = require('node-can');\nconst bus = new can.Bus('raw', 'socketCan', {\n\tinterface: 'can0', // String, required\n});\n```\n\n## Protocols\n\n### RAW\n\n#### Usage\n\n```js\nconst can = require('node-can');\nconst bus = new can.Bus('raw', 'USBCanAnalyserV7', {\n\tinterface: 'can0',\n});\n\n// Listen for messages\nbus.protocol.on('message', console.log);\n\n// Write message\nbus.transport.write({ ...messageProps });\n```\n\n### CanOPEN\n\nCanOPEN is not fully implemented !\n\n#### Usage\n\n```js\nconst can = require('node-can');\nconst bus = new can.Bus('canopen', 'USBCanAnalyserV7', {\n\tport: '/some/serial/port',\n});\n\nbus.run().then(() =\u003e {\n\tconst applyNetworkDef = bus.protocol.dic.loadEdsFile('filepath.eds');\n\n\t// Scan for slave nodes\n\tbus.protocol.network.scanner.search().then((nodeIds) =\u003e {\n\t\tif (nodeIds.length) {\n\t\t\t// Slaves are present in network\n\t\t\tconst node = bus.protocol.network.addNode(nodeIds[0], applyNetworkDef());\n\n\t\t\tnode.pdo.read().then(() =\u003e {\n\t\t\t\tconsole.log(`Node ${node.id} : PDO OK`);\n\n\t\t\t\t// Listen for change on a given signal\n\t\t\t\tconst pdoSignal = node.pdo.get('SOME_SIGNAL');\n\t\t\t\tpdoSignal.on('change', console.log);\n\n\t\t\t\t// Read SDO\n\t\t\t\tnode.sdo.get('SOME_RECORD').get('SOME_VARIABLE').read().then(console.log);\n\n\t\t\t\t// Write SDO\n\t\t\t\tconst sdoVal = 0x01;\n\t\t\t\tnode.sdo.get('SOME_RECORD').get('SOME_VARIABLE').setRaw(sdoVal).save().then(console.log);\n\t\t\t});\n\t\t} else {\n\t\t\tconsole.error('Node slave node found');\n\t\t}\n\t});\n});\n```\n\n## TODO\n\n- Write tests\n- Write real documentation\n- More comments in code\n- \u003cdel\u003ePrepbuild library with babel at installation, instead of using `@babel/register`\u003c/del\u003e\n- Ability to configure extended frame mode using `USBCanAnalyserV7` transport\n- Create an interface to allow developers to extending protocols \u0026 transports\n- Implement .kcd parser for `raw` protocol\n- \u003cdel\u003eImplement `socket can` support (need a native interface)\u003c/del\u003e\n- `CanOPEN` protocol\n\t- Ability to auto download object dictionary from a slave node\n\t- Implement LSS\n\t- \u003cdel\u003ePDO write\u003c/del\u003e\n\t- Implement SYNC\n\t- Implement TIME PRODUCER\n\t- Implement `xml` dictionary parser\n\t- Implement segment download\n\t- Implement block uploads / downloads\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fangelodlfrtr%2Fnode-can","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fangelodlfrtr%2Fnode-can","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fangelodlfrtr%2Fnode-can/lists"}