從晶片到雲端 Python物聯網全棧開發經驗教訓共享
阿新 • • 發佈:2019-02-17
劉凱
一、前言
物聯網端到端模型
物聯網與網際網路差異
- 開發環節:物聯網增加了裝置相關的裝置域開發;
- 人機互動:沒有標準顯示元件,不支援現有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和第三方網路服務,迭代各類融合型創新物聯網服務