基于Django框架开发简单的物联网平台
在本文中,我们将探讨一个基于Django框架开发的简单物联网平台项目。这个项目不仅包括一个网页端界面,还涵盖了一个微信小程序端,两者在功能上是一致的。该平台主要用于展示温湿度数据,并提供数据的可视化展示以及远程控制设备的能力。
项目介绍
该项目后端使用Django框架,并利用MQTT协议实现数据的采集和传输。数据源可以是实时从传感器采集到的数据,或者是模拟生成的随机数据。当接收到信息时,数据会被保存到MySQL数据库中。微信小程序通过访问Django提供的API接口来获取数据,并在小程序页面中展示这些信息。此外,该平台还可以作为一个发布端,使用户能够通过一个简单的开关操作来控制设备,例如控制一个LED灯的亮灭。
Django项目结构
Django项目文件被组织在DragonbordWebProject目录下,其中包含了多个配置文件,如__init__.py、asgi.py、settings.py、urls.py和wsgi.py。在settings.py文件中,需要进行一些特定的修改,例如注册应用、修改时区以及设置数据库配置。
数据库配置
在settings.py中,数据库默认使用SQLite,但在此项目中被修改为使用MySQL。以下是修改后的数据库配置示例:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '数据库地址',
'PORT': 3306,
'USER': '账号',
'PASSWORD': '密码',
'NAME': '数据库名'
}
}
URL配置
在urls.py文件中,配置了根路由以及应用的URL地址。例如,path(‘admin/’, admin.site.urls)用于配置进入后台管理界面的URL路径,而path(‘webapp/’, include(‘WebWechatProject.urls’))则用于配置进入应用的URL路径。
自定义应用WebWechatProject
在WebWechatProject应用中,定义了多个文件,包括admin.py、forms.py、models.py、services.py、urls.py和views.py。其中,services.py、forms.py和urls.py是因项目需求而特别创建的。
模型定义
在models.py文件中,定义了四个模型类:BaseModel、Messages、TemperatureMeasures、HumidityMeasures和DeviceActivationLog。这些模型类通过外键建立了关联关系,用于存储和管理温湿度数据及设备激活日志。
MQTT服务
services.py文件中包含了使用paho.mqtt.client库实现的MQTT协议连接和通信的代码。定义了一个Mqtt类,其中包含了连接、订阅和发布消息的方法。通过装饰器@lru_cache(maxsize=None)实现了单例模式,确保整个应用中只有一个MQTT客户端实例。
视图和表单
views.py文件中包含了多个视图函数,用于处理网页端和微信小程序端的请求。例如,actuators函数用于渲染继电器列表页面,而blink_led_on和blink_led_off函数则用于控制LED灯的亮灭。forms.py文件中定义了一个UpdateStateForm表单类,用于更新DeviceActivationLog模型的measure字段。
URL路由
urls.py文件中定义了应用的URL路由,将不同的URL路径映射到对应的视图函数或类上。
微信小程序端
微信小程序端的账号申请、开发者工具的下载与安装、AppID的申请等步骤在文档中有所描述。小程序的项目结构和页面结构也在文档中进行了简要说明。
远程控制功能的实现:
小程序端向特定的API接口发送POST请求,其中包含一个参数(true或false)。Django接收到该参数后,立即通过MQTT协议将数据传输。特定视图中已经将MQTT发布端固定在代码中,该发布端将数据发送到预先订阅的订阅端。下面提供那段视图代码:
class BlinkMeasuresView(APIView):
"""控制LED灯"""
def get(self, request, format=None):
Blink = DeviceActivationLog.objects.all()
serializer = BlinkMeasureSerializer(Blink, many=True)
print(serializer.data)
return Response(serializer.data)
def post(self, request, format=None):
mqtt = get_mqtt()
received_data = request.data # 获取客户端发送的数据
if received_data['status'] == 'open':
mqtt.publish_message('Lijiang/webApp/actuator', 'true')
elif received_data['status'] == 'close':
mqtt.publish_message('Lijiang/webApp/actuator', 'false')
return Response({"message": "Data received and processed successfully"})
运行结果
微信小程序端
源码获取
https://gitlab.com/t18699741793/djangoiothub
详细文档