Un module central Node.js BLE (Bluetooth Low Energy).
Vous voulez mettre en œuvre un périphérique? Checkout Bleno
Remarque: MacOS / Mac OS X, Linux, FreeBSD et Windows sont actuellement les seuls Os pris en charge. D'autres plateformes peuvent être développées plus tard.
libbluetooth-dev
sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
Assurez-vous que node
est sur votre chemin, si ce n'est pas le cas, certaines options:
nodejs
à node
: sudo ln -s /usr/bin/nodejs /usr/bin/node
sudo yum install bluez bluez-libs bluez-libs-devel
Voir Configurer Intel Edison pour le développement Bluetooth LE (SMART)
Assurez-vous que vous faites faire GNU:
sudo pkg install gmake
Désactivez le chargement automatique de la pile Bluetooth par défaut en mettant No-Ubt.Conf dans /usr/local/etc/devd/no-ubt.conf
et redémarrage Devd ( sudo service devd restart
).
Déchargez le module du noyau ng_ubt
Si déjà chargé:
sudo kldunload ng_ubt
Assurez-vous d'avoir des autorisations de lecture et d'écriture sur l'appareil /dev/usb/*
qui correspond à votre adaptateur Bluetooth.
Exigences de gypce de nœud pour Windows
Installez les outils et configurations requis à l'aide de Windows-Build-Tools de Microsoft à partir d'un PowerShell élevé ou CMD.exe (exécuter en tant qu'administrateur).
npm install --global --production windows-build-tools
Node-Bluetooth-Hci-Socket Prérequis
Voir Guide de configuration de @ Don sur Bluetooth LE avec Node.js et Noble sur Windows
Cette limite est imposée par le matériel de l'adaptateur Bluetooth ainsi que son firmware.
Plate-forme | |
---|---|
OS X 10.11 (El Capitan) | 6 |
Linux / Windows - dépendant de l'adaptateur | 5 (adaptateur basé sur le RSE) |
Certains adaptateurs BLE ne peuvent pas se connecter à un périphérique pendant leur numérisation (exemples ci-dessous). Vous obtiendrez les messages suivants lorsque vous essayez de vous connecter:
SENA UD-100 (Cambridge Silicon Radio, Ltd Bluetooth Dongle (mode HCI)): Error: Command disallowed
Intel Dual Band Wireless-AC 7260 (Intel Corporation Wireless 7260 (Rev 73)): Error: Connection Rejected due to Limited Resources (0xd)
Vous devez arrêter la numérisation avant d'essayer de vous connecter afin de résoudre ce problème.
npm install noble
var noble = require ( 'noble' ) ;
noble . startScanning ( ) ; // any service UUID, no duplicates
noble . startScanning ( [ ] , true ) ; // any service UUID, allow duplicates
var serviceUUIDs = [ "<service UUID 1>" , ... ] ; // default: [] => all
var allowDuplicates = < false | true > ; // default: false
noble.startScanning(serviceUUIDs, allowDuplicates[, callback(error)]); // particular UUID's
Remarque: noble.state
doit être poweredOn
avant le démarrage de la numérisation. noble.on('stateChange', callback(state));
Peut être utilisé Registre pour les événements de changement d'état.
noble . stopScanning ( ) ;
peripheral . connect ( [ callback ( error ) ] ) ;
peripheral . disconnect ( [ callback ( error ) ] ) ;
peripheral . updateRssi ( [ callback ( error , rssi ) ] ) ;
peripheral . discoverServices ( ) ; // any service UUID
var serviceUUIDs = [ "<service UUID 1>" , ... ] ;
peripheral . discoverServices ( serviceUUIDs [ , callback ( error , services ) ] ) ; // particular UUID's
peripheral . discoverAllServicesAndCharacteristics ( [ callback ( error , services , characteristics ) ] ) ;
var serviceUUIDs = [ "<service UUID 1>" , ... ] ;
var characteristicUUIDs = [ "<characteristic UUID 1>" , ... ] ;
peripheral . discoverSomeServicesAndCharacteristics ( serviceUUIDs , characteristicUUIDs , [ callback ( error , services , characteristics ) ) ;
service . discoverIncludedServices ( ) ; // any service UUID
var serviceUUIDs = [ "<service UUID 1>" , ... ] ;
service . discoverIncludedServices ( serviceUUIDs [ , callback ( error , includedServiceUuids ) ] ) ; // particular UUID's
service . discoverCharacteristics ( ) // any characteristic UUID
var characteristicUUIDs = [ "<characteristic UUID 1>" , ... ] ;
service . discoverCharacteristics ( characteristicUUIDs [ , callback ( error , characteristics ) ] ) ; // particular UUID's
characteristic . read ( [ callback ( error , data ) ] ) ;
characteristic . write ( data , withoutResponse [ , callback ( error ) ] ) ; // data is a buffer, withoutResponse is true|false
withoutResponse
:false
: Envoyez une demande d'écriture, utilisée avec une propriété caractéristique "écrire"true
: Envoyer une commande d'écriture, utilisée avec une propriété caractéristique "écrire sans réponse" characteristic . broadcast ( broadcast [ , callback ( error ) ] ) ; // broadcast is true|false
characteristic . subscribe ( [ callback ( error ) ] ) ;
'data'
lorsque périphérique envoie une notification ou une indication characteristic . unsubscribe ( [ callback ( error ) ] ) ;
characteristic . discoverDescriptors ( [ callback ( error , descriptors ) ] ) ;
descriptor . readValue ( [ callback ( error , data ) ] ) ;
descriptor . writeValue ( data [ , callback ( error ) ] ) ; // data is a buffer
peripheral . readHandle ( handle , callback ( error , data ) ) ;
peripheral . writeHandle ( handle , data , withoutResponse , callback ( error ) ) ;
Voir les documents Node.js EventEmitter pour plus d'informations. sur les API.
state = < "unknown" | "resetting" | "unsupported" | "unauthorized" | "poweredOff" | "poweredOn" >
noble . on ( 'stateChange' , callback ( state ) ) ;
noble . on ( 'scanStart' , callback ) ;
L'événement est émis lorsque la numérisation est démarrée ou si une autre application permet la numérisation ou modifie les paramètres de numérisation.
noble . on ( 'scanStop' , callback ) ;
L'événement est émis lorsque la numérisation est arrêtée ou si une autre application cesse de numériser.
peripheral = {
id : "<id>" ,
address : "<BT address" > , // Bluetooth Address of device, or 'unknown' if not known
addressType : "<BT address type>" , // Bluetooth Address type (public, random), or 'unknown' if not known
connectable : < connectable > , // true or false, or undefined if not known
advertisement: {
localName : " < name > ",
txPowerLevel: <int>,
serviceUuids: [" < service UUID > ", ...],
serviceSolicitationUuid: [" < service solicitation UUID > ", ...],
manufacturerData: <Buffer>,
serviceData: [
{
uuid: " < service UUID > "
data: <Buffer>
},
...
]
},
rssi: <rssi>
};
noble.on('discover', callback(peripheral));
Remarque: Sur OS X, l'adresse sera définie sur «inconnue» si le périphérique n'a pas été connecté précédemment.
noble . on ( 'warning' , callback ( message ) ) ;
peripheral . once ( 'connect' , callback ) ;
peripheral . once ( 'disconnect' , callback ) ;
peripheral . once ( 'rssiUpdate' , callback ( rssi ) ) ;
peripheral . once ( 'servicesDiscover' , callback ( services ) ) ;
service . once ( 'includedServicesDiscover' , callback ( includedServiceUuids ) ) ;
characteristic = {
uuid : "<uuid>" ,
// properties: 'broadcast', 'read', 'writeWithoutResponse', 'write', 'notify', 'indicate', 'authenticatedSignedWrites', 'extendedProperties'
properties : [ ... ]
} ;
service . once ( 'characteristicsDiscover' , callback ( characteristics ) ) ;
Émis lorsque la lecture caractéristique est terminée, le résultat de characteristic.read(...)
ou la valeur caractéristique a été mis à jour par périphérique via la notification ou l'indication - après avoir été activé avec notify(true[, callback(error)])
.
characteristic . on ( 'data' , callback ( data , isNotification ) ) ;
characteristic . once ( 'read' , callback ( data , isNotification ) ) ; // legacy
Remarque: La valeur du paramètre de l'événement isNotification
peut être undefined
en fonction de la prise en charge de la plate-forme. Le paramètre est déprécié après la version 1.8.1, et non pris en charge lorsqu'il est sur MacOS High Sierra et plus tard.
Émis lorsque l'écriture caractéristique est terminée, résultat de characteristic.write(...)
.
characteristic . once ( 'write' , withoutResponse , callback ( ) ) ;
Émis lorsque l'état de diffusion des caractéristiques change, le résultat de characteristic.broadcast(...)
.
characteristic . once ( 'broadcast' , callback ( state ) ) ;
Émis lorsque l'état de notification caractéristique change, le résultat de characteristic.notify(...)
.
characteristic . once ( 'notify' , callback ( state ) ) ;
descriptor = {
uuid : '<uuid>'
} ;
characteristic . once ( 'descriptorsDiscover' , callback ( descriptors ) ) ;
descriptor . once ( 'valueRead' , data ) ;
descriptor . once ( 'valueWrite' ) ;
Exécutez la commande suivante:
sudo setcap cap_net_raw+eip $( eval readlink -f ` which node ` )
Cela accorde les privilèges de node
binaire cap_net_raw
, afin qu'il puisse démarrer / arrêter la publicité BLE.
Remarque: La commande ci-dessus nécessite l'installation setcap
, elle peut être installée à l'aide des éléments suivants:
sudo apt-get install libcap2-bin
su -c 'yum install libcap2-bin'
hci0
est utilisé par défaut pour remplacer la variable d'environnement NOBLE_HCI_DEVICE_ID
sur le numéro d'interface.
Exemple, spécifiez hci1
:
sudo NOBLE_HCI_DEVICE_ID=1 node < your file > .js
Par défaut, Noble attend à la fois les données publicitaires et les données de réponse à numériser pour chaque adresse Bluetooth. Si votre appareil n'utilise pas de réponse de scan, la variable d'environnement suivante peut être utilisée pour le contourner.
sudo NOBLE_REPORT_ALL_HCI_EVENTS=1 node < your file > .js
Par défaut, Noble répondra par une erreur chaque fois qu'un message de demande GATT est reçu. Si votre intention est d'utiliser Bleno en tandem avec Noble, la variable d'environnement suivante peut être utilisée pour contourner cette fonctionnalité. Remarque: Cela nécessite un adaptateur Bluetooth 4.1.
sudo NOBLE_MULTI_ROLE=1 node < your file > .js
Par défaut, Noble sélectionnera les liaisons pour communiquer avec les périphériques Bluetooth en fonction de votre plate-forme. Si vous préférez spécifier les liaisons que Noble devrait utiliser:
var noble = require ( 'noble/with-bindings' ) ( require ( './my-custom-bindings' ) ) ;
Soutenez-nous avec un don mensuel et nous aidez à poursuivre nos activités. [Devenez un bailleur de fonds]
Devenez sponsor et obtenez votre logo sur notre lecture sur GitHub avec un lien vers votre site. [Devenir sponsor]
Copyright (C) 2015 Sandeep Mistry [email protected]
L'autorisation est accordée gratuitement par la présente à toute personne qui obtient une copie de ce logiciel et des fichiers de documentation associés (le "logiciel"), pour traiter le logiciel sans restriction, y compris sans limiter les droits d'utilisation, de copier, de modifier, de fusionner , publier, distribuer, sous-licencier et / ou vendre des copies du logiciel, et pour permettre aux personnes à qui le logiciel est fourni pour le faire, sous réserve des conditions suivantes:
L'avis de droit d'auteur ci-dessus et le présent avis d'autorisation sont inclus dans toutes les copies ou des parties substantielles du logiciel.
Le logiciel est fourni "tel quel", sans garantie d'aucune sorte, express ou implicite, y compris, mais sans s'y limiter, les garanties de qualité marchande, d'adéquation à un usage particulier et de non-contrefaçon. En aucun cas, les auteurs ou les titulaires de droits d'auteur ne seront pas responsables de toute réclamation, dommage ou autre responsabilité, que ce soit dans une action de contrat, de délit ou autre, découlant de, hors du logiciel ou de l'utilisation ou d'autres transactions dans le LOGICIEL.