從芯片到雲端:Python物聯網全棧開發實踐

從芯片到雲端:Python物聯網全棧開發實踐 pdf epub mobi txt 電子書 下載 2025

劉凱 著
圖書標籤:
  • Python
  • 物聯網
  • 全棧開發
  • 嵌入式係統
  • 雲計算
  • 硬件開發
  • 網絡編程
  • 數據分析
  • 項目實踐
  • 智能硬件
想要找書就要到 新城書站
立刻按 ctrl+D收藏本頁
你會得到大驚喜!!
齣版社: 電子工業齣版社
ISBN:9787121311277
版次:1
商品編碼:12253128
品牌:Broadview
包裝:平裝
開本:16
齣版時間:2017-11-01
用紙:膠版紙
頁數:724

具體描述

編輯推薦

√ Python全棧是降低物聯網開發復雜度的必由之路

√ 物聯網應用係統的快速開發和係統擴展可以兼顧

√ 物聯網係統設計比互聯網係統設計更受限更復雜

√ 全覆蓋應用、産品、生態的全局視角與選型思路

內容簡介

物聯網開發重新定義瞭“全棧開發”的範圍。Python作為一門快速發展的語言,已經成為係統集成領域的優選語言之一,其可覆蓋從電路邏輯設計到大數據分析的物聯網端到端開發。各領域開發者可以利用Python交叉涉足物聯網設備、邊緣計算、雲計算、數據分析的工程設計。

《從芯片到雲端:Python物聯網全棧開發實踐》嘗試讓讀者建立物聯網設計的整體概念,從基礎概念開始,到相關技術選型、開源工程、參考設計與經驗分享。無論是物聯網領域的創業者,還是係統架構師,都可從本書中獲得靈感。本書對於嵌入式開發領域的開發者尤具學習價值,利用Python可加快開發迭代速度、降低開發成本,並可以基於嵌入式Python建立完整的物聯網軟硬件生態。

作者簡介

劉凱,服務於微電子行業二十餘載的資深工程師。曾在飛利浦半導體(即NXP恩智浦半導體前身)任資深工程師,從事軟、硬件開發與産品設計等工作,有用匯編/C/C++開發嵌入式係統固件、用Perl/Python腳本做開發支持工具、用PHP/Java/Python做設備雲和Web應用的豐富經驗。現作為獨立係統集成開發商,專業從事物聯網相關項目設計和谘詢服務,主攻嵌入式、RFID、微控製器、物聯網、WSN、Linux、Python、開源等領域。

精彩書評

前幾年國內引進瞭Chris Anderson的《創客:新工業革命》。打那時候開始,國內流行起“創客”風潮。“創客”這個詞果真是一個洋氣的舶來品,很多國人姑且把它看成硬件創業的預備役。但是大洋彼岸原産地的人們倒是樸實得可愛:織個毛衣,搞個室內大棚蔬菜。當然高科技類的自然少不瞭搗鼓一下機床,焊一塊闆子,這更像是一種DIY的懷舊文化:更加純粹和快樂。做一名純粹的創客並不容易,畢竟要抽齣一定的時間和精力。直到現在我依然惦記著自己那颱完成瞭一半的 3D 粉末打印機,而它就靜靜地躺在儲物箱裏。那時候的我已經開始為創業做前期準備,但商業項目和自己在創客空間玩的東西沒啥關係,終究自娛自樂和商業有差彆。

遇見 Allan 的時候,他也在努力從創客轉變成創業者。我很驚詫於他雖然技術嫻熟,也曾負責NXP産品技術與市場,卻依然對技術保持著孩童般的初心,真的不多見啊。離開NXP後,Allan決定成為一名自由職業者。靠著自己紮實的技術,從前端到後颱,從硬件到軟件,他一個人搞起瞭物聯網的項目和産品。我們時不時在綫上談論可行的産品和市場策略。雖然我對硬件不熟悉,但是由於自己當時就職於PTC,擁有些許物聯網後颱軟件的認知,就這樣我們相互參照著學習,並努力將其付諸實踐。

2015年5月,我離開瞭PTC並投身於機器視覺領域的創業,但依然保有對物聯網的熱情,尤其關注工業物聯。而 Allan 在這幾年的實踐中積纍瞭全棧開發的經驗。終於有一天,他覺得是時候將他獨自一人的全棧開發經驗記錄下來,並傳播給這個領域的開發者瞭。我自然非常支持他,但是獨自寫一本技術類的書,這是多麼考驗人呀。之後和 Allan 的交流變少瞭,我想象得齣他獨自在房間碼格子的情形。半年後,這本書的初稿終於紮紮實實地完成瞭。

創業者和分析師們總愛重復地問一個問題:物聯網的風口有沒有來?我們很難精準地去預判某個時間節點,但假如物聯網是一個不遠不近的方嚮的話,我們當下能夠做的便是順著産業的脈搏而跳動。類比一下 PC 和移動互聯網,我們依然處於物聯網大規模商業化的早期。但是最終我們會迎來萬物互聯。讓我激動的是萬物互聯的基礎架構成熟後,在各個行業以及各個利基市場將會湧現齣各種“新物種”,推動著商業和産業進一步提高效率,進一步打破邊界。而對於希望投身於這個行業的技術人員來說,應該盡量拋棄這些華麗的時髦術語,迴歸技術本身。這本書平實地記錄瞭讀者需要瞭解和掌控的基礎知識;與此同時,它從單一語言全棧開發的概念齣發梳理瞭一個完整的流程,而全局觀的梳理能夠更好地幫助技術人員去理解技術的本質。

技術總是在飛速地發展,書本記載的技能需要不斷地升級更新。但是我能感受到 Allan 更希望傳達的創客精神。創客願意從零開始建一棟樓,他們或許不能建成一座摩天大廈,但至少也會築成一幢彆具一格的小樓房。這種純粹的樂趣隻有從動手實踐中纔體會得齣來。但人們的生活節奏總是很匆忙,有這麼一本類似於“寶典”的書,可以加快看官您動手的速度和效率。但願您能享受從零開始搭建一個物聯網項目或者産品的過程。

張成 上海疊層科技聯閤創始人


目錄

第1章 物聯網簡介 1

1.1 物聯網定義 1

1.2 物聯網發展趨勢 1

1.3 物聯網應用與技術 2

1.3.1 物聯網核心價值 2

1.3.2 物聯網發展階段 3

1.3.3 物聯網分層 5

1.3.4 物聯網數據傳輸與網絡拓撲 5

1.3.5 物聯網實施所需技術棧 8

1.3.6 標準、現狀與未來 10

1.4 本章小結 16

第2章 Python語言基礎 17

2.1 Python的由來與特徵 19

2.1.1 概述 19

2.1.2 設計定位與哲學 19

2.1.3 優點與缺點 20

2.2 Python與物聯網開發 22

2.3 獲取Python資源 24

2.3.1 Python主程序 24

2.3.2 Python文檔 24

2.3.3 Python PyPI 24

2.4 Python解釋器運行環境 26

2.4.1 REPL交互模式 26

2.4.2 直接運行與模塊運行 26

2.4.3 腳本文件直接運行 27

2.4.4 源程序文字編碼與結束符 28

2.5 Python類型與語法 29

2.5.1 動態類型 29

2.5.2 傳值與傳引用 30

2.5.3 數據類型 31

2.5.4 內置類型 32

2.5.5 內置類型的普適操作 34

2.5.6 數值類型 35

2.5.7 布爾類型 37

2.5.8 迭代器類型 37

2.5.9 生成器類型 38

2.5.10 yield錶達式 39

2.5.11 序列類型 39

2.5.12 set集閤類型 54

2.5.13 映射類型 55

2.5.14 其他類型 56

2.5.15 控製流 59

2.5.16 內置函數 61

2.5.17 用戶自定義函數 62

2.5.18 模塊 65

2.5.19 輸入/輸齣 68

2.5.20 麵嚮對象編程 74

2.5.21 進程和綫程 82

2.5.22 錯誤和異常 90

2.6 Python標準庫概覽 93

2.7 本章小結 94

第3章 Python語言進階 95

3.1 HOWTO:常見任務和解決方案 95

3.1.1 數據類型轉換 96

3.1.2 數據的調試打印 100

3.1.3 數據類型資源優化 102

3.1.4 數據結構與算法 102

3.1.5 數據緩存 103

3.1.6 數據多路復用和解復用 104

3.1.7 數據序列化和反序列化 107

3.1.8 數據壓縮和解壓縮 119

3.1.9 數據加密 120

3.1.10 數據傳輸 121

3.1.11 數據後處理 121

3.1.12 數據持久化 121

3.1.13 數據交換 122

3.2 HOWTO:函數式編程 123

3.2.1 高階函數 123

3.2.2 map函數 124

3.2.3 reduce函數 124

3.2.4 filter函數 124

3.2.5 sorted函數 125

3.2.6 返迴函數 125

3.2.7 閉包 126

3.2.8 匿名函數 126

3.2.9 裝飾器 127

3.3 HOWTO:並發運行模型 131

3.3.1 協程 131

3.3.2 I/O模型 134

3.4 HOWTO:日期與時間 136

3.4.1 類型轉換 136

3.4.2 時區的處理 138

3.5 Python版本遷移 139

3.5.1 Python 2與Python 3的區彆 140

3.5.2 Python 2到Python 3的流程 140

3.5.3 多個Python版本共存 140

3.5.4 virtualenv 141

3.5.5 Windows多個版本共存 141

3.5.6 Linux多個版本共存 142

3.6 其他常見技巧 143

3.6.1 常數類型的模擬 143

3.6.2 枚舉類型的模擬 143

3.6.3 開發自定義模塊 144

3.7 Python與其他語言 145

3.8 Python語言擴展 151

3.8.1 C語言擴展Python 151

3.8.2 ctypes訪問Windows DLL 153

3.8.3 Jython訪問Java類 154

3.8.4 IronPython訪問.NET 155

3.9 Python加速 157

3.9.1 PyPy 158

3.9.2 Cython 159

3.9.3 PyCUDA 159

3.9.4 PyOpenCL 159

3.9.5 Theano 159

3.9.6 Nuitka 159

3.10 本章小結 160

第4章 嵌入式係統開發 161

4.1 嵌入式係統硬件分類 162

4.1.1 MCU 162

4.1.2 MPU 163

4.1.3 DSP 163

4.1.4 SMP 164

4.1.5 異構大小核 164

4.1.6 FPGA原型 165

4.1.7 SoPC 165

4.1.8 GPU 167

4.1.9 哈佛結構和馮?諾依曼結構 168

4.2 電路原型設計 168

4.2.1 集成電路設計流程 170

4.2.2 模擬電路原型設計 170

4.2.3 數字電路原型設計 175

4.3 常見嵌入式微控製器(MCU) 179

4.3.1 MCU市場狀況 179

4.3.2 Arduino/Wiring 180

4.3.3 ARM mbed 181

4.3.4 設計專屬架構和專屬MCU 182

4.3.5 ARM MCU差異化競爭 182

4.4 常見嵌入式處理器和主闆 184

4.4.1 ARM架構 185

4.4.2 其餘的ARM Linux主闆 188

4.4.3 MIPS開發闆 190

4.4.4 x86 mini-ITX 191

4.5 常見傳感器和執行器 192

4.5.1 虛擬傳感器 193

4.5.2 智能傳感器 193

4.5.3 專用傳感器 194

4.5.4 執行器 195

4.6 物聯網通信集成電路 196

4.7 嵌入式係統開發語言演進 197

4.7.1 從匯編到嵌入式C 197

4.7.2 從C到C++ 199

4.7.3 壓縮C++的係統消耗 199

4.7.4 C++適閤物聯網開發 200

4.8 C/C++的編程模式和技巧 204

4.8.1 C/C++設計模式 205

4.8.2 迴調函數 206

4.8.3 有限狀態機模型 209

4.8.4 善用結構體 211

4.8.5 C/C++協程 214

4.9 開發生態選擇 215

4.9.1 工業標準與廠傢私有指令集架構 215

4.9.2 硬件與軟件平颱選擇 215

4.9.3 編譯器選擇 216

4.10 常見操作係統 217

4.10.1 無操作係統 217

4.10.2 RTOS的優勢 218

4.10.3 uC/OS 219

4.10.4 Keil RTX 219

4.10.5 mbed RTOS與mbed OS 220

4.10.6 FreeRTOS 221

4.10.7 Linux是開發復雜聯網設備的現實選擇 222

4.11 物聯網中間件 227

4.11.1 WSN堆棧 227

4.11.2 TCP/IP 227

4.11.3 USB 227

4.11.4 FAT/FS 228

4.11.5 GUI 228

4.11.6 Terminal 228

4.11.7 MQTT 228

4.11.8 CoAP 229

4.12 物聯網安全性 230

4.12.1 安全相關芯片 230

4.12.2 安全中間件 231

4.12.3 Python安全算法 232

4.13 設備固件更新 232

4.13.1 固件更新技術發展史 232

4.13.2 本地固件更新 234

4.13.3 遠程固件更新 234

4.13.4 固件升級定製 234

4.14 各類串口實現聯網 235

4.14.1 串口協議的選擇 235

4.14.2 模擬串口設備 236

4.14.3 其他類型虛擬設備 238

4.14.4 ISP編程器 238

4.14.5 串口設備監控器 239

4.15 本章小結 239

第5章 設備連接和編程接口 240

5.1 設備連接概述 240

5.1.1 嵌入式係統連接層次 240

5.1.2 選擇正確的連接方案 241

5.1.3 具體落實連接設計 241

5.1.4 本章內容安排 242

5.2 連接能力匯總 242

5.2.1 連接由芯片開始 243

5.2.2 芯片內部係統總綫 245

5.2.3 芯片間連接技術 246

5.2.4 設備間連接 249

5.2.5 設備組網 250

5.2.6 設備組網與聯網的無綫技術 253

5.2.7 連接性迴顧 266

5.3 Linux文件係統 266

5.3.1 設備即文件 266

5.3.2 設備文件係統 267

5.3.3 Linux設備文件的演變 268

5.3.4 文件I/O操作 271

5.3.5 Linux硬件編程 272

5.4 並行接口 273

5.4.1 老舊的PC並行接口 274

5.4.2 高速總綫 274

5.4.3 GPIO 274

5.4.4 Linux訪問GPIO 275

5.4.5 GPIO的Python包 276

5.5 串行接口 277

5.5.1 異步通信串行口 277

5.5.2 I2C總綫 284

5.5.3 SPI總綫 290

5.5.4 與其他硬件平颱相關的Python包 294

5.6 USB總綫 296

5.6.1 USB Endpoints 297

5.6.2 USB Device/Host/OTG 297

5.6.3 USB 3.0 297

5.6.4 libUSB 297

5.6.5 PyUSB 298

5.6.6 標準化USB橋接 299

5.6.7 與USB相關的其他設計 301

5.7 Linux網絡設備驅動 301

5.7.1 TCP/IP套接字編程 301

5.7.2 IEEE 802.3到IEEE 802.11 302

5.7.3 網絡通信實現方案 302

5.7.4 私有通信協議棧 305

5.7.5 短距離無綫連接 307

5.8 工業總綫 310

5.8.1 CAN總綫 310

5.8.2 LIN總綫 312

5.8.3 其他ASIC 313

5.8.4 定製Python擴展 313

5.8.5 Windows DLL 314

5.9 本章小結 314

第6章 嵌入式Python虛擬機 315

6.1 嵌入式高級語言平颱大薈萃 315

6.1.1 高級語言與二次開發 315

6.1.2 BASIC 319

6.1.3 Java 319

6.1.4 Lua 322

6.1.5 JavaScript 322

6.1.6 .NET 323

6.2 前一代Python虛擬機 323

6.2.1 Telit GPRS模塊 323

6.2.2 Symbian 325

6.2.3 Windows CE 325

6.2.4 OpenMoko 325

6.3 深嵌入式Python平颱 326

6.3.1 LEGO EV3 326

6.3.2 TinyPy 326

6.3.3 嵌入式Python的局限 327

6.4 PyMite 328

6.4.1 硬件平颱 328

6.4.2 維護者 329

6.4.3 pymbed分支 329

6.4.4 開發現狀 331

6.4.5 文檔 332

6.4.6 源碼樹 333

6.4.7 使用流程 335

6.4.8 實踐 336

6.4.9 工程小結 337

6.4.10 網絡資源 338

6.5 VIPER/Zerynth 338

6.5.1 硬件平颱 339

6.5.2 Zerynth Studio 340

6.5.3 與標準Python的區彆 341

6.5.4 快速啓動 342

6.5.5 坎坷的使用過程 342

6.5.6 Zerynth目錄結構 343

6.5.7 硬件相關庫 344

6.5.8 其他特性 355

6.6 MicroPython 356

6.6.1 工程背景知識 356

6.6.2 在綫評估網頁 358

6.6.3 官方硬件平颱分支 358

6.6.4 衍生項目 359

6.6.5 UNIX版本 360

6.6.6 MicroPython庫 363

6.6.7 STM32HAL分支 365

6.6.8 NUCLEO-F401RE適配 367

6.6.9 pyboard評估 372

6.6.10 異步處理和中斷處理 389

6.6.11 中斷處理的普遍問題 392

6.6.12 使用心得 395

6.6.13 商品化與知識産權 396

6.6.14 BBC microbit 396

6.7 Linux與Python 398

6.7.1 Linux中Python的運行環境 398

6.7.2 交叉編譯CPython 401

6.7.3 交叉編譯MicroPython 402

6.7.4 Jython運行環境 404

6.7.5 Android SL4A 406

6.8 本章小結 407

第7章 Python應用APP 408

7.1 基於字符的人機界麵 409

7.1.1 命令行參數 409

7.1.2 字符終端開發 410

7.1.3 ncurses 411

7.2 桌麵GUI開發 412

7.2.1 Tkinter 413

7.2.2 wxPython 414

7.2.3 Boa Constructor 415

7.2.4 wxGlade 416

7.2.5 PyGTK 417

7.2.6 PyQt 419

7.2.7 PySide 420

7.2.8 Enthought 421

7.2.9 Cocoa+PyObjC 423

7.2.10 Java AWT 424

7.2.11 IronPython與WPF 425

7.2.12 其他UI 425

7.3 本地Web GUI 426

7.3.1 與WebKit相關的Python包 427

7.3.2 OneRing 427

7.3.3 Pyjs 427

7.3.4 Python Flexx 428

7.4 本地可執行文件 429

7.4.1 Linux可執行文件 429

7.4.2 Mac OS X應用程序包 430

7.4.3 Windows可執行文件 430

7.4.4 pyinstaller 430

7.4.5 py2exe 430

7.4.6 py2app 430

7.4.7 cx_Freeze 431

7.4.8 Windows係統服務 431

7.4.9 Windows定時任務 432

7.4.10 Linux係統服務 433

7.4.11 Linux定時任務 435

7.5 移動APP開發 436

7.5.1 響應式網頁 437

7.5.2 PhoneGAP應用開發 437

7.5.3 SL4A 437

7.5.4 QPython開發 441

7.5.5 Kivy 443

7.5.6 其他開發方式 449

7.6 本章小結 449

第8章 Python開發輔助支持 451

8.1 物聯網開發需要不斷優化 452

8.2 專屬小工具 452

8.3 原型驗證 458

8.4 代碼生成器 459

8.5 軟件測試 461

8.6 文檔生成器 468

8.7 文檔操縱 477

8.8 國際化與本地化 479

8.9 配置管理 484

8.10 數據與素材處理 486

8.11 通信報文分析 495

8.12 與Arduino/mbed相關的Python包 497

8.13 虛擬儀器 509

8.14 3D/VR/AR 512

8.15 本章小結 515

第9章 物聯網服務器端設計 516

9.1 物聯網計算模型 517

9.2 物聯網與互聯網設計異同 526

9.3 物聯網網關與邊緣服務器 535

9.3.1 Python socket服務器 536

9.3.2 pyserial RFC2217 536

9.3.3 SubGHz網關panStamp 537

9.3.4 Rascal micro 538

9.3.5 Java IoT網關 539

9.4 物聯網設備接入協議 540

9.5 高可用性與高並發性 575

9.7 Web開發框架 589

9.8 物聯網安全 597

9.9 服務器交付 603

9.10 服務器運維 605

9.11 物聯網係統設計實踐 614

9.12 本章小結 625

第10章 融閤應用與數據分析 626

10.1 物聯網是可編程的 626

10.2 數據統計、分析和挖掘 630

10.3 采集整理自有數據 633

10.4 采集第三方數據 637

10.5 數據分析 647

10.6 數據可視化 663

10.7 本章小結 682

推薦書目與結束語 683


(篇幅有限,完整目錄請查看本書)

精彩書摘

序言

筆者曾經長期服務於微電子行業,現在從事物聯網相關項目設計和谘詢服務。

1995年畢業後,筆者加入瞭飛利浦半導體上海技術中心,任軟件工程師。在此期間的主要工作是使用匯編語言為國內客戶進行各類顯像管(CRT)彩電的固件開發。當時的技術環境,8051都已經非常普及瞭,而飛利浦半導體彩電和固定電話技術方案中的控製器卻依舊采用老舊的Intel 8048內核MCU。該內核架構有許多限製:比如超過2KB代碼需要切換代碼段,缺乏高級語言支持,等等。雖然架構古老,但這個業務卻一直是當時飛利浦半導體的“現金牛”(即主要利潤來源)。

筆者後轉入産品市場部,在那裏可以接觸到許多炙手可熱的産品綫。其中,筆者負責的産品如下。

8051控製器:配閤中國閤作夥伴,如(北航)中國單片機實驗室、南京萬利、南京偉福、廣州周立功等單位,閤作推廣LPC764/9XX及後來的ARM LPC係列。

通信産品:8048內核電話機MCU、傳呼機、DECT和中國數字無繩電話芯片組。

智能卡産品:包括電話卡、CPU卡,以及最著名的HF-RFID Mifare、LF-RFID Hitag RFID和車用防盜鑰匙。

DSP産品:Trimedia VLIW(超長指令集)DSP,用於視頻電話和媒體處理。

CPLD:低功耗CoolRunner CPLD,後轉售給Xilinx。

PDA:基於MIPS R3000內核的Windows CE PDA方案。

後來,筆者又重新拾起軟件開發的工作,主要負責基於8051/MIPS的LCD/DTV的客戶化固件開發。

應該這麼說,在飛利浦的從業經驗使得筆者積纍瞭嵌入式開發經驗,開闊瞭産品綫視野,並積纍瞭多方麵的技術興趣和行業人脈。同時,在開發這些嵌入式産品的過程中,筆者開始采用各類腳本語言來做代碼生成和其他開發工具。

2008年,飛利浦半導體部獨立成為NXP公司之後,筆者開始瞭自己的創業之路。到目前為止,筆者獨立設計過以下産品和參考設計:

基於Cypress PSoC的RFID/UART/GPRS/TPMS模塊(C)。

基於SDIO閃存卡的NFC接口(FPGA/CPLD)。

Wi-Fi強製門戶及熱點分享網站(PHP)。

GPRS+GPS AVL設備及網站(C/Java/PHP)。

TI C2800 DSP ANC主動噪聲抑製係統(C/ASM)。

網絡爬蟲,用於抓取超市的POP海報分發(Python+PHP)。

Android翻譯APP(Java)。

電子貨架標簽係統,第一個從設備到APP的完整原型設計(C+Python網關)。

GAP創客電子模塊,基於NXP/Freescale/ST的M0/M3處理器,並提供Bootloader和ISP軟件(C/C++/Python)。

工業門物聯網(C/C++/Python)。

呼吸機物聯網(Python/Golang)。

電梯物聯網(Python)。

EPD電子模塊(C++/Python)。

RFID分類錢包(國傢實用新型專利,已授權)。

GPS資産定位係統(C++/Python)。

電信CDMA基站監控設備(C++/Python)。

VoLTE高清語音監控設備(C++/Python)。

分級基金及股票監控報警係統(Python)。

離開NXP之後,筆者的設計不再受限於原公司的技術平颱所涉及的消費電子産品領域,而是擴大到瞭互聯網與物聯網領域。筆者的個人體驗是,無論是設備端還是服務器端,都有許多技術可以深入學習。但是兩者融閤,技術復雜度卻呈現幾何級數上升。

不同領域有不同的優勢語言。一般來說,CPLD/FPGA使用VHDL/Verilog,MCU/SoC固件開發使用C/C++,桌麵開發使用C#/VB等,服務器開發使用Java/PHP/JavaScript/Python/Golang,手機APP使用Java/Objective-C。

所以,筆者在工程實踐中,一直在使用匯編/C/C++開發嵌入式係統固件,並使用Perl/Python腳本做開發支持工具,同時采用PHP/Java/Python做設備雲和Web應用。一個完整的物聯網應用涵蓋許多環節:從數字邏輯電路設計,到硬件設計、固件設計、網關軟件設計、服務器軟件和網頁設計、APP設計,甚至模具的3D設計。齣於工作的需要,即使環節長,筆者也不得不像“萬金油”一樣,親自參與全過程的設計工作。雖然無奈,但筆者的修煉結果是,比一般硬件團隊略懂服務器開發,比一般服務器/APP開發團隊略懂硬件開發,而且大緻瞭解瞭物聯網的許多具體技術。

筆者的個人體會是,物聯網環節太長瞭!無論是設計、編碼還是調試,物聯網的龐雜特性都非常明顯。首先設計和編碼時間就很長,尤其在係統聯閤調試時,需要使用多種開發工具(仿真器、目標硬件、儀錶、服務器、Web控製颱)。在這個階段,有時候需要多颱計算機纔能夠完成調試任務。

以超市貨架管理項目為例,其涉及WSN協議規劃、節點端和網關端設備的固件開發和協議實現、服務器設計、手機APP、條形碼和二維碼掃描。此項目筆者整整開發瞭一年纔交付給客戶,而且調試起來還挺麻煩。

個人單槍匹馬,精力有限,無法同時兼顧所有環節,因而開發的項目格局不會太大。物聯網開發應該為團隊閤作,甚至多個團隊之間進行閤作。每個團隊對於各自的環節負責,做到接口標準化。這樣纔能夠復用已有的經驗和模式,並充分發揮其邊際效應。即便是團隊閤作,也需要將自己使用的工具數量降低到最少,至少需要尋找到覆蓋麵較廣的工具來開發。這也是現在許多“全棧”開發的目的。

采用單一語言做全棧開發

全棧開發最初齣現在互聯網行業,指的是能夠同時開發網頁前端和服務器後端。這包括能夠做全棧開發的技術和掌握這些技術的工程師。該行業最典型的全棧開發語言是JavaScript。

在物聯網行業中,全棧開發的含義被延伸瞭。筆者推薦以Python作為全棧開發語言。本書的全棧開發涉及IC(集成電路)設計、設備端(電路和係統)、服務器(含網頁)端,以及移動端和數據分析端。使用單一語言可以多方麵降低成本:

學習周期短,降低人力成本。

交付時間短,降低開發成本。

人力資源供應充分,降低人均開發成本。

容易形成生態,構建開發者生態圈,實現眾包。

代碼復用性強,代碼可重用,開源市場有不少現成方案,可降低總體開發成本。

設備可以虛擬化,物理設備可以通過同一代碼模擬齣來,以加快工程啓動周期,降低開發成本額和減少開發者間的責任推諉。

綜上,物聯網開發涉及麵龐雜,開發周期長,尋找一種覆蓋麵廣的編程語言和方法對企業和開發團隊有現實意義。

Python用於全棧開發

在筆者眼裏,承擔全棧開發的語言可以是Java,也可以是JavaScript,還可以是Python。由於互聯網的發展,加之JavaScript在前端語言中的優勢地位,使得它開始延伸到瞭服務器後端和設備端。而Java原本就在設備端和服務器端都很有優勢。從發展曆史上看,在嵌入式平颱中最早齣現的是Java,最近纔開始齣現JavaScript和Lua等動態語言。這都是服務器端企圖深入到嵌入式行業的努力。至於Python,由於其膠水特性,雖然性能不占優勢,但是開發速度快,比較適閤做全棧的原型開發。

之所以齣現企業和手機開發者力推Java開發,前端開發者力推Node.js開發前後端技術,某些群體力推Go的現象,除瞭技術本身的因素,許多情況下也是其教育背景和從業經曆所導緻的,即所謂齣身和基因所決定的。在此,個人經曆決定瞭筆者選擇Python作為自己的主力開發語言。

曾經看過一個關於如何在Java/JavaScript/C#/Python/Golang等幾種語言中選擇一種作為主力編程語言的漫畫式流程圖。其中有一個選擇:如果你喜歡樂高,那麼請選擇Python。仔細想想,Python的確很像樂高:

接口一緻性高。

粗顆粒,構建速度快,適閤原型。

有標準構件,如各種標準積木和標準庫。

具備大量的定製構件。樂高中存在定製的主題人物和機器人組件,而Python也有大量的C擴展庫和第三方應用庫。

在我國的港颱地區術語中,將Integrated Circuit翻譯為“積體電路”,即積木化的電路。而新齣現的各類集成技術,如SoC/SiP,即係統芯片和係統封裝,也是通過在電路IP領域和封裝領域的創新來實現更大規模的電路整閤。換而言之,不同規模的電路都是搭積木搭齣來的。所以,半導體行業應該會比較偏愛類似於積木的Python語言。

迴顧自己的從業和工程經曆,大概以下是筆者偏愛Python開發的原因:

在固件開發中,接觸到使用腳本語言(gawk)來設計代碼生成器簡化開發。

電子工程經驗,接觸並瞭解瞭許多企業的設備聯網需求。

互聯網工程開發經驗,接觸到瞭互聯網/物聯網領域的諸多環節。

在網站和APP開發經驗中,不得不使用多種編程語言用於軟件開發,瞭解工程管理的痛點。

Python作為一種膠水語言,可在物聯網及嵌入式係統中承擔大量任務,並可以部分替代VHDL/C/C++/Java/PHP/JavaScript等各類語言,或者與這些語言進行互相調用。但是讓一位工程師拋棄原有技術棧換用其他語言是睏難的。最初,筆者隻是在工程實踐中發現Python的“齣鏡率”相當高。在一些小場景中筆者嘗試使用Python開發後,積纍瞭一定的使用經驗。後來為瞭加速開發,筆者開始在客戶工程中大量使用Python進行原型驗證和服務器端開發。最終,Python成為筆者的主力開發語言。

說起來,筆者本人的經曆與Python的膠水特性很類似。筆者不能算是Python高手,所有的開發都是僅僅讀瞭最基本的演示代碼後就立即著手進行工程開發。筆者甚至連相關基本入門書都沒有看完整,就著手使用Python構建係統。缺乏耐心的代價就是不斷重新造輪子,即所謂的“重構”。不過,在不斷換“輪子”的過程中筆者充分體會到瞭Python的各種優點。

無論是麵嚮過程(POP)、麵嚮對象(OOP)、麵嚮切麵(AOP),還是更加抽象的函數式編程(FP),Python都可以支持。編程思想隻有在項目中纔能被不斷加深理解。

這一點,Python對筆者的幫助非常大。之前,雖然也寫過C++/Java程序,但是實際上真正讓筆者完成從麵嚮過程到麵嚮對象編程思維轉換的語言恰恰是Python。

相當多的Python代碼,一開始編寫的時候是采用各類函數的麵嚮控製編程,腳本化的傾嚮很強。隨著代碼復雜度的增加,筆者不得不反復重構代碼,並主動引入瞭OOP的編程方法。體會瞭OOP的好處後,促使筆者反過來在設備端設計中重構C++代碼。在物聯網服務器端開發時,筆者接受瞭麵嚮切麵的概念。在編寫本書的時候,筆者又學習瞭函數式編程。在以後的開發中,筆者會有意識地增加更加抽象的編程思想以簡化日常的編程設計。

實際上,在從事物聯網的後端設計時,許多朋友強力推薦筆者使用Java進行開發。因為Java在企業級應用中積纍瞭許多可重用的設計,是企業級應用的首選語言。但是筆者接觸並熟悉Python之後,堅持使用Python開發網關和服務器。筆者發現使用什麼語言真的不那麼重要,隻要自己熟悉就好。況且Python還可以用Jython來對接Java重用Java資源。說起來Python和Java是兩種極端:Python可以在許多語言中實現,而許多語言利用Java VM來運行。

熟悉瞭Python後,筆者就在日常工程中堅持使用Python:在端口擴展與仿真、代碼和文檔生成、Web/IoT服務器及嵌入式平颱Python VM中都可以用到。而且每次開發後,總能夠保留一些Python工具提交給開源社群,或者以後自己用。這也是不斷自我強化的過程:熟悉一種工具,就會不斷地利用這種工具去解決問題。

Python的缺點及應對措施

首先,許多開發者認為Python的運行速度較慢,尤其無法與C/C++編譯的原生代碼相比。由於VM的設計架構不同,Python,尤其是CPython比Java/Lua還要慢。Python作為一種開源的語言,即使有各種各樣的問題,利用開源社群的力量也可以更容易地找到各種解決方案。現在使用JIT技術的PyPy加速已經非常成熟,在許多場閤都可以應用。Cython也是一種性能極高的擴展,可以實現與Golang類似的性能。配閤libuv異步庫,Python的網絡性能不輸於任何一種編程語言。性能不是唯一的要素,Python的強大在於:生態的完整,開發速度快,運行速度也很快。

其次,Python語言和代碼本質上是開源的,所以更加適閤開源軟件使用。如果要實現閉源的商業化軟件,可以將Python源碼編譯成pyc,或使用各類C和其他擴展幫助保護核心設計,其代價是損失瞭Python跨平颱的特性(除非擴展中也采用瞭某種跨平颱技術,比如JVM)。

最後,Python的GIL問題也很有名,對多綫程設計不利。解決方法有很多:多進程、協程及其他Python實現(如Jython、PyPy、Cython等)均可以迴避這個問題。

前言/序言

本書講述如何以Python為主要編程語言,實現“從芯片到雲端”的物聯網應用係統快速開發和係統擴展。通過閱讀本書,讀者可以充分體會Python作為一門全棧開發語言,是如何在物聯網的設備端、應用端、服務器端和數據端環節中發揮作用的。

編寫本書的初衷是為瞭讓準備或者已經從事物聯網開發的讀者能夠通過Python語言縮短相關學習和開發周期;同時與大傢分享一些經驗教訓,希望能夠讓讀者在具體開發中迴避各種“坑”。這不僅對開發團隊,對於企業甚至投資者決策也是有益的。

大多數物聯網相關書籍比較關注物聯網係統和服務器端設計,但是物聯網與互聯網的設計差彆在於:物聯網係統設計受限於有限的設備計算能力、巨大的連接數量、獨特的數據特徵。所以完整的物聯網係統設計需要考慮的要素比互聯網更多,需要掌握的知識麵既廣且深。如何在短期內實現係統上綫,並安全、平滑地實現規模擴展一直是大傢思考的問題。開發者可以采用的對策如下:

減少開發語言和工具種類。

使用成熟的參考設計和編程框架。

使用主流的雲計算服務和可擴展的係統設計。

開源硬件、軟件設計和並行開發模式。

有許多事情“開弓沒有迴頭箭”。物聯網的最大特點是大量的定製需求,而且上下環節的銜接往往存在技術依賴性,某個環節的決定往往會對其他環節的實施帶來很大的影響,並可能造成開發團隊間的責任推諉。這需要係統設計者事前做許多調研功課。筆者專注於設備域和服務器域,但本書力求帶來更寬的視野,包括物聯網相關的應用、産品和生態,介紹不同的係統架構和雲計算服務,並在不同的技術選項中推薦幾種比較適閤工程實施和實際需求的主流組閤。

在收集資料的過程中,筆者發現Python作為一門通用編程語言,應用範圍非常寬泛。相信本書內容中有許多物聯網相關的Python應用是齣乎大多數人意料的:

支持SPICE/IBIS仿真與VHDL設計和電路的自動測試。

可以在許多流行的8/16/32 MCU上運行,包括AVR/PIC/ARM/MIPS。

支持絕大多數MCU/MPU/CPU的外設和工業總綫,而且編程接口非常靈活。

可以在各種類型的Linux上運行多種Python運行環境,包括CPython、Jython和各類嵌入式Python。

通過Jython運行於Java Runtime中,與Java類庫完美結閤,切入企業級應用和大數據分析。

可以跨平颱開發桌麵應用和手機應用。

大量現成的網絡安全和分析工具,可幫助開發者定位通信報文錯誤,或尋找係統安全漏洞。

提供大量的輔助工具,包括文檔、軟件工程、虛擬儀器、媒體處理等,為此筆者特地預留瞭第8章進行羅列。

物聯網網關、服務器架構、數據分析和可視化、虛擬設備、通信協議定製等領域開發效率超高。

從SPICE/VHDL開始,到服務器,Python實現瞭“從芯片到雲端”的全棧開發。筆者希望這些內容和案例能夠幫助開發者在啓動項目前對開發有全局性的瞭解,並做齣正確選擇。

同時,本書的寫作過程采用瞭Python相關工具,也是“全棧開發”實例之一。

格式:將Python文檔中常見的reST/Markdown作為基礎書寫格式。

編譯:采用Sphinx將reST章節編譯成流行的HTML網頁、ePub電子書籍。

轉換:采用Pandoc(Haskell)轉換成交付給齣版社的docx主流文檔格式。

讀者可以將本書看作單一編程語言的物聯網應用小百科,通過書中的簡單例子大緻瞭解物聯網的開發流程,並可以根據自己的興趣,在每章的延伸閱讀 清單中深入探索、掌握物聯網開發技術的具體實現細節。

目標讀者群

本書的目標讀者群是以下兩大類開發者。

互聯網開發團隊:熟悉移動端APP的開發、服務器架構和網頁前端開發,但對於傳統製造業的技術領域,如芯片設計、硬件設計、固件設計、硬件係統集成,以及批量生産和庫存管理缺乏足夠的瞭解。

設備開發團隊:主要是傳統製造業産業鏈中的半導體供應商、獨立設計公司、設備製造商。他們熟悉硬件設備的設計和流程,但普遍對於互聯網應用和物聯網架構缺乏足夠的瞭解。

當前的製造業變化趨勢是,設計與平颱標準化,導緻産品同質化競爭嚴重。這使得傳統製造業在市場中逐漸喪失瞭議價權和話語權,處於被整閤的被動地位。這些企業和團隊在物聯網時代異常焦慮,急需掌握數據接入和數據分析技術,以增加市場份額,並提升市場競爭力和議價權。本書第9章主要講述物聯網服務器後端開發,可以幫助傳統製造業瞭解服務器端和數據端的發展趨勢、大緻的技術方案構成,並可以利用Python做些簡單的設備測試。

除瞭工業物聯網、行業物聯網外,消費端智能硬件領域的物聯網開發案例非常多,這是市場熱點之一。許多創業團隊雖然可以自行設計APP,搭建服務器,但是團隊往往缺乏設備端製造經驗,並仍在各類硬件問題中艱苦跋涉,苦苦摸索。本書在第4章中介紹瞭成熟的元器件、連接模塊和實時操作係統,配閤Python快速原型開發能力,讓項目可以快速上市之餘,還可以為設備添加各種“智能”應用。

此外,許多讀者可能希望從全局角度瞭解物聯網應用、各類技術方案甄選標準,以及具體技術細節。本書也盡可能地進行羅列,並就一些常見問題特彆加以說明。

總的來說,本書適閤對物聯網及相關熱點,如智能硬件、工業4.0、萬物互聯的應用與實現技術感興趣的人群閱讀。目標讀者群除瞭互聯網從業者、微電子和OEM/ODM製造商、應用係統集成商,還包括學生、教師、創客、極客、Python語言愛好者、産品經理、項目經理,企業高管和創投基金經理等。

最低閱讀要求

由於本書是一本技術書籍,因此需要讀者具備一定的編程經驗和技術熱情。如果讀者對於Python基本語法有一定的瞭解那就更棒瞭。即便沒有Python的使用經驗,相信Python易學易用的特點也可以讓讀者很快入門。

此外,由於代碼中大部分采用英語注釋,因此需要讀者具備基本的英語閱讀能力。

本書的目的

核心目的

為應用開發團隊提供設備端硬件、固件開發流程和開發工具方麵的工程建議,並提供一些可以用於與服務器對接的硬件平颱和參考設計。

為設備開發團隊,提供服務器前後端/移動端的係統架構、開發框架、生態平颱方麵的工程開發建議,提供可以不斷升級的可擴展架構和開發路徑,以滿足産品從原型測試、中試、量産到分布式規模生産係統整個産品生命周期的需求。

其他目的

分享基於IaaS/PaaS雲計算平颱的服務器開發經驗,包括設備雲、應用雲和大數據服務。

分享可快速部署的物聯網網關(Gateway)、邊緣服務器(Edge Server)原型設計。

匯集Python在計算機係統中方方麵麵的應用信息,並持續更新。

吸引各方閤力推動Python在嵌入式虛擬機/網關/服務器/大數據分析方麵的開源活動。

本書內容安排

物聯網環節長、技術龐雜,涉及的每種技術領域都值得大傢仔細鑽研學習。可以這麼說,許多話題和技術都可以單獨齣一本書。所以本書力求在有限的篇幅內,突齣物聯網特徵並使用Python落地生根,使之成為快速開發迭代的基礎;與此同時提示在Python應用中可能遇到的問題和解決方案,以降低讀者的學習成本。

本書以數據的流動方嚮,即數據的設備端采集、服務器接入、轉發、分析到用戶端的呈現為主綫,並以Python語言從入門到各個技術棧中的應用作為輔綫來安排章節。

本書內容編排經過多次斟酌和修改,最終按照以下順序介紹。

章節簡介

第1章 物聯網簡介 概述物聯網的定義、發展趨勢以及物聯網應用與技術等

第2章 Python語言基礎 數據類型、數據結構、內置函數和標準庫

第3章 Python語言進階 多種實現、與其他語言的接口、物聯網常見技巧

第4章 嵌入式係統開發 數字邏輯與模擬電路設計、C/C++固件開發以及主流的平颱與供應商

第5章 設備連接和編程接口 物聯網的多種連接性與編程接口以及Python支持包

第6章 嵌入式Python虛擬機 深嵌入式、嵌入式Linux最小係統以及各類Python虛擬機實現、演示

第7章 Python應用APP 在主流桌麵操作係統和移動端中的Python APP開發

第8章 Python開發輔助支持 在物聯網開發環節中的原型驗證、虛擬設備、數據分析等多個方麵的Python開發工具

第9章 物聯網服務器端設計 物聯網網關、邊緣服務器、Web/IoT服務、開發框架和連接選項

第10章 融閤應用與數據分析 科學計算、數據統計、數據挖掘和大數據分析平颱和工具,以及數據可視化

除瞭本書內容,筆者還整理瞭諸多書中提到的Python擴展包和演示代碼,並計劃依托齣版社網站和其他互聯網服務進行分發。本書為筆者一個人寫就,缺少專傢進行校對,本人水平有限,書中難免有疏漏、錯誤,歡迎讀者指正。但筆者精力亦有限,無法一一迴復,祈諒。

本書未包括的內容

因為篇幅的限製,也因為物聯網的特性,所以本書安排的內容比較繁雜。本書未能針對特定硬件、軟件、雲服務展開,也沒有針對物聯網提供完整的開源設計。這些希望讀者在書本之外展開。本書齣版後會依托各類互聯網服務(如GitHub、社交網站和BBS)展開後續的開源設計活動。

軟硬件環境

除非特殊應用和聲明,本文主要的操作環境為Windows 7(64位)及Ubuntu Linux 12.04(32/64位)。Python版本為V2.7.11和V3.5。

在微控製器方麵筆者推薦ARM mbed兼容的LPC/STM/KL開發闆,或Arduino;對於卡片電腦,推薦樹莓派或者兼容的國産Linux SBC;對於MicroPython,推薦在STM32F4XX/ESP8266開發闆上運行。

版權聲明

本書所附代碼和硬件,凡是筆者所做,皆采用LGPL協議,讀者可以自由用於任意目的;其餘軟件和硬件,請參考各自官網中的版權聲明。本書引用的圖片、代碼、圖錶等,其版權皆歸屬於所屬公司、網站和個人。本書引用這些資源主要用於說明目的,且盡量在每章延伸閱讀中標明齣處。如有遺漏,請聯絡筆者本人。

感謝

本書付梓需要感謝許多機構和個人。

知乎網站:本書的創作主題來源於筆者在知乎上的提問,並得到瞭知乎網友(包括齣版社編輯)的熱心解答、正麵鼓勵和推動纔能夠走到這一步。

張春雨先生(永恒的俠少),電子工業齣版社的策劃編輯:在知乎上遇見後,你一路推動本書的齣版。感謝你的耐心和鼓勵。

張成先生,物聯網創業夥伴:張成先生,物聯網創業夥伴:不斷鼓勵筆者繼續深入物聯網開發,並撥冗為本書作序。

EEWorld編輯nmg和版主dcexpert:他們提供瞭寶貴的MicroPython pyboard開發闆。

諸多開源項目的作者們:感謝大傢對於開源軟硬件項目的熱情和不厭其煩解答問題的耐心。

芯片供應商及分銷商:

NXP(恩智浦),感謝免費提供LPC係列開發闆。

Freescale(飛思卡爾,已與NXP閤並),感謝慷慨提供大量KL25的樣片及技術支持。

TI(德州儀器)及分銷商Serial(新曄科技),感謝提供WSN技術支持。

Cypress,感謝免費提供PSoC開發闆。

Fujitsu(富士通),感謝友情提供FeRAM RFID。

Atmel(愛特梅爾),感謝免費提供MCU、Wi-Fi和Crypto産品開發闆。

Nuvoton(新唐科技),感謝免費提供MCU開發闆。

最後感謝自己的父母和妻子,忍受筆者在放棄其他工程開發的情況下編寫本書。

輕吻女兒Kirin,謝謝你的耐心等候。

劉凱(奕辰,Allan K Liu)

2017夏,上海


用戶評價

評分

很厚實的書,介紹瞭物聯網的方方麵麵

評分

內容翔實,從端到雲,架構清晰

評分

書正在看,jd送貨就是快哦(⊙o⊙)哦

評分

物聯網開發重新定義瞭“全棧開發”的範圍。Python作為一門快速發展的語言,已經成為係統集成領域的優選語言之一,其可覆蓋從電路邏輯設計到大數據分析的物聯網端到端開發

評分

不錯,值得學習

評分

挺好的,買瞭好多本

評分

真是好書啊,值得收藏學習,瞭解一下知識

評分

價格有點高,挺厚的一本,希望有用,包裝撕沒撕開過都不知道,五星好評!

評分

幫同學買的,作為學校教材外的補充,京東活動入手很劃算,物流速度快,非常滿意

相關圖書

本站所有內容均為互聯網搜尋引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度google,bing,sogou

© 2025 book.cndgn.com All Rights Reserved. 新城书站 版權所有