一分钱的物联网:使设备具有Web界面


作者:DataArt高级嵌入式开发人员Nikolay Khabarov

在本文中,我们将介绍如何使用ESP8266芯片的最新版本的DeviceHive固件0.5版在家庭网络中使用Web界面创建自己的设备。但是,对于初学者来说,让我们看一下固件本身的新功能:主要的创新与在本地网络上脱机工作的能力有关。



该系列中的先前文章:

一分钱的物联网,或DeviceHive可以实现的功能。
物有所值的物联网:实用指南。第1部分,硬件。
在DeviceHive v 0.3固件中对ESP8266进行无线配置。
物有所值的物联网:实用指南。第2部分,软件。

好消息-我们已将ESP8266的DeviceHive固件更新为0.5版。对于那些忘记或根本不知道的人,我提醒您,该固件是连接到ESP8266芯片内的DeviceHive服务器的一种实现。新的固件功能使该芯片可以作为具有自身Web界面的终端设备在本地网络上工作。同时,尽管已保存了用于连接到远程服务器的所有功能,并且可以与本地解决方案结合使用,但您甚至不需要使用服务器来托管网页。

像往常一样,在GitHub上下载最新的固件您也可以在此处找到固件源代码

所以,我们有什么新鲜事。

1.本地RESTful API


现在,在端口80的每个芯片上,都有一个带有RESTful API的简单HTTP服务器。除了可以使用中断的功能以外,命令完全重复执行云命令。命令的完整列表可以在本文档中找到。例如,如果您想知道微电路所有引脚的状态,则需要使用命令“ gpio / read”。在云的情况下,我们只需将此命令发送到服务器,现在我们可以简单地通过地址“ http://device-id.local/api/gpio/read”访问本地RESTful API,作为回报,我们将获得一个包含所有结论状态的JSON 。如果未在芯片上设置访问密钥(AccessKey),则即使在浏览器中也可以执行此操作:



或使用curl工具。

curl -i -X POST  \
    -H "Authorization: Bearer YourAccessKeyHere="  \
    http://esp-demo.local/api/gpio/read

如果有密码,则必须在HTTP标头中传输它。该密钥既用于云服务器上的授权,也用于本地工作。对于本地使用,密钥应视为简单的字符串,即密码。该方法可以是GET或POST-这不会影响命令的功能。命令在请求地址中传输,参数(如果有)在请求主体中以JSON形式传输。

2.mDNS


您可能已经注意到,上面的示例使用域名esp-demo.local。现在,该芯片实现了组播域名系统,并且本地网络中所有支持mDNS的设备都可以将域名解析为IP地址。而且,可以检测网络中的所有设备,并且不需要本地DNS服务器。

mDNS运行在重复经典DNS的协议上,但是请求通过UDP发送到广播地址。设备侦听相同的广播地址并自己响应请求。芯片的deviceId(在固件设置过程中配置)用作域名。完全限定的域名将类似于DeviceId.local。

RFC6763描述发现服务的过程,包括内部mDNS。这可用于通过我们的固件检测芯片。有许多实用程序和库可以使用mDNS实现服务发现。例如,被'avahi-discovery'实用程序检测到具有DeviceId'esp-demo'的芯片如下所示:



某些现代操作系统可以从任何应用程序(例如,从浏览器)解析此类域名。有些将需要安装专门的软件。

3.支持流行的传感器


以前,要使用传感器,必须为传感器本身实现通信协议。现在,命令列表包括支持使用单个命令从常用传感器读取数据。例如,要从DS18B20传感器获取温度,您需要初始化温度测量过程,等到测量完成后再读取结果。这绝不是最困难的过程。现在,为了从传感器中找出温度,只需发送命令“ devices / ds18b20 / read”并获得形式为“ {“ temperature”:24.5000}”的JSON。有关支持的传感器完整列表,请参见命令列表

MPU-6050的数据输出示例(加速度计,陀螺仪,以及芯片上的温度传感器):



4.本地Web服务器


由于我们在HTTP服务器上具有RESTful API,所以为什么不给它网页。而且,他当然知道。在芯片上安装固件后,在“ http://deviceid.local/”中打开浏览器,您将看到芯片的Web界面。默认情况下,它包含有关使用固件的一些帮助,使用本地RESTful API的工具(您可以在其中尝试调用各种命令和base64转换器的页面),使用RESTful API的网页示例(您可以直接从中查看页面的源代码)浏览器)和到目前为止非常简单的网页文本编辑器。使用此编辑器,您可以直接从浏览器将芯片的主页更改为您自己的任何代码。页面大小限制为64KiB。

您可以像内置示例一样在芯片上放置一个页面,该页面将在JavaScript上用芯片实现任何操作,并在Web浏览器中将其显示给用户。而且,没有人禁止从同一页面访问本地网络中的所有芯片。



实践部分


现在,我们插入DS18B20温度传感器,并为其配备一个Web界面。传感器必须由GND和3V3引脚供电,并连接至某些GPIO引脚。电源引脚旁边是GPIO2,让我们使用它。可以按以下方式进行连接:



在照片中,这是用于实现ESP8266开发人员板的最受欢迎的选项之一,该开发板立即包括microUSB电源,USB-TTL适配器。非常方便。使用这样的板,您甚至不需要在固件过程中捏定任何结论,最新版本的固件更新程序将自行完成所有工作。只需插入Micro-USB并运行该实用程序即可。请注意,考虑到交付,此类板在中国交易大厅中为开发商开发的零售成本降至3-4美元。

但是回到Web界面。该芯片本身已经具有一个网页,其中包含使用DS18B20的示例。它位于“ http://deviceid.local/ds18b20.html”。打开它,如有必要,输入访问密钥,然后查看从传感器读取的温度:



您可以直接在浏览器中查看页面的源代码。如果您不喜欢这种设计,或者想要显示来自多个传感器的数据,或者需要连接其他传感器,则可以创建网页并将其上传到芯片,如上所述。

例如,让我们制作一个简单的网页来控制连接的继电器。

该代码将如下所示。
<html>
 <head>
 <script type="text/javascript">
    function send(onOff) {
      localStorage['accesskey'] = document.getElementById('accesskey').value;
      var xmlhttp = new XMLHttpRequest();  
      xmlhttp.open('POST', "http://" + window.location.hostname + '/api/gpio/write', true);
      xmlhttp.setRequestHeader("Authorization", "Bearer " + localStorage['accesskey']);
      xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4){
          if(xmlhttp.status < 200 || xmlhttp.status > 299) {
            alert('ERROR: Command return ' + xmlhttp.status + ' ' + xmlhttp.responseText, true);
          }
        }
      }
     var json = {}
     json["5"] = onOff ? 1 : 0;
     xmlhttp.send(JSON.stringify(json));
   }
   function init() {
     document.getElementById('accesskey').value = localStorage['accesskey'];
   }
 </script>
 </head>
 <body onload="init()">
  <label>AccesKey: </label><input type="password" id="accesskey"><br><br>
  <input type="button" value="On" onclick="send(true);">   <input type="button" value="Off" onclick="send(false);">
 </body>
</html>

该代码使用localStorage存储芯片访问密钥,因此不必每次都输入它。当您按下开/关按钮时,将调用XMLHttpRequest(),它将请求发送到本地RESTful API。
现在将此页面加载到芯片上。我们将连接SSR-40DA固态继电器,通过它我们将通过220伏交流电(即从电源插座)供电来开启电动机。自然,代替电动机,可以连接另一个负载,这样的继电器可以承受40安培的电流。在视频中,您可以看到如何连接这种继电器以及如何打开电动机:


就这样,谢谢大家的关注。欢迎任何批评和建议,写信!

Source: https://habr.com/ru/post/zh-CN398813/


All Articles