Python中文网

从芯片到云端:Python物联网全栈开发实践,由电子工业出版社在2017-11-01月出版发行,本书编译以及作者信息为: 刘凯 著,这是第1次发行, 国际标准书号为:9787121311277,品牌为博文视点, 这本书采用平装开本为16,纸张采为胶版纸,全书共有724页,字数万字,值得推荐。

此书内容摘要

物联网开发重新定义了“全栈开发”的范围。Python作为一门快速发展的语言,已经成为系统集成领域的优选语言之一,其可覆盖从电路逻辑设计到大数据分析的物联网端到端开发。各领域开发者可以利用Python交叉涉足物联网设备、边缘计算、云计算、数据分析的工程设计。

《从芯片到云端:Python物联网全栈开发实践》尝试让读者建立物联网设计的整体概念,从基础概念开始,到相关技术选型、开源工程、参考设计与经验分享。无论是物联网领域的创业者,还是系统架构师,都可从本书中获得灵感。本书对于嵌入式开发领域的开发者尤具学习价值,利用Python可加快开发迭代速度、降低开发成本,并可以基于嵌入式Python建立完整的物联网软硬件生态。

关于此书作者

刘凯,服务于微电子行业二十余载的资深工程师。曾在飞利浦半导体(即NXP恩智浦半导体前身)任资深工程师,从事软、硬件开发与产品设计等工作,有用汇编/C/C++开发嵌入式系统固件、用Perl/Python脚本做开发支持工具、用PHP/Java/Python做设备云和Web应用的丰富经验。现作为独立系统集成开发商,专业从事物联网相关项目设计和咨询服务,主攻嵌入式、RFID、微控制器、物联网、WSN、Linux、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.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


(篇幅有限,完整目录请查看本书)

部分内容试读

本书讲述如何以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夏,上海

关于此书评价

前几年国内引进了Chris Anderson的《创客:新工业革命》。打那时候开始,国内流行起“创客”风潮。“创客”这个词果真是一个洋气的舶来品,很多国人姑且把它看成硬件创业的预备役。但是大洋彼岸原产地的人们倒是朴实得可爱:织个毛衣,搞个室内大棚蔬菜。当然高科技类的自然少不了捣鼓一下机床,焊一块板子,这更像是一种DIY的怀旧文化:更加纯粹和快乐。做一名纯粹的创客并不容易,毕竟要抽出一定的时间和精力。直到现在我依然惦记着自己那台完成了一半的 3D 粉末打印机,而它就静静地躺在储物箱里。那时候的我已经开始为创业做前期准备,但商业项目和自己在创客空间玩的东西没啥关系,终究自娱自乐和商业有差别。

遇见 Allan 的时候,他也在努力从创客转变成创业者。我很惊诧于他虽然技术娴熟,也曾负责NXP产品技术与市场,却依然对技术保持着孩童般的初心,真的不多见啊。离开NXP后,Allan决定成为一名自由职业者。靠着自己扎实的技术,从前端到后台,从硬件到软件,他一个人搞起了物联网的项目和产品。我们时不时在线上谈论可行的产品和市场策略。虽然我对硬件不熟悉,但是由于自己当时就职于PTC,拥有些许物联网后台软件的认知,就这样我们相互参照着学习,并努力将其付诸实践。

2015年5月,我离开了PTC并投身于机器视觉领域的创业,但依然保有对物联网的热情,尤其关注工业物联。而 Allan 在这几年的实践中积累了全栈开发的经验。终于有一天,他觉得是时候将他独自一人的全栈开发经验记录下来,并传播给这个领域的开发者了。我自然非常支持他,但是独自写一本技术类的书,这是多么考验人呀。之后和 Allan 的交流变少了,我想象得出他独自在房间码格子的情形。半年后,这本书的初稿终于扎扎实实地完成了。

创业者和分析师们总爱重复地问一个问题:物联网的风口有没有来?我们很难精准地去预判某个时间节点,但假如物联网是一个不远不近的方向的话,我们当下能够做的便是顺着产业的脉搏而跳动。类比一下 PC 和移动互联网,我们依然处于物联网大规模商业化的早期。但是最终我们会迎来万物互联。让我激动的是万物互联的基础架构成熟后,在各个行业以及各个利基市场将会涌现出各种“新物种”,推动着商业和产业进一步提高效率,进一步打破边界。而对于希望投身于这个行业的技术人员来说,应该尽量抛弃这些华丽的时髦术语,回归技术本身。这本书平实地记录了读者需要了解和掌控的基础知识;与此同时,它从单一语言全栈开发的概念出发梳理了一个完整的流程,而全局观的梳理能够更好地帮助技术人员去理解技术的本质。

技术总是在飞速地发展,书本记载的技能需要不断地升级更新。但是我能感受到 Allan 更希望传达的创客精神。创客愿意从零开始建一栋楼,他们或许不能建成一座摩天大厦,但至少也会筑成一幢别具一格的小楼房。这种纯粹的乐趣只有从动手实践中才体会得出来。但人们的生活节奏总是很匆忙,有这么一本类似于“宝典”的书,可以加快看官您动手的速度和效率。但愿您能享受从零开始搭建一个物联网项目或者产品的过程。

张成 上海叠层科技联合创始人


书摘内容

序言

笔者曾经长期服务于微电子行业,现在从事物联网相关项目设计和咨询服务。

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中文网整理提供。