2011-04-29 38 views
7

我最近面临一个相当奇怪的任务,其中一个结果是使用DTMF(又名“触摸音”)音调来控制非X Linux计算机终端的必要性。计算机有一个调制解调器,可以通过ALSA访问,因此sox“rec”程序,这是我通过阅读输入。所讨论的计算机是完全隔离的,没有任何以太网或其他网络接口。我使用的Goertzel算法实现效果很好,eSpeak语音合成引擎也是唯一的输出源;这应该适用于任何Touch Tone手机。它回读两个输入(输入为八进制数字,一次一个ASCII字节)以及任何shell反馈的内容 - 提示,命令输出等,使用ASCII助记符控制字符。将按键从Python插入到Linux控制台中

当前我用于与dash进行交互的方法以及通过它启动的程序是pexpect模块。但是,我需要它能够根据需要回读光标所在行的全部内容,我不记得pexpect可以做到这一点(如果是这样,我不能说)。我能想到的唯一的另一个解决方案是以某种方式使用Python来控制或充当键盘和控制台驱动程序。

这的确是唯一的解决方法(如果可以的话,甚至可以用Python吗?),还是有另一种直接访问控制台内容的方式?

编辑︰通过愚蠢的运气,我刚刚发现SVN版本的PExpect有pexpect.screen。但是,它没有任何实际运行程序的方法。我将不得不关注它的发展。

回答

2

简单的解决方案是使用Linux内核的uinput接口。它允许您将按键和鼠标事件插入内核,就像它们来自物理人机界面设备一样。这将基本上将您的应用程序变成键盘/鼠标。

由于您正在使用Python,我建议您查看python-uinput模块。

如果您对Python中的二进制I/O感到满意,那么您可以在没有任何库的情况下执行相同的操作;只需查看所涉及结构的/usr/include/linux/uinput.h头文件(接口是完全稳定的),也可以使用C语言中的某些uinput tutorials

请注意,访问/dev/uinput/dev/input/uinput设备(取决于您的发行版)通常需要root权限。我将亲自运行Python服务作为专用于该服务的用户和组,并修改/添加udev规则(检查rules.d下的所有文件),以允许对该组的输入设备进行读写访问,如

SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id" 
KERNEL=="uinput", MODE="0660", GROUP="the-dedicated-group" 

但是,如果您的Python应用程序只执行程序,则应使其成为终端仿真程序 - 例如,使用this。你也可以使用Python pty;但主要工作是使用ANSI转义序列模拟终端,以便应用程序不会感到困惑,现有的终端仿真程序具有此类代码。

0

如果您想操纵控制台的内容,您可能需要使用curses。这是有据可查的here。看看window.getch()window.getyx()

+0

好吧,但我该如何在它内部运行一个shell(如'dash')? – mmirate 2011-04-30 10:30:40

+0

更确切地说,我如何在不重新实现'readline'的情况下这样做? – mmirate 2011-04-30 20:32:36

+0

好吧,如果'readline'是你所用的'sh',那么readline就有[python bindings](http://docs.python.org/library/readline.html)。 – Anish 2011-05-04 00:39:50