UNPKG

rasp-blefi

Version:

Experimental project that allow headless configuration of WIFI network on Rasperry PI using BLE.

63 lines (57 loc) 1.74 kB
import bleno, { Characteristic } from '@abandonware/bleno'; import utils from 'util'; import Network from '../network'; import { logger } from '../utils/logger'; /** * BLE characteristic for Network credential * @param network - network */ function NetworkCredentialCharacteristic(network: Network) { this.network = network; bleno.Characteristic.call(this, { uuid: 'fff2', properties: ['write'], descriptors: [ new bleno.Descriptor({ uuid: '2901', value: '', }), ], onWriteRequest: ( data: Buffer, offset: number, _withoutResponse: any, cb: Function ) => { logger.info('bluetooth read network credential characateristic'); if (offset) { cb(this.RESULT_ATTR_NOT_LONG); } else if (data.length > 32 || data.length <= 0) { cb(this.RESULT_INVALID_ATTRIBUTE_LENGTH); } else { // Parse credentials const credentials = data.toString('utf-8'); const [ssid, pwd] = credentials.split(' '); // Input vaidations if (!ssid) { logger.error('network ssid is empty', { ssid }); cb(this.RESULT_UNLIKELY_ERROR); return; } // Configue network (this.network as Network) .configureNetwork(ssid, pwd) .then(() => { logger.info('network successfully configured'); cb(this.RESULT_SUCCESS); }) .catch((err: unknown) => { logger.error('unable to configure network', { err }); cb(this.RESULT_UNLIKELY_ERROR); }); } }, }); } utils.inherits(NetworkCredentialCharacteristic, Characteristic); export default NetworkCredentialCharacteristic;