福利 | Python 物联网全栈开发实践

转载 2017年11月29日 00:00:00

点击上方“CSDN”,选择“置顶公众号”

关键时刻,第一时间送达!

编者按:昨日,第一届小米 IoT 开发者大会在京召开,大会上正式发布了小米IoT 开发者计划,此外,百度集团总裁兼首席运营官陆奇宣布百度和小米达成战略合作,将联手共建“AI+IoT”软硬一体模式。在如今 IoT 大行其道,定义却模糊不清之时,作为开发者我们该如何进行物联网全栈开发?

在这篇文章中,我们以 Twisted 为例,分享物联网设备接入的基本协议及架构搭建,希望能给诸多开发者一些思考,更加快速地上手物联网开发。

本章节选自图书《从芯片到云端:Python物联网全栈开发实践》。同时为了回馈大家长久以来的支持与关注,特申请 5 本技术图书赠于物联网开发道路上的同行者,详细规则可见文末

远程设备可以通过4G网络或者Wi-Fi直接连接TCP/IP网络,也可通过网关、边缘服务器等设备转换到TCP/IP网络,再连接到设备云、应用云、大数据分析服务器和用户APP。本节内容将总结设备云各种接入协议的实现,包括:

  • 基于TCP/UDP的套接字服务器;

  • 基于UDP的CoAP协议;

  • 基于TCP的MQTT协议;

  • 基于HTTP的REST API Web服务。

除了这几种,还可以找到其他一些协议:

  • HTML5 WebSocket/SSE,可以支持持久连接和服务器推送;

  • XMPP,用于即时通信等。

严格地说,应该将后两类定义为互联网客户端接入协议。客户端本质上也是设备端,但是其已经独立发展,形成了自己的特点。

从目前来看,许多设备联网都采用私有协议,需要定制接入服务;物联网专用协议CoAP/MQTT也很热门;而基于Web的REST API和其他方式也是互联网标准。所以,本节将以Twisted为例,讲解如何接入这些协议。

异步通信框架Twisted

Twisted设计于2000年,是事件驱动的异步网络引擎架构,作者是Glyph Lefkowitz。Twisted最初是针对一款多人在线游戏(Twisted Reality)而设计的网络通信框架,其后来发展成为一个事件驱动、跨平台的可扩展型通用网络应用开发框架。

Twisted自推出以来广泛用于生产环境中,Google、Lucas Film、Justin.TV及Launchpad软件协作平台都采用Twisted设计过产品和网络服务。此外,Twisted还驱动着BuildBot(自动构建工具)、BitTorrent(著名P2P分享服务)及TahoeLAFS(开源云存储服务)。

作为网络应用的重型框架,Twisted支持常见的传输层和应用层协议,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC、FTP和DNS。用Twisted定制开发客户协议也很简单。Twisted对于其支持的协议都带有客户端和服务器端,同时附有命令行工具和Log日志输出,这可以用于配置和部署产品级的网络应用。

图9-10来自Twisted的参考设计:Poetry Server。Twisted是单线程设计,运行于单一CPU核心中,可以在单一线程中集成多个端口服务。但Twisted通过Reactor模型构建了高速异步事件驱动型网络编程框架。

0?wx_fmt=png

图9-10  Twisted系统运行示意图

多核服务器与负载均衡

Ngnix由俄罗斯工程师Igor Sysoev开发,其徽标如图9-11所示。Ngnix可以作为Web代理服务器、Mail代理服务器和通用的TCP/UDP代理服务器。套接字服务器、Web服务器、Web API服务器的负载均衡可以采用Ngnix来实现,这几乎是行业标配之一了。

0?wx_fmt=png

图9-11  Nginx徽标

在多核服务器中可以运行多个Twisted实例,并可以非常容易地进行规模性能扩展。但一台服务器一般只会分配一个公网IP。如果Twisted实例分别侦听不同端口也没有问题;如果共享一个侦听端口,则需要负载均衡服务器来实现。

作为主流的反向代理服务器,Ngnix可以支持多台多核高配主机,运行多个Twisted实例实现横向规模扩展。具体实现方法如图9-12所示。

  • Twisted 1,运行于Server A,CPU1,侦听端口5000;

  • Twisted 2,运行于Server A,CPU2,侦听端口5010;

  • Twisted x,运行于Server A,CPUx,侦听端口50x0;

  • ……

  • Twisted 1,运行于Server B,CPU1,侦听端口5000;

  • Twisted 2,运行于Server B,CPU2,侦听端口5010;

  • Twisted x,运行于Server B,CPUx,侦听端口50x0;

  • ……

  • Ngnix,侦听指定端口6000,并按照预先定义的分配策略将流量转发给 Server A/B/Z中的CPU1/CPU2/CPUx。

  • 还可以在Ngnix处部署TLS证书等。

0?wx_fmt=png

图9-12  Ngnix与多个Twisted服务器实例构成负载均衡设计

基于TCP的四层负载均衡并发能力是50万个长连接,这可以满足大多数物联网需求了。如果需要更多连接数,可以通过子域名将流量分配到多台负载均衡的方式实现规模扩展。

客户端

在Twisted的参考设计中,一般会对等提供服务器和客户端设计。在应用层上,用户还可以自行替换或者扩展Twisted的客户端。Web客户端中较为出名的是网络爬虫框架Scrapy。

服务器端

Twisted虽然提供HTTP端口的客户端和服务器,但是其仅支持简单的HTTP开发。基于Twisted,可以使用更加完整的 Web框架,如Klein或Cyclone等。物联网CoAP协议对应的代理服务器是txThings。MQTT有twisted-mqtt-client客户端。笔者曾经误以为Twisted方案是实现MQTT服务器,但其实它是作为MQTT客户端存在的:

  • MQTT broker是服务器,比如开源的mosquitto,或者云服务供应商的IoT套件;

  • twisted-mqtt-client作为broker的客户端,挂接在broker服务器上;

  • twisted-mqtt-client将数据保存在持久层(如SQL/NoSQL/NewSQL数据库服务器)中。

所以在基于MQTT的设计中,Twisted提供的都是客户端设计。但之所以将其归类到服务器,主要因为这都是服务器端领域的设计。

从物联网接口来看,Twisted已经支持了大多数的设备接入协议:

  • REST Web API,基于Web 服务器;

  • Raw TCP/UDP,定制客户协议,用于传统设备升级;

  • CoAP,用于超轻量级物联网;

  • MQTT,用于轻量级物联网。

与Twisted相关联的有Tornado和Cyclone。Twisted/Tornado/Cyclone的英文含义是类似的。这些开源工程的名称暗示自己的设计运行速度飞快。

这三者间存在联系和差异:

  • Twisted是独立发展的网络编程架构,基于epoll/poll/select,跨操作系统。

  • Twisted不仅仅针对Web,它还包括了许多其他网络协议。

  • Tornado是FriendFeed设计的异步非堵塞Web网络框架,基于epoll。

  • Tornado虽然也可以支持套接字服务器,但其主要作为Web服务器使用。

  • Twisted的Web过于简单,Cyclone项目将Tornado API在Twisted上重新实现,是Twisted Web完整框架。

  • Cyclone的缺陷在于生态和社区不够强,只有作者一人维护。

  • Twisted上还推荐Klein做Web,Klein比Cyclone更加简单,但Cyclone更加完整。

虽然Tornado也支持socket/WebSocket/Web Server,社区生态也很强,但笔者希望尽量减少框架种类,还是采用了基于Twisted/Cyclone的完整生态开发。

在服务客户定制项目的过程中,笔者以Twisted为基础实现了EPIC设备连接服务器,具备以下特点:

  • 物联网设备联网使用Twisted TCP/UDP套接字服务器;

  • Web/Web API使用Cyclone;

  • MQTT接入采用mosquitto开源服务器;

  • CoAP 接入采用txThings代理服务器;

  • 消息队列采用Redis/ZeroMQ;

  • 负载均衡使用Ngnix或PaaS;

  • SQL数据库采用MySQL/MariaDB;

  • 内存数据库采用Redis。 

因文章篇幅有限,更多有关 Twisted 套接字服务器设计、协议接入可查看《从芯片到云端:Python物联网全栈开发实践》。

图书详情

0?wx_fmt=jpeg

摘要:本书讲述如何以Python为主要编程语言,实现“从芯片到云端”的物联网应用系统快速开发和系统扩展。通过阅读本书,读者可以充分体会Python作为一门全栈开发语言,是如何在物联网的设备端、应用端、服务器端和数据端环节中发挥作用的。

作者:刘凯,服务于微电子行业二十余载的资深工程师。曾在飞利浦半导体(即NXP恩智浦半导体前身)任资深工程师,从事软、硬件开发与产品设计等工作,有用汇编/C/C++开发嵌入式系统固件、用Perl/Python脚本做开发支持工具、用PHP/Java/Python做设备云和Web应用的丰富经验。

如果有迫不及待的宝宝们想要即刻阅读这本书,点击下方【阅读原文】,即可订购哟~~

赠书规则

如果你对本书感兴趣,可以在本文下方留言,说出自己申请理由,我会把有价值的评论放出,根据评论点赞数+申请理由挑选出 5 位参与的小伙伴。

截止时间:12 月 2 日中午 12:00。


0?wx_fmt=jpeg


python 全栈开发

  • 2017年11月08日 14:04
  • 1.65MB
  • 下载

2017最新整理python全栈工程师系统培训之路精品课程(全套)

百度搜索“一起自学吧”做大数据专家,不做第一,只做唯一。 课程介绍: 本课程由一起自学吧论坛打造,目的是给想成为Python全栈工程师的同学提供一套完整,全面而系统的培训课...
  • shikailonggy
  • shikailonggy
  • 2017年07月07日 15:47
  • 2333

《Python Web开发实战》读书笔记一

1、python web课程资源 2、虚拟环境virtualenv的使用 3、virtualenvwrapper扩展 4、使用virtualenv-burrito打包完成virtualenv, vir...
  • watermelonbig
  • watermelonbig
  • 2016年10月16日 15:17
  • 3058

CSDN物联网学习5 从芯片到云端 Python物联网全栈开发经验教训共享

刘凯一、前言物联网端到端模型物联网与互联网差异 开发环节:物联网增加了设备相关的设备域开发; 人机交互:没有标准显示组件,不支持现有UI组件,需要NUI、智能传感器 接入协议:设备能力受限,需要支持M...
  • xundh
  • xundh
  • 2017年07月01日 15:54
  • 2418

未来物联网全栈开发 --JavaScript or Python?

版权声明:本文为博主杜锦阳原创文章,未经博主允许不得转载,如有侵权将依法追究其法律责任。 目录(?)[+] 先来说说 Javascript再来说说 Python未来谁是王者 ...
  • Qsir
  • Qsir
  • 2017年05月14日 15:45
  • 1923

python 物联网全战开发经验教训

  • 2017年08月15日 19:15
  • 1.87MB
  • 下载

Micropython加速物联网开发1 - Micropython初体验

Mircopython使得用python进行单片机开发成为可能,其基于ANSI C,语法跟Python 3基本一致,拥有自己的解释器、编译器、虚拟机以及类库。目前已支持多款单片机,本例使用基于STM3...
  • messidona11
  • messidona11
  • 2017年05月11日 16:14
  • 1983

物联网的全栈开发之路

物联网的全栈开发技术
  • yueqian_scut
  • yueqian_scut
  • 2016年09月30日 19:04
  • 5316

【物联网(IoT)开发】使用 Arduino 和 Python在 Bluemix 上开发一个 IoT 应用程序之控制LED灯开关

上篇“【物联网(IoT)开发】Arduino 入门 Hello World(LED闪烁)”只是通过将一段程序烧录到Arduino开发板上控制LEC闪烁,没有任何连网动作,也就是说断开网络提供电源依然还...
  • testcs_dn
  • testcs_dn
  • 2016年10月02日 12:58
  • 11402

从端到云——工业物联网项目全栈快速开发实践

时至今日,随着国内外大公司的介入,物联网越来越热。本文作者将结合工控领域的特色及当前物联网领域的一些新技术新趋势,分享工业物联网和民用物联网的特色及异同,并从自身实际应用开发的角度,解读从端到云,工业...
  • tangxiaoyin
  • tangxiaoyin
  • 2017年06月08日 15:49
  • 5507
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:福利 | Python 物联网全栈开发实践
举报原因:
原因补充:

(最多只允许输入30个字)