以Socket作为服务器与传感器通讯手段的家庭能源管理系统
- 以Socket作为服务器与传感器通讯手段
- 多传感器支持
- 友好的Web用户界面
- 可以控制每一个传感器的开关面板
- 清晰的实时动态数据分析大屏幕
- 程序说崩就崩,我没有做任何与鲁棒性有关的考虑与设计。
- 哪怕程序正常跑起来了也不能说明是神明在保佑。我是坚定的唯物主义者。
- 别动代码,除非您知道自己在干什么。
- 以上三条纯属娱乐。不过程序确实挺粗糙的就对了。
这个项目由以下三个大模块组成:
- 后端通信模块
- 数据处理中间件
- WEB服务器与相应前端
根据课设要求,现在主要介绍后端通信模块。
SocketServer.py为通信模块的服务器端,负责接收传感器数据。
服务器端采用了socketserver库,该库封装了socket模块,使得每个拨入的连接将被传入一个新的线程处理,从而实现多传感器通信的功能。
socket模块运作模式如下:
- 定义连接,端口族等(这些功能已经被封装,将在编程时默认调用)
- 将程序绑定至指定端口
- 监听进入阻塞状态
- 当呼叫传入时,切换为accept状态
- 接受数据,填充缓冲区
- 循环程序,再次填充缓冲区,输出数据
SocketServer.py为通信模块的传感器端,负责模拟发送传感器数据。
模块允许创建多个线程来模拟多个传感器同时呼入的情况。
一个传感器应当发送这样的 json :
{
"type": "data",
"id": 1,
"sn": "DNPLK11FNK",
"power": "1200",
"state": "on",
"time": 1639451655.1565
}
- type:定义了数据类型,目前仅定义了“data”。
- id:传感器id,为整形类型
- sn:传感器序列号
- power:传感器检测到的功率
- state:传感器目前的状态
- on:表示传感器处于开启状态
- suspend:表示传感器正忙,处于挂起状态
- off:表示传感器处于关闭状态。当传感器处于关闭或挂起状态时,传感器将不发送当前功率。
- time:当前时间戳,为double类型
传感器将在每个通信轮询中接受来自服务器的命令,并会按照服务器命令切换状态。
{
"result": "ok"
}
- 当服务器返回ok时,传感器将在下一个通讯轮询切换为打开状态。
{
"result": "off"
}
- 当服务器返回off时,传感器将在下两个通讯轮询切换为suspend状态,随后切换为off状态
- 当传感器连续两个周期不返回任何数据,传感器将自动挂起并关闭。
- 数据处理负责将后端数据写入sqlite数据库,并计算相关数据供前端直接调用
- WEB部分负责创建相应的接口与前端页面,调用并显示页面与相关数据,并允许控制
- WEB服务器部分采用flask框架,采用Pywebio进行页面生,echarts生成实时图形。
本项目完全使用Python构成,解释器版本为3.10。您可以像运行普通Python程序一样运行本项目。
- 将本仓库克隆到本地
- 安装本项目使用的所有依赖库
- 运行仓库根目录下的main.py