收听原始蓝牙键盘数据
Posted
技术标签:
【中文标题】收听原始蓝牙键盘数据【英文标题】:Listen to raw bluetooth keyboard data 【发布时间】:2014-10-24 17:19:34 【问题描述】:我需要收听蓝牙键盘发送到我的设备的原始命令/按键,如果可能,防止它们“传播”到系统的其余部分。
基本上,我用 Node.js 和 coffee-script 编写了一些东西,它接收来自stdin
的按键并控制我的飞利浦 Hue 灯泡。它看起来像这样:
keypress = require 'keypress'
# Setup keypress events
keypress process.stdin
process.stdin.on 'keypress', (character, key) ->
switch character
when 'l' then hue.decreaseTemp()
when 'r' then hue.increaseTemp()
when 'u' then hue.increaseBri()
when 'd' then hue.decreaseBri()
when 'b' then hue.turnOff()
# Exit on ctrl-c
if key?.ctrl and key.name is 'c'
process.stdin.pause()
它的功能有效,但它不是很有用,因为它从标准输入接收输入,阻止它在后台运行。
如果窗口没有焦点,我该怎么做才能让这个接收输入?
我更喜欢在我的 Mac 上运行 Node.js 或 Python 中的某些东西,但如果需要,我愿意切换语言或在我的 Raspberry Pi 上运行
【问题讨论】:
您究竟是如何监听按键事件的?您需要解释您实际使用的内容并提供一些代码 @ian 我正在使用keypress 收听来自标准输入的输入,一旦脚本失去焦点,终端窗口就无法接收输入(显然)。 后台运行是什么意思。您必须专注于窗口才能直接输入,它的工作原理与任何其他程序一样。 我的意思是我不希望窗口有焦点让程序接收输入。我知道除非有焦点,否则我无法接收标准输入输入,因此可以改变,但我只需要找到其他东西来使其工作。 你所说的,本质上是你通过蓝牙连接你的键盘,然后当你输入(假设你的程序正在运行并处于焦点)时,它会执行命令来控制某些东西 -而你想要的是能够使用键盘来控制它,而不必让终端处于焦点,对吧? 【参考方案1】:keypress 只监听标准输入流,而不是键盘本身。此输入流由操作系统及其硬件驱动程序处理。通常操作系统不希望应用程序直接监听键盘,而是将键盘事件定向到它所关注的程序。
您必须直接处理设备,否则操作系统会将这些输入重定向到其他焦点程序。您应该为此尝试node-hid。它可以访问附加的人机界面设备,如键盘/鼠标。说明说它适用于 USB 设备,但它应该适用于蓝牙 (HID) 设备。
其次,由于您正在听硬件,很可能您不会直接收到按键值,而是需要解释一堆原始输入数据/信号。您将键盘用作遥控器,请准备好将其用作低级设备。
【讨论】:
是的 - 我希望我不会得到像字符这样的花哨的东西,而只有原始值。我按下了大约 5 个按钮,所以我没问题。 嗯,我尝试了 node-hid,但我只能让它窃取我 Mac 上的触控板 - 它无法连接/收听蓝牙遥控器。它让我走上了正轨 @DavidPearce 看起来蓝牙不适用于节点隐藏。如果您有蓝牙低功耗 (BLE)/蓝牙 4.0 键盘,您可以尝试github.com/sandeepmistry/noble。您还需要 LightBlue 服务来访问您的设备。查看更多信息here【参考方案2】:解决这个问题的一种方法(控制色调而不需要程序在前台)是将色调控制和键盘快捷键拆分到不同的应用程序:
我会简单地编写一个命令行工具,例如。使用节点,它将要运行的命令作为参数。然后我会为命令创建操作系统级别的键盘快捷键。
例如。我会配置 Command-Shift-+ 来调用huecontrol increasebri
。 Huecontrol 会做的事情并退出。
【讨论】:
我相信重点是在他故意打字时改变颜色。 (听起来会很棒……) 是的 - 理想情况下,我是从蓝牙键盘收听原始数据。我正在使用 Roku 遥控器,它类似于蓝牙键盘7554xysb4c4dxy7u.zippykid.netdna-cdn.com/wp-content/uploads/…,例如向上按钮输入字母“u”。我想直接从键盘读取输入,而不是stdin
好的,如果要在键入时更改颜色,则必须实际听键盘,热键不起作用。我只是想指出一种解决问题的方法。
仔细阅读您的评论,现在我明白了。如果您使用Autohotkey 或OS X alternatives 之类的东西将Roku 键盘中的简单字母“u”映射到所需的操作,您仍然可以使用热键和命令行脚本。有点hacky,但你不是在尝试编写商业软件,只是解决你自己的问题。以上是关于收听原始蓝牙键盘数据的主要内容,如果未能解决你的问题,请参考以下文章