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

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

《從晶片到雲端:Python物聯網全棧開發實踐》 一書作者劉凱 ,電子工業出版社2018年1月出版

內容提要

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

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

目錄

第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.2.1 單位轉化器 453

8.2.2 內碼轉換器 454

8.2.3 其他編碼轉換 455

8.3 原型驗證 458

8.4 代碼生成器 459

8.5 軟體測試 461

8.5.1 unittest單元測試 462

8.5.2 socket壓力測試 462

8.5.3 urllib2遠程記錄 463

8.5.4 PCBA測試 466

8.6 文檔生成器 468

8.6.1 文檔格式 469

8.6.2 文檔生成工具 473

8.7 文檔操縱 477

8.7.1 Doc文檔操縱 477

8.7.2 Excel表格操縱 478

8.8 國際化與本地化 479

8.8.1 gettext 479

8.8.2 Web多語種切換 482

8.8.3 字型檔檔案生成器 482

8.8.4 GB2312點陣字型檔提取 482

8.8.5 TTF字型檔提取 483

8.9 配置管理 484

8.9.1 軟體配置管理 484

8.9.2 軟體配置管理自動化 485

8.9.3 Git Bash 485

8.9.4 Dulwich/Gittle包 485

8.9.5 Python Subversion包 486

8.9.6 watchdog系統監控 486

8.10 數據與素材處理 486

8.10.1 二維碼顯示 486

8.10.2 多媒體相關軟體包 490

8.10.3 地理位置 494

8.11 通信報文分析 495

8.11.1 PyShark 495

8.11.2 pypcapfile 497

8.11.3 scapy和scapy3k 497

8.11.4 pcap Web分析 497

8.12 與Arduino/mbed相關的Python包 497

8.12.1 Arduino Prototyping 498

8.12.2 pyFirmata 501

8.12.3 Py2B 501

8.12.4 CmdMessager 501

8.12.5 mbed 504

8.12.6 mbed RPC 504

8.12.7 mbed-ls 505

8.12.8 Python-mbedtls 507

8.12.9 Python-xbee 508

8.13 虛擬儀器 509

8.13.1 實時顯示波形 510

8.13.2 Instrumentino 510

8.13.3 Vipy 511

8.13.4 PyVISA 511

8.13.5 Pythics 512

8.14 3D/VR/AR 512

8.14.1 PyOpenGL 513

8.14.2 PySoy 514

8.14.3 VPython 514

8.14.4 Printrun 3D列印 514

8.15 本章小結 515

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

9.1 物聯網計算模型 517

9.1.1 雲計算 517

9.1.2 Web PaaS與IoT PaaS 518

9.1.3 IoT PaaS供應商 518

9.1.4 PaaS/IaaS混合架構 524

9.1.5 霧計算 525

9.2 物聯網與網際網路設計異同 526

9.2.1 基礎架構 526

9.2.2 標準化程度 527

9.2.3 業務模式 527

9.2.4 系統構成 527

9.2.5 設備接入協定 528

9.2.6 數據特性 529

9.2.7 系統架構 530

9.2.8 數據持久層 532

9.2.9 大數據分析架構 534

9.2.10 業務耦合與分離 534

9.2.11 業務與數據融合 535

9.2.12 認證授權與計費 535

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.4.1 異步通信框架Twisted 541

9.4.2 Twisted 套接字伺服器設計 544

9.4.3 物聯網專用協定 558

9.4.4 CoAP 560

9.4.5 MQTT 564

9.4.6 mosquitto/paho 567

9.4.7 REST API 572

9.4.8 伺服器數據推送技術 572

9.5 高可用性與高並發性 575

9.5.1 並行與並發計算 575

9.5.2 網路I/O模型分類 575

9.5.3 架構最佳化的路徑 576

9.5.4 關係資料庫系統 576

9.5.5 SQL/NoSQL/NewSQL 578

9.5.6 Redis 579

9.5.7 MongoDB 580

9.5.8 時序資料庫 581

9.5.9 訊息佇列 583

9.6 業務與數據融合 585

9.6.1 網站許可權管理 585

9.6.2 認證授權與計費 586

9.6.3 OpenID 587

9.6.4 OAUTH 587

9.6.5 OpenID與OAUTH的異同 588

9.6.6 社交化硬體 588

9.7 Web開發框架 589

9.7.1 MVC模型 589

9.7.2 Web開發流程 589

9.7.3 Python Web百花齊放 590

9.7.4 Zope 591

9.7.5 Django 591

9.7.6 Flask 592

9.7.7 gevent提升性能 593

9.7.8 異步Web框架Tornado 593

9.7.9 異步網路框架Twisted 593

9.7.10 異步Web框架Cyclone 594

9.7.11 靜態網頁 594

9.7.12 TLS安全網頁 594

9.8 物聯網安全 597

9.8.1 物聯網安全現狀堪憂 598

9.8.2 作業系統安全 598

9.8.3 數據快取與數據持久層安全 599

9.8.4 Web框架與容器安全 599

9.8.5 遠程載入風險 600

9.8.6 Web前端安全 600

9.8.7 傳輸層安全 601

9.9 伺服器交付 603

9.9.1 虛擬機交付 603

9.9.2 Docker容器交付 603

9.9.3 VirtualEnv交付 605

9.10 伺服器運維 605

9.10.1 Linux定時任務 606

9.10.2 常見的定時任務 610

9.10.3 系統監控 611

9.10.4 集成化運維軟體 613

9.11 物聯網系統設計實踐 614

9.11.1 伺服器端需求分析 614

9.11.2 確定設備接入方式 616

9.11.3 物聯網的實時要求 617

9.11.4 EPIC IoT設備伺服器 617

9.11.5 EPIC架構最佳化 619

9.12 本章小結 625

第10章 融合套用與數據分析 626

10.1 物聯網是可程式的 626

10.1.1 Web API的“滿漢全席” 627

10.1.2 Web API技術演進 628

10.1.3 IoT Web API的必要性 628

10.1.4 Device as a Service 629

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

10.2.1 名詞解釋 630

10.2.2 術語小結 631

10.2.3 大數據分析 632

10.3 採集整理自有數據 633

10.3.1 原始設備數據 633

10.3.2 數據埋點 633

10.3.3 伺服器端數據 634

10.3.4 需求確定分析方法 637

10.4 採集第三方數據 637

10.4.1 結構化數據 638

10.4.2 半結構化數據 638

10.4.3 非結構化數據 639

10.4.4 數據錄入 644

10.4.5 數據融合 644

10.4.6 數據規整 646

10.4.7 數據交易 646

10.5 數據分析 647

10.5.1 常見程式語言 647

10.5.2 數據分析分類 647

10.5.3 科學計算數據分析工具 651

10.5.4 統計學數據分析工具 658

10.5.5 金融數據分析工具 659

10.5.6 大數據平台與生態 661

10.6 數據可視化 663

10.6.1 數據可視化的發展趨勢 664

10.6.2 matplotlib 665

10.6.3 seaborn 665

10.6.4 mpld3 666

10.6.5 Chaco 667

10.6.6 Pygal 668

10.6.7 Plotly 670

10.6.8 TVTK 671

10.6.9 VPython 672

10.6.10 Folium 673

10.6.11 NetworkX 674

10.6.12 Bokeh 676

10.6.13 Mayavi 678

10.6.14 Vispy 680

10.6.15 MoviePy 681

10.6.16 其他新技術 682

10.7 本章小結 682

推薦書目與結束語 683  

相關詞條

熱門詞條

聯絡我們