2012-10-10 55 views
-1

enter image description here將數據發送到IP網絡

您好,

從上述圖像中,我有一個網絡服務器上的Linux機器和客戶端/設備。現在我需要這3個來溝通。網絡服務器根據網頁上的按鈕將數據發送到IP地址(客戶端/設備)。但在數據發送之前,數據必須首先訪問linux機器,然後機器將數據發送到設備,然後設備讀取數據並根據發送的命令採取行動。然後設備將數據發送回然後linux機器將它發送到web服務器以進行確認。意味着設備接收數據沒有任何問題。

  1. PHP是web服務器。現在如何將數據發送到一個IP地址。

  2. linux機器處理所有請求並將所有請求發送到設備,當設備獲得數據時,它會向linux機器發送數據,然後機器向數據服務器發送ok數據,以確保數據成功到達。閱讀關於套接字編程,我想創建一個讀取請求的應用程序。)或者如果你有任何想法,我該如何做到這一點?

  3. 如何能在設備讀取通過服務器發送的數據..

感謝,

編輯:該設備沒有連接到Linux機器。該設備僅通過以太網電纜連接。

+0

你能提供一些關於該設備的更多細節嗎?它是否支持任何標準協議(可能是Telnet?HTTP?),以及它是否提供數據流(如音頻/視頻)或只是對查詢做出的簡短迴應? –

+0

對不起......這個設備是arduino +以太網屏蔽層..一個步進驅動器連接到它,步進電機連接..步進器根據控制器/ linux機器發送的數據移動到arduino +以太網盾。我打算使用這個網站上的客戶端http://www.linuxhowtos.org/C_C++/socket.htm,我可以使用它將數據發送到arduino以太網的ip。然後arduino ethernet通過執行client.read()讀取它。瀏覽器讀取Linux上的數據我計劃在php上使用管道。感謝你們對我的幫助。 – demic0de

+0

如果你使用TCP套接字,那麼從Arduino以太網盾發回數據就像'client.write()'一樣簡單。 TCP連接是雙向的,所有你需要知道的是避免等待對方發送數據的情況。如果您每次用戶按下按鈕時使用PHP'fsockopen()'單獨打開與Arduino的連接,您也可以直接從PHP與Arduino聯繫。 –

回答

0

讓我們稱最上面的機器'服務器',中間機器'控制器'和最下面的機器'設備'。設備是外設(如USB或串行設備)還是計算機無關緊要。

第一項任務是讓控制器查詢設備。實現這一點的最佳方式實際上取決於設備。如果您考慮USB音頻/視頻設備等事情,則需要對其進行調整,然後發送連續的數據流。像溫度或溼度傳感器這樣的東西被告知做測量,然後他們迴應數據。

通常你將所需的函數寫入一個小型庫中,並使用命令行工具驗證它是否有效。在某些情況下,庫可能不是必需的,例如,如果設備已被控制器中的內核支持,並且信息是平常可用的。 (例如,考慮硬盤中的溫度傳感器:如果設備是硬盤,則控制器可以簡單地使用命令hddtemp /dev/sda來獲取/dev/sda(第一個SATA/ATA/SCSI硬盤)的溫度。期望最終用戶能夠選擇她感興趣的哪些硬盤,以便選擇將不得不從服務器流向控制器。)

接下來,您將編寫一個將在控制器上運行的服務。該服務將包含已編寫和測試的庫函數,因此可以輕鬆訪問設備。 (這樣就知道了控制器 - 設備通信的工作原理,不需要擔心。一次一件)

服務有許多不同的設計,從普通的TCP/IP或遠程過程調用(RPC)的UDP/IP套接字,HTTP等高級協議。近些年來,使用HTTP的最後一個變得越來越普遍,響應是XML,純文本或二進制媒體(通常是圖像)。這個想法是讓服務基本上是另一個可以直接訪問設備的Web服務器。安全性更簡單,因爲它不需要全球訪問:它只能回答來自服務器的請求。我已經使用基本的shell腳本(Bash),PHP(PHP-CGI和命令行PHP,PHP-CLI)和C等編寫了這些服務。最好的選擇取決於細節,真的。我個人更喜歡簡單的基於文本的TCP/IP套接字或HTTP。

在服務器上,你可以寫一個PHP頁面,連接到控制器,請求爲所欲爲請求(通常取決於用戶數據,首先檢查的理智和安全性,當然)。 PHP提供了簡單的內置工具來完成HTTP請求和使用原始TCP/IP進行連接,因此非常適合。如果啓用HTTP協議包裝,那麼它只是$handle = fopen("http://192.168.x.x/myservice?param1=" . urlencode($param1) . "&param2=" . urlencode($param2), "r+b");。要獲得套接字連接,請使用fsockopen()函數。 (有關詳細信息,請參閱fopen()http wrappers,並且fsockopen()PHP Function Referencewww.php.net

在實踐中,PHP頁面代碼首先創建到控制器的連接。然後它發送一個請求,包含從最終用戶收到的相關清理命令/參數。然後它等待Controller響應結果(通過簡單地讀取響應),然後關閉連接。響應應該包含所有需要的數據,所以PHP頁面可以自由地爲最終用戶構建頁面。

這一切都不是很困難,但有很多事情要做。我發現Controller-Device通信需要最多的工作;在完成之後,其餘部分一直非常簡單。

如果您可以提供更多的細節控制器 - 設備連接是什麼,設備提供什麼樣的數據(文本?數字?圖像?很多二進制數據?)以及什麼類型的參數/命令(只是「一個結果,請嗎?「,基本命令如」上移「,」你在哪裏?「)你是否期望你需要發送到控制器/設備,我可能會更具體。另外,你是否僅限於PHP,或者你願意使用C編寫Controller服務嗎?我發現自己是一個非常好的組合。


編輯補充:

概括地說,這三個點都可以回答如下:

  1. 要麼使用fopen("http://ip.add.re.ss:port/", "r+b");如果使用HTTP協議和PHP被配置成允許HTTP包裝(他們通常是),或使用fsockopen()。詳細信息請參閱上面鏈接的PHP文檔。

  2. 與IP連接的設備,控制器基本上是一箇中繼器或翻譯器。通常這意味着一個在Controller上運行的守護進程,管理來自服務器(或服務器)的傳入請求以及來自設備(或設備)的響應。當有不同數量的設備和/或需要多個接口時,這種情況更爲常見。在實踐中,Controller像上面描述的那樣運行一個守護進程,除了協議可以是標準的或者足夠簡單的,所以不需要編寫一個庫。

  3. 的服務器上運行的PHP必須包含請求的詳細信息(到底是什麼需要的話)到控制器。控制器必須將它們傳遞給設備。如果控制器爲服務器上連接的PHP提供http URL,則它可以解析查詢參數,並將其轉換爲Device可以理解的格式。 實踐中的一個特殊問題是處理併發訪問。通常從控制器到設備只有一個連接,但多個PHP可能同時連接到控制器。所以涉及一些簿記。 在某些情況下,設備會向控制器提供連續的數據流(或定期更新數據),並且控制器會簡單地對其進行標記。當服務器上運行的PHP查詢控制器的某些內容時,控制器只需查找最新數據(根本不需要聯繫設備,只需接收數據),並用它響應。在這裏,通常在控制器到服務器的響應中包含時間戳,或者更好的是數據的時間。

你真的應該添加一些細節到你的問題。 (我懷疑downvote是由於缺乏細節)。您不需要告訴我們設備的確切形式和型號,只需知道它是接收器(電視?無線電?氣象站?)還是傳感器集羣或一個門鎖,如果你知道任何有關通信協議的細節(哪一個)?到目前爲止,我們只知道它使用IP。這根本沒有幫助,只是約所有現在使用IP。這也是我的答案如此模糊的原因。我想更精確些,但是你沒有提供足夠的信息讓我這樣做。

+0

非常感謝您的答覆......我現在有一些事情在我的腦海裏......我忘了提及客戶端/設備沒有連接到linux機器上,我的壞處是......它只能通過以太網電纜..所以該設備是分開的Linux機器..所以,如果變成這樣,那麼它是直接的.. .. web服務器 - >設備它將不再訪問控制器..我怎麼可能使控制器檢測設備沒有它被附加到它?它只有ip,我將用它來控制它。再次感謝。 – demic0de

+0

@ demic0de:即使Device通過以太網連接到控制器,也適用相同的原則。 (在這種情況下,服務器和控制器通常是同一臺機器,但它們不一定非要)。如果設備允許多個併發訪問,或者如果您在PHP中阻止該設備,則不一定需要Controller服務在服務器上,並且設備在合理的時間內響應。檢測設備只是探測:基本上嘗試一個連接,看看它是否工作。 (也有本地網絡設備發現的協議,但它實際上取決於設備,它支持什麼。) –

+0

謝謝設備是arduino以太網.. arduino以太網必須首先發送數據到控制器才能被識別。控制器可以控制它。但我不知道如何在arduino中做到這一點。我知道我怎麼能通過套接字發送數據從Linux到Arduino以太網,但我不知道如何在Arduino以太網中做到這一點..謝謝, – demic0de