2025年7月17日木曜日

Droid VNC

 


ealVNCのダウンロードはこちら

この動画では、RealVNCというVNCビューワを使ってAndroidを遠隔操作したのですが、「droid VNC Server」には、PCやMacのブラウザからでも同じようなことができる機能が搭載されています。

端末にdroid VNC Serverをインストールし、「StartServer」でサーバの起動、「StopServer」でサーバの停止。これだけの操作なので簡単ですね。サーバを起動すると画面したに二つのアクセス方法が表示されます。

上段はVNCビューワ用、下段がブラウザ用。ブラウザ用のURLにアクセスすると、上の動画のような操作がブラウザからでも出来ます。しかし、接続がちょくちょく途切れたりするのでストレスが溜まるかもしれません。

こういったアプリがあれば、Androidのスクリーンショットの撮影ももっと楽になりそうですし、もっと快適にサクサク動くようになればこのままYouTube動画を見ても楽しめそうです。

更新1:遠隔操作していませんでしたね(^^;PCに表示されたホーム画面上をマウスでクリックしたりすれば操作できます。



-----

Fdroid

https://f-droid.org/ja/packages/net.christianbeier.droidvnc_ng/  ここにフォーラム

RasPi キーボード

 


USB Linux Gadgetを使ってRaspberry PiをUSBキーボードと認識させてみた

こんにちは。主に課金周りのサーバーとそのバックシステムを担当しているKです。

皆さんUSB Linux Gadgetをご存知でしょうか。USB Linux GadgetはUDC(USB Device Controller)を備えたデバイスであり、USBホストに接続してシリアルポートやストレージ機能などを追加で拡張することができます。

今回はUSB Linux Gadgetを使ってRaspberry PiをUSBキーボードと認識させて遊んでみました。

準備したもの

  • MacBook
  • Raspberry Pi 4 Model B : OS Linux raspberrypi 5.15.32-v8+
  • Windows11

やってみたこと

Raspberry PiにUSB Linux Gadgetを設定してWindowsにキーボードとして認識させます。

その後、MacからRaspberry Piにキーコードを送ってHIDを通してWindowsにタイプした結果を表示させます。

かんたんな事前知識

USB機器は一見ひとつの機器でも内部的には複数の機能をもつものがあります。これを実現するためにUSBデバイスがどのような仕様のものなのかを、テーブルの形で階層的に保持しています。これをディスクリプタと呼びます。ディスクリプタにはいくつか種類があります。

    • デバイス・ディスクリプタ
      • 一番上のルートに位置するディスクリプタ、ベンダIDやプロダクトIDなどを設定します。
    • コンフィグレーション・ディスクリプタ
      • インターフェース・ディスクリプタとエンドポイント・ディスクリプタの長さや消費電力を設定します。
    • インターフェース・ディスクリプタ
      • ここでインターフェースとしての仕様を設定します。ここに今回の目的であるキーボードであることを設定します。
    • エンドポイント・ディスクリプタ
      • エンドポイントの番号や転送モード、パケットサイズなどを設定します。
    • ストリング・ディスクリプタ
      • デバイスに対する製品名などの文字情報を設定します。これらの情報は任意に設定でき、ホストに接続したときに表示されます。言語ごとに決められたサブディレクトリに構築します。

各ディスクリプタの仕様についてはこちらをご参照ください。

 

今回の機器構成

最初の準備

Raspberry PiにUSB OTGドライバとComposite USB Gadgetsを読み込ませます。

/boot/config.txtに以下を追加します。

dtoverlay=dwc2

/boot/cmdline.txtに以下を追加します。

modules-load=dwc2,libcomposite

間違って記入するとRaspberry Piが立ち上がらなくなるので注意しましょう。

手順

以下、Raspberry Piでの作業です。

デバイスの制御のためにlibcompositeを読み込み、configfsのディレクトリに移動します。

$ modprobe libcomposite
$ cd /sys/kernel/config/usb_gadget/

ガジェットのディレクトリを作成し、移動します。

$ mkdir -p g1
$ cd g1

configfsに設定を書いていきます。各ガジェットには、ベンダーIDと製品IDを登録する必要があります。ベンダーIDと製品IDは各メーカーで個別に決められていますが、今回は以下のものを使います。各ベンダの情報はUSB Information for Developersに記載されています。

デバイス・ディスクリプタの設定の設定をします。

$ echo 0x1d6b > idVendor  # USB IFが割り当てます。今回はLinux Foundationを選択
$ echo 0x0104 > idProduct # ベンダが割り当てます。今回はMultifunction Composite Gadgetを選択
$ echo 0x0100 > bcdDevice # BCD表現のデバイスのリリース番号 v1.0.0にしておきます
$ echo 0x0200 > bcdUSB    # BCD表現のUSB仕様リリース番号 USB2.0にします。

ストリング・ディスクリプタを作成します。

$ mkdir strings/0x409
$ echo "12345678"    > strings/0x409/serialnumber
$ echo "KeyboardTestCCN." > strings/0x409/manufacturer
$ echo "Generic USB Keyboard"  > strings/0x409/product

Functionsの設定をし、レポートディスクリプタを設定します。レポートディスクリプタはデバイスからホストに通知するデータフォーマットを定義するものです。こちらを参考にします。

$ mkdir -p functions/hid.usb0
$ echo 1 > functions/hid.usb0/protocol  # キーボード
$ echo 0 > functions/hid.usb0/subclass  # subclass設定しない
$ echo 8 > functions/hid.usb0/report_length
$ echo -ne \\x05\\x01\\x09\\x06\\xa1\\x01\\x05\\x07\\x19\\xe0\\x29\\xe7\\x15\\x00\\x25\\x01\\x75\\x01\\x95\\x08\\x81\\x02\\x95\\x01\\x75\\x08\\x81\\x03\\x95\\x05\\x75\\x01\\x05\\x08\\x19\\x01\\x29\\x05\\x91\\x02\\x95\\x01\\x75\\x03\\x91\\x03\\x95\\x06\\x75\\x08\\x15\\x00\\x25\\x65\\x05\\x07\\x19\\x00\\x29\\x65\\x81\\x00\\xc0 > functions/hid.usb0/report_desc

コンフィグレーション・ディスクリプタを設定します。

$ mkdir -p configs/c.1
$ echo 250 > configs/c.1/MaxPower

 

$ mkdir -p configs/c.1/strings/0x409
$ echo "Config 1" > configs/c.1/strings/0x409/configuration
$ ln -s functions/hid.usb0 configs/c.1

最後にガジェットを有効化します。後にデバイスにキーコードを送るために権限をつけておきます。

$ ls /sys/class/udc > UDC
$ chmod 777 /dev/hidg0

以上で設定は完了です。Raspberry Piを再起動するとすべての設定が消えてしまいますので、スクリプト化しておくかserviceに登録することをおすすめします。

Windowsでキーボードとして認識されたことを確認する

WindowsでRaspberry Piをキーボードとして認識しているか確認します。

USBデバイスをUSB Device Tree Viewerで見るとちゃんと認識されていました。設定したディスクリプタも確認できます。

Raspberry Piでキーコードを送ってみる

ちゃんとキーボードとして動作するのかやってみます。

以下のコマンドで”a”を押しっぱなしにするキーコードを送ってみます。

$ echo -ne "\0\0\x4\0\0\0\0\0" > /dev/hidg0

あらかじめWindowsでは”a”を表示させるためにエディタを開いてカーソルを置いておきました。キーコードを入力後、エディタをみるとaがずっと入力され続けている様子が見れます。

 

キーを離すキーコードを送ると入力が止まります。

$ echo -ne "\0\0\0\0\0\0\0\0" > /dev/hidg0

おまけ

Raspberry Pi 4 model Bから電源アダプターがUSB-Type Cに変更されています。最初、WindowsにUSBで接続してそのまま給電できるかと思ったのですが電圧が足りずOSが起動しませんでした。しかしWindowsとはUSB TypeCの口を利用して繋ぎたいのでどうしたものかと考えた結果、GPIOから給電させてみたらいけるのではないかとやってみましたら無事起動しました。以下のコマンドで電圧不足をみてlogがでていなかったので足りたのでしょう。

 

$ journalctl -xe | grep "Under-voltage"

まとめ

USB エクステンダー

 



FlexiHubを使ったRaspberry PiからのUSB共有

適切なUSB-Ethernetエクステンダーソフトウェアツールを使用すると、Raspberry PiからUSBをIP経由で共有するのは非常に簡単で、USB延長ケーブル、余分なガジェットを購入したり、CAT5eやCAT6 LANワイヤーを敷設したり、USBをRS32アダプターに使用したりする必要はありません。

Raspberry PiからUSBをIP経由で共有する方法
1
ここでFlexiHubアカウントを登録し、無料のデモ期間を開始します。
 FlexiHub アカウントを登録する
2
サーバーコンピューターにアプリをダウンロードしてインストールします。
 アプリをダウンロードしてインストールする
3
Raspberryのターミナルで次のコマンドを実行します: yum install [package];
4
アプリを起動し、「Share」をクリックしてUSBデバイスを共有します。

それだけです!

その時点から、共有されたUSBデバイスは、FlexiHubがインストールされておりインターネット接続があるすべてのコンピュータからリモートでアクセス可能になります。オペレーティングシステムや物理的な距離に関係なく。

主な特徴:

ユニバーサルソリューション:

USBリダイレクションサーバー: FlexiHubのユニークなUSBリダイレクションサーバーは、公開IPアドレスを必要とせずにすべてのファイアウォールを通過してアプリを動作させます。

周辺機器の共有: USBハブを共有することで、そのUSBポートに接続された周辺機器が追加の設定なしにリモート接続で即座に利用可能になります。

パフォーマンスの向上:

トラフィック圧縮: FlexiHubはオプションでトラフィック圧縮機能を提供しており、USBプリンタやウェブカメラなどの帯域幅に敏感なUSBデバイスに特に有用です。これにより、高速な1Gbpsインターネット接続がなくても効率的に動作させることができます。

セキュリティ:

SSL暗号化: FlexiHubは、2048ビットの強力なSSL暗号化を提供し、セキュリティカメラ、USBドングル、またはFlexiHubを通じて送信されるデータへの不正アクセスを完全に防止します。

USB over Network Raspberry Pi共有 - ビデオチュートリアル

Raspberry PiをUSB-over-IPサーバーとして設定する無料の方法

原則として、この方法は先ほど説明したものと似ていますが、異なるUSBからEthernetへの拡張アプリを介して行われます。そして、今回はまだ開発中のオープンソースソリューションを使用するため、セットアッププロセスにはある程度の技術的な能力が必要です。もしあなたがそれを持っていないなら、最初の試みでうまくいかないことに驚かないでください。

USB-over-IPサーバー

この方法を選択する前に考慮する必要があるいくつかの重要な点:

  • LAN内のUSBデバイスのみを共有できます。
  • 非LinuxマシンからUSBデバイスを共有することはできません。
  • この共有方法はUSBハブで機能しません。
  • 少なくとも100 Mbpsの接続をお勧めします。
  • 共有デバイスまでの距離が長いほど、接続が悪くなります。
  • 不正アクセスからの保護がありません。
  • トラフィック圧縮がないため、リモートカメラの画像が大幅に遅延する可能性があります。

Raspberry Piをサーバーとして設定することから始めましょう:

1
このコマンドを使用してアプリをインストールします: sudo apt install usbip
2
インストールが完了したら、必要なカーネルモジュールを追加します:
sudo modprobe usbip_host
echo 'usbip_host' >> /etc/modules
3
lsusbコマンドを使用して、Raspberry Piに物理的に接続されているすべてのUSBデバイスのリストを表示し、共有するデバイスの8桁のUSB ID番号を覚えておくか、メモしておきます。
4
usbip list -p -lコマンドを使用して、デバイスのバスIDを見つけます(前のステップでのUSB ID番号を使用してリスト上の正しいデバイスを特定します)。その番号をメモします。
5
コマンドを実行します:
sudo usbip bind --busid=N
(Nは前のステップからのバスID番号です)
6
デーモンを実行して、デバイスをUSB/IPにアタッチします: usbipd

または、systemdサービスを作成することもできます:

vi /lib/systemd/system/usbipd.service

以下の定義を持つ(デバイスの実際のUSB ID番号をNに変更してください):


[Unit]
Description=usbip host daemon
After=network.target

[Service]
Type=forking
ExecStart=/usr/sbin/usbipd -D
ExecStartPost=/bin/sh -c "/usr/sbin/usbip bind --$(/usr/sbin/usbip list -p -l | grep '#usbid=N#' | cut '-d#' -f1)"
ExecStop=/bin/sh -c "/usr/sbin/usbip unbind --$(/usr/sbin/usbip list -p -l | grep '#usbid=N#' | cut '-d#' -f1); killall usbipd"
[Install]
WantedBy=multi-user.target



そして、そのサービスを開始するためにこれらのコマンドを実行します:

sudo systemctl --system daemon-reload
sudo systemctl enable usbipd.service
sudo systemctl start usbipd.service

クライアントのセットアップに移りましょう:

注意: Windows用のクライアントアプリがありますが、署名されていないドライバーやWindows 10のサポートがない不安定なベータ版であるため、本当に言及する価値はありません。

1. Ubuntuで同じアプリを使ってUSB over IPを共有するには、これらのコマンドを実行します:
sudo -s
apt-get install linux-tools-generic -y

2. 必要なモジュールを有効にします:
modprobe vhci-hcd
echo 'vhci-hcd' >> /etc/modules

共有デバイスをこのマシンに接続するには、コマンドを実行します: sudo usbip attach -r 0.0.0.0
(0.0.0.0の代わりにRaspberry Piの実際のIPアドレスを入力します)

または、systemdサービスを作成できます:
vi /lib/systemd/system/usbip.service

定義を保存し、その後、サービスを開始するためにこれらのコマンドを実行します:

[Unit]
Description=usbip client
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh -c "/usr/lib/linux-tools/$(uname -r)/usbip attach -r 0.0.0.0 -b $(/usr/lib/linux-tools/$(uname -r)/usbip list -r 0.0.0.0 | grep 'N' | cut -d: -f1)"
ExecStop=/bin/sh -c "/usr/lib/linux-tools/$(uname -r)/usbip detach --port=$(/usr/lib/linux-tools/$(uname -r)/usbip port | grep '<Port in Use>' | sed -E 's/^Port ([0-9][0-9]).*/\1/')"

[Install]
WantedBy=multi-user.target

保存してから、次のコマンドを実行してサービスを開始します。

sudo systemctl --system daemon-reload
sudo systemctl enable usbip.service
sudo systemctl start usbip.service

その後、共有デバイスにリモートでアクセスできるはずです。うまくいかない場合は、最初からすべてのステップを再試してください。

重要! この方法で共有されている間にUSBデバイスをRaspberry Piから抜くと、永久的なデータ損失が発生する可能性があります。最初にRaspberryをオフにし(オフにした後、余分な予防措置としてACアダプターも切断できます)。

FlexiHubを使ったUSB共有
30日間のデモ期間

Raspberry Pi と VirtualHere を備えた USB over IP ハブ

Raspberry PiとVirtualHereを使用してワイヤレスUSB over IPハブを構築するのは、以下の2つのコンポーネントがあれば比較的簡単な作業です。

  1. VirtualHere USBサーバー

  2. 動作するRaspberry Piモジュール。モジュールはPi 3以上で、Raspberry Pi OSを実行し、USBポートとWiFi機能を備えている必要があります。

VirtualHereは、ネットワーク接続されたUSBデバイスの共有を可能にします。これは、スキャナー、プリンター、ウェブカメラなどのリモートUSBデバイスを接続して、ローカルマシンに直接接続されているかのように使用できるソリューションです。VirtualHereサーバーを使用すると、ネットワーク上の任意の場所からUSBデバイスにリモートアクセスできます。

Raspberry PiのUSB over IP機能を使用してワイヤレスUSBハブを構築する方法


以下のステップでRaspberry Piを使用してUSB over IPをサポートするハブを作成できます。

  1. XRDP、SSH、またはその他の手法を使用してRaspberry Piにログインします。

  2. 次のコマンドを使用してRaspberry Pi用のVirtualHere USBサーバープラグインをダウンロードします:

    $ wget https://www.virtualhere.com/sites/default/files/usbserver/vhusbdarm

  3. chmodコマンドを使用してダウンロードしたファイルに実行許可を設定します:

    $ chmod +x vhusbdarm

  4. このコマンドを使用してVirtualHere USBサーバーをバックグラウンドで実行します:

    $ sudo ./vhusbdarm -b
    使用可能なオプションを確認するには、このコマンドを実行します:
    $ ./vhusbdarm -h

  5. ネットワークに接続されたUSBデバイスに接続するクライアントコンピューターにVirtualHereクライアントアプリケーションをダウンロードしてインストールします。

  6. これで、USBデバイスをUSBが無効化された仮想マシンに接続すると、Raspberry Piハブに表示されます。この方法では、任意のタイプのUSBデバイスをネットワーク経由で接続できます。接続できるデバイスの数にはオープンポートの数のみが制限となります。物理的なUSBハブを追加して、より多くのUSBポートを提供し、追加のデバイスを接続することもできます。