本文檔將介紹一種使用代理將1-Wire范圍擴展到近無窮大極限的方法。描述基本代理的最佳類比是想象大多數(shù)公司的代理服務器(有時稱為公司防火墻)。在此設置中,只有一臺計算機(代理)具有與 Internet 的實際連接,其余用戶計算機只能訪問代理。LAN 上用于 LAN 外部計算機的所有網(wǎng)絡數(shù)據(jù)包在 WAN 上重復,反之亦然。這一理念可以應用到1-Wire網(wǎng)絡上。通過代理連接到1-Wire網(wǎng)絡需要幾個軟件模塊:客戶端模塊和主機模塊。主機模塊是在1-Wire代理服務器(PC、MxTNI?或微控制器)上運行的代碼,該服務器具有對1-Wire網(wǎng)絡的硬件訪問權限。客戶端模塊是在僅具有網(wǎng)絡訪問權限以訪問主機模塊的遠程計算機上運行的代碼。主機模塊可能訪問客戶端模塊,而不是對1-Wire網(wǎng)絡的硬件訪問,而客戶端模塊將引用另一個主機模塊。通過這種方式,可以將到達1-Wire網(wǎng)絡的代理鏈接在一起。
介紹
1-Wire協(xié)議的最初設計源于通過短連接與附近設備通信的愿望。盡管通過仔細考慮,可以將此連接的長度延長到比最初預期的更遠,但限制仍然非常真實。
本文檔將介紹一種使用代理將1-Wire范圍擴展到近無窮大極限的方法。描述基本代理的最佳類比是想象大多數(shù)公司的代理服務器(有時稱為公司防火墻)。通常,公司為其員工提供LAN(局域網(wǎng)),用于連接彼此的計算機并共享文件。公司通常需要提供一種訪問互聯(lián)網(wǎng)(非常廣域網(wǎng))的方法。在此設置中,只有一臺計算機(代理)具有與 Internet 的實際連接,其余計算機只能訪問代理。代理代表 LAN 上的所有計算機發(fā)出所有互聯(lián)網(wǎng)數(shù)據(jù)請求。在此示例中,代理充當 WAN 和 LAN 之間的接口。LAN 上用于 LAN 外部計算機的所有網(wǎng)絡數(shù)據(jù)包在 WAN 上“重復”,反之亦然。
圖1.代理服務器示例。
圖 1 說明了代理服務器提供的基本服務,即提供對內(nèi)部計算機通常無法訪問的網(wǎng)絡的訪問權限。更具體地說,可以通過 LAN 訪問代理的內(nèi)部計算機在沒有代理幫助的情況下沒有其他方式訪問 WAN。通過代理服務器路由信息請求,現(xiàn)在可以訪問以前無法訪問的外部服務器。盡管很多細節(jié)都發(fā)生了變化,但同樣的基本思想可以應用于1-Wire網(wǎng)絡。圖 2 說明了此應用程序的基礎知識。
圖2.1-Wire代理示例。
圖2中的應用代表希望接入1-Wire網(wǎng)絡,但無論出于何種原因無法直接訪問該網(wǎng)絡的所有應用。原因可能是它們離網(wǎng)絡太遠,或者它們在不允許硬件訪問的環(huán)境中運行(即在 Java 驅(qū)動的手機上運行的 Java? 應用程序)。由于電氣限制,使用1-Wire網(wǎng)絡的應用通常運行在距離200-Wire從器件不到1米的硬件上。在圖2所示的場景中,應用只需要訪問網(wǎng)絡介質(zhì)和合適的1-Wire代理服務器即可。網(wǎng)絡介質(zhì)可以是任何內(nèi)容,例如 RF 無線網(wǎng)絡、IR 點對點鏈路或 TCP/IP 以太網(wǎng)網(wǎng)絡。得益于被稱為互聯(lián)網(wǎng)的超大型廣域網(wǎng),外部計算機與實際1-Wire網(wǎng)絡之間的距離不再是問題。
概述
通過代理連接到1-Wire網(wǎng)絡需要幾個模塊:客戶端模塊和主機模塊。主機模塊是在1-Wire代理服務器(PC、MxTNI或微控制器)上運行的代碼,該服務器具有對1-Wire網(wǎng)絡的硬件訪問權限。客戶端模塊是在僅具有網(wǎng)絡訪問權限以訪問主機模塊的遠程計算機上運行的代碼。主機模塊(而不是對1-Wire網(wǎng)絡的硬件訪問)可以訪問客戶端模塊,該客戶端模塊將引用另一個主機模塊。通過這種方式,可以將到達1-Wire網(wǎng)絡的代理鏈接在一起。圖3顯示了1-Wire應用、客戶端模塊、主機模塊和1-Wire網(wǎng)絡之間的交互性。
圖3.客戶端/主機配置。
PC在1-Wire網(wǎng)絡上的通信方式通常是使用適配器,通常使用合適的1-Wire主站來產(chǎn)生正確的時序。例如,DS9097U適配器使用DS2480B串行1-Wire線路驅(qū)動器芯片。PC 使用串行端口連接到 DS9097U。通過串行端口發(fā)送的命令到達DS2480B,然后轉(zhuǎn)換為1-Wire網(wǎng)絡命令。DS2480B通過PC的串行端口返回任何1-Wire網(wǎng)絡命令的輸出。但是,當通過1-Wire代理與1-Wire網(wǎng)絡通信時,PC將調(diào)用客戶端模塊向主機模塊發(fā)送命令。這些命令將通過網(wǎng)絡介質(zhì)(例如因特網(wǎng))傳輸?shù)街鳈C模塊。然后,主機模塊將通過1-Wire主站與物理1-Wire網(wǎng)絡進行通信。1-Wire通信的結果將通過網(wǎng)絡介質(zhì)返回到客戶端模塊的緩沖區(qū)中。
實現(xiàn)
發(fā)生重復的軟件應用層可以是許多地方中的任何一個。1-Wire應用主要由以下幾層組成:
應用—保持有關如何使用1-Wire數(shù)據(jù)的知識(即,如何將1-Wire通信塊轉(zhuǎn)換為以華氏度為單位的溫度結果)。
演示 - 維護有關不同數(shù)據(jù)格式的知識,并將其包裝到可能有用的 API 中。
傳輸—保持有關如何將數(shù)據(jù)塊傳輸?shù)?-Wire網(wǎng)絡或從<>-Wire網(wǎng)絡傳輸數(shù)據(jù)塊的知識。
鏈路—保持如何重置1-Wire網(wǎng)絡并傳輸<>或<>的知識。
在鏈路層安裝代理需要通過網(wǎng)絡傳輸串行或并行端口命令。例如,如果主機的某個串行端口上裝有DS9097U適配器,則客戶端模塊將發(fā)送直接針對DS2480B主芯片的命令。iButton 網(wǎng)站上提供的串行到以太網(wǎng)示例(請參閱本文檔末尾的鏈接部分)完全演示了這一原則。此示例允許電腦具有虛擬 COM 端口。發(fā)送到此虛擬COM端口的所有命令都通過網(wǎng)絡傳輸?shù)搅硪慌_設備(PC或MxTNI)。如果主機設備的串行端口上有DS9097U,則客戶端可以將DS9097U視為直接連接。
在傳輸層安裝代理的想法由IEEE? 1451.4的協(xié)議規(guī)范處理。在這一層,客戶端模塊不會關注用于連接1-Wire網(wǎng)絡的實際硬件,而是將鏈路層視為主機處理的理所當然的東西。客戶端將主要向主機傳輸重置命令和數(shù)據(jù)塊。
最高的層,也可能是最有效的層,將是表示層。這種代理包含在1-Wire API for Java Kit中。在1-Wire API for Java中,每個適合1-Wire連接的適配器都由DSPortAdapter的一個子類表示。在面向?qū)ο蟮恼Z言中,這意味著各種適配器(串行、并行或 USB)的所有實例都可以被視為其父類 DSPortAdapter 的實例。這是在面向?qū)ο?a target="_blank">程序員應該非常熟悉的演示文稿中隱藏實現(xiàn)的情況。由于1-Wire API中的這種設計選擇,因此添加DSPortAdapter的新子類非常簡單,該子類僅實現(xiàn)上述客戶端模塊。圖 4 的類圖中描述了此客戶端模塊及其與主機模塊的關系。
圖4.類交互圖。
使用1-Wire代理的最大問題是數(shù)據(jù)包延遲。如果網(wǎng)絡介質(zhì)的數(shù)據(jù)包周轉(zhuǎn)時間為一秒,則大多數(shù)實時應用程序根本不可能實現(xiàn)。理想情況下,網(wǎng)絡數(shù)據(jù)包延遲(有時稱為 PING 時間)應小于 PC 在連接外部硬件時產(chǎn)生的延遲。例如,如果發(fā)送到串行端口和從串行端口讀取的任何數(shù)據(jù)的數(shù)據(jù)包周轉(zhuǎn)時間為 20 毫秒,則 5 毫秒的網(wǎng)絡數(shù)據(jù)包延遲幾乎不會明顯。如果網(wǎng)絡數(shù)據(jù)包延遲明顯更高,則可能需要更高層的實現(xiàn)來提高應用程序的實時響應能力。為了說明這一點,以下是鏈路層代理的示例數(shù)據(jù)包交換可能的樣子:
Client Module transmits a serial write command to reset the DS2480B Packet = {XMIT_SERIAL, DS2480B_COMMAND_MODE, DS2480B_CMD_RESET} Server Module writes bytes to serial port. Client Module transmits a serial read command with a number of bytes to read Packet = {RECV_SERIAL, NUM_BYTES_TO_RECV} Server Module transmits bytes read from serial port, representing return value of reset command Packet = {NUM_BYTES_TO_RECV, however many bytes...} Client Module interprets return value |
對于發(fā)送的每個數(shù)據(jù)包,為數(shù)據(jù)包延遲添加一個乘數(shù)。如果以這種方式連續(xù)多次調(diào)用DS9097U,很明顯,它可以相當快地增加大量網(wǎng)絡流量。在表示層,可以按如下方式再現(xiàn)完全相同的1-Wire活動:
Client Module transmits reset command Packet = {ADAPTER _CMD_RESET} Server Module transmits reset command to serial port. Then reads bytes back from serial port, and interprets the return value of reset command. Server Module transmits return value Packet = {RET_SUCCESS} |
將1-Wire代理實現(xiàn)方案移至應用層可以顯著減少數(shù)據(jù)包延遲問題。但是,由于這一層的實現(xiàn)是高度不可移植的(即,應用層的實現(xiàn)本質(zhì)上與特定應用程序綁定),因此目前沒有可用的參考實現(xiàn)。為了便于說明,讓我們檢查一下與一個特定應用的區(qū)別:溫度輪詢。用于溫度轉(zhuǎn)換的可能網(wǎng)絡數(shù)據(jù)包交換將在鏈路層和表示層生成大量數(shù)據(jù)包。需要發(fā)送“1-Wire復位”命令、“匹配ROM”命令和“執(zhí)行溫度轉(zhuǎn)換”命令。客戶端模塊將負責解釋每個命令的返回值,因為它以網(wǎng)絡數(shù)據(jù)包的形式從主機模塊接收。如果在應用層實施1-Wire代理,則客戶端模塊只需發(fā)送“執(zhí)行完整溫度轉(zhuǎn)換”命令。來自服務器的返回值(在單個數(shù)據(jù)包中)可能只是溫度轉(zhuǎn)換的結果。
軟件接口示例
在1-Wire API for Java Kit中使用客戶端模塊非常簡單,只需創(chuàng)建NetAdapter的實例并將連接字符串傳遞給初始化方法即可。連接字符串的格式為:
: :
主機名是運行主機模塊的 PC(或 MxTNI)的主機名或該計算機的 IP 地址。端口是主機正在偵聽的 TCP/IP 端口。共享密鑰用于簡單形式的身份驗證。當客戶端模塊連接到主機模塊時,主機會向客戶端發(fā)出隨機質(zhì)詢。然后,客戶端查找隨機質(zhì)詢字節(jié)和共享密鑰的 CRC-16。然后將此CRC-16傳輸回主機進行驗證。如果 CRC-16 與主機計算的內(nèi)容匹配,則認為用戶已通過身份驗證。請注意,NetAdapter 中還有一種附加的初始化方法,該方法允許通過接受已建立的 TCP/IP 套接字(可能是加密連接)來執(zhí)行進一步的步驟來保護連接。
在1-Wire API for Java Kit中,有一個示例程序可以簡化主機模塊的使用。此應用程序?qū)⒅鳈C模塊的所有參數(shù)作為命令行上的參數(shù),并使用這些參數(shù)創(chuàng)建 NetAdapterHost 的實例。桌面和 MxTNI 都包含預構建的二進制文件。圖 5 顯示了在 COM9097 串行端口上使用 DS1U 適配器在桌面上啟動主機模塊的命令行。當前工作目錄是1-Wire API for Java Kit中StartNetAdapterHost的應用程序文件夾。
java -cp ".;" StartNetAdapterHost -adapterName DS9097U -adapterPort COM1 -listenPort 6161 -secret "this is my secret"
圖5.在 PC 上啟動主機模塊。
在 PC 上執(zhí)行圖 5 中所示的行將啟動 NetAdapterHost,它將在端口 6161 上創(chuàng)建一個偵聽 TCP/IP 套接字。用于簡單身份驗證的共享密鑰是“這是我的密鑰”。在 MxTNI 上啟動主機模塊幾乎相同。只需將 StartNetAdapterHost.tini 文件通過 ftp 到 MxTNI 機器即可。然后登錄并使用圖 6 中所示的命令行。
java StartNetAdapterHost.tini -adapterName TINIExternalAdapter -adapterPort serial1 -listenPort 6161 -secret "this is my secret"
圖6.在 MxTNI 上啟動主機模塊。
主機模塊啟動后,將接受來自客戶端模塊的傳入連接。數(shù)字 圖8所示為遠程溫度演示,演示如何連接到主機并與1-Wire器件交互。此應用程序?qū)⑦B接到指定的主機并查找任何溫度設備。它 然后輪詢每個設備,并以攝氏度和華氏度顯示當前溫度。自 使用示例應用,只需將代碼復制并粘貼到名為 RemoteTemperatureDemo.java 的文件中即可。 更改類頂部的常量以反映實際設置(即,確保主機名 變量具有啟動 NetAdapterHost 的計算機的主機名)。然后執(zhí)行 圖 7 中所示的命令來編譯和執(zhí)行此類。
javac -classpath ".;" RemoteTemperatureDemo.java java -classpath ".; " RemoteTemperatureDemo
圖7.編譯并運行遠程溫度演示。
該程序的輸出應為找到的每個溫度器件的64位1-Wire地址,后跟當前溫度。如果未找到設備,將顯示一條錯誤消息,指示這一點。
有關使用 NetAdapter 和 NetAdapterHost 的更多信息,請參閱這些類的 JavaDocs。所有1-Wire類的JavaDocs都包含在1-Wire API for Java Kit中。
import com.dalsemi.onewire.adapter.*; import com.dalsemi.onewire.container.*; import com.dalsemi.onewire.utils.*; import java.util.Enumeration; public class RemoteTemperatureDemo { // update these variables to reflect your setup public static final String hostname = "shughes.dalsemi.com"; public static final int port = 6161; public static final String secret = "this is my secret"; public static void main (String[] args) { OneWireContainer owc = null; TemperatureContainer tc = null; // create the NetAdapter object NetAdapter adapter = new NetAdapter(); try { // connect to the NetAdapterHost adapter.selectPort(hostname + ":" + port + ":" + secret); adapter.beginExclusive(true); // find the first temperature device Enumeration e = adapter.getAllDeviceContainers(); while (tc==null && e.hasMoreElements()) { // get the next container owc = (OneWireContainer)e.nextElement(); // check if it is a temperature device if(owc instanceof TemperatureContainer) { tc = (TemperatureContainer)owc; System.out.println("Device: " + owc.getAddressAsString()); // poll the temperature device byte[] state = tc.readDevice(); tc.doTemperatureConvert(state); double temp = tc.getTemperature(state); // display temeprature result System.out.print(" " + temp + " C ("); System.out.println(Convert.toFahrenheit(temp) + " F)"); } } // if no temperature devices were found if(tc==null) System.out.println("No temperature devices found!"); } catch (Exception e) { System.out.println(e.getMessage()); } finally { adapter.endExclusive(); try { adapter.freePort(); } catch(Exception e) {;} } } }
圖8.遠程溫度演示。
審核編輯:郭婷
-
計算機
+關注
關注
19文章
7421瀏覽量
87714 -
服務器
+關注
關注
12文章
9021瀏覽量
85183 -
1-Wire
+關注
關注
0文章
49瀏覽量
21293
發(fā)布評論請先 登錄
相關推薦
評論