我现在正在努力使用node.js与Inateck的蓝牙条码扫描器建立稳固,长期的连接。该过程在后台运行(linux,无输入焦点),这就是我将扫描仪配置为SPP设备的原因。
只要扫描仪没有自动关闭以节省电量,大约5分钟后,连接基本上就可以正常工作。
我的第一个方法是使用bluetooth-serial-port包。它发现扫描仪,读取条形码,但当扫描仪关闭时,我不知道如何重新连接。我添加了一个间隔计时器来检查连接并尝试再次连接,如果isOpen()返回false(它工作一次)。当我按下扫描仪上的按钮时,它会重新打开,我可以重新连接,但是在查看秒后,即使连接已建立,isOpen()也会返回false,并且我没有得到任何进一步的读数。这是我的代码:
var btSerial = new (require('bluetooth-serial-port')).BluetoothSerialPort();
var btInterval = null;
btSerial.on('found', function (address, name) {
btSerial.findSerialPortChannel(address, function (channel) {
if (address === '00:06:11:68:15:81') {
btSerial.connect(address, channel, function () {
console.log('connected to ' + address);
btInterval = setInterval(function () {
if (!btSerial.isOpen()) {
btSerial.close();
clearInterval(btInterval);
console.log('lost connection - try to reconnect');
btSerial.inquire();
}
}, 5000);
}, function () {
console.log('cannot connect to ' + address);
});
}
}, function () {
console.log('found nothing');
});
});
btSerial.on('finished', function () {
console.log('finished');
});
btSerial.on('data', function (buffer) {
console.log(buffer.toString('utf-8'));
});
btSerial.inquire();
输出如下:
finished
connected to 00:06:11:68:15:81
found nothing
... scanning works ...
lost connection - try to reconnect
finished
connected to 00:06:11:68:15:81
... scanning works ...
lost connection - try to reconnect
finished
... that's it - no more scans ...
^C
另一个想法是使用节点fs()直接从'/ dev / rfcomm0'读取。
scanner = fs.createReadStream('/dev/rfcomm0', {bufferSize: 1});
scanner.on('open', function () {
logger.info('Scanner connected');
});
scanner.on('end', function () {
logger.info('End of data stream');
});
scanner.on('close', function () {
logger.info('Scanner disconnected');
});
scanner.on('error', function (error) {
logger.error('Scanner error');
});
scanner.on('data', function (chunk) {
logger.info(chunk.toString('ascii', 0, 13));
}
});
});
当从设备读取时,操作系统会自动完成连接,并且我确实通过on('data',..)接收代码。但是,扫描仪在一段时间后关闭时,我确实遇到了同样的问题。我确实收到了on('close',..)事件,但再次使用fs.createReadStream()重新连接不再有效。
也许有人已经不得不处理这样的问题并且可以给我一个提示如何处理这个问题。我很欣赏每一个建议。
谢谢, 最大
答案 0 :(得分:0)
这不是我想要的方式,而是在扫描仪可用时启动我的节点应用程序的bash脚本,完成工作:
#!/bin/bash
echo "Press CTRL+C to stop..."
while :
do
if hcitool scan | grep -q "00:06:11:68:15:81"; then
# BT scanner found
node .
fi
sleep 1
done