极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 32395|回复: 11

抓取USB键盘的按键信号,通过蓝牙发送电脑

[复制链接]
发表于 2012-7-8 00:20:57 | 显示全部楼层 |阅读模式
世界发展是懒人推动的
刚从Think换到了mac air,原来用的是Think的底座,底座连键盘、鼠标和显示器,每次用的时候把电脑按上去就行了。

但是air要正常用就要接电源、USB hub和雷电接口,实在是麻烦,电源和雷电是必须要接的,但是USB未必需要。

所以希望能用蓝牙的方式,建立键盘与mac air的连接。

不想换蓝牙键盘,现在的机械键盘用着有感情。

综上,想实现的目标如下:

用Arduino的USB host功能抓取键盘的按键信息,然后通过Arduino扩展连接的蓝牙模块将按键信息发送给Mac air,实现无线键盘的目标。

初步想可能需要3个功能模块:
1.USB Host抓取键盘的按键信息;
2.蓝牙与Mac电脑建立连接发送数据;
3.Mac端将接收的数据翻译成按键信息。

遗憾的是Arduino的资料浩如烟海,吾等懒人实在没有耐心挨个看完,找到需要的code,所以还请诸位老大、达人、大神们给指条明路,提供一些样例代码或者相关开发教程。

感激不尽。
回复

使用道具 举报

发表于 2012-7-8 05:18:17 | 显示全部楼层
这个工作量感觉好大啊,首先要搞定arduino的USB键盘驱动,然后再装个蓝牙模块(应该是串口蓝牙模块了,不然要有2个USB接口了)。再把arduino伪装成蓝牙键盘,应该要搞定arduino端蓝牙HID的协议了。然后还要把USB键盘映射到蓝牙HID上面。

我觉得你这个做出来了可以直接拿去做产品了。叫USB HID和蓝牙 HID协议转换适配器。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-8 10:13:27 | 显示全部楼层
麻烦不怕,反正不是着急的事情,有功夫了就弄点,没工夫就放着。

关键是找不到对应的资料,头大。

cosaller兄有啥推荐不。
回复 支持 反对

使用道具 举报

发表于 2012-7-8 13:00:31 | 显示全部楼层
关于2.3我有方法:
Arduino你买个蓝牙模块便可(就算想法失败了,也可以移作他用)
Mac AIR内置应该蓝牙


我倒是熟悉win下的编程,不知道Mac如何。但我想模拟蓝牙键盘协议很困难。真正实现你说的功能要写MAC驱动(我不会),或是你用Arduino模拟已有驱动的别的品牌的蓝牙键盘(我也不会)。但是,不如用一般的软件模拟。写几个伪码给你看看
直接编程Mac AIR需要你有软件编程基础并了解 MAC API。但我的建议是找一门跨平台脚本语言,如Python一类的。安装关于Bluebooth的库,相当于AVR C和Arduino C的区别。

必能实现2.3两点要求的简单组合Python + LightBlue + osascirp
d=lightblue.getBlueboothData()
key=d.read()
if key=='A'
  osascirp.sendkey('A')  也是通过MAC API或者库文件可以实现的
if key=='B'
   osascirp.sendkey('B')

什么Control+A的组合键,也可以,大概就是这个思路。
Sendkey的资料
2.在Mac系统上发送键盘消息,这里用到了osascirp,在python中运行一个cmd,调用osacript脚本实现发送键盘消息。
例:
import os
cmd1 = """
osascript -e 'tell application "System Events" to keystroke "nihao" using {command down}'
"""

cmd2 = """
osascript -e 'tell application "System Events" to keystroke "nihao"'  
"""
os.system(cmd1)
os.system(cmd1)
cmd1和cmd2的区别在于前者在发送“nihao”键值的同时按下了 “cmmand”键,而cmd2则直接发送“nihao”的键盘消息。


回复 支持 反对

使用道具 举报

发表于 2012-7-8 13:02:53 | 显示全部楼层
关于1.的话,如果你的键盘是PS2的,Arduino可以直接读取。不行应该也可以使用PS2-USB转接线。要不就找开源的Liunx驱动研究即可。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-8 22:10:12 | 显示全部楼层
十分感谢 PureGold兄如此耐心和细致的解答,看来软件模拟按键的方式应该比直接想办法把键盘伪装成蓝牙键盘的难度低些,唯一无法肯定的是效率如何,我照着这个路子再研究一下。
关于 1,键盘是USB的,为什么是找Linux的驱动研究?而不是挂一个Arduino库?驱动是要最终以代码的形式刷到Arduino中的吗?

万分感谢。
回复 支持 反对

使用道具 举报

发表于 2012-7-9 10:57:22 | 显示全部楼层

zhe

关于2.3 (不行的方案)呵呵,因为那个键盘在Win,Linux,Mac下都可以使用对吗,而通讯他们的就是驱动。分析驱动可以获得键盘与主机的通信协议。至于为什么找Linux,因为它的键盘驱动你可以找到源代码.别的应该都是不开源的。我看了一下协议,非常麻烦,此路应该不通。


目前最为可行的方案(只用arduino实现,之前说的并不简单)

关于1
已经有人帮你实现,鸟语,不懂就算了.
http://hunt.net.nz/users/darran/weblog/c6f35/

关于2,3
就是你的mac air必须外接一个Arduino.
直接利用Arduino伪装成键盘。。有这样的例子。在example/USB/keyboard里。。
整个体系的架构就是:

                             bluebooth
Keyboard  -> Arduino ---------->Arduino ->Mac Air
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-9 23:33:23 | 显示全部楼层
首先感谢PureGold大神如此耐心的解释。

硬着头皮把老外的帖子看完了,终于发现了一个比我还无聊的,哈哈,只是因为键盘两个键串了就折腾出这么一大套来。不过代码确实是学习了。

但是如果按照Keyboard  -> Arduino ---------->Arduino ->Mac Air 这个思路来解决问题,当初偷懒的目标就还是没达成,USB口还是得接。

换句话说,要想让mac把arduino识别成蓝牙键盘,就得在代码上让arduino变得像一个键盘,这就要涉及到研究驱动的问题。

但是如果换个思路呢?比如用某个现有的mac与arduino 蓝牙通讯的方案,在mac端搞一个能把通讯信号翻译成模拟按键的工具,会不会相对容易些?
回复 支持 反对

使用道具 举报

发表于 2012-7-10 11:55:14 | 显示全部楼层
容易是容易,也是我一开始说的,但是如果是非驱动的软件,效果上可能没你想的那么好。(我就是写Windows程序的。在win平台下,很多程序拒绝接受软件模拟的按键,如QQ。。可能出于安全考虑。但是mac我不清楚,你可以试试)。主要这个方案脱离了Arduino编程,只是怕您不了解而已。
总的来说,思路完全可以。
回复 支持 反对

使用道具 举报

发表于 2012-7-10 11:57:36 | 显示全部楼层
本帖最后由 PureGold 于 2012-7-10 12:00 编辑

          老外的方法           蓝牙                  按键模拟
Keyboard ---------->arduino----------->mac air----------------->app
应该是这样


话说那个老外的文章我大概看了一下,也发现了他是2个键颠倒了,就是没想到只有这两个键。。{:soso_e136:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-11 08:03:04 | 显示全部楼层
嗯,理解了,确实做软件模拟还需要学另外的编程技术,而且虚拟按键的输入效果可能也会打折,再研究研究吧,看来还不是个容易的事情。

总之还是十分感谢 PureGold 兄如此耐心的解答,收益良多,多谢了。
回复 支持 反对

使用道具 举报

发表于 2015-6-13 22:48:49 | 显示全部楼层
请问老外的那个办法,有没有实现了的,我没做出来,有更具体的描述吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-30 02:31 , Processed in 0.057534 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表