MATLAB和物联网连载6: Thingspeak Tutorial 5

在前面的教程中,我们已经学习了Thingspeak的三种服务:MATLAB Analysis, MATLAB Visualization, Plugins 和TimeControl(图中

MATLAB和物联网连载6: Thingspeak Tutorial 5

在前面的教程中,我们已经学习了Thingspeak的三种服务:MATLAB Analysis, MATLAB Visualization, Plugins 和TimeControl(图中绿色所示),这一节我们将用两个例子继续学习React,TalkBack和ThingHTTP服务(图中红色所示)。在第一个例子中,我们把React和ThingHTTP的服务和另一个物联网领域很流行的IFTTT服务连接在一起, 利用NodeMCU 来演示如何让联网硬件在一定条件下给邮箱发邮件。第二个例子中,我们将演示用Talkback服务来控制联网硬件。

MATLAB和物联网连载6: Thingspeak Tutorial 5

如用Thingspeak和IFTTT让物联网硬件发邮件

这篇 土壤湿度检测的教程中 (湿度数据存放在Thingspeak的 Channel 138112中), 我们设计了一个联网的硬件负责定时收集土壤的湿度,有些时候,我们希望在数据满足一定条件的情况下,可以触发一些反应(React)。比如土壤湿度低于某个值,就发出一个警报或邮件。 下面就是这个设想的架构:联网硬件通过湿度检测仪监视土壤湿度,然后通过HTTP Put定时向数据收集服务Thingspeak报告湿度数据,Thingspeak中通过React服务来监视该频道的数据,一但湿度数值低于15,就触发ThingHTTP服务,而ThingHTTP的工作则是继续触发IFTTT中的Maker Channel的服务,最后发送邮件。

+-----+---------------------------------------------------------------

| | +-----------+ +--------------+

| | |soil +--------+ NodeMCU |

| | +-----------+ +--------+-----+

| | |

| | |HTTP Put Request

+-----+-------------------------------------+-------------------------

| T | +--------+-----+

| H | |Thingspeak |

| I | +-+-----------++

| N | | |

| G | +-----+----+ ++--------+

| S | | React | | Thing |

| P | | | | HTTP |

| E | | | | |

| A | +----------+ +----+----+

| K | |HTTP Put Request

+-----+----------------------------------------------+-----------------

| I | +---------------------+----+

| F | | IFTTT Maker Channel |

| T | | |

| T | +------------+-------------+

| T | |

| | |IFTTT with Gmail

+-----+-------------------------------------+--------------------------

| | +-------+------+

| | | Gmail |

| | +--------------+

+-----+----------------------------------------------------------------

IFTTT Maker Channel的设置

现在我们从后向前来设置这个反应链,IFTTT是If This Then That的缩写,它的服务是:用户通过指定This(触发条件/如果)和That(连锁反应/就)来创建自己的Recipe(物联网如果就反应链),来自动化一些简单的小任务。比如:如果(If)用手机拍了照片,就(That)自动的把这张照片存在Dropbox中。IFTTT中有一个Maker Channel可以将Web Request作为If的条件,这就是我们今天要使用的。首先在Maker Channel中创建一个Recipe:

MATLAB和物联网连载6: Thingspeak Tutorial 5

这个Recipe的Trigger是:如果(If)收到一个Web Request

MATLAB和物联网连载6: Thingspeak Tutorial 5

就(That)选择Trigger的Response,这里选择mail(作为例子笔者选择gmail)

MATLAB和物联网连载6: Thingspeak Tutorial 5

还填入要发送的邮件的内容,注意它给出的模板格式,其中{{}}允许我们从发送来的Web Request中提取同名的数据,然后转发到邮件当中去

MATLAB和物联网连载6: Thingspeak Tutorial 5

Maker Channel中有详细如何向Channel发送HTTP的request的教程,参见 这里 。Maker Channel还提供了测试功能,来验证Response的设置

MATLAB和物联网连载6: Thingspeak Tutorial 5

或者使用如下的命令直接测试

curl -X POST -H "Content-Type: application/json" -d '{"value1":"1"}' https://maker.ifttt.com/trigger/plant_alarm/with/key/cY05pyaeXXX

ThingHTTP的设置

ThingHTTP将负责向Maker Channel发送Web Request。首先创建一个新的ThingHTTP服务,和IFTTT的连接设置如下

MATLAB和物联网连载6: Thingspeak Tutorial 5

注意:

  • URL中要包括IFTTT提供的一个Private Key
  • Content type必须是JSON,因为IFTTT Maker Channel预期的格式是JSON
  • 在Body中,可以援引任何Channel中的数据,这是要发送给IFTTT的数据,格式如下:

{"value1":"%%channel_138112_field_1%%"}

React的设置

最后,创建一个React服务,设置如下:每15分钟检查一下Channel 138112,如果值低于15,触发ThingHTTP中的plant alarm服务

MATLAB和物联网连载6: Thingspeak Tutorial 5

因为土壤的湿度一直低于15,所以完成这个设置之后,因为很快就会受到NodeMCU通过Thingspeak和IFTTT发送的邮件。

如何用Thingspeak控制联网硬件

向硬件发送命令的最简单的方式当然是使用MQTT,该协议是一种发送和接受的模式(Subscribe and Publish)。除此之外Thingspeak还提供了一个服务,叫做Talkback,它把要向硬件发送的命令存在一个消息或命令队列中,并且由硬件自己主动地查询(Pull)要传递给自己的信息。比如:如果我们希望NodeMCU可以往不同的Channel中发送数据,而具体往哪一个Channel中发送,则由writeKey来决定(因为Channel和writeKey有一一对应的关系),这就要求在部署硬件之后,必须可以再修改writeKey,这就要求writeKey不能在程序中事先指定好,而必须从其它地方得到的。由于writeKey是一串随机的字符串,所以它不能当做double型的数据存在数据Channel中,于是,可以存贮任意字符的Talkback服务在这儿就派上用场了。下面是这个例子的架构图: 硬件先从Talkback的服务处得到writeKey,再把数据发送到writeKey对应的Channel。

 +---+--------------------------------------------------------

| T |

| H | +---------------+ +----------------+

| I | | Talkback | | Channel |

| H | | | | |

| G | | writekey | | |

| S | +-----------+---+ +-----^----------+

| | | ^

-+---+----------------V---------------------+------------------

| N | V |

| O | +--+----------+ |

| D | | NodeMCU | |

| E | | +----------+

| M | | |

| C | +-------------+

| U |

+---+---------------------------------------------------------

Talkback提供简单的HTTP接口,来存储和维护一个消息命令队列,如下所示: Example : Talkback ID(10060)

PositionCommand IDCommand string12687601command_122687602command_232687603command_3

它支持往队列中添加,更新命令,还有从队列中取出(消耗)一个命令,当取出命令的时候,它遵循先进先出原则。每一个talkback服务都有一个ID,相当于消息队列的ID,而在一个队列中,每一个命令也有一个自己的ID,叫做Command ID,在更新command string时,即需要指定Talkback ID,还需要指定Command ID.

往队列中插入一个command的curl命令如下

curl -X POST -H "Content-Type: application/json" -d '{"api_key":"writekey","command_string":"new_command"}'  https://api.thingspeak.com/talkbacks/10060/commands.json

在NodeMCU上,往队列中插入command,可以通过NodeMCU的Net Library完成

conn=net.createConnection(net.TCP, 0) 

conn:on("connection",function(conn, payload)

cmd ="POST /talkbacks/10060/commands.json?api_key=R0BP3QV2NRPRVEJQ&command_string=3PGT8C4EBT5SRY4K"

.. " HTTP/1.1/r/n"

.. "Host: api.thingspeak.com/r/n"

.. "/r/n";

conn:send(cmd);

end)

conn:on("receive", function(conn, payload)

print("received");

conn:close()

end)

conn:connect(80,'api.thingspeak.com')

最后,先查询Talkback消息命令队列,然后决定哪一个channel中发送数据的NodeMCU Lua程序参见这篇的最后一段: A practical Example: Talkback: Queue commands to NodeMCU via Thingspeak

未登录用户
全部评论0
到底啦