AndroidをUSBシリアルのホストに

usb-serial-for-androidを使用する方法をメモ。
他にFTDriverというのもある。

(1) usb-serial-for-androidのソースを入手

下記サイトからプロジェクト一式をダウンロード(またはgitでclone)する。

(2) Android Studioでプロジェクトを開く

メッセージに従って、足らないSDKをインストールしたり、Gradleをアップグレードしたりする。

このプロジェクト内には以下の2つのモジュールがある。

  • usbSerialForAndroid : ライブラリ本体
  • usbSerialExamples : サンプルアプリ
エラーその1
Error:Application and test application id cannot be the same:
both are 'com.hoho.android.usbserial.examples' for debugAndroidTest

よく分からないが、build.gradle(Module: usbSerialExamples)をテキトーに修正する。

testApplicationId "com.hoho.android.usbserial.examples"
testApplicationId "com.hoho.android.usbserial.examplestest"
エラーその2

なんかパスが狂ってる
usbSerialExamples/src/main/java/src/com を
usbSerialExamples/src/main/java/com に移動して
usbSerialExamples/src/main/java/src は削除する。

(3) 必要に応じてdevice_filter.xmlにデバイスを追加

usbSerialExamples/src/main/res/xml/device_filter.xml にGR-CITRUSを追加した例。
(VID = 0x2A50 = 10832, PID = 0x0277 = 631)

<resources>
    <!-- 0x2A50 / 0x0277: GR-CITRUS ※追加 -->
    <usb-device vendor-id="10832" product-id="631" />

    <!-- 0x0403 / 0x6001: FTDI FT232R UART -->
    <usb-device vendor-id="1027" product-id="24577" />
    
    <!-- 0x0403 / 0x6015: FTDI FT231X -->
    <usb-device vendor-id="1027" product-id="24597" />

    <!-- 0x2341 / Arduino -->
    <usb-device vendor-id="9025" />

    <!-- 0x16C0 / 0x0483: Teensyduino  -->
    <usb-device vendor-id="5824" product-id="1155" />

    <!-- 0x10C4 / 0xEA60: CP210x UART Bridge -->
    <usb-device vendor-id="4292" product-id="60000" />
    
    <!-- 0x067B / 0x2303: Prolific PL2303 -->
    <usb-device vendor-id="1659" product-id="8963" />
    
    <!-- 0x1a86 / 0x7523: Qinheng CH340 -->
    <usb-device vendor-id="6790" product-id="29987" />
</resources>

(4) 必要に応じてgetDefaultProbeTable()にデバイスを追加

usbSerialForAndroid の UsbSerialProber.java にある getDefaultProbeTable() にGR-CITRUSを追加した例。
(VID = 0x2A50, PID = 631)

    public static ProbeTable getDefaultProbeTable() {
        final ProbeTable probeTable = new ProbeTable();
        probeTable.addDriver(CdcAcmSerialDriver.class);
        probeTable.addDriver(Cp21xxSerialDriver.class);
        probeTable.addDriver(FtdiSerialDriver.class);
        probeTable.addDriver(ProlificSerialDriver.class);
        probeTable.addDriver(Ch34xSerialDriver.class);
        // GR-CITRUSを追加
        probeTable.addProduct(0x2A50, 0x0277, CdcAcmSerialDriver.class);
        return probeTable;
    }

(5) サンプルアプリで動作確認

サンプルアプリ usbSerialExamples で動作確認をおこなう。
このとき、USBがふさがってしまうのでデバッグにはWiFiを用いると良い。

(6) ライブラリのJARを作成

build.gradle(Module: usbSerialForAndroid)を修正する。

def JAR_NAME='usbSerialForAndroidLibrary.jar'
task clearJar(type: Delete) {
    delete 'build/libs/' + JAR_NAME
}
task makeJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('release/')
    include('classes.jar')
    rename('classes.jar', JAR_NAME)
}
makeJar.dependsOn(clearJar, build)

そして、Build > Make Module 'usbSerialForAndroid' でJARをビルドする。

(7) アプリへの組込み

JARのコピー

プロジェクトの中にあるapp/libsフォルダにusbSerialForAndroid.jarをコピーする。
Android StudioでusbSerialForAndroidLibrary.jarを右クリックし、Add As Library..する。

build.gradle(Module: app)に依存を記述
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs') // <- この一行を追加
}
res/xml/device_filter.xmlを追加

usbSerialExamples/src/main/res/xml/device_filter.xml
アプリのres/xmlフォルダにコピーする。

AndroidManifest.xmlに追記
<intent-filter>
    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>

<meta-data
    android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
    android:resource="@xml/device_filter" />

(8) アプリでのライブラリの使用

サンプルアプリを参考に。
必要なimportは下記のとおり。

import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;
import com.hoho.android.usbserial.util.HexDump;