1. 程式人生 > >福利 | Python 物聯網全棧開發實踐

福利 | Python 物聯網全棧開發實踐

點選上方“CSDN”,選擇“置頂公眾號”

關鍵時刻,第一時間送達!

編者按:昨日,第一屆小米 IoT 開發者大會在京召開,大會上正式釋出了小米IoT 開發者計劃,此外,百度集團總裁兼營運長陸奇宣佈百度和小米達成戰略合作,將聯手共建“AI+IoT”軟硬一體模式。在如今 IoT 大行其道,定義卻模糊不清之時,作為開發者我們該如何進行物聯網全棧開發?

在這篇文章中,我們以 Twisted 為例,分享物聯網裝置接入的基本協議及架構搭建,希望能給諸多開發者一些思考,更加快速地上手物聯網開發。

本章節選自圖書《從晶片到雲端:Python物聯網全棧開發實踐》。同時為了回饋大家長久以來的支援與關注,特申請 5 本技術圖書贈於物聯網開發道路上的同行者,詳細規則可見文末

遠端裝置可以通過4G網路或者Wi-Fi直接連線TCP/IP網路,也可通過閘道器、邊緣伺服器等裝置轉換到TCP/IP網路,再連線到裝置雲、應用雲、大資料分析伺服器和使用者APP。本節內容將總結裝置雲各種接入協議的實現,包括:

  • 基於TCP/UDP的套接字伺服器;

  • 基於UDP的CoAP協議;

  • 基於TCP的MQTT協議;

  • 基於HTTP的REST API Web服務。

除了這幾種,還可以找到其他一些協議:

  • HTML5 WebSocket/SSE,可以支援持久連線和伺服器推送;

  • XMPP,用於即時通訊等。

嚴格地說,應該將後兩類定義為網際網路客戶端接入協議。客戶端本質上也是裝置端,但是其已經獨立發展,形成了自己的特點。

從目前來看,許多裝置聯網都採用私有協議,需要定製接入服務;物聯網專用協議CoAP/MQTT也很熱門;而基於Web的REST API和其他方式也是網際網路標準。所以,本節將以Twisted為例,講解如何接入這些協議。

非同步通訊框架Twisted

Twisted設計於2000年,是事件驅動的非同步網路引擎架構,作者是Glyph Lefkowitz。Twisted最初是針對一款多人線上遊戲(Twisted Reality)而設計的網路通訊框架,其後來發展成為一個事件驅動、跨平臺的可擴充套件型通用網路應用開發框架。

Twisted自推出以來廣泛用於生產環境中,Google、Lucas Film、Justin.TV及Launchpad軟體協作平臺都採用Twisted設計過產品和網路服務。此外,Twisted還驅動著BuildBot(自動構建工具)、BitTorrent(著名P2P分享服務)及TahoeLAFS(開源雲端儲存服務)。

作為網路應用的重型框架,Twisted支援常見的傳輸層和應用層協議,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC、FTP和DNS。用Twisted定製開發客戶協議也很簡單。Twisted對於其支援的協議都帶有客戶端和伺服器端,同時附有命令列工具和Log日誌輸出,這可以用於配置和部署產品級的網路應用。

圖9-10來自Twisted的參考設計:Poetry Server。Twisted是單執行緒設計,運行於單一CPU核心中,可以在單一執行緒中整合多個埠服務。但Twisted通過Reactor模型構建了高速非同步事件驅動型網路程式設計框架。

0?wx_fmt=png

圖9-10  Twisted系統執行示意圖

多核伺服器與負載均衡

Ngnix由俄羅斯工程師Igor Sysoev開發,其徽標如圖9-11所示。Ngnix可以作為Web代理伺服器、Mail代理伺服器和通用的TCP/UDP代理伺服器。套接字伺服器、Web伺服器、Web API伺服器的負載均衡可以採用Ngnix來實現,這幾乎是行業標配之一了。

0?wx_fmt=png

圖9-11  Nginx徽標

在多核伺服器中可以執行多個Twisted例項,並可以非常容易地進行規模效能擴充套件。但一臺伺服器一般只會分配一個公網IP。如果Twisted例項分別偵聽不同埠也沒有問題;如果共享一個偵聽埠,則需要負載均衡伺服器來實現。

作為主流的反向代理伺服器,Ngnix可以支援多臺多核高配主機,執行多個Twisted例項實現橫向規模擴充套件。具體實現方法如圖9-12所示。

  • Twisted 1,運行於Server A,CPU1,偵聽埠5000;

  • Twisted 2,運行於Server A,CPU2,偵聽埠5010;

  • Twisted x,運行於Server A,CPUx,偵聽埠50x0;

  • ……

  • Twisted 1,運行於Server B,CPU1,偵聽埠5000;

  • Twisted 2,運行於Server B,CPU2,偵聽埠5010;

  • Twisted x,運行於Server B,CPUx,偵聽埠50x0;

  • ……

  • Ngnix,偵聽指定埠6000,並按照預先定義的分配策略將流量轉發給 Server A/B/Z中的CPU1/CPU2/CPUx。

  • 還可以在Ngnix處部署TLS證書等。

0?wx_fmt=png

圖9-12  Ngnix與多個Twisted伺服器例項構成負載均衡設計

基於TCP的四層負載均衡併發能力是50萬個長連線,這可以滿足大多數物聯網需求了。如果需要更多連線數,可以通過子域名將流量分配到多臺負載均衡的方式實現規模擴充套件。

客戶端

在Twisted的參考設計中,一般會對等提供伺服器和客戶端設計。在應用層上,使用者還可以自行替換或者擴充套件Twisted的客戶端。Web客戶端中較為出名的是網路爬蟲框架Scrapy。

伺服器端

Twisted雖然提供HTTP埠的客戶端和伺服器,但是其僅支援簡單的HTTP開發。基於Twisted,可以使用更加完整的 Web框架,如Klein或Cyclone等。物聯網CoAP協議對應的代理伺服器是txThings。MQTT有twisted-mqtt-client客戶端。筆者曾經誤以為Twisted方案是實現MQTT伺服器,但其實它是作為MQTT客戶端存在的:

  • MQTT broker是伺服器,比如開源的mosquitto,或者雲服務供應商的IoT套件;

  • twisted-mqtt-client作為broker的客戶端,掛接在broker伺服器上;

  • twisted-mqtt-client將資料儲存在持久層(如SQL/NoSQL/NewSQL資料庫伺服器)中。

所以在基於MQTT的設計中,Twisted提供的都是客戶端設計。但之所以將其歸類到伺服器,主要因為這都是伺服器端領域的設計。

從物聯網介面來看,Twisted已經支援了大多數的裝置接入協議:

  • REST Web API,基於Web 伺服器;

  • Raw TCP/UDP,定製客戶協議,用於傳統裝置升級;

  • CoAP,用於超輕量級物聯網;

  • MQTT,用於輕量級物聯網。

與Twisted相關聯的有Tornado和Cyclone。Twisted/Tornado/Cyclone的英文含義是類似的。這些開源工程的名稱暗示自己的設計執行速度飛快。

這三者間存在聯絡和差異:

  • Twisted是獨立發展的網路程式設計架構,基於epoll/poll/select,跨作業系統。

  • Twisted不僅僅針對Web,它還包括了許多其他網路協議。

  • Tornado是FriendFeed設計的非同步非堵塞Web網路框架,基於epoll。

  • Tornado雖然也可以支援套接字伺服器,但其主要作為Web伺服器使用。

  • Twisted的Web過於簡單,Cyclone專案將Tornado API在Twisted上重新實現,是Twisted Web完整框架。

  • Cyclone的缺陷在於生態和社群不夠強,只有作者一人維護。

  • Twisted上還推薦Klein做Web,Klein比Cyclone更加簡單,但Cyclone更加完整。

雖然Tornado也支援socket/WebSocket/Web Server,社群生態也很強,但筆者希望儘量減少框架種類,還是採用了基於Twisted/Cyclone的完整生態開發。

在服務客戶定製專案的過程中,筆者以Twisted為基礎實現了EPIC裝置連線伺服器,具備以下特點:

  • 物聯網裝置聯網使用Twisted TCP/UDP套接字伺服器;

  • Web/Web API使用Cyclone;

  • MQTT接入採用mosquitto開源伺服器;

  • CoAP 接入採用txThings代理伺服器;

  • 訊息佇列採用Redis/ZeroMQ;

  • 負載均衡使用Ngnix或PaaS;

  • SQL資料庫採用MySQL/MariaDB;

  • 記憶體資料庫採用Redis。 

因文章篇幅有限,更多有關 Twisted 套接字伺服器設計、協議接入可檢視《從晶片到雲端:Python物聯網全棧開發實踐》。

圖書詳情

0?wx_fmt=jpeg

摘要:本書講述如何以Python為主要程式語言,實現“從晶片到雲端”的物聯網應用系統快速開發和系統擴充套件。通過閱讀本書,讀者可以充分體會Python作為一門全棧開發語言,是如何在物聯網的裝置端、應用端、伺服器端和資料端環節中發揮作用的。

作者:劉凱,服務於微電子行業二十餘載的資深工程師。曾在飛利浦半導體(即NXP恩智浦半導體前身)任資深工程師,從事軟、硬體開發與產品設計等工作,有用匯編/C/C++開發嵌入式系統韌體、用Perl/Python指令碼做開發支援工具、用PHP/Java/Python做裝置雲和Web應用的豐富經驗。

如果有迫不及待的寶寶們想要即刻閱讀這本書,點選下方【閱讀原文】,即可訂購喲~~

贈書規則

如果你對本書感興趣,可以在本文下方留言,說出自己申請理由,我會把有價值的評論放出,根據評論點贊數+申請理由挑選出 5 位參與的小夥伴。

截止時間:12 月 2 日中午 12:00。

0?wx_fmt=jpeg