本文檔將介紹一種使用代理將1-Wire范圍擴(kuò)展到近無(wú)窮大極限的方法。描述基本代理的最佳類(lèi)比是想象大多數(shù)公司的代理服務(wù)器(有時(shí)稱(chēng)為公司防火墻)。在此設(shè)置中,只有一臺(tái)計(jì)算機(jī)(代理)具有與 Internet 的實(shí)際連接,其余用戶計(jì)算機(jī)只能訪問(wèn)代理。LAN 上用于 LAN 外部計(jì)算機(jī)的所有網(wǎng)絡(luò)數(shù)據(jù)包在 WAN 上重復(fù),反之亦然。這一理念可以應(yīng)用到1-Wire網(wǎng)絡(luò)上。通過(guò)代理連接到1-Wire網(wǎng)絡(luò)需要幾個(gè)軟件模塊:客戶端模塊和主機(jī)模塊。主機(jī)模塊是在1-Wire代理服務(wù)器(PC、MxTNI?或微控制器)上運(yùn)行的代碼,該服務(wù)器具有對(duì)1-Wire網(wǎng)絡(luò)的硬件訪問(wèn)權(quán)限。客戶端模塊是在僅具有網(wǎng)絡(luò)訪問(wèn)權(quán)限以訪問(wèn)主機(jī)模塊的遠(yuǎn)程計(jì)算機(jī)上運(yùn)行的代碼。主機(jī)模塊可能訪問(wèn)客戶端模塊,而不是對(duì)1-Wire網(wǎng)絡(luò)的硬件訪問(wèn),而客戶端模塊將引用另一個(gè)主機(jī)模塊。通過(guò)這種方式,可以將到達(dá)1-Wire網(wǎng)絡(luò)的代理鏈接在一起。
介紹
1-Wire協(xié)議的最初設(shè)計(jì)源于通過(guò)短連接與附近設(shè)備通信的愿望。盡管通過(guò)仔細(xì)考慮,可以將此連接的長(zhǎng)度延長(zhǎng)到比最初預(yù)期的更遠(yuǎn),但限制仍然非常真實(shí)。
本文檔將介紹一種使用代理將1-Wire范圍擴(kuò)展到近無(wú)窮大極限的方法。描述基本代理的最佳類(lèi)比是想象大多數(shù)公司的代理服務(wù)器(有時(shí)稱(chēng)為公司防火墻)。通常,公司為其員工提供LAN(局域網(wǎng)),用于連接彼此的計(jì)算機(jī)并共享文件。公司通常需要提供一種訪問(wèn)互聯(lián)網(wǎng)(非常廣域網(wǎng))的方法。在此設(shè)置中,只有一臺(tái)計(jì)算機(jī)(代理)具有與 Internet 的實(shí)際連接,其余計(jì)算機(jī)只能訪問(wèn)代理。代理代表 LAN 上的所有計(jì)算機(jī)發(fā)出所有互聯(lián)網(wǎng)數(shù)據(jù)請(qǐng)求。在此示例中,代理充當(dāng) WAN 和 LAN 之間的接口。LAN 上用于 LAN 外部計(jì)算機(jī)的所有網(wǎng)絡(luò)數(shù)據(jù)包在 WAN 上“重復(fù)”,反之亦然。
圖1.代理服務(wù)器示例。
圖 1 說(shuō)明了代理服務(wù)器提供的基本服務(wù),即提供對(duì)內(nèi)部計(jì)算機(jī)通常無(wú)法訪問(wèn)的網(wǎng)絡(luò)的訪問(wèn)權(quán)限。更具體地說(shuō),可以通過(guò) LAN 訪問(wèn)代理的內(nèi)部計(jì)算機(jī)在沒(méi)有代理幫助的情況下沒(méi)有其他方式訪問(wèn) WAN。通過(guò)代理服務(wù)器路由信息請(qǐng)求,現(xiàn)在可以訪問(wèn)以前無(wú)法訪問(wèn)的外部服務(wù)器。盡管很多細(xì)節(jié)都發(fā)生了變化,但同樣的基本思想可以應(yīng)用于1-Wire網(wǎng)絡(luò)。圖 2 說(shuō)明了此應(yīng)用程序的基礎(chǔ)知識(shí)。
圖2.1-Wire代理示例。
圖2中的應(yīng)用代表希望接入1-Wire網(wǎng)絡(luò),但無(wú)論出于何種原因無(wú)法直接訪問(wèn)該網(wǎng)絡(luò)的所有應(yīng)用。原因可能是它們離網(wǎng)絡(luò)太遠(yuǎn),或者它們?cè)诓辉试S硬件訪問(wèn)的環(huán)境中運(yùn)行(即在 Java 驅(qū)動(dòng)的手機(jī)上運(yùn)行的 Java? 應(yīng)用程序)。由于電氣限制,使用1-Wire網(wǎng)絡(luò)的應(yīng)用通常運(yùn)行在距離200-Wire從器件不到1米的硬件上。在圖2所示的場(chǎng)景中,應(yīng)用只需要訪問(wèn)網(wǎng)絡(luò)介質(zhì)和合適的1-Wire代理服務(wù)器即可。網(wǎng)絡(luò)介質(zhì)可以是任何內(nèi)容,例如 RF 無(wú)線網(wǎng)絡(luò)、IR 點(diǎn)對(duì)點(diǎn)鏈路或 TCP/IP 以太網(wǎng)網(wǎng)絡(luò)。得益于被稱(chēng)為互聯(lián)網(wǎng)的超大型廣域網(wǎng),外部計(jì)算機(jī)與實(shí)際1-Wire網(wǎng)絡(luò)之間的距離不再是問(wèn)題。
概述
通過(guò)代理連接到1-Wire網(wǎng)絡(luò)需要幾個(gè)模塊:客戶端模塊和主機(jī)模塊。主機(jī)模塊是在1-Wire代理服務(wù)器(PC、MxTNI或微控制器)上運(yùn)行的代碼,該服務(wù)器具有對(duì)1-Wire網(wǎng)絡(luò)的硬件訪問(wèn)權(quán)限。客戶端模塊是在僅具有網(wǎng)絡(luò)訪問(wèn)權(quán)限以訪問(wèn)主機(jī)模塊的遠(yuǎn)程計(jì)算機(jī)上運(yùn)行的代碼。主機(jī)模塊(而不是對(duì)1-Wire網(wǎng)絡(luò)的硬件訪問(wèn))可以訪問(wèn)客戶端模塊,該客戶端模塊將引用另一個(gè)主機(jī)模塊。通過(guò)這種方式,可以將到達(dá)1-Wire網(wǎng)絡(luò)的代理鏈接在一起。圖3顯示了1-Wire應(yīng)用、客戶端模塊、主機(jī)模塊和1-Wire網(wǎng)絡(luò)之間的交互性。
圖3.客戶端/主機(jī)配置。
PC在1-Wire網(wǎng)絡(luò)上的通信方式通常是使用適配器,通常使用合適的1-Wire主站來(lái)產(chǎn)生正確的時(shí)序。例如,DS9097U適配器使用DS2480B串行1-Wire線路驅(qū)動(dòng)器芯片。PC 使用串行端口連接到 DS9097U。通過(guò)串行端口發(fā)送的命令到達(dá)DS2480B,然后轉(zhuǎn)換為1-Wire網(wǎng)絡(luò)命令。DS2480B通過(guò)PC的串行端口返回任何1-Wire網(wǎng)絡(luò)命令的輸出。但是,當(dāng)通過(guò)1-Wire代理與1-Wire網(wǎng)絡(luò)通信時(shí),PC將調(diào)用客戶端模塊向主機(jī)模塊發(fā)送命令。這些命令將通過(guò)網(wǎng)絡(luò)介質(zhì)(例如因特網(wǎng))傳輸?shù)街鳈C(jī)模塊。然后,主機(jī)模塊將通過(guò)1-Wire主站與物理1-Wire網(wǎng)絡(luò)進(jìn)行通信。1-Wire通信的結(jié)果將通過(guò)網(wǎng)絡(luò)介質(zhì)返回到客戶端模塊的緩沖區(qū)中。
實(shí)現(xiàn)
發(fā)生重復(fù)的軟件應(yīng)用層可以是許多地方中的任何一個(gè)。1-Wire應(yīng)用主要由以下幾層組成:
應(yīng)用—保持有關(guān)如何使用1-Wire數(shù)據(jù)的知識(shí)(即,如何將1-Wire通信塊轉(zhuǎn)換為以華氏度為單位的溫度結(jié)果)。
演示 - 維護(hù)有關(guān)不同數(shù)據(jù)格式的知識(shí),并將其包裝到可能有用的 API 中。
傳輸—保持有關(guān)如何將數(shù)據(jù)塊傳輸?shù)?-Wire網(wǎng)絡(luò)或從<>-Wire網(wǎng)絡(luò)傳輸數(shù)據(jù)塊的知識(shí)。
鏈路—保持如何重置1-Wire網(wǎng)絡(luò)并傳輸<>或<>的知識(shí)。
在鏈路層安裝代理需要通過(guò)網(wǎng)絡(luò)傳輸串行或并行端口命令。例如,如果主機(jī)的某個(gè)串行端口上裝有DS9097U適配器,則客戶端模塊將發(fā)送直接針對(duì)DS2480B主芯片的命令。iButton 網(wǎng)站上提供的串行到以太網(wǎng)示例(請(qǐng)參閱本文檔末尾的鏈接部分)完全演示了這一原則。此示例允許電腦具有虛擬 COM 端口。發(fā)送到此虛擬COM端口的所有命令都通過(guò)網(wǎng)絡(luò)傳輸?shù)搅硪慌_(tái)設(shè)備(PC或MxTNI)。如果主機(jī)設(shè)備的串行端口上有DS9097U,則客戶端可以將DS9097U視為直接連接。
在傳輸層安裝代理的想法由IEEE? 1451.4的協(xié)議規(guī)范處理。在這一層,客戶端模塊不會(huì)關(guān)注用于連接1-Wire網(wǎng)絡(luò)的實(shí)際硬件,而是將鏈路層視為主機(jī)處理的理所當(dāng)然的東西。客戶端將主要向主機(jī)傳輸重置命令和數(shù)據(jù)塊。
最高的層,也可能是最有效的層,將是表示層。這種代理包含在1-Wire API for Java Kit中。在1-Wire API for Java中,每個(gè)適合1-Wire連接的適配器都由DSPortAdapter的一個(gè)子類(lèi)表示。在面向?qū)ο蟮恼Z(yǔ)言中,這意味著各種適配器(串行、并行或 USB)的所有實(shí)例都可以被視為其父類(lèi) DSPortAdapter 的實(shí)例。這是在面向?qū)ο?a target="_blank">程序員應(yīng)該非常熟悉的演示文稿中隱藏實(shí)現(xiàn)的情況。由于1-Wire API中的這種設(shè)計(jì)選擇,因此添加DSPortAdapter的新子類(lèi)非常簡(jiǎn)單,該子類(lèi)僅實(shí)現(xiàn)上述客戶端模塊。圖 4 的類(lèi)圖中描述了此客戶端模塊及其與主機(jī)模塊的關(guān)系。
圖4.類(lèi)交互圖。
使用1-Wire代理的最大問(wèn)題是數(shù)據(jù)包延遲。如果網(wǎng)絡(luò)介質(zhì)的數(shù)據(jù)包周轉(zhuǎn)時(shí)間為一秒,則大多數(shù)實(shí)時(shí)應(yīng)用程序根本不可能實(shí)現(xiàn)。理想情況下,網(wǎng)絡(luò)數(shù)據(jù)包延遲(有時(shí)稱(chēng)為 PING 時(shí)間)應(yīng)小于 PC 在連接外部硬件時(shí)產(chǎn)生的延遲。例如,如果發(fā)送到串行端口和從串行端口讀取的任何數(shù)據(jù)的數(shù)據(jù)包周轉(zhuǎn)時(shí)間為 20 毫秒,則 5 毫秒的網(wǎng)絡(luò)數(shù)據(jù)包延遲幾乎不會(huì)明顯。如果網(wǎng)絡(luò)數(shù)據(jù)包延遲明顯更高,則可能需要更高層的實(shí)現(xiàn)來(lái)提高應(yīng)用程序的實(shí)時(shí)響應(yīng)能力。為了說(shuō)明這一點(diǎ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 |
對(duì)于發(fā)送的每個(gè)數(shù)據(jù)包,為數(shù)據(jù)包延遲添加一個(gè)乘數(shù)。如果以這種方式連續(xù)多次調(diào)用DS9097U,很明顯,它可以相當(dāng)快地增加大量網(wǎng)絡(luò)流量。在表示層,可以按如下方式再現(xiàn)完全相同的1-Wire活動(dòng):
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代理實(shí)現(xiàn)方案移至應(yīng)用層可以顯著減少數(shù)據(jù)包延遲問(wèn)題。但是,由于這一層的實(shí)現(xiàn)是高度不可移植的(即,應(yīng)用層的實(shí)現(xiàn)本質(zhì)上與特定應(yīng)用程序綁定),因此目前沒(méi)有可用的參考實(shí)現(xiàn)。為了便于說(shuō)明,讓我們檢查一下與一個(gè)特定應(yīng)用的區(qū)別:溫度輪詢。用于溫度轉(zhuǎn)換的可能網(wǎng)絡(luò)數(shù)據(jù)包交換將在鏈路層和表示層生成大量數(shù)據(jù)包。需要發(fā)送“1-Wire復(fù)位”命令、“匹配ROM”命令和“執(zhí)行溫度轉(zhuǎn)換”命令。客戶端模塊將負(fù)責(zé)解釋每個(gè)命令的返回值,因?yàn)樗跃W(wǎng)絡(luò)數(shù)據(jù)包的形式從主機(jī)模塊接收。如果在應(yīng)用層實(shí)施1-Wire代理,則客戶端模塊只需發(fā)送“執(zhí)行完整溫度轉(zhuǎn)換”命令。來(lái)自服務(wù)器的返回值(在單個(gè)數(shù)據(jù)包中)可能只是溫度轉(zhuǎn)換的結(jié)果。
軟件接口示例
在1-Wire API for Java Kit中使用客戶端模塊非常簡(jiǎn)單,只需創(chuàng)建NetAdapter的實(shí)例并將連接字符串傳遞給初始化方法即可。連接字符串的格式為:
: :
主機(jī)名是運(yùn)行主機(jī)模塊的 PC(或 MxTNI)的主機(jī)名或該計(jì)算機(jī)的 IP 地址。端口是主機(jī)正在偵聽(tīng)的 TCP/IP 端口。共享密鑰用于簡(jiǎn)單形式的身份驗(yàn)證。當(dāng)客戶端模塊連接到主機(jī)模塊時(shí),主機(jī)會(huì)向客戶端發(fā)出隨機(jī)質(zhì)詢。然后,客戶端查找隨機(jī)質(zhì)詢字節(jié)和共享密鑰的 CRC-16。然后將此CRC-16傳輸回主機(jī)進(jìn)行驗(yàn)證。如果 CRC-16 與主機(jī)計(jì)算的內(nèi)容匹配,則認(rèn)為用戶已通過(guò)身份驗(yàn)證。請(qǐng)注意,NetAdapter 中還有一種附加的初始化方法,該方法允許通過(guò)接受已建立的 TCP/IP 套接字(可能是加密連接)來(lái)執(zhí)行進(jìn)一步的步驟來(lái)保護(hù)連接。
在1-Wire API for Java Kit中,有一個(gè)示例程序可以簡(jiǎn)化主機(jī)模塊的使用。此應(yīng)用程序?qū)⒅鳈C(jī)模塊的所有參數(shù)作為命令行上的參數(shù),并使用這些參數(shù)創(chuàng)建 NetAdapterHost 的實(shí)例。桌面和 MxTNI 都包含預(yù)構(gòu)建的二進(jìn)制文件。圖 5 顯示了在 COM9097 串行端口上使用 DS1U 適配器在桌面上啟動(dòng)主機(jī)模塊的命令行。當(dāng)前工作目錄是1-Wire API for Java Kit中StartNetAdapterHost的應(yīng)用程序文件夾。
java -cp ".;" StartNetAdapterHost -adapterName DS9097U -adapterPort COM1 -listenPort 6161 -secret "this is my secret"
圖5.在 PC 上啟動(dòng)主機(jī)模塊。
在 PC 上執(zhí)行圖 5 中所示的行將啟動(dòng) NetAdapterHost,它將在端口 6161 上創(chuàng)建一個(gè)偵聽(tīng) TCP/IP 套接字。用于簡(jiǎn)單身份驗(yàn)證的共享密鑰是“這是我的密鑰”。在 MxTNI 上啟動(dòng)主機(jī)模塊幾乎相同。只需將 StartNetAdapterHost.tini 文件通過(guò) ftp 到 MxTNI 機(jī)器即可。然后登錄并使用圖 6 中所示的命令行。
java StartNetAdapterHost.tini -adapterName TINIExternalAdapter -adapterPort serial1 -listenPort 6161 -secret "this is my secret"
圖6.在 MxTNI 上啟動(dòng)主機(jī)模塊。
主機(jī)模塊啟動(dòng)后,將接受來(lái)自客戶端模塊的傳入連接。數(shù)字 圖8所示為遠(yuǎn)程溫度演示,演示如何連接到主機(jī)并與1-Wire器件交互。此應(yīng)用程序?qū)⑦B接到指定的主機(jī)并查找任何溫度設(shè)備。它 然后輪詢每個(gè)設(shè)備,并以攝氏度和華氏度顯示當(dāng)前溫度。自 使用示例應(yīng)用,只需將代碼復(fù)制并粘貼到名為 RemoteTemperatureDemo.java 的文件中即可。 更改類(lèi)頂部的常量以反映實(shí)際設(shè)置(即,確保主機(jī)名 變量具有啟動(dòng) NetAdapterHost 的計(jì)算機(jī)的主機(jī)名)。然后執(zhí)行 圖 7 中所示的命令來(lái)編譯和執(zhí)行此類(lèi)。
javac -classpath ".;" RemoteTemperatureDemo.java java -classpath ".; " RemoteTemperatureDemo
圖7.編譯并運(yùn)行遠(yuǎn)程溫度演示。
該程序的輸出應(yīng)為找到的每個(gè)溫度器件的64位1-Wire地址,后跟當(dāng)前溫度。如果未找到設(shè)備,將顯示一條錯(cuò)誤消息,指示這一點(diǎn)。
有關(guān)使用 NetAdapter 和 NetAdapterHost 的更多信息,請(qǐng)參閱這些類(lèi)的 JavaDocs。所有1-Wire類(lèi)的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.遠(yuǎn)程溫度演示。
審核編輯:郭婷
-
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7632瀏覽量
90196 -
服務(wù)器
+關(guān)注
關(guān)注
13文章
9698瀏覽量
87296 -
1-Wire
+關(guān)注
關(guān)注
0文章
70瀏覽量
21547
發(fā)布評(píng)論請(qǐng)先 登錄
1-Wire時(shí)序的理解及配置
如何訪問(wèn)1-Wire API
應(yīng)用筆記187 1-Wire搜索算法
1-Wire搜索算法

Overview of 1-Wire Technology

Reading and Writing 1-Wire Dev

A Simple 1-Wire DAC

Bluetooth to 1-Wire communicat

1-Wire總線主機(jī)
使用NFC系統(tǒng)無(wú)線供電和訪問(wèn)1-Wire網(wǎng)絡(luò)

可靠的長(zhǎng)線1-Wire網(wǎng)絡(luò)指南

通過(guò)串行接口讀寫(xiě)1-Wire器件

可靠的長(zhǎng)線1-Wire網(wǎng)絡(luò)指南

使用UART實(shí)現(xiàn)1-Wire總線主控

如何將1-Wire主機(jī)復(fù)用到多個(gè)通道?

評(píng)論