OMG,到底在尋找什么..................
          (構造一個完美的J2EE系統所需要的完整知識體系)
          posts - 198,  comments - 37,  trackbacks - 0


          hbb [等級:◆(初級)] (信譽值: 100) 回復于: 2007-1-8 2:19:31Top

          jUSB API

          jUSB 項目是由 Mojo Jojo 和 David Brownell 于 2000年 6月創立的。其目標是提供一組免費的、在 Linux 平臺上訪問 USB 設備的 Java API。這個 API 是按照 Lesser GPL (LGPL)條款發表的,這意味著您可以在專有和免費軟件項目中使用它。這個 API 提供了對多個物理 USB 設備的多線程訪問,并支持本機和遠程設備。具有多個接口的設備可以同時被多個應用程序(或者設備驅動程序)所訪問,其中每一個應用程序(或者設備驅動程序)都占據一個不同的接口。該 API 支持控制傳輸、批量傳輸和中斷傳輸,不支持等時傳輸,因為等時傳輸用于媒體數據(如音頻和視頻),JMF API 已經在其他標準設備驅動程序上對此提供了很好的支持(參閱 參考資料)。當前,該 API 可以在具有 Linux 2.4 核心或者以前的 2.2.18 核心的 GNU/Linux 版本上工作。因此可支持大多數最新的版本,例如,該 API 可以在沒有任何補丁或者升級的 Red Hat 7.2 和 9.0 上工作。

          jUSB API 包括以下包:
           
          ·usb.core: 這個包是 jUSB API 的核心部分。它使得 Java 應用程序可以從 USB 主機訪問 USB 設備。

          ·usb.linux: 這個包包含 usb.core.Host 對象的 Linux 實現、bootstrapping 支持和其他可以提升 Linux USB 支持的類。這個實現通過虛擬 USB 文件系統(usbdevfs)訪問 USB 設備。

          ·usb.windows: 這個包包含 usb.core.Host 對象的 Windows 實現、bootstrapping 支持和其他可以提升 Windows USB 支持的類。這個實現仍然處于非常初級的階段。

          ·usb.remote: 這個包是 usb.core API 的遠程版本。它包括一個 RMI proxy 和一個 daemon 應用程序,它讓 Java 應用程序可以訪問遠程計算機上的 USB 設備。

          ·usb.util: 這個包提供了一些有用的實用程序,可以將 firmware下載到 USB 設備上、將 USB 系統的內容轉儲到 XML 中、以及將只有 bulk I/O 的 USB 設備工具轉換成一個套接字(socket)。

          ·usb.devices: 這個可選包收集了用 jUSB API 訪問不同 USB 設備的 Java 代碼,包括柯達數碼相機和 Rio 500 MP3 播放器。這些 API 經過特別編寫以簡化訪問特定 USB 設備的過程,并且不能用于訪問其他設備。這些 API 是在 usb.core API 之上構建的,它們可以工作在所有支持 jUSB 的操作系統上。

          ·usb.view: 這個可選包提供了基于 Swing 的 USB 樹簡單瀏覽器。它是一個展示 jUSB API 應用的很好的示例程序。

          盡管 usb.core.Host 對象的實現對于不同的操作系統是不同的,但是 Java 程序員只需要理解 usb.core 包就可以用 jUSB API 開始應用程序的開發。表 1 列出了 usb.core 的接口和類,Java 程序員應該熟悉它們:

          表 1. jUSB 中的接口和類

          接口 說明
          Bus 將一組 USB 設備連接到 Host 上
          Host 表示具有一個或者多個 Bus 的 USB 控制器

          類 說明
          Configuration 提供對設備所支持的 USB 配置的訪問,以及對與該配置關聯的接口的訪問
          Descriptor 具有 USB 類型的描述符的實體的基類
          Device 提供對 USB 設備的訪問
          DeviceDescriptor 提供對 USB 設備描述符的訪問
          EndPoint 提供對 USB 端點描述符的訪問、在給定設備配置中構造設備數據輸入或者輸出
          HostFactory 包含 bootstrapping 方法
          Hub 提供對 USB hub 描述符以及一些 hub 操作的訪問
          Interface 描述一組端點,并與一個特定設備配置相關聯
          PortIdentifier 為 USB 設備提供穩定的字符串標識符,以便在操作和故障診斷時使用

          用 jUSB API 訪問一臺 USB 設備的正常過程如下:

          ·通過從 HostFactory 得到 USB Host 進行 Bootstrap。

          ·從 Host 訪問 USB Bus,然后從這個 Bus 訪問 USB root hub(即 USB Device)。

          ·得到 hub 上可用的 USB 端口數量,遍歷所有端口以找到正確的 Device。

          ·訪問附加到特定端口上的 USB Device。可以用一臺 Device 的 PortIdentifier 直接從 Host 訪問它,也可以通過從 root hub 開始遍歷 USB Bus 找到它。

          ·用 ControlMessage 與該 Device 直接交互,或者從該 Device 的當前 Configuration 中要求一個 Interface,并與該 Interface 上可用的 Endpoint 進行 I/O 。

          清單 1 展示了如何用 jUSB API 獲得 USB 系統中的內容。這個程序編寫為只是查看 root hub 上可用的 USB 設備,但是很容易將它改為遍歷整個 USB 樹。這里的邏輯對應于上述步驟 1 到步驟 4。

          清單 1. 用 jUSB API 獲得 USB 系統的內容

          import usb.core.*;

          public class ListUSB
          {
           public static void main(String[] args)
           {
          try
          {
           // Bootstrap by getting the USB Host from the HostFactory.
           Host host = HostFactory.getHost();

           // Obtain a list of the USB buses available on the Host.
           Bus[] bus = host.getBusses();
           int total_bus = bus.length;

           // Traverse through all the USB buses.
           for (int i=0; i<total_bus; i++)
           {
          // Access the root hub on the USB bus and obtain the
          // number of USB ports available on the root hub.
          Device root = bus[i].getRootHub();
          int total_port = root.getNumPorts();

          // Traverse through all the USB ports available on the
          // root hub. It should be mentioned that the numbering
          // starts from 1, not 0.
          for (int j=1; j<=total_port; j++)
          {
           // Obtain the Device connected to the port.
           Device device = root.getChild(j);
           if (device != null)
           {
          // USB device available, do something here.
           }
          }
           }
          } catch (Exception e)
          {
           System.out.println(e.getMessage());
          }
           }


          hbb [等級:◆(初級)] (信譽值: 100) 回復于: 2007-1-8 2:19:59Top

          清單 2 展示了在應用程序成功地找到了 Device 的條件下,如何與 Interface 和 EndPoint 進行批量 I/O。 這個代碼段也可以修改為執行控制或者中斷 I/O。它對應于上述步驟 5。

          清單 2. 用 jUSB API 執行批量 I/O

          if (device != null)
          {
          // Obtain the current Configuration of the device and the number of
          // Interfaces available under the current Configuration.
          Configuration config = device.getConfiguration();
          int total_interface = config.getNumInterfaces();

          // Traverse through the Interfaces
          for (int k=0; k<total_interface; k++)
          {
          // Access the currently Interface and obtain the number of
          // endpoints available on the Interface.
          Interface itf = config.getInterface(k, 0);
          int total_ep = itf.getNumEndpoints();

          // Traverse through all the endpoints.
          for (int l=0; l<total_ep; l++)
          {
          // Access the endpoint, and obtain its I/O type.
          Endpoint ep = itf.getEndpoint(l);
          String io_type = ep.getType();
          boolean input = ep.isInput();

          // If the endpoint is an input endpoint, obtain its
          // InputStream and read in data.
          if (input)
          {
          InputStream in;
          in = ep.getInputStream();
          // Read in data here
          in.close();
          }
          // If the Endpoint is and output Endpoint, obtain its
          // OutputStream and write out data.
          else
          {
          OutputStream out;
          out = ep.getOutputStream();
          // Write out data here.
          out.close();
          }
          }
          }
          }

          jUSB 項目在 2000年 6月到 2001年 2月期間非常活躍。該 API 的最新的版本 0.4.4發表于 2001年 2月 14日。從那以后只提出了很少的改進,原因可能是 IBM 小組成功地成為了 Java 語言的候選擴展標準。不過,基于 jUSB 已經開發出一些第三方應用程序,包括 JPhoto 項目(這是一個用 jUSB 連接到數碼照相機的應用程序)和 jSyncManager 項目(這是一個用 jUSB 與使用 Palm 操作系統的 PDA 同步的應用程序)。


          hbb [等級:◆(初級)] (信譽值: 100) 回復于: 2007-1-8 2:20:38Top

          JSR-80 API (javax.usb)

          正如前面提到的,JSR-80 項目是由 IBM 的 Dan Streetman 于 1999年創立的。2001年,這個項目通過 Java 規范請求(JSR)過程被接受為 Java 語言的候選擴展標準。這個項目現在稱為 JSR-80 并且被正式分派了 Java 包 javax.usb。這個項目使用 Common Public License 的許可證形式,并通過 Java Community Process 進行開發。這個項目的目標是為 Java 平臺開發一個 USB 接口,可以從任何 Java 應用程序中完全訪問 USB 系統。JSR-80 API 支持 USB 規范所定義的全部四種傳輸類型。目前,該 API 的 Linux 實現可以在支持 2.4 核心的大多數最新 GNU/Linux 版本上工作,如 Red Hat 7.2 和 9.0。

          JSR-80 項目包括三個包:javax-usb (javax.usb API)、javax-usb-ri (操作系統無關的基準實現的公共部分)以及 javax-usb-ri-linux (Linux 平臺的基準實現,它將公共基準實現鏈接到 Linux USB 堆棧)。所有這三個部分都是構成 Linux 平臺上 java.usb API 完整功能所必需的。在該項目的電子郵件列表中可以看到有人正在致力于將這個 API 移植到其他操作系統上(主要是 Microsoft Windows),但是還沒有可以工作的版本發表。

          盡管 JSR-80 API 的操作系統無關的實現在不同的操作系統上是不同的,但是 Java 程序員只需要理解 javax.usb 包就可以開始開發應用程序了。表 2 列出了 javax.usb 中的接口和類, Java 程序員應該熟悉它們:

          表 2. JSR-80 API 中的接口和類

          接口 說明
          UsbConfiguration 表示 USB 設備的配置
          UsbConfigurationDescriptor USB 配置描述符的接口
          UsbDevice USB 設備的接口
          UsbDeviceDescriptor USB 設備描述符的接口
          UsbEndpoint USB 端點的接口
          UsbEndpointDescriptor USB 端點描述符的接口
          UsbHub USB hub 的接口
          UsbInterface USB 接口的接口
          UsbInterfaceDescriptor USB 接口描述符的接口
          UsbPipe USB 管道的接口
          UsbPort USB 端口的接口
          UsbServices javax.usb 實現的接口

          類 說明
          UsbHostManager javax.usb 的入口點

          用 JSR-80 API 訪問 USB 設備的正常過程如下:

          ·通過從 UsbHostManager 得到相應的 UsbServices 進行 Bootstrap。

          ·通過 UsbServices 訪問 root hub。在應用程序中 root hub 就是一個 UsbHub。

          ·獲得連接到 root hub 的 UsbDevices 清單。遍歷所有低級 hub 以找到正確的 UsbDevice。

          ·用控制消息(UsbControlIrp)與 UsbDevice 直接交互,或者從 UsbDevice 的相應 UsbConfiguration 中要求一個 UsbInterface 并與該 UsbInterface 上可用的 UsbEndpoint 進行 I/O。

          ·如果一個 UsbEndpoint 用于進行 I/O,那么打開與它關聯的 UsbPipe。通過這個 UsbPipe 可以同步或者異步提交上行數據(從 USB 設備到主計算機)和下行數據(從主計算機到 USB 設備)。

          ·當應用程序不再需要訪問該 UsbDevice 時,關閉這個 UsbPipe 并釋放相應的 UsbInterface。

          在清單 3 中,我們用 JSR-80 API 獲得 USB 系統的內容。這個程序遞歸地遍歷 USB 系統上的所有 USB hub 并找出連接到主機計算機上的所有 USB 設備。這段代碼對應于上述步驟 1 到步驟 3。

          清單 3. 用 JSR-80 API 獲得 USB 系統的內容

          import javax.usb.*;
          import java.util.List;

          public class TraverseUSB
          {
          public static void main(String argv[])
          {
          try
          {
          // Access the system USB services, and access to the root
          // hub. Then traverse through the root hub.
          UsbServices services = UsbHostManager.getUsbServices();
          UsbHub rootHub = services.getRootUsbHub();
          traverse(rootHub);
          } catch (Exception e) {}
          }

          public static void traverse(UsbDevice device)
          {
          if (device.isUsbHub())
          {
          // This is a USB Hub, traverse through the hub.
          List attachedDevices = ((UsbHub) device).getAttachedUsbDevices();
          for (int i=0; i<attachedDevices.size(); i++)
          {
          traverse((UsbDevice) attachedDevices.get(i));
          }
          }
          else
          {
          // This is a USB function, not a hub.
          // Do something.
          }
          }
          }

          清單 4 展示了在應用程序成功地找到 Device 后,如何與 Interface 和 EndPoint 進行 I/O。這段代碼還可以修改為進行所有四種數據傳輸類型的 I/O。它對應于上述步驟 4 到步驟 6。

          清單 4. 用 JSR-80 API 進行 I/O

          public static void testIO(UsbDevice device)
          {
          try
          {
          // Access to the active configuration of the USB device, obtain
          // all the interfaces available in that configuration.
          UsbConfiguration config = device.getActiveUsbConfiguration();
          List totalInterfaces = config.getUsbInterfaces();

          // Traverse through all the interfaces, and access the endpoints
          // available to that interface for I/O.
          for (int i=0; i<totalInterfaces.size(); i++)
          {
          UsbInterface interf = (UsbInterface) totalInterfaces.get(i);
          interf.claim();
          List totalEndpoints = interf.getUsbEndpoints();
          for (int j=0; j<totalEndpoints.size(); j++)
          {
          // Access the particular endpoint, determine the direction
          // of its data flow, and type of data transfer, and open the
          // data pipe for I/O.
          UsbEndpoint ep = (UsbEndpoint) totalEndpoints.get(i);
          int direction = ep.getDirection();
          int type = ep.getType();
          UsbPipe pipe = ep.getUsbPipe();
          pipe.open();
          // Perform I/O through the USB pipe here.
          pipe.close();
          }
          interf.release();
          }
          } catch (Exception e) {}
          }

          JSR-80 項目從一開始就非常活躍。2003年 2月發表了 javax.usb API、RI 和 RI 的 0.10.0 版本。看起來這一版本會提交給 JSR-80 委員會做最終批準。預計正式成為 Java 語言的擴展標準后,其他操作系統上的實現會很快出現。Linux 開發者團體看來對 JSR-80 項目的興趣比 jUSB 項目更大,使用 Linux 平臺的 javax.usb API 的項目數量在不斷地增加。

          結束語

          jUSB API 和 JSR-80 API 都為應用程序提供了從運行 Linux 操作系統的計算機中訪問 USB 設備的能力。JSR-80 API 提供了比 jUSB API 更多的功能,很有可能成為 Java 語言的擴展標準。目前,只有 Linux 開發人員可以利用 jUSB 和 JSR-80 API 的功能。不過,有人正在積極地將這兩種 API 移植到其他操作系統上。Java 開發人員應該在不久就可以在其他操作系統上訪問 USB 設備。從現在起就熟悉這些 API,當這些項目可以在多個平臺上發揮作用時,您就可以在自己的應用程序中加入 USB 功能了。

          posted on 2007-01-31 15:33 OMG 閱讀(354) 評論(0)  編輯  收藏 所屬分類: JavaX

          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          IT風云人物

          文檔

          朋友

          相冊

          經典網站

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 嘉义县| 信丰县| 西丰县| 崇礼县| 治多县| 贵定县| 中阳县| 沅江市| 顺平县| 阿拉善右旗| 南乐县| 定日县| 娱乐| 偏关县| 闻喜县| 化隆| 湟中县| 古蔺县| 桐城市| 淳安县| 苗栗市| 正安县| 毕节市| 灵璧县| 鄂伦春自治旗| 洞口县| 扶余县| 水富县| 新余市| 临潭县| 利津县| 德令哈市| 郸城县| 华亭县| 兴国县| 册亨县| 博乐市| 凉山| 西盟| 孝义市| 东丰县|