目前,所有已呈现的通信都是基于请求响应方法的,其中一个实体正在发送请求,另一实体正在发送回响应。 但是在某些情况下,您需要ESP8266模块与服务器之间的实时通信,而不仅仅是事务。
实时通讯协议
ESP8266流数据
要从ESP8266流传输数据,我们首先需要在ESP8266与服务器之间建立连接; 通过连接流式传输的数据将是X,Y和Z轴的加速度值。 ESP8266将从ADXL345芯片读取它们,并将其发送到nodeJS服务器。 可以从服务器将数据发送到同一服务器上连接的浏览器,也可以将其写入数据库以进行进一步分析:
最终电路还可以包括一个时间序列数据库,例如InfluxDb,用于存储由ADXL345传输的值。
添加数据库可以使您从多个加速度传感器收集各种数据,将它们存储在数据库中,根据要求检索它们以将它们与当前值进行比较,或者使用当前和历史数据绘制漂亮的图形。
服务器还可以对某些值做出反应,并发送警报(电子邮件,SMS),并将数据发送到其他ESP8266模块以做出反应,或发送到其他服务器。
ADXL345加速度计
它是由Analog Devices(AD)生产的一种超低功耗3轴加速度计,能够进行高达±16g的高分辨率测量。 如果您仅打算测量地球的重力,那么±2g可能就足够了。 对于汽车运动,±4g很好,但是如果您要跟踪突然停止的物体,则需要±16g:
加速计连接ESP8266
代码
服务器端
服务器端使用了Node.js和Express.js.。启动服务器步骤:
打开浏览器,将其指向服务器的IP地址和端口,您将在SmoothieJS提供的漂亮图形上看到加速:
按下重新启动ESP8266将远程重新启动您的模块,如果您从网页上按下重新初始化ESP8266按钮,则ESP8266将重置Wi-Fi凭证,IP地址和端口号的所有数据。
您可以在同一服务器上添加多个模块,对于每个新连接,服务器将为其添加新的图形和新的按钮。 这样,您可以监视同一页面中的多个传感器,而无需刷新它或执行任何操作。 如果您想为您的家庭自动化平台提供一个不错的仪表板,这非常好
作为改进,您可以添加时间序列数据库(例如InfluxDB)来存储接收到的值,并具有所需的持久性。 要创建更复杂的仪表板,可以使用Grafana(https://grafana.com/):
服务器端代码包含两部分:
- 后端代码,负责从ESP8266模块和Web页面接收连接
- 连接到服务器并显示漂亮图形的前端代码
后端代码
整个后端代码都是用JavaScript编写的,位于server.js文件中。
要接收消息,必须为其添加处理程序。 在“连接”事件中,当收到消息时,意味着新的ESP8266加速模块要连接到服务器。 ID和套接字的值从“数据”中检索,并添加到先前连接的ESP8266加速模块的本地列表中:
为了通知所有连接的浏览器新的ACC准备发送数据,后端服务器代码向它们发送acc_ram消息,并转发包含模块ID的数据对象。
收到消息后,浏览器将为新模块动态构建图形元素(用于绘图的画布,按钮)。
当后端接收到包含测得的加速度值的JSON消息类型时,该消息将转发到所有浏览器,并且这些值将成为smoothie.js图形的输入数据:
对于从网页接收到的发往特定ESP8266模块的消息,我们需要首先根据套接字ID识别目标模块,然后将该消息发送到正确的模块。 否则会向所有ESP8266模块发送一条reset命令:
前端网页
Node.js服务器提供的网页是使用BoostrapJS和AngularJS开发的简单SPA。 该网页将尝试通过WebSocket连接连接到服务器,然后它将发送自己的注册消息,以便服务器可以将其套接字添加到其数据库中。
来自ESP8266但由后端服务器转发的加速度值的入口点为:
该函数从服务器接收实际数据,并使用append函数将X,Y和Z加速度的值添加到smoothie.js中。
结语
我们完成了ESP8266可以实现的另一项重要功能,即实时通信。 您已经了解了如何将实时加速度从ADXL345 3轴加速度计传输到后端Node.js服务器,该服务器将接收到的数据转发到连接的浏览器。 使用smoothie.js,很好地实时绘制数据。 您还可以扩展改项目,将接收到的数据存储在时间序列数据库中,将Grafana用作值的显示工具,通过MQTT将它们发送给MQTT代理。 添加数据库和一个很好的用于显示值的工具可使该解决方案成为商业解决方案。 您也可以开发一个平台,用于存储和显示其他公司或私人用户的实时数据。
详情参阅 - 亚图跨际