锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Python 物联网全栈开发经验教训共享

时间:2022-09-22 08:00:01 挖机手动式快速连接器id压缩型传感器弹簧目标连接器穿墙电连接器

1bdc68cd4430a4b773ee0793fde8b723.jpeg

作者 | 刘凯

责编 | 薄荷茶

微信公众号ID | csdn_iot

本文为7月1日「掌握物联网全栈开发的道路」在线峰会上,刘凯先生的《从芯片到云》——Python 《物联网全栈开发经验教训共享》演讲实录。

在微信官方账号后台回复Python在线峰会上查看更多细节。

大家好,我叫刘凯,我来解释一下。From Chip to Cloud,Python物联网全栈开发内容。主要从前言, Python简介、设备端选型、设备、网关、服务器端开发六个方面。

我来自微电子行业。我的主要工作经验是集成电路的应用开发。我接触的大多数项目都使用汇编和C语言编程,并使用一些脚本语言来实现软件工程和自动化的目的。离职后,从事过一阵子互联网开发。近年来,结合互联网和嵌入式经验参与IoT在物联网开发中。一路上,我用了很多编程语言,但是物联网的编程模型太长了,所以我不得不使用全栈开发模式。

在我处理的几个物联网项目中,目Python开发服务器。还尝试在设备开发中使用嵌入式。Python虚拟机。此外,《物联网全栈网全栈开发实践》一书Python全产业链端到端开发应用。

因为我和我的客户都是新公司,精益创业和MVP原型开发是一种常用的方法。我们选择的编程语言、框架和生态必须足够成熟、稳定和可扩展。在许多帮助下Python编程框架可以在短时间内完成最小系统的开发,并在此基础上不断迭代、升级和优化。这更符合创业路线图。

当然,全栈开发必须倡导团队内部的压缩和统一开发工具,而不是单独唱独角戏。片面最单一的编程语言实际上是一种误解。

让我们来看看最典型的物联网端到端系统模型。

最左边是设备端,也称为传感器节点、边缘节点等,大多数使用MCU来设计。

左二绿色方框代表连接设备节点和网关的各种传感器网络和局域网。

中间的白色方框代表网关,这个位置很重要。除网关外,还可能是边缘路由器或边缘计算设备。

网关右侧的绿色代表广域网,是网关和服务器之间的数据通道。在许多蜂窝数据物联网应用中,网关和路由器对设备透明,可以理解为终端直接连接服务器。例如,共享自行车,开发人员可以简化开发链接。

在此图中,最右边的服务器细分为设备接入服务器、应用服务器和数据分析服务器。这表明服务器端实际上是一个分布式系统。

这张照片中没有出现的是Web前端和移动终端。在很多项目中,由于物联网的原因,我会刻意淡化两者的设计UI需求没有移动互联网高。在应用服务器中,使用响应框架和REST API可以同时支持浏览器和移动端,简化系统设计。

如你所见,物联网系统最大的特点是链接太长。因此,我们必须为团队选择合适的编程工具。

参考刚才的图解,我们来对比一下。IoT与互联网的区别:

  1. 在开发环节方面,IoT终端设备和网关开发工作量比互联网增加;

  2. 人机交互,IoT传感器和Nature UI实现技术;

  3. 在组网方面,由于设备能力有限,无法使用Web必须使用协议MQTT/CoAP/及套接字编程;

  4. 在安全特性方面,互联网安全标准技术TLS开始使用RSA2048算法对设备压力过大,必须寻找替代技术或增加硬件成本。

  5. 在数据特性方面,包括视频直播和录像在内的互联网流出流量大,而且大多数IoT却流入流量大。

  6. 实时要求,IoT在大规模流入的数据中,必须能够实时检索、统计和处理隐含的实时要求。

  7. 在用户增长方面,IoT应用规模往往受设备供应量的限制,对供应商的资金、生产、销售和库存管理要求很高。

  8. 沉没成本,IoT它增加了硬件成本,毛利普遍较低,降低了企业的盈利能力,属于重资产项目,而互联网往往属于轻资产项目。两者在利润模式和水平上有很大的不同。

  9. 生命周期方面,IoT硬件设备的生命周期比手机长得多APP等待互联网产品。因此,它在迭代、交付和维护方面处于劣势。

  10. 在团队组成方面,传统硬件和互联网开发团队的薪酬结构与文化冲突较大。

综上所述,IoT虽然很多技术可以与互联网共享,但差异很大。我们应该注意这些差异,否则我们将踩到无数的坑。所谓的硬件坑是指这些技术以外的麻烦。

我们来看看Python如何参与物联网开发:

  • 首先,Python它与底层语言的相互调用,使其在多个技术领域获得了支持和优势。

  • 经典CPython基于C/C ,常用作脚本语言,可调用DLL/so设备驱动、通用计算、动态库二次开发、桌面应用、Web发展运维优势;

  • Jython基于Java可调用的虚拟机Java可用于大数据分析和跨平台GUI、网关开发与移动APP开发;

  • IronPython基于C#,可以在Windows以及Linux MONO项目中与C#混合编程或动态库调用C#程序;

  • JavaScript非常热门,Python可以提供V8引擎,D3可视化库的包装,甚至还有一个JavaScript换句话说,我们可以使用它Python来实现Web前端设计和爬虫设计;

  • Python其实嵌入式发展很早,最近特别流行。在此基础上,出现了完整的开发生态和大量的参考设计。主流供应商Telit/Xilinx都推出了Python编程产品。

  • 由于FPGA/GPU等器件在DSP,NLP技术平台是机器学习的首选,因此Python也算是这些方面的优势语言。

综上所述,Python自然是应用层编程语言,非常适合系统集成。

对于设备端开发,从研发到大规模生产,往往面临着设备资源、工具链和开发平台的各种限制。也需要很多工具。Python对于物联网的巨大发展价值,它一直被开发者忽视,因为它相对分散。我在所有的书中保留了一章来介绍各种各样的东西Python工具。这里我举几个例子:

  • 系统建模:Blender/printrun/opengl可分别用于3D此外,数据分析和网络仿真软件包还可用于特定领域的系统建模。

  • 虚拟仪器:通过SCPI/pyserial/socket我开发的可以实现与可编程仪器的通信LoRa在项目中,使用自定义SCPI脚本实现了LoRa MODEM自动测试和网络分析。

  • 报纸分析:传感器网络中最常见的任务之一是报纸捕获和分析,该领域最经典的工具是Wireshark,该工具对应Python包装库使开发人员更容易过滤、分析和调试捕获的报纸数据。这些软件包可用于实时底层报纸分析。

  • 生产自动化方面:右侧小图是美国Sparkfun公司提供的弹簧针试验床,配合合适的工具和Python脚本如mbed-ls/pyocd可以实现PCBA批量试验和固件下载。

另外,我还用Python作为软件配置管理,提取和转换字模BOM材料列表管理和手动焊接语音提示器。简而言之,只有开发者才能注意在物联网的各个开发环节找到合适的Python加快设备端和系统系统的开发,提高开发效率。

许多脚本语言的最初设计相对简单,执行速度相对较慢。但现在新一代设计采用了各种方法,大大加快了脚本语言的执行。其中以JavaScript的V8发动机是典型案例。正是V8和node.js才开启了JavaScript全栈开发之路。Python经常被批评执行速度慢,我觉得这些对比不公平,因为他们使用代差技术进行对比,涉嫌误导。实际上,Python可采用多种加速方式。

  1. 最经典的加速方法是通过C/C甚至Golang进行加速。CPython执行速度必然比C/C 要慢,所以CPU这些语言可以用来提高密集型任务的性能。

  2. 我们可以PyPy为了提高性能,因为使用了JIT编译器,可以实现较快的执行速度。是经典CPython8倍的运行速度。

  3. node.js执行速度快,还和libuv有关联,在I/O密集型应用效率高。libuv有对应的pyuv包装可以达到相同的执行效率。

  4. 硬件加速,Python可以借助CUDA或FPGA实现实时数据分析件加速和实时数据分析。

因此,在许多特定的领域,如Web后端、爬虫、数据分析和机器学习基本上使用了类似于其他语言的性能加速方法。所以不用担心Python的性能。

Python它已经是一个相对成熟的技术生态系统,因此可以直接使用一些现成的物联网软件包。

  • PySerial它还提供了最常见的物理串口和虚拟串口软件包Telnet串口RFC2217协议。配合PySerial传统设备可以直接升级为网络串口,可以说是最简单的开箱即用物联网。Python3.4之后,PySerial配合asynio串口应用可实现异步驱动。

      • Twisted的开发历史非常悠久,也是最常见的异步事件驱动的编程框架,可以用于通讯协议定制。Twisted提供了诸多服务器与客户端参考设计。

      • Tornado作为Facebook的开源项目,也采用了异步事件驱动,相比Twisted,Tornado更加适合作为Web服务器使用,同时通过WebSocket和TCP套接字服务实现对于物联网的支持。

      • MQTT-client,MQTT已经成为物联网应用层协议的事实标准,不同的Python框架如Twisted/Tornado/Flask都有自己的MQTT客户端实现。

      • coap/txThings,CoAP是另外一种物联网应用层协议,除了现有的短消息和UDP传输层,目前CoAP也有基于TCP长连接的标准草案。CoAP的实现更加简单,但是参考设计较少,txThings是目前可用的CoAP代理服务器。

      Python为常见的的标准化接口提供了现成的软件包和编程框架,在Github等开源站点上存在众多的Python物联网设备、网关和服务器端项目,开发者稍作验证既可以实现设计复用。

      在传统的软件开发中,瀑布模型强调需求与实现对应。而现实中往往是业主在拍脑子。脑洞大开没有关系,但是却可能会影响到技术选型。作为开发者,我们需要了解行业生态,挖掘核心业务需求,同时拒绝不切实际的“伪需求”,还要给一些总做平台梦的业主浇浇冷水。我们可以从以下几个方面去了解:

      1. 核心目的:不同的物联网系统之间差异很大,这必然导致不同的数据传输特性;

      2. 覆盖范围:物联网的设备覆盖范围是离散的,还是集中的,是否需要漫游支持,也非常重要;

      3. 数据特征:物联网通常流入数据较多,但是也有截然相反的情况,如固件更新、广告分发等,此外对于数据的实时性需求也需要了解;

      4. 目标受众:物联网最终要服务于目标人群,那么他们的使用习惯、终端适配、收入和教育水平也是必要考虑的;

      5. 使用体验:这一点与移动互联网有关,共享单车的快速普及很重要的因素就是社交和支付账户的第三方登陆比传统流程使用更加方便,所以在消费者相关的物联网应用中,第三方登陆将将成为快速扩张的工具。

      6. 行业需求:有些特定领域的物联网应用,开发者必须尊重现有的行业标准、频率划分、通讯协议、加密算法。

      所有这些约束条件,都必须仔细了解。最要不得就是向拥有不同技术栈的合作伙伴去问一圈,想小马过河一样,把自己的搞懵圈,陷入纠结之中。我接触的项目中,在需求分析环节,75%的都有类似的问题,耽搁了许多宝贵时间。

      下面我举几个实例来解释一下:

      1. 电子货架标签:该产品已经经过好几代产品迭代,有漫射红外和短距无线电好几种方案,国内盒马生鲜、永辉超市刚刚开始采用,主要的目的就是减少人力更换标价的时间与成本。但是实际上频繁改价需求只对生鲜超市才有意义。ESL室内工作距离100米左右,位置固定,可以分片分区,数据主要从服务器下发给设备显示屏,上传数据极少,最基础的甚至可以使用无线广播方式开发,所以使用最简单星型拓扑的短距离无线技术即可,没有必要采用网状网的设计;

      2. 资产定位:要区分是区域内定位还是离散性的定位,大多数定位都是后者,往往依赖于蜂窝数据网络。此类应用具备广域无线的特征,数据低占空比,数据流入居多,需要实时分发异步事件,此外,根据对象的移动速度需要选择合适的无线技术。

      • 农业应用:农林牧渔细分领域中,可能存在差异,但是总体来说,农业应用以数据采集和远程遥控为主,数据量少、占空比较低,使用低功耗广域无线技术非常适合。但是农业作为一个专门的行业,已经沉淀了大量农机设备,需要整合型的设备融合,而非单品物联网产品。

      • 房屋租赁:互联网短租、合租、整租市场非常活跃,其技术选型比较多样,由于有线宽带接入的普及,总体偏向通过WiFi/BLE等消费者相关的物联网实现组网和联网,同时需要实现多种设备的协同和业务场景整合。同时此类应用对于异步事件的实时响应也有一定要求。

      • 医疗设备:由于人群密集,多会采用消费者相关的物联网技术,远程医疗和实时数据采集属于高速数据采集的范围,对于异步事件的响应和分发速度要求很高,但是对于病患,尤其是老年病患的使用习惯和网络环境需要做更细致的调研。

      通过需求分析,我们可以很容易地过滤出物联网组网和联网技术选型的结果。不过呢,这里的确还有些技术陷阱是需要提示大家注意的。

      在摸清系统的各种约束条件后,我们要进行组网与联网的技术选型。

      • 首先,要在蜂窝数据与非授权的ISM频段中选择。如果一个开放式物联网应用,且可以被公众移动网络所覆盖,就可以使用蜂窝数据方式,但是2G面临退网风险,NB-IOT/eMTC还未成熟。此外NB-IoT窄带技术易受干扰,而宽带eMTC在国内没有获得频率资源。这个阶段采用何种技术的确很麻烦。这也就是为何LoRa/Sigfox目前可以在智慧城市应用中占有一席之地的原因。

      • 其次是2.4GHz与Sub-1GHz的选择, 这两种都是非授权的无线技术,其频谱的使用包括占空比和功率都是有限制的。其中,2.4GHz全球通用,存在众多的标准化无线连接技术。1GHz以下频段却和各地频率划分有关,标准化程度不高。两者相比,2.4GHz技术在室内频谱过分拥挤,且无法穿墙,无法绕射。此外,该频段对于湿润气候非常敏感,在雨天的通讯距离会锐减,所以在室外的覆盖范围和应用非常受限。Sub-1GHz的频率特性使其成为物联网的应用重点。因为看到了这种频谱优势,许多无线技术推出了对应Sub-1GHz分支版本,但是各地频段划分不同,标准化程度不高。虽然2.4GHz不适合户外应用,但在定位系统中,2.4GHz无线技术却有其独特的应用优势,定位更加精准。所以,需求决定了技术选型结果。

      • 短距离无线和低功耗广域网络的选型,取决于传输率和覆盖范围。在同样的发射功率和接收灵敏度情况下,距离越长,传速率越低。短距离无线速率高,比较适合有一定实时性要求的现场控制,这种网络大多都支持多跳路由、网状网,但对于中继节点功耗要求很高,堆栈复杂度较高,组网难度较大。所以如果传输率不高的应用,采用单跳的低功耗广域网络更合适。

      • 由于各家无线技术标准的激烈竞争,增加了开发者的工作量和难度。为了应对这种趋势,市场上出现了多种融合型集成电路,尝试多种维度的整合。有的尝试整合2.4GHz内短距无线技术,或尝试整合不同频段的技术,或尝试整合不同的蜂窝数据传输技术,还有使用软件无线电实现更加通用的技术整合。大多数整合型SoC都内置较高级别的处理器。所以既可以采用嵌入式Python开发物联网MODEM,也可以在主机端实现Python的驱动与应用开发,实现Python在设备端的全栈开发。

      • 除了无线技术,许多有线连接技术也很有现实意义。农业和工业的物联网节点区域内可以使用CAN/以太网的双绞线实现区域内联网和供电,而节点之间可以使用无线技术组网。

      我选用了一个相对冷门但是有趣的例子作为Python全栈开发的实例。此图是电吉他手常用的脚踏式效果器组合。电吉他效果器种类非常多,已经发展出十几种类别的产品。近年来出现了各种形式的数字化可编程效果器。但在现场演奏中,脚踏式效果器依然是最实用的形式。

      一般单台效果器只负责一种特效的产生,将其按照不同顺序串联起来,或分为两路后再合并,形成不同的乐风,乐手在演奏中使用踏板将某些效果器直通短路,在不同乐风间切换。

      芬兰开发者 Henrik Forsten 在Github上开源了一个使用Python和SPICE来模拟效果器电路的工程。经典的效果器电路设计历史悠久,大部分都是公开的。

      此外,Python dsptools或Audiolazy等音频DSP处理软件包可以直接替代特效电路,产生所需效果。同时配合网络编程框架实现专业音频协议,可以构建一个完整的乐器联网与在线直播应用。

      这个例子涉及到了信号发生、系统建模与电路SPICE仿真、信号处理、网络传输与分发、以及在线娱乐的全链条开发。

      近年来,许多高级语言都尝试挤到嵌入式领域,但嵌入式领域的优势编程语言依然是C/C++和Java。尤其是MCU中必须使用静态编译型的C/C++开发,在嵌入式Linux中,会出现百家争鸣的现象。

      既然运行速度较慢,无法与C/C++相比,那么在嵌入式中使用高级语言的目的是为什么呢?我觉得有一点可能是参考互联网和移动互联网的发展,尝试创建一个用户可编程的智能设备。

      在互联网中,服务器与网络服务接口就可以实现可编程的网站,例如基于谷歌地图可以产生大量的LBS应用。移动互联网所依赖的智能手机就是一个典型的可编程设备载体,具备实时网络连接、网络服务、可以动态下载用户程序。但是在许多垂直细分领域,这个可编程设备还有待大家挖掘。现有的智能硬件之类的其实只是联网硬件,而非可编程硬件。这些设备可能是可穿戴,智能家居、或某种边缘计算设备。这一点见仁见智。无论是什么设备,都应该具备一定的使用频度,人机交互能力,通用性以及应用层变更需求。

      接下来我们看看支持Python编程的物联网可编程设备。

      市面上已经涌现了大量的Python可编程设备。

      • 左上角是GPRS模块供应商Telit,它提供了支持Python编程的GPRS MODEM。

      • 第一行左二是MicroPython的PyBoard,是目前最热的Python虚拟机,支持Python 3.4,推动了一大批嵌入式Python产品和工程的出现。

      • 第一行右二是Xilinx PyNQ,作为FPGA领军企业,Xilinx 最近推出的PyNQ,是运行于Zynq FPGA的完整Python平台,以Python库的形式将底层硬件IP提供给应用层开发者。主要用于实现嵌入式系统以及机器学习目的。

      • 右上角是Lego EV3机器人,内置Linux主机支持Python编程。

      • 左下角是BBC Microbit,支持ARM mbed C++开发,同时支持MicroPython编程。

      • 第二行左二是NVIDIA的TX1开发板,内置Ubuntu操作系统,支持Python对于GPU/CUDA的HPC编程、机器学习、CV、3D应用。

      • 第二行右二是OpenMOKO,作为第一款全开源的移动电话,支持Python编程。

      • 右下角是百度手环,可以运行MicroPython/MicroBit版本嵌入式Python。

      后面还会介绍各类MicroPython物联网网关,与MicroPython类似的嵌入式版本还有PyMite和Zerynth。

      • PyMite,最早的开源嵌入式Python虚拟机,支持Python 2.5。

      • Zerynth,提供社区版和商业专业版的嵌入式Python虚拟机。

      基于Linux的Python平台非常多,比较典型的有:

      • OpenWRT,是常用的开源路由器,支持Python编程。

      • 树莓派,可以用于开发GUI和网关。

      总的来说,Python很早就覆盖了MCU和CPU平台,嵌入式Python甚至可以在AVR 8位MCU上运行,不过随着物联网的需求越来越旺盛,功能越发复杂,推荐使用M4级别的MCU来实现嵌入式Python虚拟机。

      物联网的现状是碎片化,经手若干工程后,我认识到一个趋势:必须使用标准化接口来应对碎片化需求,加快迭代速度。这包括标准的硬件接口、操作系统和编程接口。

      设备端开发包含两部分:节点设备和网关设备。前者大多采用MCU开发,后者大多采用中高端MCU或Linux系统开发。各种各样物联网连接技术落实到芯片级连接方式,大多数已经标准化。这包括最标准化的UART/USB接口,以及各类模拟和数字I/O,还有MiniPCIe等PC工业标准总线。

      在LoRa的开源网关设计中,主机的LoRaWAN堆栈通过SPI总线连接射频收发器前端。但是我更加倾向采用USB CDC的方式将收发器连接到主机端,虽然USB MODEM的固件复杂了些,但是额外好处是:网关设计可以支持主流桌面和移动操作系统,还可以通过USB Hub支持多路无线接入。由于USB支持热插拔,可以自动识别,可以实现协议栈的热更换。USB DFU可以用来自动升级固件来实现多种应用目的。USB必将在物联网应用中发挥新的作用。

      MCU/CPU SoC上存在大量的数字和模拟I/O,如GPIO/I2C/SPI/ADC/PWM等等,在硬件角度看已经标准化了,但是从编程角度看,标准化程序不够。尤其在Linux操作系统中,由于不同SoC的I/O布局不同,其命名方式存在区别。现有的标准化工作没有实现统一。所以非常适合通过UART/USB桥接到系统中。主流的桌面操作系统都不是实时操作系统,处理底层I/O效率很低,MCU虽然简单,中断驱动模式可以同时满足高速I/O实时性和慢速I/O应用要求。大小核间可以邮箱寄存器,I2C/UART通讯。这种CPU+MCU的大小核设计在无人机、手机、机顶盒、智能电视领域已经成为主流。

      至于其他特定领域的I/O,如SDIO等,都已经实现了标准化,可以通过特定的系统服务去访问。

      物联网的操作系统涉及到生态发展,竞争激烈。但大体上已经尘埃落定。

      1. 在MCU领域,ARM Cortex市场份额最大,mbed OS成为未来开发的趋势。mbed OS作为一个完整的技术生态,包含了物联网嵌入式开发领域的绝大多数组件。在RTOS领域,绝大多数供应商都遵守了ARM提出的CMSIS RTOS标准。开发者可以很容易地切换不同的RTOS。所以,mbed一举解决了嵌入式开发中最麻烦的几大问题,实现了跨编译器、跨操作系统、跨芯片供应商、跨调试器的系统开发。同一源码可以非常方便地在不同芯片上运行。

      2. 在CPU领域,ARM依然占据了优势地位。Linux作为嵌入式和服务器操作系统的事实标准,而主流发行版都有对应ARM版本,嵌入式领域也可以利用Yocto工具构建专用的Linux操作系统,降低了从源码编译Linux的麻烦。

      3. 运行时环境部分还存在较大的竞争,除了原生C/C++语言,各类语言的竞争主要发生在这里。

      4. I/O命名,Arduino提供了一组与硬件无关的I/O命名,ARM mbed继承了这一个设计,实现了与硬件无关的程序设计。

      我们再来看看编程接口的标准化程度。

      随着硬件和操作系统的标准化,编程接口也逐渐标准化。在Linux的Python开发中,串行口UART包括USB虚拟串口设备,都可以使用PySerial进行编程。而USB设备可以使用PyUSB选定VID/PID进行设备和应用开发。

      物联网中最常见的无线通讯技术如WiFi/BLE已经标准化,不需要开发底层驱动。但其余的物联网技术包括CAN总线、LIN总线、Zigbee、6LowPAN,甚至一些私有协议都开始提供套接字编程接口。这些设备通过SPI/UART/USB,最初都是字符型设备,现在内核开发团队开始将其“网卡”来看待。后者更加符合物联网的本质,也预示者物联网IP化趋势。开发者要关注这种开发转变趋势。

      从操作系统角度看,所有设备在Linux都是文件,很早就被标准化了。所以开发者可以视情况通过文件系统或套接字进行编程。而在Windows系统中,非标准设备的应用开发往往通过DLL库进行二次开发。这方面,Python都有现成方案可以使用。

      基于标准化硬件、操作系统和编程接口,可以大大简并加速物联网开发。

      这里我要介绍一个Python物联网网关实例:来自西班牙的开源设计,panStamp。该项目最初应用于农业物联网,目前在智能电网和智慧城市工程中得到了普及使用。该工程采用TI的CC1101 FSK射频收发器。使用的MCU是Atmel AVR和TI的MSP430低功耗MCU,支持Arduino编程。模块通过UART接入到树莓派平台中,该项目是一个完整的Python全栈开发样板。

      它的总体软件框架是一个分布式的网络框架,整合了无线模块的守护服务、IFTTT规则引擎、Web管理界面、数据库、数据分析、异步任务队列,组件之间通过ZeroMQ/MQTT进行异步整合。这种框架不仅仅适用于物联网网关,也适用于边缘计算,以及云计算的分布式计算模型。他们之间架构类似,差别在于具体的组件选择和设备并发数量。

      panStamp构建周期短,开发相对容易,是一个很好地物联网网关范本和源码来源。国内价廉物美的Linux单板机可以成为此类物联网网关的最佳货源。此类单板机中的Linux还有细分为源码交叉编译、预编译和完整版Linux几种,其中预编译和完整版Linux对于Python的支持最好,可以回避交叉编译的麻烦。

      国内的一些设计也采用了类似的Linux + Python网关设计。Github上还有一个类似的LoRa网关设计,主要用于用于养蜂场管理。TI作为半导体供应商,提供了完整的Zigbee/6LowPAN的Linux解决方案,同样适用于Python开发。

      除了基于Linux的Python网关,基于MCU的MicroPython也衍生出许多网关分支。与CPython相比,MicroPython是为嵌入式开发的,天生就支持交叉编译,可以编译到合适的MCU,甚至Linux/Windows主机中运行。更加重要的是:MicroPython还自带upip和微型库。所以MicroPython将来会在更多的平台上普及使用。

      基于MicroPython,Pycom公司提供了多种网关设计,不同的型号分别支持LTE/WiFi/LoRa/Sigfox等多种无线技术。这种设计基于Cortex-M4控制器,存储器容量大,计算能力强,可以支持多种通讯堆栈,有的甚至还可以支持TLS和MQTT协议。可以充分利用这些标准化组件连接到云计算平台。

      根据开发者反馈以及我自己的开发经验,在嵌入式环境中使用Python,远比C/C++简单快捷,大大提高了编程效率。不仅可以访问绝大多数的硬件资源,调试简单,还可以获得各种中间件服务,包括文件系统、交互命令、网络服务,并且支持多线程、异步I/O、回调,无须担心内存泄漏和垃圾回收问题。太爽了。

      不过问题来了,MicroPython虽然比较完整,开发者水平却参差不齐。长期使用C/C的开发者会有C语言的使用惯性,比如借助中间变量来交换数值等。我推荐阅读Python入门语法,逐渐掌握OOP和函数式编程,并注意硬件中断服务例程和回调函数的使用。在Python开发学习过程中,也会提高开发者的C/C语言编程编程技巧。两者可以互为促进。

      物联网对于安全的要求越来越高,所以未来安全性较高的Java编程依然会是主流。Java的OSGi是一种较为著名的Java组件化编程模型。在IDE和网关等领域,Java OSGi技术历史悠久,存在着大量的商用及开源参考设计。其中智能家居领域的OpenHab就是一种OSGi网关框架。从主流供应商角度,Java OSGi可以一种安全而完整的网关解决方案。右侧图中是Freescale/NXP与Oracle合作提供的物联网网关,基于OSGi模型构建。在OSGi中,支持JSR223脚本标准,支持十几种脚本语言,包括Python和JavaScript在内。

      Java的开发周期较长,这一点可已使用Python缩短开发周期。Python代码也可以开发出符合OSGi标准的Jython桥接。在树莓派中,有对应Jython分支TigerJython。不过树莓派中,更多是直接采用CPython来开发物联网应用。

      我们总结下来,在基于Linux的物联网网关设计中,可以使用多种方式来实现:

      1. CPython,交叉编译,或预编译

      2. MicroPython,交叉编译

      3. PyMite,交叉编译

      4. Jython,接入Java OSGi。

      开发过若干系统后,我定义了一个物联网分布式计算的雏形,所有组件均基于Python进行开发。可以用于物联网网关、单机版服务器和分布式服务器集群。取名EPIC。

      各种设备的接入方式有许多,左侧设备均通过MQTT接入,是主流的连接方式,在上方,TCP套接字通过Twisted接入,CoAP通过txThings接入,WebSocket/HTTP则通过Web服务器接入,都可以通过代理服务器实现负载均衡,并支持TLS证书。而负责接入的服务器集群将各种设备通过REST API抽象成设备接入服务,提供给应用Web服务器。同时应用服务器对外提供响应式UI界面、REST API。提供给己方的移动APP,以及第三方合作伙伴使用。

      该图的右侧主要是数据库,包括数据缓存、关系数据库和时序数据库,以及云端数据库PaaS和大数据平台。右下角独立组件采用crond代表定时离线批处理。

      服务器端内部组件彼此之间可以通过消息队列实现进程间异步通讯。

      采用私有协议进行设备联网对接,我有一些惨痛教训。许多开发者认为私有协议很简单,其实是个大坑。先说一下结论:尽量采用标准化协议实现联网,如TLS + MQTT + JSON就是主流选择。如果设备能力有限,可以做参考标准,简化功能。我的理由:

      1. 设备的生命周期要比互联网应用要长;

      2. 物联网安全漏洞百出,所以最好使用标准化认证、加密和流程;

      3. 物联网联网状态机不仅包含数据上传,指令下发,固件升级,还会根据应用不同更改需求;

      4. 设备生命周期管理,需要实现设备和网关的各个环节的固件升级;

      5. 应用层需求变更,会影响到数据建模和对象定义,最好使用自带语义的序列化方式传输。

      6. 物联网标准协议实现了粘包处理,设计不完善的私有协议就是一个噩梦。

      一个完整的协议,需要规划报文帧结构、认证授权与加密、状态机和功能扩展、对象序列化等等许多方面,且分层清晰。而大多数私有协议都采用二进制协议,承载在TCP长连接上,每增加一个物理量都需要双方都进行升级,增加了对接的工作量。很容易发生不同版本协议向同一端口发送的现象,增加了调试与维护难度。

      需求变化是肯定会发生的。而一个设计不完善的私有协议,恰恰会阻碍后续的升级。可以这么说,如果接到此类“超简单”的TCP长连接设计任务,基本上就是失败的开始。因为你们把事情看得太简单了。

      如果采用标准化的物联网协议,可以一次性解决了安全,帧结构和状态机问题,在此之上采用JSON,可以实现数据对象序列化,简单高效。即使增减物理量,也不会要求在通讯协议上进行升级。大大减轻了开发工作量。

      作为一个来自微电子行业的开发者,我知道大多数嵌入式设备的处理能力无法实现RSA非对称认证,可以采用变通方式,减少功能,比如采用低强度双向认证、CoAP帧结构、二进制JSON,并通过开源社区检验。同时代码生成器可以简化开发,加快集成速度。

      实施角度,可以使用Twisted/Tornado来实现。

      不同系统之间在数据特性方面,包括流向、流量、频率都有所不同,可能需要采用不同的数据持久层技术。

      最初我采用了传统的关系数据库。但是在数据采集应用中,数据总量很快会积累到一个相当大的规模,而在一些IOPS性能较差的云计算产品中,在较大的数据集中检索数据会导致慢查询。即便定时删除部分数据也会导致数据库表,造成数据库不可用。在反复尝试了各类数据库分片和优化技术之后,我转而考虑另外的数据库技术。

      物联网数据有实时性要求,即入库数据能够得到马上检索和处理,数据库领域的RTDB实时数据库来自工业领域,但是商业许可证产品更多见。

      进过分析,我发现数据从采集、上传、入库、查询,到最后的网页绘图和分享,数据库的IOPS是整个系统的瓶颈。所以我将热点数据存入Redis作为数据缓存,这样可以避免热点数据入库和查询的瓶颈,Redis的自动删除功能可以确保热点数据的内存占用不会导致系统崩溃。是否采用Redis虽然有各种争议,但是目前该物联网系统已经正常运行了两年多。

      除了Redis,MongoDB和Cassandra都是物联网中常见的数据库。物联网数据具有时序信号的特点,即数据都与时间戳有关。除了RTDB,TSDB时序数据库可以说是专为物联网定制的数据库。开源社区大量TSDB都依赖于MongoDB/Cassandra实现了时序数据库。我个人选用了InfluxDB作为时序数据库。

      在各类云计算数据库PaaS服务中,百度天工和阿里云均支持时序数据。各类大表格服务也都可以用于物联网,谷歌的Firebase也是一个很适合物联网的品种。此外,实时大数据分析平台也是可行的,这里就不多介绍了。

      数据库接口编程大多数是socket/HTTP通讯,使用Python完全可以胜任。

      在应用开发层面,我的物联网设计从最初的整体式设计,逐渐转化为连接与应用分离的分布式应用。负责连接的称之为设备云,负责应用的称之为应用云。听上去开发工作量是增加了,但从长远来看,其实减少了重复工作。尤其是当我们需要横向拓展多种产品时,这种设计会体现出其优势来。

      设备通过标准化联网方式接入设备云,可以大大简化联网设计工作;

      1. 设备云通过REST API方式,把设备抽象成数据服务;

      2. 分布式设计可以实现应用层的快速迭代。物联网和互联网有一个相同点,即应用层需要快速迭代以适应市场变化。但是物联网设备端生命周期长,变更要比应用层少。将两者分离,可以实现让应用层尽可能地快速迭代,不必受限于设备。同时,与业务相关的设计环节,如RBAC、、流程、存储、UI、APP等都可以在应用层单独迭代。

      3. 从商业角度来看,所谓物联网业务其实是一种资源管理应用,设备抽象为服务后,物联网应用开发可以简化为Web开发。

      4. 系统整合加速,可以横向整合设备。比较典型的是短租业务,除了最基础的门锁,还有摄像头、煤气、湿度传感器等设备。应用层的资管服务器中接入不同的设备REST API,并融合视频直播API和其他网络服务,可以快速衍生出更多的物联网服务。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章