这个项目的主要需求其实并不复杂,只是需要让用户可以在小程序上控制预约后的自习室座位的灯和柜子等的开关。这里的关键是需要通过一个网络应用来转发用户对智能硬件的控制请求。
物联网应用的主要几个难点及对应的思路如下:
- 通信数据量小、通信环境不确定。传统的HTTP/HTTPS协议相对比较复杂,传递这么小的数据量显然性价比过低,而且无法应对网络不稳定的状况。所以在loT应用中,通常使用MQTT协议代替HTTP协议来实现控制程序和智能硬件的通信。本文的目的不是介绍MQTT协议如何实践应用,所以不再赘述。
- 安全问题。这里初步计划是使用MQTT推荐的一些安全方案,加上阿里云的微消息队列MQTT自带的一些鉴权方案,如果资金充足考虑使用VPN来保证鉴权和加密的安全。
- 硬软件测试。软件层面相对解决方案比较成熟,有很多可以用的方案,这里先把软件方案设计展示出来。硬件层面则潜在的问题比较多,树莓派、输出接口、智能锁都有很多不确定的环节,只有拿到实物以后才有可能逐步覆盖测试。
MQTT协议架构
MQTT协议架构要求三个部分:发布者(Publish)、代理(Broker)、订阅者(Subscribe)。 其中,发布者负责发布消息,代理作为消息队列连接发布者和订阅者,订阅者接收消息。
MQTT协议下发送的消息格式为: - 固定报头(Fixed header): - 类型:连接、发布、订阅等 - 有效载荷(Payload): - 锁ID:自定义字段,标记需要操作的锁的ID - 开关行为:自定义字段,标记开关的行为,可选开、关、转换状态三种。
https://github.com/mcxiaoke/mqtt/blob/master/mqtt/02-ControlPacketFormat.md
MQTT协议下需要自定义安全方案。 最省事并且最贵的方法是搭建VPN,其次是实现双向鉴权,再其次是实现客户端鉴权。 加密方式考虑使用推荐的方案,比如AES对称加密。
https://github.com/mcxiaoke/mqtt/blob/master/mqtt/05-Security.md
完整架构
完整架构包括用户的操作和服务器的处理。用户通过HTTP请求开关,服务器接收HTTP请求以后把消息转给MQTT服务器。
技术选型
订阅者:Flask-MQTT
Flask-MQTT的文档推荐使用树莓派作为客户端,配合MQTT服务器使用,可以作为订阅者的选型。
"Flask-MQTT was developed to provide an easy-to-setup solution for interacting with IoT devices. A typical scenario would be a Raspberry Pi running a mosquitto mqtt server combined with a Flask webserver."
发布者:Flask/Django/云函数 + paho-mqtt
Flask-MQTT不支持多个Worker同时运行,所以这里考虑直接用底层的包实现转发协议。 服务端优选使用云函数,可以保持服务端的轻量级,和小程序云开发容易配合。 其次可以使用Flask和Django的Serverless Framework,方便部署和运维。