| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
node-hid supports Node.js v6 and upwards. For versions before that, you will need to build from source. The platforms, architectures and node versions node-hid supports are the following. In general we try to provide pre-built native library binaries for the most common platforms, Node and Electron versions.
We strive to make node-hid cross-platform so there's a good chance any combination not listed here will compile and work.
¹ prebuilt-binaries not provided for these platforms
² prebuilt binary built on Ubuntu 16.04 x64
Native modules like node-hid require upstream dependencies to be updated to work with newer Node and Electron versions. Unless you need the features in the most recent Electron or Node, use a supported version.
For most "standard" use cases (node v4.x on mac, linux, windows on a x86 or x64 processor), node-hid will install nice and easy with a standard:
npm install node-hid
If you install globally, the test program src/show-devices.js is installed as hid-showdevices. On Linux you can use it to try the difference between hidraw and libusb driverTypes:
$ npm install -g node-hid $ hid-showdevices libusb $ hid-showdevices hidraw
We are using prebuild to compile and post binaries of the library for most common use cases (linux, mac, windows on standard processor platforms). If you are on a special case, node-hid will work, but it will compile the binary when you install.
If node-hid doesn't have a pre-built binary for your system (e.g. Linux on Raspberry Pi), node-gyp is used to compile node-hid locally. It will need the pre-requisites listed in Compling from source below.
In the src/ directory, various JavaScript programs can be found that talk to specific devices in some way. Some interesting ones:
To try them out, run them like node src/showdevices.js from within the node-hid directory.
var HID = require('node-hid');
var devices = HID.devices();devices will contain an array of objects, one for each HID device available. Of particular interest are the vendorId and productId, as they uniquely identify a device, and the path, which is needed to open a particular device.
Sample output:
HID.devices();
{ vendorId: 10168,
productId: 493,
path: 'IOService:/AppleACPIPl...HIDDevice@14210000,0',
serialNumber: '20002E8C',
manufacturer: 'ThingM',
product: 'blink(1) mk2',
release: 2,
interface: -1,
usagePage: 65280,
usage: 1 },
{ vendorId: 1452,
productId: 610,
path: 'IOService:/AppleACPIPl...Keyboard@14400000,0',
serialNumber: '',
manufacturer: 'Apple Inc.',
product: 'Apple Internal Keyboard / Trackpad',
release: 549,
interface: -1,
usagePage: 1,
usage: 6 },
<and more>Both HID.devices() and new HID.HID() are relatively costly, each causing a USB (and potentially Bluetooth) enumeration. This takes time and OS resources. Doing either can slow down the read/write that you do in parallel with a device, and cause other USB devices to slow down too. This is how USB works.
If you are polling HID.devices() or doing repeated new HID.HID(vid,pid) to detect device plug / unplug, consider instead using node-usb-detection. node-usb-detection uses OS-specific, non-bus enumeration ways to detect device plug / unplug.
Before a device can be read from or written to, it must be opened. The path can be determined by a prior HID.devices() call. Use either the path from the list returned by a prior call to HID.devices():
var device = new HID.HID(path);or open the first device matching a VID/PID pair:
var device = new HID.HID(vid,pid);The device variable will contain a handle to the device. If an error occurs opening the device, an exception will be thrown.
A node-hid device is an EventEmitter. While it shares some method names and usage patterns with Readable and Writable streams, it is not a stream and the semantics vary. For example, device.write does not take encoding or callback args and device.pause does not do the same thing as readable.pause. There is also no pipe method.
If you need to filter down the HID.devices() list, you can use standard Javascript array techniques:
var devices = HID.devices();
var deviceInfo = devices.find( function(d) {
var isTeensy = d.vendorId===0x16C0 && d.productId===0x0486;
return isTeensy && d.usagePage===0xFFAB && d.usage===0x200;
});
if( deviceInfo ) {
var device = new HID.HID( deviceInfo.path );
// ... use device
}To receive FEATURE reports, use device.getFeatureReport().
To receive INPUT reports, use device.on("data",...). A node-hid device is an EventEmitter. Reading from a device is performed by registering a "data" event handler:
device.on("data", function(data) {});You can also listen for errors like this:
device.on("error", function(err) {});For FEATURE reports:
var buf = device.getFeatureReport(reportId, reportLength)Notes:
To send FEATURE reports, use device.sendFeatureReport().
To send OUTPUT reports, use device.write().
All writing is synchronous.
The ReportId is the first byte of the array sent to device.sendFeatureReport() or device.write(), meaning the array should be one byte bigger than your report. If your device does NOT use numbered reports, set the first byte of the 0x00.
device.write([0x00, 0x01, 0x01, 0x05, 0xff, 0xff]);device.sendFeatureReport( [0x01, 'c', 0, 0xff,0x33,0x00, 70,0, 0] );Notes:
This method will cause the HID device to resume emmitting data events. If no listeners are registered for the data event, data will be lost.
When a data event is registered for this HID device, this method will be automatically called.
In general node-hid is not thread-safe because the underlying C-library it wraps (hidapi) is not thread-safe. However, node-hid is now reporting as minimally Context Aware to allow use in Electron v9+. Until node-hid (or hidapi) is rewritten to be thread-safe, please constrain all accesses to it via a single thread.
Most OSes will prevent USB HID keyboards or mice, or devices that appear as a keyboard to the OS. This includes many RFID scanners, barcode readers, USB HID scales, and many other devices. This is a security precaution. Otherwise, it would be trivial to build keyloggers. There are non-standard work-arounds for this, but in general you cannot use node-hid to access keyboard-like devices.
See General notes above Keyboards
See General notes above about Keyboards
For reasons similar to mice & keyboards it appears you can't access this controller on Windows 10.
See General notes above about Keyboards
By default as of node-hid@0.7.0, the hidraw driver is used to talk to HID devices. Before node-hid@0.7.0, the more older but less capable libusb driver was used. With hidraw Linux apps can now see usage and usagePage attributes of devices.
If you would still like to use the libusb driver, then you can do either:
During runtime, you can use HID.setDriverType('libusb') immediately after require()-ing node-hid:
var HID = require('node-hid');
HID.setDriverType('libusb');If you must have the libusb version and cannot use setDriverType(), you can install older node-hid or build from source:
npm install node-hid@0.5.7
or:
npm install node-hid --build-from-source --driver=libusb
Most Linux distros use udev to manage access to physical devices, and USB HID devices are normally owned by the root user. To allow non-root access, you must create a udev rule for the device, based on the devices vendorId and productId.
This rule is a text file placed in /etc/udev/rules.d.
For an example HID device (say a blink(1) light with vendorId = 0x27b8 and productId = 0x01ed, the rules file to support both hidraw and libusb would look like:
SUBSYSTEM=="input", GROUP="input", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="27b8", ATTRS{idProduct}=="01ed", MODE:="666", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="27b8", ATTRS{idProduct}=="01ed", MODE="0666", GROUP="plugdev"
Note that the values for idVendor and idProduct must be in hex and lower-case.
Save this file as /etc/udev/rules.d/51-blink1.rules, unplug the HID device, and reload the rules with:
sudo udevadm control --reload-rules
For a complete example, see the blink1 udev rules.
To compile & develop locally or if prebuild cannot download a pre-built binary for you, you will need the following tools:
npm install node-hid --build-from-source
For example:
git clone https://github.com/node-hid/node-hid.git cd node-hid # must change into node-hid directory npm install -g rimraf # just so it doesn't get 'clean'ed npm run prepublishOnly # get the needed hidapi submodule npm install --build-from-source # rebuilds the module with C code npm run showdevices # list connected HID devices node ./src/show-devices.js # same as above
You may see some warnings from the C compiler as it compiles
hidapi (the underlying C library node-hid uses).
This is expected.
For ease of development, there are also the scripts:
npm run gypclean # "node-gyp clean" clean gyp build directory npm run gypconfigure # "node-gyp configure" configure makefiles npm run gypbuild # "node-gyp build" build native code
When cross-compiling you need to override node-hid's normal behavior of using Linux pkg-config to determine CLFAGS and LDFLAGS for libusb. To do this, you can use the node-gyp variable node_hid_no_pkg_config and then invoke a node-hid rebuild with either:
node-gyp rebuild --node_hid_no_pkg_config=1
or
npm gyprebuild --node_hid_no_pkg_config=1
In your electron project, add electron-rebuild to your devDependencies. Then in your package.json scripts add:
"postinstall": "electron-rebuild"
This will cause npm to rebuild node-hid for the version of Node that is in Electron. If you get an error similar to The module "HID.node" was compiled against a different version of Node.js then electron-rebuild hasn't been run and Electron is trying to use node-hid compiled for Node.js and not for Electron.
If using node-hid with webpack or similar bundler, you may need to exclude node-hid and other libraries with native code. In webpack, you say which externals you have in your webpack-config.js:
externals: {
"node-hid": 'commonjs node-hid'
}
Examples of node-hid in Electron:
Without knowing much about NW.js, a quick hacky solution that works is:
cd my-nwjs-app npm install node-hid --save npm install -g nw-gyp cd node_modules/node-hid nw-gyp rebuild --target=0.42.3 --arch=x64 // or whatever NW.js version you have cd ../.. nwjs .
Please use the node-hid github issues page for support questions and issues.
| Back | FazBrowse Home | New Git URL |