Um módulo central node.js ble (Bluetooth Low Low Energy).
Quer implementar um periférico? BlenO checkout
Nota: MacOS / Mac OS X, Linux, FreeBSD e Windows são atualmente os únicos sistemas operacionais suportados. Outras plataformas podem ser desenvolvidas mais tarde.
libbluetooth-dev
sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
Verifique se node
está no seu caminho, se não for, algumas opções:
nodejs
simplink para node
: sudo ln -s /usr/bin/nodejs /usr/bin/node
sudo yum install bluez bluez-libs bluez-libs-devel
Consulte Configurar o Intel Edison for Bluetooth LE (Smart) Development
Certifique -se de fazer GNU fazer:
sudo pkg install gmake
Desative o carregamento automático da pilha Bluetooth padrão, colocando no-bt.conf em /usr/local/etc/devd/no-ubt.conf
e reiniciando o devd ( sudo service devd restart
).
Descarregue o módulo kernel ng_ubt
se já carregado:
sudo kldunload ng_ubt
Certifique -se de ler e escrever permissões no dispositivo /dev/usb/*
que corresponda ao seu adaptador Bluetooth.
Requisitos do Node GYP para Windows
Instale as ferramentas e configurações necessárias usando as ferramentas Windows-build da Microsoft a partir de um PowerShell ou CMD.EXE elevado (execute como administrador).
npm install --global --production windows-build-tools
Pré-requisitos Node-Bluetooth-HCI-Socket
Veja o guia de configuração de @Don no Bluetooth Le com Node.js e Noble no Windows
Esse limite é imposto pelo hardware do adaptador Bluetooth, bem como seu firmware.
Plataforma | |
---|---|
OS X 10.11 (El Capitan) | 6 |
Linux/Windows - dependente do adaptador | 5 (adaptador baseado em RSE) |
Alguns adaptadores BLE não podem se conectar a um periférico enquanto estão digitalizando (exemplos abaixo). Você receberá as seguintes mensagens ao tentar se conectar:
Sena UD-100 (Cambridge Silicon Radio, Ltd Bluetooth Dongle (modo HCI)): Error: Command disallowed
Intel Dual Band Wireless-AC 7260 (Intel Corporation Wireless 7260 (Ap 73)): Error: Connection Rejected due to Limited Resources (0xd)
Você precisa parar de digitalizar antes de tentar se conectar para resolver esse problema.
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
NOTA: noble.state
deve ser poweredOn
antes do início da digitalização. noble.on('stateChange', callback(state));
pode ser usado registro para eventos de mudança de estado.
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
: Envie uma solicitação de gravação, usada com a propriedade de característica "Write"true
: Envie um comando de gravação, usado com propriedade de característica "Write Without Response" characteristic . broadcast ( broadcast [ , callback ( error ) ] ) ; // broadcast is true|false
characteristic . subscribe ( [ callback ( error ) ] ) ;
'data'
gatilhos quando o periférico enviar uma notificação ou indicação 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 ) ) ;
Consulte os documentos Node.js EventEmitter para obter mais informações. na API's.
state = < "unknown" | "resetting" | "unsupported" | "unauthorized" | "poweredOff" | "poweredOn" >
noble . on ( 'stateChange' , callback ( state ) ) ;
noble . on ( 'scanStart' , callback ) ;
O evento é emitido quando a digitalização é iniciada ou se outro aplicativo permite a digitalização ou alterações nas configurações de digitalização.
noble . on ( 'scanStop' , callback ) ;
O evento é emitido quando a digitalização é interrompida ou se outro aplicativo parar de digitalizar.
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));
NOTA: No OS X, o endereço será definido como 'desconhecido' se o dispositivo não tiver sido conectado anteriormente.
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 ) ) ;
Emitido quando a leitura característica foi concluída, resultado de characteristic.read(...)
ou valor característico foi atualizado por periférico por notificação ou indicação - depois de ter sido ativado com notify(true[, callback(error)])
.
characteristic . on ( 'data' , callback ( data , isNotification ) ) ;
characteristic . once ( 'read' , callback ( data , isNotification ) ) ; // legacy
Nota: O valor do parâmetro do evento isNotification
pode ser undefined
dependendo do suporte da plataforma. O parâmetro é descontinuado após a versão 1.8.1 e não é suportado quando no MacOS High Sierra e posterior.
Emitido quando a gravação característica foi concluída, resultado de characteristic.write(...)
.
characteristic . once ( 'write' , withoutResponse , callback ( ) ) ;
Emitido quando o estado de transmissão característico muda, resultado de characteristic.broadcast(...)
.
characteristic . once ( 'broadcast' , callback ( state ) ) ;
Emitido quando a notificação característica do estado muda, resultado de characteristic.notify(...)
.
characteristic . once ( 'notify' , callback ( state ) ) ;
descriptor = {
uuid : '<uuid>'
} ;
characteristic . once ( 'descriptorsDiscover' , callback ( descriptors ) ) ;
descriptor . once ( 'valueRead' , data ) ;
descriptor . once ( 'valueWrite' ) ;
Execute o seguinte comando:
sudo setcap cap_net_raw+eip $( eval readlink -f ` which node ` )
Isso concede os privilégios binários node
cap_net_raw
, para que possa iniciar/interromper a publicidade ble.
NOTA: O comando acima exige que setcap
seja instalado, ele pode ser instalado usando o seguinte:
sudo apt-get install libcap2-bin
su -c 'yum install libcap2-bin'
hci0
é usado por padrão para substituir o Definir a variável de ambiente NOBLE_HCI_DEVICE_ID
para o número da interface.
Exemplo, especifique hci1
:
sudo NOBLE_HCI_DEVICE_ID=1 node < your file > .js
Por padrão, o Noble aguarda os dados de dados e a resposta de digitalização para cada endereço Bluetooth. Se o seu dispositivo não usar a resposta da varredura, a seguinte variável de ambiente poderá ser usada para ignorá -lo.
sudo NOBLE_REPORT_ALL_HCI_EVENTS=1 node < your file > .js
Por padrão, o Noble responderá com um erro sempre que uma mensagem de solicitação GATT for recebida. Se sua intenção é usar o Blen em conjunto com nobre, a seguinte variável de ambiente pode ser usada para ignorar essa funcionalidade. Nota: Isso requer um adaptador Bluetooth 4.1.
sudo NOBLE_MULTI_ROLE=1 node < your file > .js
Por padrão, o Noble selecionará ligações para se comunicar com dispositivos Bluetooth, dependendo da sua plataforma. Se você preferir especificar quais ligações nobres devem usar:
var noble = require ( 'noble/with-bindings' ) ( require ( './my-custom-bindings' ) ) ;
Apoie -nos com uma doação mensal e ajude -nos a continuar nossas atividades. [Torne -se um patrocinador]
Torne -se um patrocinador e obtenha seu logotipo em nosso ReadMe no GitHub com um link para o seu site. [Torne -se um patrocinador]
Copyright (c) 2015 Sandeep Mistry [email protected]
É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados (o "software"), para lidar com o software sem restrição, incluindo, sem limitação, os direitos de uso, copiar, modificar, mesclar .
O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas as cópias ou em partes substanciais do software.
O software é fornecido "como está", sem garantia de qualquer tipo, expresso ou implícito, incluindo, entre outros, as garantias de comercialização, aptidão para uma finalidade específica e não innoculação. Em nenhum caso os autores ou detentores de direitos autorais serão responsabilizados por qualquer reclamação, danos ou outro passivo, seja em uma ação de contrato, delito ou não, decorrente de, fora ou em conexão com o software ou o uso ou outras negociações nos Software.