我是David,此存儲庫/文章的目標是通過嘗試以最簡單的方式解釋它們來揭開插座。
在這些示例中,我將使用nodejs和粒子(任何版本都可以使用)來顯示硬件可以與nodejs交談,反之亦然。但是毫無疑問,這並不意味著我選擇的工具是解決這個問題的唯一方法。這就是我個人所知道的。
任何具有網絡連接性的嵌入式設備都可以類似地工作,並且任何帶有插座支持的語言也可以使用。
回購結構
我相信插座周圍有很大的神秘感。多年來,許多人使他們聽起來令人恐懼,我的目標是證明他們並不是那麼神秘或複雜。我希望最終您將把插座視為解決特定問題的更簡單解決方案。
特別是在每個字節都計數的嵌入式系統中。
插座是所有網絡連接的基礎。每個連接的設備都使用插座。在插座之上,您將擁有協議,這是指定數據後應如何發送或處理數據的規則。流行的HTTP協議就是一個例子。知道這一點,您可以模仿任何具有插座支持的語言的設備。如何?通過發送遵守特定協議(規則)的字節。這些規則可在線免費提供。
您可以製作一個假裝為一個的應用程序:
人們為什麼認為插座很複雜?
可能是因為人們傾向於使用傳達複雜性的單詞,例如:
僅通過閱讀您可能認為的這幾點,這不適合我。但是插座實際上非常簡單。例如,要從Web服務器獲得響應,您只需要發送以下文本:
GET / HTTP/1.1
就是這樣。服務器將進行此文本,解析並了解您正在製作:
/contact以獲取聯繫頁面。它沒有更多。打印機將了解另一個標題,同樣,DNS服務器將需要其協議(規則)的特定內容。
難以相信嗎?使用此命令使用Telnet應用程序連接到您喜歡的站點(僅通過端口80支持一個不安全的連接)。
SITE 80GET / HTTP/1.1對於安全連接,您可以使用openSSL如下:
Openssl s_client -connect google.com:443GET / HTTP/1.1另一個示例是通過直接連接到SMTP服務器來發送電子郵件。大多數當前的SMTP服務器都通過密碼確保並使用加密保護,這使得很難快速測試。但是,如果您可以訪問普通SMTP服務器,則可以輸入以下內容:
telnet example.com smtpHELO client.example.comMAIL from: <[email protected]>RCPT to: <[email protected]>DATAFrom: [email protected]To: [email protected]Subject: Test messageQUIT如您所見,這不是嗎?
現在,我們對協議有了更好的了解,您需要設計一個通用的通信結構。假設您想將房屋的溫度發送到Nodejs服務器。您的字節流看起來像這樣:
45,40.1,50,90,100,102.5
逗號充當每個測量的分離器。您可以選擇想要的任何字符,但是,您知道,逗號將使您的數據與CSV(逗號分隔值)格式兼容。另一方面,您需要一些可以檢查分離器的代碼,而當發生這種情況時 - 您的價值。
從此示例中可以看到,沒有標題或可選數據。您決定協議中的內容。
基於上面的示例,您可以在協議中添加濕度,例如:
45:80,40:85,32.1:82,50:89
同樣,逗號將您的數據分開,而結腸將數據集區分開來。另外:請記住...協議需要良好的文檔,因此其他開發人員可以理解他們必須管理的數據。
另一個重要的是,他的示例談論了ASCII ProtoCall,要了解二進製文件的工作原理,您可以閱讀我寫的以下文章,標題為:How-to-deconstruct-ping-with-c-and-c-and-nodejs。
計算機以1s和0s工作,這是一個事實。該示例無法將編譯應用程序與常規數據區分開。一切都存儲為一系列位。這意味著即使是通過Internet發送的數據也為1s和0s。
您可能在問,那我為什麼要關心類型。因為根據您的類型,您的二進制數據將有所不同。例如: 1個整數將為00000001 ,其中31個整數將變為00011111 。
這意味著,在連接的另一端,您需要知道自己得到的。假設您想進行簡單的比較。
if ( data == 1 ) {
true
}如果您將數據轉換為整數,但是將其發送為char,則將其將INT 31與INT 1進行比較。但是,如果您知道您正在發送角色,則可以將其與正確的類型進行比較:
if ( data == '1' ) {
true
}現在,char 1實際上是31 ,比較將起作用。在Hardware2NodeJS示例文件夾中,您會找到示例代碼,以解釋實踐差異。
在Internet上,發送數據的兩個最受歡迎的協議是TCP和UDP。您會看到人們在名稱的末尾添加 /IP。 IP代表(Internet協議),簡而言之,您可以將其視為Internet的地址系統。這意味著您不僅可以在Internet上使用TCP或UDP,因為TCP和UDP是包裝數據的方式,您使用的地址系統取決於您。
TCP和UDP是協議,現在您應該知道這個詞意味著規則,而這兩個協議無非是說明如何打包數據的規則。另一端了解相同的規則,可以解開接收到的信息,反之亦然。
大多數Internet都使用TCP,因為我們希望確保我們發送的內容將在另一端全部收到。例如,如果您發送文檔,則不希望丟失字母或單詞。有了許多格式,如果標頭缺少零件,該零件告訴系統如何理解文件,則係統將通知您文件已損壞,無法讀取。
當然,有一些格式更具彈性,並且不需要100%的數據。例如,某些電影,圖像和音樂格式可能會缺少一些內容,而我們只是忍受。圖像或電影可能有一些怪異的文物。音樂可能會有一些斑點和噪音。
從硬件產品發送數據時,該協議非常有用。假設我們正在使用蜂窩調製解調器從許多設備收集傳感器數據,我們必須為發送的每個字節付費。在這種情況下,我們應該考慮以下內容:為我們對TCP的更高保真度支付更多費用是值得的嗎?還是最好接受一些測量結果,但為我們的數據傳輸付出少付的錢?
通常,我會默認使用TCP,但是如果您有很好的理由不使用它,則UDP是您的下一個最佳選擇。
我希望這個存儲庫可以幫助您更好地了解什麼是插座。如果不清楚,請在Twitter上打我,我將嘗試修復項目中不清楚的任何積分。
我要感謝所有幫助我完成該項目的好人,包括:
如果您喜歡這個項目,請考慮給它?並查看我的GitHub帳戶,在這裡您會發現可能會發現有用或有趣的其他資源。
該項目由0x4447 LLC帶給您,這是一家專門在AWS之上構建自定義解決方案的軟件公司。請按照此鏈接了解更多信息:https://0x4447.com。或者,將電子郵件發送至[email protected]。