web-dev-qa-db-ja.com

Androidをプログラムして物理USBキーボードとして機能させることはできますか?

私が本当に知りたいのは、それがハードウェアの問題なのか、ソフトウェアの問題なのかです。 Android電話をUSB経由でコンピューターに接続し、ハードウェアキーボードとして機能させることはできますか。コンピューターに何もインストールしたくありません。Androidを標準のハードウェアのように動作させたいです。


編集:明確化デバイスが通常のキーボードを完全にエミュレートできるようにするAndroidのプログラム/ライブラリを作成して、オペレーティングシステムがそれを標準キーボードデバイスとして報告し、BIOSで機能するようにしますまたはキーボードが機能する他の場所。

73
Billy Moon

Nexus 7のカーネルを変更して、MTP/ADB /その他のUSB機能を失うことなく、標準のHIDキーボードとマウスのように動作するようにしました。

Usb-gadget-testコマンドラインユーティリティを使用して、キーストロークとマウスの動きをPCに送信できます。キーイベントを送信し、カメラからビデオを受信するリモート管理アプリを後で作成します。

カーネルパッチ、バイナリ、および手順: https://github.com/pelya/Android-keyboard-gadget

編集: Google Playに適切なアプリを公開しました 、Nexus 7がルート化されている場合、アプリから直接カーネルをフラッシュし、キープレスを送信できます。

38
pelya

ほとんどのUSBキーボードを実行するには、ドライバーが必要です。 標準HIDドライバー の機能を超えるキーボード機能(非標準ボタン)は、コンピューターにソフトウェアをインストールする必要があります。

そうは言っても、Androidの SB機能 を使用し、デフォルトのHIDが十分でない場合はカスタムドライバーを作成して目標を達成することが可能です。それは非常に重要なことです。

編集:KristopherMicinskiは、ストックAndroid USB APIで得られる制御レベルがこの目的には不十分だと思います。 HID標準を使用して通信するようにファームウェアを変更する彼の2つのソリューションと、AndroidアクセサリプロトコルからHIDに変換するハードウェアの仲介者は、どちらも私にとって有効なようです。コンピューターへのドライバーのインストールが問題外の場合、これらの2つのオプションのみが考えられます。

ただし、この動作用のドライバーをインストールする場合は、Android USBプロトコルを処理できるカスタムドライバーを記述し、キーボード機能の正しい呼び出し/割り込みに正しく変換する必要があります。メモリが機能する場合、過去10年間に使用したすべての周辺キーボードは、完全な機能のためにドライバーをインストールする必要があるため、これは非標準の動作とは見なされない場合があります。 (ただし、この方法では、デバイスはウィンドウ内のキーボードとしてのみ機能し、起動プロセス中は機能しません)

13
Chris Bye

誰かがついにやったように見えますが、それは少しtinyいですが、ここにあります:

http://forum.xda-developers.com/showthread.php?t=1871281

カーネルの再コンパイルと少しの編集を伴い、部分的な機能(MDC?)を失います。

個人的には、「本当のコスト」がわかったので、おそらくAndroidがUSBを介してシリアルデバイスと通信できると仮定して、Teencyなどに小さなアダプターを組み込むでしょう。しかし、それは私がサムスンを持っているという事実に基づいており、とにかくUSB接続を行うために特別なケーブルが必要になるでしょう-とにかくいまいましいケーブルを持ち歩く必要がある場合、最後に小さなデバイスを持っているのに余分な痛みはありません。

11
Orwellophile

誰かがカーネルにパッチを当ててそれをやったようです。バージニア州フェアファックスのジョージ・メイソン大学コンピュータサイエンス学部、アンゲロス・スタヴロウ、ジャオウイ・ワンによる「楽しみと利益のためのスマートフォンUSB接続の活用」というタイトルの論文に出会ったばかりです。 (上記のタイトルをグーグルで自由に利用できます)。ここで2人の研究者は、AndroidデバイスがHIDデバイス(キーボード)として自身を提示することにより、接続されたPCを制御する侵害されたAndroidデバイスの可能性を調査しています。コンセプトの証明として、彼らはあなたが望むことを正確にやってカーネルにパッチを当てることに成功したようです。彼らは詳細な手順を提供しませんでしたが、とにかく彼らが言ったことを引用します:

..... Linux向けUSBガジェットAPIを使用して、Android Linuxカーネル上の既存のUSB複合インターフェースに加えて、特殊なUSBガジェットドライバーを開発しました[4]。 UGALフレームワークは、さまざまなカーネルAPI間の単純なUSBヒューマンインターフェイスドライバー(HID)機能(デバイスドライバー)とグルーコードの実装を支援しました。 「drivers/usb/gadget/composite.c」で提供されているコードを使用して、独自のガジェットドライバーを追加の複合USBインターフェイスとして作成しました。このドライバーは、USBキーボードデバイスをシミュレートします。また、事前にプログラムされた入力コマンドをデスクトップシステムに送信するUSB​​マウスデバイスをシミュレートすることもできます。したがって、通常のUSBマウスまたはキーボードデバイスを装って、事前定義されたコマンドを密かに送信して、悪意のあるインタラクティブなユーザーアクティビティをシミュレートするのは簡単です。この機能を検証するために、管理された実験では、致命的でない操作を実行するキーコードシーケンスを送信し、そのような操作されたデバイスがどのように損傷を引き起こす可能性があるかを示しました。特に、Dell USBキーボード(vendorID = 413C、productID = 2105) CTRL + ESC」キーの組み合わせと「U」および「Enter」キーシーケンスでマシンを再起動します。これにはUSB接続のみが必要であり、デスクトップシステムで「現在のユーザー」権限を取得できることに注意してください。追加のローカルまたはリモートのエクスプロイトがペイロードとして送信されると、マルウェアは特権をエスカレートし、デスクトップシステムのフルアクセスを取得できます。

5
JavaMan

これが可能であることを確認できる唯一の方法は、次の場合です。

  • Androidファームウェアを変更して、必要なプロトコルを使用して操作できる十分に低いレベルでusbレベルのアクセスを提供しました

または

  • デバイスに接続したある種の特別なハードウェアレベルコンバーターを作成しました。

(だから、やりたい仕事の量によっては、ハードウェアまたはソフトウェアの問題かもしれません。)

3

Androidは、ホストに接続されたときにすでにVID/PIDで識別されています。すでにマスストレージ用のインターフェースがあります。 03:01 HIDの2番目のインターフェイスをサポートするには、低レベルでドライバーをハックする必要があります。次に、修正されたドライバーにスキャンコードをプッシュするだけの問題になります。これは簡単なことではありませんが、きちんとしたハックになるでしょう。 1つの用途は、ログイン用の長いランダムパスワードの入力です。

2
Renate

これは、追加のドライバーを必要とせずに可能です。

小型のUSBドングルサイズのデバイスでPCのUSBキーボードをエミュレートし、Androidデバイスを使用して、Bluetooth(および/またはマウス)データをBluetooth経由で送信できます。

Indiegogoキャンペーンの説明ビデオをご覧ください: http://igg.me/at/hiDBLUE/x/3400885

ところで:製品の技術文書はこちらから入手できます。 http://www.flyfish-tech.com/hiDBLUE

2
Ivanz

最新のAndroidを搭載したルート化されたデバイスをお持ちであれば、それができると信じています。たとえば、Android 4を実行しているAsus Eee Pad Transformerにはライブラリ/system/lib/libusb.soおよび/system/lib/libusbhost.soがあるため、JNIを使​​用してそれらを呼び出すJavaアプリケーションを記述できます。 USBキーボードをエミュレートします。これは、USBキーボードがPCと通信する方法をエミュレートするグルーCコードを記述する必要があることを意味します(= USBプロトコルの動作を研究する必要があります)。

これらのライブラリを使用するには通常いくつかの許可が必要なので、「ルート化」と言います。

編集:USBホストとして機能するようにAndroidデバイスをプログラミングする場合、上記は当てはまります。この場合、「ガジェット」である必要があります。 Androidデバイスのカーネルに含まれるLinuxガジェット機能の量がわかりません。同様の質問については this をご覧ください。

2
gfour

あきらめてはいけません。 Linuxは、「USB Gadgets」を介して適切なハードウェアで実行できます。また、次の事実を示します。

  1. 私の古いNokia N95では、USBを使用して「大容量記憶装置」、「メディアプレーヤー」、「GSMモデム」、または写真を印刷できました。
  2. Apple USB-Cameraパッシブアダプターを介してiPadにiPhoneを接続すると、写真が転送されます。
  3. iPhoneは、たとえば、 DFUに入るとき。

なぜこれがすべて関連するのですか?

なぜならLinux電話を書いていたなら、それが何をするのか、どのようにそれを行うのかを知っているからです。そして、答えはUSBガジェットに関係します。

ここに投稿されたリンクの1つを読んで、

Linuxカーネルです。興味がある場合、コードはkernel.orgツリーのdrivers/usb/gadget /にあります。 Androidには、メインラインにはない特定のガジェットパッチがいくつかありますが、それほど多くはありません。カーネルのgitツリーをチェックアウトするだけで、これらすべてを確認できます。開発者を煩わせる必要はありません。

試してみると思いますが、Androidカーネル/オペレーティングシステムを再コンパイルするか、少なくとも必要に応じてカーネルを/ could /再構築できるビルド環境が必要です。

ところで、USBガジェットをサポートするAtmel NGW100mkIIがありますが、HIDモジュールは同梱されていません。そして、私は上記などをしなければなりません。

2
Orwellophile

他の何人かはこれが間違っていると考えました。それまでの間、私は彼らの意見を共有します。申し訳ありません。

古い間違った答え:

私の意見では、これはほとんど不可能です。

お使いのコンピューターは、USBデバイス記述子またはUSBインターフェイス記述子でUSBデバイスを識別します。 Androidデバイスをキーボードとして使用できるようにするには、これらを変更する必要があります。実際、これらはデバイスのROMに保存されていると思うので、ハードウェアを変更する必要があります。デバイスは、オフになっている状態で充電している場合でも、ホストと自分自身を識別する必要があります(USBホストに消費電力について通知する必要があります。私にとってこれは、ハードウェアを変更する必要があるという方向を指し示しています

「最も簡単な」方法は、おそらく、受信データ(まだusb経由で送信する必要がある)を、コンピューターに送信するps/2またはusbクライアント信号に変換するµCを備えたusbホストチップを含むアダプターを組み立てることです。

私の意見では、最も簡単な方法は、これらのキーボードのいずれかを購入して、転がしてバッグに入れることです。

1
Martze

この質問にコメントするのは少し遅れていますが、他の人にとっては役に立つかもしれません。

Android電話をキーボード、マウス、カメラ、サウンドストリーミングシステム、テザリングデバイスのように動作させることができます。要するに、ハードウェアがあなたを制限しない限り、そしてあなたが市場で見たこれまでのUSBガジェット。速度などのガジェットインターフェイスは利用できません。

USBデバイスには、ホストとガジェットの2つのタイプがあります。したがって、ガジェットデバイスはクライアントのように機能し、通常、ほとんどの電話にusb otgインターフェイスがあります。したがって、ガジェットの最後に、異なる設定を切り替えることで、電話機をまったく異なるデバイスのように動作させることができます(USB設定に入ってデバイスを大容量記憶装置またはその他のものとして作成するときに既に実行しています)。

ただし、これらすべてを行うには、Androidカーネルを変更する必要があります。あなたがAndroidデバイス開発者である場合、あなたは確かにそれを行うことができます。

1
Abhishek

Tcp/ipやadbなどを介してAndroidをすぐに使用するには、何らかの接続を確立する必要があります。そのため、少なくともadbとリスナーをコンピューターにインストールする必要はありません。

しかし、USB経由でデータのようなハードウェアキーボードを送信するアクティビティがある場合は、なぜですか?簡単ではないと思います。この時点で、usuasフォーラムの回答はすぐに表示されます。

1
Bondax

ここでユーザーとしての経験があります。最も明白な解決策は、クライアント/サーバーモデルを介したtcp/ipによるものです。 airkeyboard(http://www.freenew.net/iPhone/air-keyboard-111/171415.htm)などのツールの多くは、スマートフォンOSを使用してキーボード/マウスの交換を作成するためにこの方法を利用しています。実装で明らかになるいくつかのセキュリティ問題があることに注意してください。たとえば、サーバーコンポーネントを利用するにはログインする必要があります。

他のクロスプラットフォームツール(つまり、別のwindows/macインスタンスを制御するwindows/mac)も同様のアプローチを利用します。相乗効果を参照してください: http://synergy-foss.org/

0
JasonG