优秀的编程知识分享平台

网站首页 > 技术文章 正文

「智能家居」自动化平台nodered基础教程

nanyue 2024-07-26 15:53:28 技术文章 8 ℃

接上节,今天继续讲解基础类别节点,利用序列类别我们可以对消息体进行拆分、合并、排序,该类别有以下5个节点:

csv 在CSV格式的字符串及其JavaScript对象表示形式之间进行相互转换。

html 使用CSS选择器从msg.payload中保存的html文档中提取元素。

json 在JSON字符串及其JavaScript对象表示形式之间相互转换。

xml 在XML字符串及其JavaScript对象表示形式之间进行相互转换。

yaml 在YAML格式的字符串及其JavaScript对象表示形式之间相互转换。

html:我们可以搭配一个http的请求节点,使用http节点,去获取一个html的全部内容,然后使用html节点去进行解析 在解析的时候,首先要选择一个标签,比如你要获取一个html中的所有p标签,那么就可以这样配置,你可以将所有p标签内的文本内容存放到msg.payload中,当做一个数组来处理。

请求的html是这个,http://mczaiyun.top/data/1.html

内容很简单

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>scrollWidth和scrollHeight属性-蚂蚁部落</title>
<style type="text/css">
* {
margin: 0px;
padding: 0px;
}
#box {
width: 200px;
height: 150px;
border: 1px solid #ddd;
margin: 0px auto;
margin-top: 50px;
/* overflow: scroll; */
padding: 0px;
}
#box::before {
content: url("data:image/svg+xml,%3Csvg t='1610605001506' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='9843' xmlns:xlink='http://www.w3.org/1999/xlink' width='16' height='16'%3E%3Cdefs%3E%3Cstyle type='text/css'%3E%3C/style%3E%3C/defs%3E%3Cpath d='M562.005333 512l-211.2-211.2 60.330667-60.330667L682.666667 512l-271.530667 271.530667-60.330667-60.330667z' p-id='9844' fill='%239DA1A7'%3E%3C/path%3E%3C/svg%3E");
}
</style>
</head>
<body>
<div id="box">
<p>段落1</p>
<p>段落2</p>
<p>段落3</p>
<p>段落4</p>
<p>段落5</p>
<p>段落6</p>
</div>
</body>
</html>

我们使用这个节点,可以去定时监控一个页面的内容,比如有一个人发布了一篇文章,我们可以给某人发一封邮件。 也可以使用一些对外的信息,如微博,发布一条微博,来控制led灯的关闭,开启。这样的实战案例,需要我们来通过解析微博内容,来获取我们需要的内容。当然这里需要定制消息体,比如#开启#LED 或者#关闭#LED。解析相应的内容,进行不同的操作。

以下是这条流的json数据,大家可以导入自己动手做一下。

[
{
"id": "70d9360.22b68cc",
"type": "tab",
"label": "Flow 2",
"disabled": false,
"info": ""
},
{
"id": "c063491c.2a1318",
"type": "html",
"z": "70d9360.22b68cc",
"name": "get p",
"property": "payload",
"outproperty": "payload",
"tag": "p",
"ret": "text",
"as": "single",
"x": 650,
"y": 260,
"wires": [
[
"f6760bc5.997d58"
]
]
},
{
"id": "f6760bc5.997d58",
"type": "debug",
"z": "70d9360.22b68cc",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 900,
"y": 260,
"wires": []
},
{
"id": "56422139.aff37",
"type": "http request",
"z": "70d9360.22b68cc",
"name": "1.html",
"method": "GET",
"ret": "txt",
"paytoqs": "body",
"url": "http://mczaiyun.top/data/1.html",
"tls": "",
"persist": false,
"proxy": "",
"authType": "",
"x": 370,
"y": 260,
"wires": [
[
"c063491c.2a1318"
]
]
},
{
"id": "27d30977.7bc8e6",
"type": "inject",
"z": "70d9360.22b68cc",
"name": "",
"props": [
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 170,
"y": 260,
"wires": [
[
"56422139.aff37"
]
]
}
]

Json:使用与html差不多, 我们请求这个地址http://mczaiyun.top/data/wxdl.json来获取一个json数据,

这个json的内容是

是文心雕龙的文章

使用debug节点来打印json节点处理后的信息如下

Csv:文件内容

请求地址 http://mczaiyun.top/data/test.csv

请求的配置

配置完成之后 打印的效果是

Xml:与csv一致

Yaml:我们可以请求这个地址的一个yaml文件http://mczaiyun.top/data/pmc.yml

存储类别节点有以下4个:

file 将msg.payload写入文件,添加到末尾或替换现有内容。或者,它也可以删除文件。

file in 以字符串或二进制缓冲区的形式读取文件的内容。

watch 监视目录或文件中的更改。

tail 监听被一个文件被添加的内容

file:是将msg.payload写入文件,添加到末尾或替换现有内容。或者,它也可以删除文件。 输入 filename,也可以配置,如果没有该目录,则自动创建。写入完成后,输入消息将发送到输出端口。

每个消息的有效荷载将添加到文件的末尾,可以选择在每个消息之间添加一个换行符(\n)。

如果使用msg.filename,则每次写入后文件都会关闭。为了获得最佳体验,请使用固定的文件名。

可以将其配置为覆盖整个文件,而不是在文件后添加段落。例如,在将二进制数据写入文件(例如图像)时,应使用此选项,并且应禁用添加换行符的选项。

可以从编码列表中指定写入文件的数据的编码。

您可以将此节点配置为删除文件

file in:能以字符串或二进制缓冲区的形式读取文件的内容。输入 filename 如果未在节点配置中设置,该属性可以选择要读取的文件名。输入 payload 文件的内容可以是字符串,也可以是二进制的buffer。 filename 如果未在节点配置中设置,该属性可以选择要读取的文件名。

Watch:用于监视目录或文件中的更改。

您可以输入用逗号分隔的目录和/或文件的列表。您需要在所有带有空格的地方加上引号“...”。

在Windows上,必须在任何目录名称中使用双反斜杠\。

实际更改的文件的完整文件名将放入msg.payload和msg.filename中,而监视列表的字符串化版本将在msg.topic中返回。

msg.file仅包含已更改文件的短文件名。msg.type更改了事物的类型,通常是file或directory,而msg.size保留了文件的大小(以字节为单位)。

当然,在Linux中,everything也是一个文件,因此可以监视

PS:该目录或文件必须存在才能被监视。如果文件或目录被删除,即使重新创建它也可能不再被监视。

Tail:监听已配置文件中,被添加的内容。 在Windows上你需要根本文件的写入和更新注册。输出的是UTF-8的字符,或者二进制文件流。

完整地流配置

[
{
"id": "c9eae563.294d18",
"type": "tab",
"label": "流程 3",
"disabled": false,
"info": ""
},
{
"id": "738ced86.140b84",
"type": "file",
"z": "c9eae563.294d18",
"name": "追加到12.txt",
"filename": "12.txt",
"appendNewline": true,
"createDir": false,
"overwriteFile": "false",
"encoding": "none",
"x": 490,
"y": 260,
"wires": [
[
"921006b.457b4f8"
]
]
},
{
"id": "8dee2a6f.831118",
"type": "inject",
"z": "c9eae563.294d18",
"name": "",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "我是被追加的",
"payloadType": "str",
"x": 190,
"y": 260,
"wires": [
[
"738ced86.140b84",
"3576d67e.f638fa"
]
]
},
{
"id": "921006b.457b4f8",
"type": "debug",
"z": "c9eae563.294d18",
"name": "",
"active": true,
"tosidebar": true,
"console": true,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 750,
"y": 260,
"wires": []
},
{
"id": "3576d67e.f638fa",
"type": "file in",
"z": "c9eae563.294d18",
"name": "读取12.txt",
"filename": "12.txt",
"format": "utf8",
"chunk": false,
"sendError": false,
"encoding": "none",
"x": 500,
"y": 400,
"wires": [
[
"921006b.457b4f8"
]
]
},
{
"id": "b231a4b7.143ea8",
"type": "watch",
"z": "c9eae563.294d18",
"name": "监听12.txt文件",
"files": "12.txt",
"recursive": "",
"x": 500,
"y": 620,
"wires": [
[
"7fba4883.304338"
]
]
},
{
"id": "7fba4883.304338",
"type": "debug",
"z": "c9eae563.294d18",
"name": "",
"active": true,
"tosidebar": true,
"console": true,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 750,
"y": 620,
"wires": []
},
{
"id": "fdf417e5.6c4db8",
"type": "tail",
"z": "c9eae563.294d18",
"name": "监听并获取12.txt内容",
"filetype": "text",
"split": "[\\r]{0,1}\\n",
"filename": "12.txt",
"inputs": 0,
"x": 500,
"y": 700,
"wires": [
[
"d8ada19c.f13ec"
]
]
},
{
"id": "d8ada19c.f13ec",
"type": "debug",
"z": "c9eae563.294d18",
"name": "",
"active": true,
"tosidebar": true,
"console": true,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 770,
"y": 700,
"wires": []
}
]

网络类别下的节点共12个,

mqtt in 连接到MQTT代理并订阅来自指定主题的消息。

mqtt out 连接到MQTT代理并发布消息。

http in 创建用于创建Web服务的HTTP端点。

http response 将响应发送回从HTTP输入节点接收的请求。

http request 发送HTTP请求并返回响应。

websocket in WebSocket输入节点。

websocket out WebSocket输出节点。

tcp in 提供TCP输入选择。可以连接到远程TCP端口,或接受传入连接。

tcp out 提供TCP输出的选择。可以连接到远程TCP端口,接受传入的连接,或回复从TCP In节点收到的消息。

tcp request 一个简单的TCP请求节点。将msg.payload发送到服务器tcp端口,并期望得到响应。

udp in UDP 输入节点。在msg.payload中生成Buffer,字符串或Base64编码的字符串。支持组播。

upd out 该节点将msg.payload发送到指定的UDP主机和端口。支持组播。

这一模块是Node-red的核心模块,如果要与硬件,设备通信,都要通过该模块来实现。由于本章节点过多,所以分多期来讲,这一期我们先来看看 http in、http out、http request。

http in:可以用于创建一个web服务的http接口,支持的方法有以下几种

GET、POST、PUT、DELETE PATHC,也支持POST上传文件 编写一个接口很简单。

创建一个Http in 节点;

使用函数 function 节点来处理要返回的数据;

使用http out节点来返回数据到客户端;

这就是一个完成的http请求链路。

该节点向后输出的内容有

payload GET请求包含任何查询字符串参数的对象。或者包含HTTP请求正文。 reqHTTP请求对象。该对象包含有关请求信息的多个属性。

body - 传入请求的正文。格式将取决于请求。

headers - 包含HTTP请求标头的对象。

query - 包含任何查询字符串参数的对象。

params - 包含任何路由参数的对象。

cookies - 包含请求cookie的对象。

files - 如果节点启用了文件上传,则为包含了上传的文件的对象。

res HTTP响应对象。此属性不应直接使用;HTTP Response节点记录了如何响应请求。该属性必须保留在传递给响应节点的消息上。

我们创建这样一个接口

接口的路径是 /getname 使用get请求

然后在后方添加一个function节点

这样就可以在flow中追加payload消息体了。

http response:为了将HTTP响应发送回客户端,返回的消息体有这几个元素

payload 响应的正文。

statusCode 如果设置,则用作响应状态代码。默认值:200。

headers 如果设置,则提供HTTP头以包含在响应中。

cookies 如果设置,则可用于设置或删除cookie。

创建一个http response 追击到上一步的流中

部署后,在浏览器输入 ip:port/getname 会看到这样一个返回体

http request:发送HTTP请求并返回响应。 有输入、输出,输入有这些参数

url 如果未在节点中配置,则此可选属性设置请求的url。

method 如果未在节点中配置,则此可选属性设置请求的HTTP方法。必须是GET,PUT,POST,PATCH或DELETE之一。

headers 设置请求的HTTP头。

cookies 如果设置,则可用于发送带有请求的cookie。

payload 发送为请求的正文。

rejectUnauthorized 如果设置为false,则允许对使用自签名证书的https站点进行请求。

followRedirects 如果设置为false,则阻止遵循重定向(HTTP 301)。默认情况下为true

requestTimeout 如果设置为正数毫秒,将覆盖全局设置的httpRequestTimeout参数。

输出的参数

payload 响应的正文。可以将节点配置为以字符串形式返回主体,尝试将其解析为JSON字符串或将其保留为二进制buffer。

statusCode 响应的状态码,如果请求无法完成,则返回错误码。

headers 包含响应头的对象。

responseUrl 如果在处理请求时发生任何重定向,则此属性为最终重定向的URL。否则则为原始请求的URL。

responseCookies 如果响应包含cookie,则此属性是每个cookie的‘名称/值’键值对的对象。

redirectList 如果请求被重定向了一次或多次,则累积的信息将被添加到此属性。“location”是下一个重定向目标。cookie是从重定向源返回的cookie。

这里给出一个示例

请求一个接口,可以配置证书, 选择请求方式;然后在节点前添加,inject节点,用于触发接口,在节点后追加 debug节点打印消息。

部署后触发流

PS:nodered自带的基础组件已经讲完,后边慢慢讲第三方组件。

-- -- -- -- -- -- END -- -- -- -- -- --

我是小白,智能家居爱好者、一卡通行业从业者、曾经的建筑智能化从业者。致力为开源智能家居平台添砖加瓦。

Tags:

最近发表
标签列表