Node.js에서 BLE Peripheral을 구현하는 패키지 bleno를 사용해보십시오.
Central 구현을 원한다면 noble 을 사용합시다. Node.js에서 BLE을 다루는 패키지의 noble과 noble-device로 비공식 SDK 같은 것을 만들어 보자. 등에서는 Central측이었습니다.
같은 작가이므로 자매 프로젝트군요.
noble - BLE Central
bleno - BLE Peripheral
설치
Node.js v8.11.3에서 시도했습니다.
npm i bleno
덧붙여서 Node.js v10 계에서 시도하면 설치 중에 다음과 같은 오류가 발생했습니다. Node.js의 버전 낮추면 빌드가 통과합니다. v8 시스템에서 시도해 봅시다. (2018/6/24 시점)
make: *** [Release/obj.target/binding/src/XpcConnection.o] Error 1
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/Users/n0bisuke/.nodebrew/node/v10.0.0/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:258:23)
gyp ERR! stack at ChildProcess.emit (events.js:182:13)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:225:12)
gyp ERR! System Darwin 17.6.0
gyp ERR! command "/Users/n0bisuke/.nodebrew/node/v10.0.0/bin/node" "/Users/n0bisuke/.nodebrew/node/v10.0.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /Users/n0bisuke/dotstudio/playground/tello-nodejs/node_modules/xpc-connection
gyp ERR! node -v v10.0.0
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules/bluetooth-hci-socket):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"linux,android,win32","arch":"any"} (current: {"os":"darwin","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules/xpc-connection):
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] install: `node-gyp rebuild`
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: Exit status 1
숫자 데이터를 보내는 간단한 BLE Peripheral 구현
간단한 예입니다.
UUID는 htps //w w. 우우 d 게 네라와 r. 네 t/ 등으로 생성합시다.
ble_peripheral.js
'use strict'
const bleno = require('bleno');
const BlenoPrimaryService = bleno.PrimaryService;
const SERVECE_UUID = `D5875408-FA51-4763-A75D-7D33CECEBC31`; //適宜書き換え
const CHARACTERISTIC_UUID = `A4F01D8C-A037-43B6-9050-1876A8C23584`; //適宜書き換え
const DEVICE_NAME = `n0bisuke-BLE-device`; //デバイス名
console.log(`bleno - ${DEVICE_NAME}`);
let counter = 0;
setInterval(()=>{counter++}, 1000); //値の変化を見るために毎秒インクリメント
const Characteristic = bleno.Characteristic;
const characteristic = new Characteristic({
uuid: CHARACTERISTIC_UUID,
properties: ['read'],
onReadRequest: (offset, callback) => { //Central側からReadリクエストが来ると発火
console.log(counter); //READリクエストでカウントを表示
const result = Characteristic.RESULT_SUCCESS;
const data = new Buffer.from(`${counter}`);
callback(result, data);
}
});
bleno.on('stateChange', (state) => {
console.log(`on -> stateChange: ${state}`);
if (state === 'poweredOn') {
bleno.startAdvertising(DEVICE_NAME, [SERVECE_UUID]);
} else {
bleno.stopAdvertising();
}
});
bleno.on('advertisingStart', (error) => {
console.log(`on -> advertisingStart: ${(error ? 'error ' + error : 'success')}`);
if(error) return;
const blenoService = new BlenoPrimaryService({
uuid: SERVECE_UUID,
characteristics: [characteristic]
});
bleno.setServices([blenoService]);
});
실행
Mac Book Pro(high Sierra)
와 Nexus 5(Android)
로 통신해 봅니다.이미지는 이런 느낌
Peripheral(Mac) <---READ---- Central(Nexus 5)
Node.js를 실행합니다.
$ node ble_peripheral.js
bleno - n0bisuke-BLE-device
on -> stateChange: poweredOn
on -> advertisingStart: success
실행하면 이 상태로 대기가 됩니다.
스마트 폰 (Nexus 5) 측에서 BLE Central을 만들어 액세스 해보십시오.
이 앱을 사용했습니다.
시작할 때 이렇게 만든 장치 이름이 표시되었습니다.
Connect하여 값을 읽으면 Node.js 측에서 onReadRequest의 부분이 발화하고 숫자가 표시됩니다.
58
69
70
75
77
78
81
소감
상당히 편리합니다만, 구현예가 좀처럼 발견되지 않고 구조 이해에 시간이 걸렸습니다.
Subscribe 주위의 구현도 시험해보고 싶네요.
NefryBT(ESP32)와의 접속도 시도했으므로 별도로 써보고 싶습니다.
Reference
이 문제에 관하여(Node.js에서 BLE Peripheral을 구현하는 패키지 bleno를 사용해보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/n0bisuke/items/e6298f13be6822965045텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)