AIOT 教育培训 《从芯片到云端:Python物联网全栈开发实践》

《从芯片到云端:Python物联网全栈开发实践》

广告位

编辑推荐

√ Python全栈是降低物联网开发复杂度的必由之路

√ 物联网应用系统的快速开发和系统扩展可以兼顾

√ 物联网系统设计比互联网系统设计更受限更复杂

√ 全覆盖应用、产品、生态的全局视角与选型思路

内容简介

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

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

作者简介

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

精彩书摘

序言

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

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等)均可以回避这个问题。

本文来自网络,不代表AIOT-ziot.cn立场,如有侵权请联系我们处理,转载请注明原出处。http://www.ziot.cn/?p=1505

作者: ziot_cn

上一篇

已经没有了

联系我们

联系我们

18810049910

在线咨询: QQ交谈

邮箱: everypray@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部