Node-RED简介
Node-RED 是构建物联⽹(IOT, Internet of Things)应⽤程序的⼀个强⼤⼯具,其重点是简化代码块的“连接”以执⾏任务。它使⽤可视化编程⽅法,允许开发⼈员将预定义的代码块(称为“节点”,Node)连接起来执⾏任务。连接的节点,通常是输⼊节点、处理节点和输出节点的组合,当它们连接在⼀起时,构成⼀个“流”(Flows)。
Node-RED最初是IBM在2013年末开发的⼀个开源项⽬,以满⾜他们快速连接硬件和设备到Web服务和其他软件的需求——作为物联⽹的⼀种粘合剂,它很快发展成为⼀种通⽤的物联⽹编程⼯具。重要的是,Node-RED已经迅速形成⼀个重要的、不断增长的⽤户基础和⼀个活跃的开发⼈员社区,他们正在开发新的节点,同时允许程序员复⽤Node-RED代码来完成各种各样的任务。
五四青年节虽然Node-RED 最初是⽤来处理物联⽹的应⽤,也就是说,它与现实世界交互和控制设备,随着它的发展,它已经成为⼀个较为开放的物联⽹开发⼯具。本章内容将介绍⼀些Node-RED的⽰例,既可以了解其功能,也可以介绍基本概念。同时还将讨论Node-RED的历史及其起源,以便让您了解Node-RED是什么样的,哪些类型的任务最好留给传统的编程环境。
到本章节结束时,希望你会对Node-RED,编程模型和⼀些简单的预构建节点有⼀个初步的认识,同时能深⼊了解Node-RED的起源和最佳⽤法。
认识Node-RED
从⼏个简单的例⼦⼊⼿,看看可以⽤Node-RED来做的事情。⽬的不是告诉如何⽤Node-RED编程(后续会持续更新),⽽是通过⼀些基础的例⼦对它的能⼒有所了解。如果想直接学习,你可以跳到第2章(或者等待第2章的更新),在那⾥将详细地描述如何创建和运⾏你的第⼀"流"(Flow)的步骤。
第⼀个例⼦是运⽤收到包含推特标签的反馈信息,⽤来打开和关闭树莓派(Raspberry Pi)的LED。在这个例⼦中,采⽤了在在树莓派的运⾏Node-red,当然后⾯也补充了基于Windows的Node-RED做的⼀个简化的模型。
⽰例1.1 使⽤Twitter控制树莓派
Node-RED的流检查推特信息,当⼀个带有# LED推特信息的标签被检测到,则打开连接到树莓派的LED。具体的编程流如图1.1所⽰。正如你所看到的,这很简单;它由3个节点连接在⼀起,其中左边为推特节点,中间为触发节点和最右边为树莓派的节点(GPIO
node,GPIO,General Purpo Input/Outpu,即通⽤输⼊/输出,集成在树莓派硬件上节点)。通常Node-RED的图标都由其⽅框中左边的图标来表⽰节点的类型,例如第⼀个节点中的Twitter 鸟图标。⽅框中右边的部分则可以由程序开发者⾃⾏编辑。
图1.1 使⽤Twitter标签触发树莓派LED3节点流
这三个节点中的每⼀个都被构建到Node-RED可视化编程⼯具中,并可以从⼀个节点编辑栏拖到主⼯作区。然后将输出选项卡连接到下⼀个节点的输⼊选项卡,节点框右边或左边的⼩灰斑连接,进⽽实现流的通路,下⼀个章节将详细讨论,但现在让我们把重点放在使⽤逻辑上。
Twitter节点是Node-RED的内置节点,简化了使⽤Twitter API的复杂性,在功能上它可以配置⽤户帐户的凭据和各种搜索字符串。在这个应⽤中,⽤到只是寻找# LED标签。当Twitter节点在对⽤户的推⽂或公共推送的反馈中看到标签时,它会创建⼀条新消息,其中包含推送的细节,该消息转发到流(Flow)中的下⼀个节点。在⽰例中,由于Twitter节点的输出被连接到触发节点的输⼊,所以触发节点能接收消息中的详细信息。触发器节点是Node-RED⾊中的另⼀个内置节点,其默认⾏为是等待其输⼊的任何消息。当它收到⼀条消息时,它就会触发,输出值“1”,以消息体发送消息。然后等待1秒,
然后在消息正⽂中发送值为“0”,作为第⼆条消息。
由于触发节点连接到树莓派的通⽤输⼊/输出接⼝(GPIO Node),控制输⼊/输出或树莓派的其他引脚,它得到的这两条消息。在Node-RED的通⽤输⼊/输出⼝(未详细地介绍树莓派的IO引脚具体信息),当获得⼀个“1”值的消息时,它将IO引脚电压升⾼,当它接收到⼀个带有“0”的消息时,它将引脚的电压拉低。在这个例⼦中,该通⽤输⼊/输出⼝配置控制引脚数为12,这个节点信息也显⽰在节点图标上。如果你有你的树莓派,并且有线与LED连接到引脚12,该通⽤输⼊/输出⼝的电压⾼1秒钟然后低,这就会使LED闪烁1秒。
如果你想了解在这⾥发⽣了什么,这实际上是⼀个有意思的Node-RED和物联⽹的例⼦。它是连接Twitter和树莓派的通⽤输⼊/输出⼝,抽象的理解可认为是搜集⽹络信息,并像信息传递到实际的硬件上。实现这样的应⽤不需要编程,所有的任务都是通过预先在Node-RED配置的节点上进⾏,因此只需要配置就可以完成。同时,只需要⼀个简单的树莓派,或其他⽀持Node-RED的硬件,就可以完成这⼀功能。
Node-RED是⼀种基于流的编程⼯具,它有⼀个可视化编辑器,允许将节点连接在⼀起创建流。在上述的案例中,3个节点创建了⼀条流。这也是很有现实意义的应⽤,将标签#LED转换为信息,这些信息在传达到真实的载体上,其中“流”的形态可以理解为节点之间线。节点在其输⼊中处理消息,将输
出的消息发送到流中的下⼀个节点。在这个简单的例⼦中,寻找⼀个Twitter上# LED标签并⽤它来触发消息到Raspberry Pi的节点,最终导致输出引脚12到⾼1秒的拉升,最终可看到LED闪烁1秒。
双鱼座狮子座鹿柴的拼音这个例⼦以及本章的其他部分,主要是向⼤家展⽰我们可以⽤Node-RED来做的事情。如果想玩这个例⼦,第2章节中会有介绍,会详细地阐述如何开始。 具体的这个程序,请在公众号中留⾔。
考虑到国内的⽤户⽆法便捷的连接到Twitter,以及没有树莓派。做了⼀个最简单的流,基于window端的Node-RED。会在Debug界⾯中,呈现的跳变的结果。
图1.2 使⽤⼀个触发信息修改输出值简化3节点流
图1.3 在debug视图下查看的调试结果
⽰例1.2 当你在锻炼计划落后时,⽤Node-RED提醒你
第⼆个例显⽰Node-RED不同⽤法。⽽不是控制设备底层的硬件设备,这个流结合⽓象信息和你的Fitbit的应⽤,通过分析数据情况,向你的电⼦邮件发送警报。在天⽓好的时候,检查你的锻炼计划是否完成。流程有点复杂,使⽤6个节点(如图1.4),仅仅通过使⽤内置节点,可以通过很少的编程来完成略复杂的任务。
图1.4 邮件提醒户外运动的流
和上述⼀样,节点从Node-RED的搜索栏拖出来,并流的编辑页⾯上连接在⼀起。在最左边的节点,让我们开始⼀个Openweather节点(⾮标准节点)可以配置检查设定在⼀定时间间隔在任何主要城市天⽓。运⾏时,它将结果打包到⼀个消息中,并将消息转发到下⼀个节点。下⼀个节点是⼀个交换节点,交换节点执⾏⼀个简单的测试,检查输⼊消息值与设定值的偏差,如果测试是真的,则发送⼀个值为“1”的消息。在这个例⼦中,它配置的检测是温度值(tempc)是否⾼于15摄⽒度。
如果今天⾛了不到1000步,那么从交换机节点⽣成⼀条消息,该消息通过流传递给函数节点(function node)。函数节点是⼀个通⽤的通⽤节点,允许⽤JavaScript编写⾃⼰的编程逻辑。后续的章节将详细地讨论这个节点,现在可以假设这个节点刚刚创建了⼀个新邮件,邮件主题和正⽂⽂本可以通过电⼦邮件发送。
⼀旦这个消息在函数节点中创建,它就通过流发送到最终节点,这是⼀个电⼦邮件节点。此节点将接收任何传⼊的消息主体,并将其发送到在初始化邮件节点时配置电⼦邮件帐户中。在这个案例中,可以设置它来向⾃⼰发送消息。
通过⾮常简单的流程使⽤Node-RED的内置节点来检查本地天⽓,如果天⽓相当暖和,⽽且你今天没怎么散步,它会给你发电⼦邮件提醒。虽然例⼦感觉很简单,只是看看天⽓,以及你的Fitbit的活动数据,你可以⽤类似的流检查家庭设备的状态,服务器计算机,或者⼀个⼯⼚的某个设备,然后你可以
使⽤输出节点发送邮件,推特或者调⽤现实中某些软件的API进⽽控制设备,这些选择是很丰富的。Node-RED是⼀个⾮常强⼤的⼯具,⽤于连接输⼊和输出,并提供许多节点,这些节点⽆论是由Node-RED内置或社区开发,这些组合可以执⾏⼀系列任务。
⽰例1.3 使⽤Node-RED的内置HTTP节点构建Web服务
在这章中介绍的最后⼀个案例是另⼀类流。它主要展⽰如何创建简单的Web服务响应真实世界的数据查询需求。⾸先发送⼀个HTTP请求,然后提供⼀个⽤图形表⽰的⽹页返回给浏览器。本例中Node-RED节点是⽤来提供⼀个Web服务器和由⼏个节点提供的简单服务。
继续使⽤前⾯的例⼦中使⽤的Fitbit结点,这个例⼦创建了⼀个简单的Web服务,可以让你查询你⼀天的Fitbit数据,使⽤饼图显⽰通过运动燃烧掉了多少卡路⾥。
流如图1.5所⽰,它是由4个节点组成。第⼀个和最后⼀个节点是HTTP输⼊和输出节点,它们共同⼯作以侦听HTTP请求并发送HTTP响应。此流侦听来⾃任何源的HTTP请求,我们假设这⾥有⼀个常规浏览器。当它到来时,需要它查询你的Fitbit数据,然后使⽤⼀个模板节点建⽴⼀个HTTP页⾯,并通过对HTTP输出节点发送到⽹页浏览器之中。
图1.5 ⼀个简单使⽤Fitbit数据的Web服务器实例图
同样,这只是为了让你对Node-RED的能⼒和灵活性有所了解,⽽不需要了解流如何⼯作的所有细节。你会在以后的章节中了解更多。在⼀个较⾼级别的应⽤中,HTTP输⼊节点已配置为侦听对URL的HTTP请求,这是⼀个组合的托管服务的使⽤,需要加上你的登录名和/ Fitbit 字符串。这将在第⼆个章节中更加详细地解释。
当⼀个HTTP请求时,HTTP输⼊节点创建⼀个消息,触发流程中的下⼀个节点,Fitbit的节点。Fitbit节点获取当前统计⽤户的信息,然后通过这些统计数据,作为⼀种信息。HTML模板节点是Node-RED中的另⼀个预构建节点,它与函数节点⼀样,允许您构建任意代码。然⽽,不像使⽤函数节点那样使⽤JavaScript,模板节点能编辑HTML之类⽂本语⾔。基本上,模板节点需要你的卡路⾥消耗数据,通过使⽤第三⽅的图形库,创建⼀个简单的HTML⽂件,会告诉接收浏览器使⽤第三⽅图形库显⽰所消耗的卡路。
⼀旦模板节点⽣成了HTML⽂件,它就把它作为消息传递给最终节点,这是⼀个HTTP响应节点。这个节点将HTML打包成⼀个HTTP响应,将它发回浏览器。然后⽤户会看到⼀个简单的卡路⾥消耗量图表(见图1.6)所有这些都是由⼀个简单的Node-RED流构建和服务的。
图1.6 ⼀个饼图,由Node-RED发出显⽰消耗的卡路⾥数量
Node-RED的历史
正如前⽂的⽰例所⽰,Node-RED是构建物联⽹应⽤程序和服务的强⼤⼯具,其主要原因是快速物联⽹原型应⽤开发需求。Node-RED引发是由IBM新兴技术组的⼀个开源项⽬,特别是通过两研究员Nick O'Leary和Dave Conway Jones。他们最初将Node-RED作为⾃⼰的⼯具,因为他们正在研究物联⽹项⽬,并正在“寻找⼀种⽅法来简化⼀些为客户构建传感器与系统之间连接的概念应⽤”。
菠萝水果茶
企业文化是什么2013年初,⼀个初始版本的Node-RED作为开源项⽬发布,并在2014期间建⽴了⼀个⼩型但活跃的⽤
户和开发组。在写作的时
候,Node-RED的仍然是⼀个新兴的技术,但已经看到了显着的开发者,实验者和⼀些⼤公司和⼩公司的尝试使⽤它开发⾃⼰需要的应⽤。今天有充满活⼒的⽤户和开发⼈员社区,核⼼致⼒于Node-RED代码本⾝,同时为流库贡献节点或流。
由于Node-RED仍然是⼀个迅速发展的技术,很多规则可能会迅速改变。这些⽂章都是基于都写在Node-RED的0.16.2版,部分应⽤请检查兼容性。
成交方式Node-RED与物联⽹
当IBM创建Node-RED时,他们主要关注的是物联⽹,即连接设备到流程,流程到设备的过程。作为⼀种快速的物联⽹应⽤开发⼯
具,Node-RED既强⼤⼜灵活。它的特点来⾃两个因素的结合:
Node-RED是基于流的编程模型,表⽰节点间事件流的消息,触发以及输出结果的处理。基于流的编程模型很好地映射到典型的物联⽹应⽤程序,这些应⽤程序以真实事件为特征,触发某种处理,从⽽导致实际操作。Node-RED将这些事件打包为消息,这些消息为在组成流的节点之间流动事件提供了⼀个简单⽽统⼀的模型。
内置节点集是Node-RED的第⼆个优势。通过建⽴⼀套强⼤的输⼊和输出节点,每⼀个隐藏的复杂性与真实世界互动,Node-RED的开发者提供了强⼤的基础,并让他们把迅速流动,完成很多⼯作,⽽不必担⼼的编程细节。
这两个因素使得Node-RED成为物联⽹应⽤开发者有⼒的⼯具。当结合灵活创建和使⽤功能节点,它允许开发⼈员快速写任意JavaScript。Node-RED社区不断创造和分享新的节点,Node-RED可能成为物联⽹开发者的主要⼯具之⼀。
兴趣学科Node-RED可能并不是物联⽹应⽤程序开发的最佳⼯具。虽然功能强⼤且灵活,但并不⼀定是正确的解决⽅案。某些情况下,Node-RED可能不是⾸选,包括:
复杂多功能物联⽹应⽤。Node-RED擅长于快速应⽤程序开发,并充当连接事件到动作或传感器到执⾏器的粘合剂。然⽽,当应⽤程序达到⼀定的规模时,通过Node-RED来可视化编程和管理变得⾮常复杂。有⼀些功能可以帮助这⼀点,例如⼦流(后续会有介绍),但最终UI会成为瓶颈。
基于流的编程并不⼀定是最适合应⽤程序开发的编程。就像某些编程语⾔擅长于某些任务⽽不是其他任务⼀样,基于流的编程也有它的弱点。循环是⼀个很好的例⼦:在处理循环时,Node-RED是很⿇烦的。男人和女人亲
基于流的编程是⼀种通⽤模型,并没有针对特定需求进⾏针对性或优化,例如数据分析或⽤户界⾯开发。⽬前,Node-RED对这些类型的应⽤程序没有具体的⽀持,也没有简单的⽅法来添加这种⽀持。显然,Node-RED的底层技术是JavaScript,可以利⽤它的能⼒来满⾜这些需求。如果要使⽤Node-RED来做原型开发,可⾏的⽅案是在找⼀种更适合任务语⾔中实现部分或全部应⽤程序,并使⽤Node-RED作为整体控件。
话虽如此,正如在本⽂中所⽰,将在后续的⽂章中分享,Node-RED是⼤量物联⽹应⽤的强⼤⼯具。随着它的发展,它将适应更⼴泛的环境,并且变得更加复杂和实⽤。同样重要的是,正如在随后的⽂章中我们会⼀起探索Node-RED,尽管Node-RED的根在物联⽹中,但它仅仅是⼀个⼯具,可以⽤来构建各种各样的应⽤程序,⽽不仅仅是物联⽹应⽤程序。事实上,在后续的⽂章中,将看到Node-RED被⽤于Web 应⽤程序、社交媒体应⽤程序、后台集成、IT任务管理等。
我希望在全⽂结束后,你所见的Node-RED,就像我们所做的那样,是⼀个灵活且功能强⼤的⼯具,可以在许多情况下使⽤,既可以⽤于原型开发,也可以⽤于产品级开发。
总结
在这篇⽂章中,我们对Node-RED的有了初步的了解。已经看到了如何使⽤⼀个可视化⼯具快速地创建需要的复杂执⾏任务,通过简单Node的连接吗,构建出复杂的任务。同时还了解了Node-RED的起
源,它是物联⽹的⼀个快速应⽤程序开发⼯具以及它是如何演变的。现在它被⽤于各种任务,⽽不仅仅是物联⽹编程。最后,讨论了Node-RED的局限性,并指出了其他语⾔和⼯具可能更好地应⽤在某些场合。在下⼀章节中,将开始⼀些真正的编程,并展⽰如何使⽤Node-RED所提供的基本节点构建⾃⼰的流