2017-02-05 115 views
1

是否有可能通過Nodejs腳本中的地址來查找藍牙設備?已知藍牙設備的Nodejs查找

這裏有幾個軟件包,主要是Noble。然而,他們都專注於掃描,而不是查找一個已知的地址(據我所知,無論如何!)。

我想實現的是查找一個已知地址,看看是否可以找到該設備。 就像PyBluez確實爲Python: bluetooth.lookup_name('CC:20:E8:8F:3A:1D', timeout=5)

在Python中,這樣可以找到該設備,即使它是不可發現,不像一個典型的查詢會掃描。

回答

0

我有這個相同的問題,只是找到btwatch庫,但它不適合我最新的raspbian。但是,源代碼只是調用l2ping並尋找一個我猜測不再打印成功的字符串,所以下面的修改後的代碼會起作用,類似於lookup_name方法,一旦你安裝了l2ping(我認爲npm bluetooth或pybluez已經它)

var Spawn = require('child_process').spawn; 

function detectMacAddress(macAddress, callback) 
{ 
    //var macAddress = '72:44:56:05:79:A0'; 
    var ls = Spawn('l2ping', ['-c', '1', '-t', '5', macAddress]); 

    ls.stdout.on('data', function (data) { 
     console.log("Found device in Range! " + macAddress); 
     callback(true); 
    }); 

    ls.on('close', function() { 
     console.log("Could not find: " + macAddress); 
     callback(false); 
    }); 
} 

或者,同步方式,

var execSync = require('child_process').execSync; 

function detectMacAddressSync(macAddress) 
{ 
    var cmd = 'l2ping -c 1 -t 5 ' + macAddress; 
    try 
    { 
     var output = execSync(cmd); 
     console.log("output : "+ output); 
     return true; 
    } 
    catch(e) 
    { 
     console.log("caught: " + e); 
     return false; 
    } 
} 
+1

啊!驚人!這正是我所追求的。謝謝。 – jdrucey

0

據我瞭解你想連接到使用地址的設備的問題。然後,我會建議使用node-bluetooth-serial-port

var btSerial = new (require('bluetooth-serialport')).BluetoothSerialPort(); 

btSerial.on('found', function(address, name) { 
    btSerial.findSerialPortChannel(address, function(channel) { 
     btSerial.connect(address, channel, function() { 
     console.log('connected'); 

     btSerial.write(new Buffer('my data', 'utf-8'), function(err, bytesWritten) { 
      if (err) console.log(err); 
     }); 

     btSerial.on('data', function(buffer) { 
      console.log(buffer.toString('utf-8')); 
     }); 
    }, function() { 
     console.log('cannot connect'); 
    }); 

    // close the connection when you're ready 
    btSerial.close(); 
}, function() { 
    console.log('found nothing'); 
}); 
}); 

BluetoothSerialPort.findSerialPortChannel(地址,回調[,errorCallback])

檢查如果設備具有串行端口服務運行,並且如果它發現它把信道ID來使用的RFCOMM連接。

回調(通道) - 完成查找設備上的串行端口時調用。 errorCallback - 稱爲搜索已完成,但未在設備上找到串行端口通道。連接到遠程藍牙設備。

bluetoothAddress - 遠程藍牙設備的地址。

通道 - 要連接的通道。 [successCallback] - 連接建立時調用。 [errorCallback(err)] - 當連接嘗試導致錯誤時調用。該參數是一個Error對象。

+0

HI rresol,我剛纔已經做了一些與此玩耍。它似乎沒有像Python例子那樣工作。這似乎是因爲我測試的設備沒有廣播任何頻道,「BluetoothSerialPort.findSerialPortChannel」總是失敗,除非它是可發現的。在這個階段,我的目標是簡單地檢查設備是否存在。我不確定這些中的任何內部工作原理,但似乎Pythons'.lookup_name'只是查找設備,但藍牙串口庫正在尋找設備**和**以獲得可用的通道。如果這是有道理的? – jdrucey