点击上方“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模型构建了高速异步事件驱动型网络编程框架。
图9-10 Twisted系统运行示意图
多核服务器与负载均衡
Ngnix由俄罗斯工程师Igor Sysoev开发,其徽标如图9-11所示。Ngnix可以作为Web代理服务器、Mail代理服务器和通用的TCP/UDP代理服务器。套接字服务器、Web服务器、Web API服务器的负载均衡可以采用Ngnix来实现,这几乎是行业标配之一了。
图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证书等。
图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物联网全栈开发实践》。
图书详情
摘要:本书讲述如何以Python为主要编程语言,实现“从芯片到云端”的物联网应用系统快速开发和系统扩展。通过阅读本书,读者可以充分体会Python作为一门全栈开发语言,是如何在物联网的设备端、应用端、服务器端和数据端环节中发挥作用的。
作者:刘凯,服务于微电子行业二十余载的资深工程师。曾在飞利浦半导体(即NXP恩智浦半导体前身)任资深工程师,从事软、硬件开发与产品设计等工作,有用汇编/C/C++开发嵌入式系统固件、用Perl/Python脚本做开发支持工具、用PHP/Java/Python做设备云和Web应用的丰富经验。
如果有迫不及待的宝宝们想要即刻阅读这本书,点击下方【阅读原文】,即可订购哟~~
赠书规则
如果你对本书感兴趣,可以在本文下方留言,说出自己申请理由,我会把有价值的评论放出,根据评论点赞数+申请理由挑选出 5 位参与的小伙伴。
截止时间:12 月 2 日中午 12:00。