ESP8266与网络服务器实时通讯

背景知识视频教程

  • Bootstrap 4布局:响应式单页设计
  • Node.js,Express,MongoDB等:2020年完整的训练营
  • 高级Express

目前,所有已呈现的通信都是基于请求响应方法的,其中一个实体正在发送请求,另一实体正在发送回响应。 但是在某些情况下,您需要ESP8266模块与服务器之间的实时通信,而不仅仅是事务。

实时通讯协议


ESP8266流数据

要从ESP8266流传输数据,我们首先需要在ESP8266与服务器之间建立连接; 通过连接流式传输的数据将是X,Y和Z轴的加速度值。 ESP8266将从ADXL345芯片读取它们,并将其发送到nodeJS服务器。 可以从服务器将数据发送到同一服务器上连接的浏览器,也可以将其写入数据库以进行进一步分析:

最终电路还可以包括一个时间序列数据库,例如InfluxDb,用于存储由ADXL345传输的值。

添加数据库可以使您从多个加速度传感器收集各种数据,将它们存储在数据库中,根据要求检索它们以将它们与当前值进行比较,或者使用当前和历史数据绘制漂亮的图形。

服务器还可以对某些值做出反应,并发送警报(电子邮件,SMS),并将数据发送到其他ESP8266模块以做出反应,或发送到其他服务器。

ADXL345加速度计

它是由Analog Devices(AD)生产的一种超低功耗3轴加速度计,能够进行高达±16g的高分辨率测量。 如果您仅打算测量地球的重力,那么±2g可能就足够了。 对于汽车运动,±4g很好,但是如果您要跟踪突然停止的物体,则需要±16g:

加速计连接ESP8266

代码

由于该sketch还有一些用于WebSocket连接的额外类,因此这里仅显示.ino文件的基本部分。

包含库:


实例化一个accel对象并创建一个唯一标识作为类构造函数的参数:


为服务器名称或其IP地址分配空间,并将默认端口设置为1234。稍后,用户将能够在Wi-Fi设置过程中选择一个:


声明将使用的全局变量:


如果要格式化SPIFFS并将clean-g再次刷新到ESP8266,请将clean_g设置为1:


通知我们需要将配置保存到SPIFFS上的config.json文件的回调函数为:


在setup()函数中,它将初始化并设置ADXL345芯片:


初始化传感器。 如果传感器未连接到ESP8266开发板,请等待:


将范围设置为适合您的项目的任何范围。 ADXL345最多可支持±16g。 根据您的应用程序,可以通过更改SetRange函数的参数来选择其他值:


接下来,从SPIFFS config.json文件中读取配置。 如果未找到配置文件,则ESP8266会假设它未配置,因此它将以接入点模式启动,并等待用户设置Wi-Fi SSID,Wi-Fi密码,服务器名称和服务器的端口,将用于连接到:


使用自定义字段(例如服务器名称和服务器端口)以及将保存到SPIFFS的Wi-Fi SSID和Wi-Fi密码配置WiFiManager,以便在每次ESP8266重启时自动连接:


现在,我们拥有将保存到SPIFFS的所有信息。 本部分仅在首次配置ESP8266时调用。 引入的信息将是持久性的,因为现在可以在每次引导时对其进行保存和检索:


现在,我们将连接到服务器,然后,我们将发送一条连接消息,其中包含从ESP8266的MAC地址派生的唯一标识。

服务器可以使用此消息来识别ESP8266并动态构造一些Web界面。 在这种情况下,如果服务器收到连接消息,它将构建一个图形,该图形将实时显示所有三个轴的接收值:


在主循环中,我们将:

  • 在每个时间间隔读取加速度的值,并将构造一个JSON消息,该消息将发送到服务器
  • 检查是否有来自服务器的传入消息。您还可以从服务器控制ESP8266; 您可以设置一些参数,重新启动ESP8266,触发某个GPIO,甚至通过格式化SPIFFS将ESP8266重置为其默认值。
  • 检查连接状态,如果有必要,请重新连接到服务器。

同样,在loop()函数中将检查连接状态,如果有必要,如果连接丢失,则重新连接到服务器:


检查是否有来自服务器的传入消息:


如果ESP8266收到一条名为welcome的消息,它将以一条名为connection的消息及其唯一ID响应:


如果收到的消息为resetModule,则EPS8266会自行重置。 可以在此处添加很多消息,以更改GPIO的状态,读取GPIO状态,从A0读取值或将PWM写入GPIO:


检查与服务器的连接,如果有必要,请重新连接:


服务器端

服务器端使用了Node.js和Express.js.。启动服务器步骤:

打开浏览器,将其指向服务器的IP地址和端口,您将在SmoothieJS提供的漂亮图形上看到加速:

按下重新启动ESP8266将远程重新启动您的模块,如果您从网页上按下重新初始化ESP8266按钮,则ESP8266将重置Wi-Fi凭证,IP地址和端口号的所有数据。

您可以在同一服务器上添加多个模块,对于每个新连接,服务器将为其添加新的图形和新的按钮。 这样,您可以监视同一页面中的多个传感器,而无需刷新它或执行任何操作。 如果您想为您的家庭自动化平台提供一个不错的仪表板,这非常好

作为改进,您可以添加时间序列数据库(例如InfluxDB)来存储接收到的值,并具有所需的持久性。 要创建更复杂的仪表板,可以使用Grafana(https://grafana.com/):

服务器端代码包含两部分:

  1. 后端代码,负责从ESP8266模块和Web页面接收连接
  2. 连接到服务器并显示漂亮图形的前端代码

后端代码

整个后端代码都是用JavaScript编写的,位于server.js文件中。


要接收消息,必须为其添加处理程序。 在“连接”事件中,当收到消息时,意味着新的ESP8266加速模块要连接到服务器。 ID和套接字的值从“数据”中检索,并添加到先前连接的ESP8266加速模块的本地列表中:


为了通知所有连接的浏览器新的ACC准备发送数据,后端服务器代码向它们发送acc_ram消息,并转发包含模块ID的数据对象。

收到消息后,浏览器将为新模块动态构建图形元素(用于绘图的画布,按钮)。

当后端接收到包含测得的加速度值的JSON消息类型时,该消息将转发到所有浏览器,并且这些值将成为smoothie.js图形的输入数据:


对于从网页接收到的发往特定ESP8266模块的消息,我们需要首先根据套接字ID识别目标模块,然后将该消息发送到正确的模块。 否则会向所有ESP8266模块发送一条reset命令:


前端网页

详情参阅http://viadean.com/esp8266_realtime.html

你可能感兴趣的:(物联网,esp8266,服务器,后端,前端)