剑客
关注科技互联网

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

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

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址