var noble = require('noble'); var Interest = require('/Users/Nero/ndn-js').Interest; var Name = require('/Users/Nero/ndn-js').Name; var Blob = require('/Users/Nero/ndn-js').Blob; var Data = require('/Users/Nero/ndn-js').Data; var KeyLocatorType = require('/Users/Nero/ndn-js').KeyLocatorType; var ndnBeaconNameString = "/ndnbeacon/testdevice"; var hmacKeyDigest = [0xF5, 0xA5, 0xFD, 0x42, 0xD1, 0x6A, 0x20, 0x30, 0x27, 0x98, 0xEF, 0x6E, 0xD3, 0x09, 0x97, 0x9B, 0x43, 0x00, 0x3D, 0x23, 0x20, 0xD9, 0xF0, 0xE8, 0xEA, 0x98, 0x31, 0xA9, 0x27, 0x59, 0xFB, 0x4B]; // Create an LED interest var ledInterest = new Interest( new Name(ndnBeaconNameString + "/LED/" + String.fromCharCode(100, 250, 20))); ledInterest.getKeyLocator().setType(KeyLocatorType.KEY_LOCATOR_DIGEST); ledInterest.getKeyLocator().setKeyData(new Blob(hmacKeyDigest)); // Create a SETURL interest var setUrlInterest = new Interest( new Name(ndnBeaconNameString + "/SETURL")); setUrlInterest.getName().append("https://www.douyu.com"); setUrlInterest.getKeyLocator().setType(KeyLocatorType.KEY_LOCATOR_DIGEST); setUrlInterest.getKeyLocator().setKeyData(new Blob(hmacKeyDigest)); // Create a GETURL interest var getUrlInterest = new Interest( new Name(ndnBeaconNameString + "/GETURL")); getUrlInterest.getKeyLocator().setType(KeyLocatorType.KEY_LOCATOR_DIGEST); getUrlInterest.getKeyLocator().setKeyData(new Blob(hmacKeyDigest)); // Create a HELP interest var helpInterest = new Interest( new Name(ndnBeaconNameString + "/HELP")); helpInterest.getKeyLocator().setType(KeyLocatorType.KEY_LOCATOR_DIGEST); helpInterest.getKeyLocator().setKeyData(new Blob(hmacKeyDigest)); // Start scanning for peripherals with uuid 2220 when Bluetooth is poweredOn. noble.on('stateChange', function(state) { if (state === 'poweredOn') { noble.startScanning(['2220'], false); } else { noble.stopScanning(); } }); // Connect to NDN beacon when found noble.on('discover', function(peripheral) { peripheral.connect(function(error) { console.log('connected to peripheral: ' + peripheral.uuid); peripheral.discoverServices(['2220'], function(error, services) { var beaconService = services[0]; console.log('discovered beacon service'); // Go through each of NDN beacon's characteristics beaconService.discoverCharacteristics([], function(error, characteristics) { characteristics.forEach(function(element){ if (element.uuid === '2221') { console.log("This is a read characteristic"); element.subscribe(function(error) { if (error) console.log(error); else console.log('subscribed to read characteristic'); }); processReadCharacteristic(element); } else if (element.uuid === '2222') { console.log("This is a write characteristic"); // Test HELP var helpInterestBuf = helpInterest.wireEncode().buf(); writeToCharacteristic(helpInterestBuf, element); console.log("HELP interest sent. Expect HELP message."); // Test LED var ledInterestBuf = ledInterest.wireEncode().buf(); writeToCharacteristic(ledInterestBuf, element); console.log("LED interest sent. LED should change color."); // Test SETURL var setUrlInterestBuf = setUrlInterest.wireEncode().buf(); writeToCharacteristic(setUrlInterestBuf, element); console.log("SETURL interest sent."); // Test GETURL // var getUrlInterestBuf = getUrlInterest.wireEncode().buf(); // writeToCharacteristic(getUrlInterestBuf, element); // console.log("GETURL interest sent. Expect custom URL."); } else console.log("This is an unknown characteristic"); }); }); }); }); }); function writeToCharacteristic(buffer, characteristic) { var pkts = Math.ceil(buffer.length/18); for (var i = 0; i < pkts; i++) { var bufHeader = Buffer.from(String.fromCharCode(i, pkts)); var bufContent = buffer.slice(i*18, (i+1)*18); characteristic.write(Buffer.concat([bufHeader, bufContent]), true, function(error) { if (error) console.log(error);}); } } function processReadCharacteristic(characteristic) { var recvBuf = new Buffer(256); // Register event handler characteristic.on('data', function(data, isNotification) { console.log("Recived data from remote device"); var i = data[0]; var pkts = data[1]; data.copy(recvBuf, i*18, 2, data.length); if (i === pkts - 1) { var total = i*18 + data.length - 2; console.log("Total length: " + total); recvBuf = recvBuf.slice(0, total); // Sample usage of received data packet var recvData = new Data(); recvData.wireDecode(new Blob(recvBuf, false)); console.log("name: " + recvData.getName().toUri()); if (recvData.getContent().size() > 0) { console.log("content (raw): " + recvData.getContent().buf().toString('binary')); console.log("content (hex): " + recvData.getContent().toHex()); } } }); }