Armadilloフォーラム

USBキーボードの読み取りかた

saitoh

2014年10月30日 18時06分

お世話になります。
daemonプログラム(rcから起動)でUSBキーボードから入力する手段を調べています。
実際はキーボードではなくキーボードの振りをする USB磁気カードリーダーを繋ぎたいと考えています。

数年前にArmadillo240にUSBテンキーを繋いだときは、苦し紛れに、
/dev/input/event0を読み取るという手段を使いました。
この場合、文字ではなくてキーコードが得られるだけなので対応する文字への変換が面倒でした。

他にもっと楽な手段はないでしょうか?

磁気カードリーダーをUSB接続のものにするかシリアル接続のものにするかまだ決めかねております。
USB接続のものの方が安価なようなので、USBで何とかなるならそちらの方が望ましいです。

コメント

USB接続のものは、USBシリアルに見えますか?

もしそうなら、ttyUSB0をひらけば、tty経由で読むことができるはずです。

もし、input layer 経由で /dev/input/event*にみえるだけなら
libxkbcommon[1]が良いかもしれません。サンプルつけますね。

将来的には、libinput[2] になると思いますが、まだ xkbcommonの方が良いと思います。

[1]:http://xkbcommon.org/
[2]:http://www.freedesktop.org/wiki/Software/libinput/

#include <string.h>
#include <xkbcommon/xkbcommon.h>
#include <linux/input.h>
 
void die()
{
    fprintf(stderr, "oops\n");
}
 
int main()
{
    struct xkb_context *ctx;
    struct xkb_keymap *keymap;
    struct xkb_state *state;
    xkb_keycode_t keycode = 38;
    xkb_keysym_t keysym;
    char buf[100];
 
    ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
    if (!ctx)
        die();
 
    keymap = xkb_keymap_new_from_names(ctx, NULL,
                       XKB_KEYMAP_COMPILE_NO_FLAGS);
    printf("keymap: %s\n",
           xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1));
 
    state = xkb_state_new(keymap);
    keysym = xkb_state_key_get_one_sym(state, keycode);
 
    printf("got %x\n", keysym);
 
    memset(buf, 0, 100);
    xkb_state_key_get_utf8(state, keycode, buf, 100);
    printf("%s\n", buf);
 
    return 0;
}
ファイル ファイルの説明
k.c

ありがとうございます。
まだ,迷って購入していないのですが USB接続のものは「ソフトウェア的にはキーボードに見える」と書かれているのでUSB HIDなのだろうと思っています。(USBではない)RS232Cの機種もあるのですがちょっと高価で。

頂いたソースを参考にさせていただきます。

> daemonプログラム(rcから起動)でUSBキーボードから入力する手段を調べています。

USBキーボード=HID(ヒューマンインターフェースデバイス)なので、
HIDを生で扱えるライブラリだと都合いいのかなと思います。
ということで、世間にこんなものもあります。

HID API for Linux, Mac OS X, and Windows
http://www.signal11.us/oss/hidapi/
(ライセンスは3種:GPLv3/BSD/The more liberal original HIDAPI licenseからの
選択とのことですので、実際にご使用する際はご注意を。
ソースは下の方のDownloadに、GitHubへのリンクとzipとで用意されています)

HIDを抽象化しているものですが、(linuxの場合は)バックエンドとして
libusb(ユーザーランドレベルからUSBを直接扱う)を使用しています。

libusb使用の参考:
最新組み込みLinux実践講座Part5 | 組み込みLinuxのArmadilloサイト
http://armadillo.atmark-techno.com/articles/sd-a500-embedded-course-ch5
(USB接続の名刺スキャナをArmadillo-500上のlibusbから制御するサンプルです)

> 実際はキーボードではなくキーボードの振りをする USB磁気カードリーダーを繋ぎたいと考えています。

(libusbを知らずとも)HIDの形で扱えるならば、それだけハードルは
下がると思いますが…hidapiの使用例は、様々なハードウェア・OS上であります。

hidapi ライブラリ - Google 検索
https://www.google.co.jp/search?q=hidapi+%E3%83%A9%E3%82%A4%E3%83%96%E3…

hidapiを使い、RFIDをNode.jsから触る例のソースなんかも見つかりますね。

bklynjones/node-hid-rfid · GitHub
https://github.com/bklynjones/node-hid-rfid
(src/HID.ccが、C++によってhidapiを使用しているコードです)

ほぼ同じような形でいけるんじゃないかと思いますが、どうでしょうか。

ありがとうございます。
なるほど。 HID API for Linux, Mac OS X, and Windows
というものがあるのですね。参考にさせていただきます。

今回は担当している学生の卒業研究に使わせるものなのでライセンスはなんでもOKです。
本来は学生が自力でここのforumで質問しないといけないのですが、なかなかそこまでは技量が追いつきません。