1. 程式人生 > >從晶片到雲端 Python物聯網全棧開發經驗教訓共享

從晶片到雲端 Python物聯網全棧開發經驗教訓共享

劉凱

一、前言

物聯網端到端模型

這裡寫圖片描述

物聯網與網際網路差異

  • 開發環節:物聯網增加了裝置相關的裝置域開發;
  • 人機互動:沒有標準顯示元件,不支援現有UI元件,需要NUI、智慧感測器
  • 接入協議:裝置能力受限,需要支援MQTT/CoAP/TCP/UDP套接字;
  • 安全特性:裝置能力受限,無法支援RSA2048演算法TLS;
  • 資料特點:物聯網上傳流入流量遠遠大於流出流量;
  • 實時要求:物聯網隱含實時要求,流入資料需要支援實時檢索、處理、統計;
  • 規模受限:物聯網應用規模受限於裝置接入數量,資金、庫存、生產、銷售壓力更大;
  • 沉沒成本:物聯網是重資產業務,網際網路是輕資產業務;
  • 生命週期:硬體裝置是生命週期要遠遠長過網際網路產品;
  • 團隊組成:硬體團隊與網際網路團隊文化融合。

二、 Python 與IoT全棧開發

Python是物聯網系統的膠水語言。

  • Python有許多實現(Implementations),能夠與多種語言進行互動,尤其適合系統整合
  • CPython與C/C++:通用計算加速、DLL二次開發、裝置驅動、桌面、Web、運維、指令碼
  • Jython與Java/JVM:大資料,GUI、閘道器、移動APP
  • IronPython與C#:Windows應用、DLL二次開發、系統整合
  • JavaScript:前端、Web視覺化、JS爬蟲
  • 嵌入式C/HDL:暫存器/電晶體級原型開發、韌體、DSP、GPU、NLP、機器學習
  • From Chip to Cloud,完整產業鏈的全棧開發,通用語言的綜合優勢

主要領域

  • 系統建模、虛擬儀器、軟體質量、自動測試、報文分析、網路模擬、媒體處理
  • 系統建模:blender,printrun,python-opengl
  • 虛擬儀器:SCPI,pyserial,socket
  • 軟體質量:unittest,pytest,pydoc,Sphinx,git/subversion
  • 自動測試:pyocd,mbed-ls
  • 報文分析:Wireshark/PyShark
  • 媒體處理:mp3play,pyglet,moviepy,字模提取

Python效能加速

  • 執行時加速:PyPy JIT加速
  • Web加速:libev/libuv的Python封裝pyev/pyuv
  • 硬體加速:CUDA GPU加速

開箱即用的Python物聯網

  • PySerial:實驗性的RFC2271/asyncio
  • Twisted/Tornado:支援socket/websocket非同步網路程式設計框架
  • MQTT-client/paho:支援Cyclone/Tornado/Flask/Django框架
  • CoAP-proxy/txThings:支援Twisted框架

三、裝置端開發與選型

1. 需求分析

  • 電子貨架標籤:短距離無線、類廣播式
  • 資產定位:廣域無線、低佔空比、資料採集、非同步事件
  • 農業應用:低功耗廣域無線、低佔空比、資料採集、多裝置融合
  • 房屋租賃:WiFi/BLE、低佔空比、安全相關、非同步事件、多裝置融合
  • 醫療裝置:WiFi/BLE、高速率、資料採集、非同步事件、多裝置融合

2. 裝置組網與聯網選型

  • 無線技術需要遵守當地法律法規
  • 蜂窩資料技術 vs ISM技術
  • Sub-1GHz vs 2.4GHz技術
  • 短距無線電 vs 低功耗廣域技術
  • 無線技術標準競爭與多模晶片融合
  • 傳統有線網路依然有現實意義

四、Python裝置端開發

具備二次開發能國的可程式設計裝置 
這裡寫圖片描述

這裡寫圖片描述

五、Python閘道器開發

1. 硬體介面標準化

  • 物聯網現狀:碎片化,垂直行業條塊分割
  • 物聯網趨勢:標準化硬體介面 + 標準化程式設計介面 + 標準化程式設計平臺
  • 應用迭代:唯快不破,以標準化方法應對碎片化需求
  • 標準化進行中:I2C/SPI/GPIO/ADC/PWM…… Adafruit GPIO/Intel MRAA
  • UART:PySerial
  • USB:PyUSB
  • OS標準裝置:SDIO/MiniPCIe/HDMI/Audio……

2. 作業系統標準化

  • MCU:ARM mbed OS/CMSIS RTOS
  • CPU/MPU:Linux Yocto/Open-Embedded/Debian/Ubuntu
  • 執行時:Native/JVM/Android
  • 程式語言:C/C++/Java/Python/JavaScript/Lua
  • I/O命名:Arduino/ARM mbed

3. 程式設計介面標準化

  • PySerial:RS232/RS485/USB CDC ACM/RFC2271
  • PyUSB:特種USB裝置,HID/CDC/MSD等裝置均被OS標準化
  • Socket:連線介面或技術標準化後會提供套接字程式設計介面,包括CAN/6LowPAN/Zigbee
  • 裝置檔案:Linux的標準化介面
  • DLL檔案:Windows下的標準介面

Linux+Python 物聯網閘道器示例

  • panStamp:西班牙智慧農業,已成為通用物聯網閘道器
  • panStamp模組:Sub-1GHz CC1101,基於Arduino API,UART接入樹莓派Linux
  • panStamp架構:分散式,包括IFTTT,Web管理介面,與眾多雲服務整合
  • 嵌入式Linux:CLFS,預編譯Linux,完整版Linux
  • 交叉編譯:CLFS與CPython交叉編譯問題
  • 其他閘道器:LoRa/Zigbee/6LowPAN閘道器

這裡寫圖片描述

這裡寫圖片描述

MicroPython物聯網閘道器

  • 基於MicroPython的物聯網參考設計
  • 交叉編譯:MicroPython更適合交叉編譯環境
  • 生態完整:MicroPython自帶upip和微型庫
  • 參考設計:WiPy/LoPy/SiPy/FiPy,重複整合LTE/NB/WiFi/BLE/LoRa/Sigfox閘道器服務
  • 開發者反饋:遠比C/C++開發要快捷,充分發揮了Python快速應用開發的特點
  • 開發者程式設計水平:殘留大量C語言程式設計方式,需要掌握Python語法,OOP/函數語言程式設計,中斷回撥和非同步I/O,實現個人程式設計能力的升級

這裡寫圖片描述

* Java OSGI+JyThon物聯網閘道器*

  • OSGi:歷史悠久,OpenHab及大量OSGi開源框架與閘道器
  • JSR223:JavaScript/Python/AWK/Groovy等十多種語言
  • OSGi Jython橋接
  • 參考設計:NXP/Freescale的OSGi閘道器設計
  • 樹莓派:Pi4J、TigerJython

這裡寫圖片描述

六、 Python伺服器端開發

1. 典型物聯網伺服器端框架:

這裡寫圖片描述

2. 聯網協議選型

  • MQTT vs TCP長連線:完整的分層協議與TLS安全
  • CoAP vs MQTT:REST無狀態與訊息佇列模式
  • XMPP/Websocket等:相對重型的通訊協議
  • 技術陷阱:基於TCP長連線的二進位制協議定製,可能導致工程失敗

3. 資料轉發與持久層選型

  • 快取:基於RAM,Redis/MongoDB
  • RDBS:SQL,MySQL/Maria/PostgreSQL/SQL Server
  • NoSQL:MongoDB/Cassandra
  • RTDB:KogMo/BerkeleyDB,工業資料採集,商業許可證居多
  • TSDB:OpenTSDB/InfluxDB
  • PaaS:Firebase/Bigtable/Hadoop/Spark

4. 連線與資管應用分離

  • 標準化聯網對接:降低連線定製需求,標準化能夠加速開發
  • 裝置抽象:裝置雲解決裝置連線,通過REST API將物理裝置抽象成裝置資料服務
  • 系統迭代加速:在資管應用中實現應用(裝置、角色、許可權、流程、儲存、UI、APP)的快速迭代
  • 簡化系統開發:資管應用簡化為Web開發,降低開發成本
  • 系統整合加速:通過REST API整合IoT PaaS/攝像頭直播/點播PaaS和第三方網路服務,迭代各類融合型創新物聯網服務