nobleWrapper.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. const resp = require('../util/resp')
  2. const noble = require('noble');
  3. let inRange = {};
  4. let blueDeviceList = []
  5. let blueCharacteristics = []
  6. let connectedCharacteristic = null;
  7. let on_data_callback = null;
  8. noble.on('discover', function (peripheral) {
  9. if(peripheral.addressType != 'public') {
  10. return;
  11. }
  12. inRange[peripheral.id] = {
  13. peripheral: peripheral
  14. };
  15. var blueDevice = {
  16. 'id': peripheral.id,
  17. 'localName': peripheral.advertisement.localName,
  18. 'serviceUuids': JSON.stringify(peripheral.advertisement.serviceUuids),
  19. 'address': peripheral.address,
  20. 'addressType': peripheral.addressType,
  21. 'connectable': peripheral.connectable,
  22. 'rssi': peripheral.rssi,
  23. }
  24. blueDeviceList.push(blueDevice)
  25. explore(peripheral)
  26. });
  27. function explore(peripheral) {
  28. peripheral.connect(error => {
  29. peripheral.discoverServices([], function (error, services) {
  30. for (let serviceIndex = 0; serviceIndex < services.length; serviceIndex++) {
  31. (function (service) {
  32. service.discoverCharacteristics([], function (error, characteristics) {
  33. for (let charIndex = 0; charIndex < characteristics.length; charIndex++) {
  34. let c = characteristics[charIndex];
  35. let info = {
  36. id: peripheral.id,
  37. uuid: service.uuid,
  38. name: service.name,
  39. characteristic: {
  40. 'uuid': c.uuid,
  41. 'properties': c.properties
  42. }
  43. }
  44. blueCharacteristics.push(info)
  45. }
  46. })
  47. })(services[serviceIndex])
  48. }
  49. setTimeout(function () {
  50. peripheral.disconnect()
  51. }, 1000)
  52. })
  53. })
  54. }
  55. function merge_scan_result() {
  56. for (let i = 0; i < blueDeviceList.length; i++) {
  57. let device = blueDeviceList[i]
  58. device.characteristics = []
  59. for (let j = 0; j < blueCharacteristics.length; j++) {
  60. let character = blueCharacteristics[j]
  61. if (device.id == character.id) {
  62. console.log(character)
  63. device.characteristics.push(character)
  64. }
  65. }
  66. }
  67. // console.log(blueDeviceList)
  68. return blueDeviceList
  69. }
  70. function connectAndSetUp(peripheral,server_uuid,characteristic_uuid) {
  71. peripheral.connect(error => {
  72. console.log('Connected to', peripheral.id);
  73. // specify the services and characteristics to discover
  74. const serviceUUIDs = [server_uuid];
  75. const characteristicUUIDs = [characteristic_uuid];
  76. peripheral.discoverSomeServicesAndCharacteristics(
  77. serviceUUIDs,
  78. characteristicUUIDs,
  79. onServicesAndCharacteristicsDiscovered
  80. );
  81. });
  82. peripheral.on('disconnect', () => console.log('disconnected'));
  83. }
  84. function onServicesAndCharacteristicsDiscovered(error, services, characteristics) {
  85. console.log('Discovered services and characteristics');
  86. const echoCharacteristic = characteristics[0];
  87. // data callback receives notifications
  88. echoCharacteristic.on('data', (data, isNotification) => {
  89. if (on_data_callback) {
  90. on_data_callback(data)
  91. }
  92. });
  93. // subscribe to be notified whenever the peripheral update the characteristic
  94. echoCharacteristic.subscribe(error => {
  95. if (error) {
  96. console.error('Error subscribing to echoCharacteristic');
  97. } else {
  98. console.log('Subscribed for echoCharacteristic notifications');
  99. }
  100. });
  101. connectedCharacteristic = echoCharacteristic
  102. }
  103. module.exports = {
  104. scan: function (resp_callback) {
  105. try {
  106. blueDeviceList = []
  107. blueCharacteristics = []
  108. setTimeout(() => {
  109. noble.stopScanning()
  110. resp_callback(resp.ok_resp(merge_scan_result()))
  111. }, 3000);
  112. noble.startScanning()
  113. } catch (e) {
  114. resp_callback(resp.fail_resp(e.message))
  115. }
  116. },
  117. connect: function (args, on_data_cb, resp_callback) {
  118. on_data_callback = on_data_cb;
  119. connectAndSetUp(inRange[args.id].peripheral,args.server_uuid,args.characteristic_uuid)
  120. },
  121. write: function (msg, resp_callback) {
  122. try {
  123. const buffer = new Buffer(msg, 'utf-8');
  124. if (connectedCharacteristic) {
  125. connectedCharacteristic.write(buffer);
  126. }
  127. } catch (e) {
  128. resp_callback(resp.fail_resp(e.message))
  129. }
  130. }
  131. }