[Java] USB Device Access for Java SE and OSGi

原文はこちら。
https://blogs.oracle.com/jtc/entry/simplifying_usb_access_for_java

JavaOne 2014でのハンズオン「Java SE Embedded Internet of Things Hands-on-Lab」を作成するにあたっての課題の一つが、JavaとOSGiを使った、USB温度センサーとの通信でした。
Java SE Embedded Internet of Things Hands-on Lab [HOL2097]
https://oracleus.activeevents.com/2014/connect/sessionDetail.ww?SESSION_ID=2097
残念ながら、USB通信APIは(2014年のハロウィン時期の段階で)Java SE標準には含まれておりません。そのため、この問題はどうすればJava/USB通信を確立できるのか、そしてさらに、どうやればOSGiフレームワークで動作するのか、ということに相当します。
今回は、この接続のベースとしてjavahidapiを選択しました。
JavaHIDAPI - Java API for working with Human Interface USB Devices (HID)
http://code.google.com/p/javahidapi/
HID API for Linux, Mac OS X, and WindowsのJava/JNIラッパーとしてのこのAPIの魅力は、このAPIを使うと、各プラットフォームの各デバイス用カスタムドライバが不要になる、という点にあります。
HID API for Linux, Mac OS X, and Windows
http://www.signal11.us/oss/hidapi/
OSGiフレームワーク内で操作するために(今回の場合、Apache Felix 4.4)、javahidapiのオープンソースコードを少々修正・機能拡張しました。その結果、最終的にOSGiバンドルを標準のOSGiフレームワークに適用し、HIDデバイスのUSB通信をサポートすることができます。このバンドルにはネイティブコンポーネントを含みまた、単純化のために、別のjarファイルをサポート対象のアーキテクチャ用にそれぞれ用意することにしました。OSGi愛好家向けに、Linux/armhf(Raspberry Pi向け)アーキテクチャ用の生成された MANIFEST.MF がどのようなものかご覧いただきましょう。
Manifest-Version: 1.0
Bnd-LastModified: 1414694971263
Build-Jdk: 1.7.0_51
Built-By: jtconnor
Bundle-Activator: com.codeminders.hidapi.Activator
Bundle-ManifestVersion: 2
Bundle-Name: hidapi OSGi Bundle for Linux/armhf
Bundle-NativeCode: native/linux/armv6l/libhidapi-jni-32.so; osname=Linux; processor=armv6l
Bundle-SymbolicName: com.codeminders.com.codeminders.hidapi-armhf
Bundle-Version: 1.0.0
Created-By: Apache Maven Bundle Plugin
Export-Package: com.codeminders.hidapi;uses:="org.osgi.framework";version="1.0.0"
Import-Package: org.osgi.framework;version="[1.6,2)"
Tool: Bnd-1.50.0
以下は事前ビルド済みの人気のあるLinuxプラットフォーム用hidapi OSGiバンドルです。
元のソースに対し、以下のような変更を加えました。
  1. MavenカテゴリのOSGiバンドルを使い、NetBeansプロジェクトを作成
  2. javahidapi のJavaソースコードをプロジェクトの src/main/java/com/codeminders/hidapi ディレクトリに配置
  3. アーキテクチャ固有のネイティブライブラリをプロジェクトの src/main/resources/native/linux/architecture ディレクトリに配置。具体的には、Linux/x86版の場合、 libhidapi-jni-32.so ファイルを src/main/resources/native/linux/x86 ディレクトリに配置。
  4. Activator.java クラスをプロジェクトの src/main/java/com/codeminders/hidapi ディレクトリに追加。OSGiでは、このバンドルがアクティベートされた際にこのクラスの start() メソッドが呼び出される。これはバンドルの MANIFEST.MF ファイルに指定する。
  5. 元の ClassPathLibraryLoader.java ファイルを簡素化。現時点ではLinuxにのみ対応。
  6. これはMavenベースのプロジェクトなので、ビルド時に上記で紹介したものと類似のMANIFEST.MFファイルを生成するよう、プロジェクトの pom.xml ファイルを編集した(x86版はこんな感じ)。
また、以下は関連するNetBeansプロジェクトです。上記4個のバンドルをビルドする際に使用しました。
このテンプレートを拡張しこれら以外のアーキテクチャ用のOSGiバンドルを含めたい場合、上記プロジェクトのうち一つを使って作業を始め、複製し、新しい環境のための適切な変更を施すことができます。新プラットフォーム用のネイティブのjavahidapiコンポーネントが使えない場合には、hidapiのソースをダウンロードしてビルドし、プロジェクトに含める必要があるでしょう。
signal11/hidapi
https://github.com/signal11/hidapi/downloads
この作業に興味がある方は、ここ(原文のコメント)に成果をお知らせ頂けると幸甚です。

0 件のコメント:

コメントを投稿