如何构建一个系统来处理MQTT代理和Django

时间:2017-09-15 09:05:08

标签: python django mqtt paho django-channels

我计划建立一个家庭自动化系统,物联网设备与MQTT经纪人进行通信。系统还涉及一个为ios / android设备提供API的Django Web服务器。我将描述一个我想要实现的例子。

从移动应用程序到Django服务器进行API调用以打开设备。当向Django发出此类API请求时,它应该通过MQTT协议将“打开”数据推送到IoT设备。

此外,IoT设备会将一些实时数据发送到MQTT代理。收到此类数据后,我想通过apns / fcm将推送通知发送到移动应用程序。

我该如何实现? Django渠道是否可以达到目的,还是应该将我的Django服务器编码为MQTT客户端并与MQTT代理进行通信?或者还有其他方法可以实现这一点。

2 个答案:

答案 0 :(得分:3)

好吧,我在 paho-MQTT 上做了一个小项目这是一个很棒的谷歌Chrome扩展MQTTLens体验。(如果你不使用这个,你应该试试这个已)

在你的情况下,我认为你可以使用Django的 rest-framework 来构建API,在前端,你可以使用crispy-form来制作ON-OFF信号,这样就可以了直接与Django的视图进行通信,您可以在其中编写客户端和订户详细信息。

让我们专注于从移动应用程序到Django服务器进行API调用以打开设备。当向Django发出此类API请求时,它应该通过MQTT协议将“打开”数据推送到IoT设备。

  • 您可以查看对来自任何设备的API调用的回复,您可以查看django-rest-framework这是我们的最佳选择。

现在物联网设备将一些实时数据发送给MQTT经纪人

  • 为此,您可以查看Google's this artical。 MQTT代理可以很容易地传递Django视图,如果你使用Django的 DRY concpet的模块化结构,这个过程并不复杂。

另一方面,您也可以为客户或经纪人提供不同的视图,这取决于您,但我认为这种方法需要很长时间才能使我不了解移动开发的应用程序,所以我可以'帮助你 :(

答案 1 :(得分:1)

您可以使用JavaScript处理任务。我有使用JavaScript在Django和Django-REST项目中实现MQTT协议的经验。您应该将JavaScript代码块嵌入到前端文件中(在我的情况下为HTML)。首先,您应该在文件中调用Paho-MQTT jQuery包。

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.2/mqttws31.min.js"></script>

然后添加此代码块。

#parameters
var hostname = "mqtt.eclipse.org"; #There are different brokers. You should enter the broker's hostname.
var port = 80; #The port number can be different based on a TLS or non-TLS connection.
var ClientID = "ClientID_" + parseInt(Math.random()*100);

#Create a client instance
var client = new Paho.MQTT.Client(hostname, Number(port), ClientID);

#Set callback handlers
client.onConnectionLost = onConnectionLost;
client.onMessageArrived = onMessageArrived;

#Connect the client
client.connect(
  {onSuccess: onConnect}
);

#Called when client connects
function onConnect() {
  #Once a connection has been established, make a subscription and send a message
  console.log("onConnect");
  client.subscribe("subTopic");
  alert("Connected.");
}

#Called when the client loses its connection
function onConnectionLost(responseObject){
  if(responseObject.errorCode != 0){
    console.log("onConnectionLost:" + responseObject.errorMessage);
  }
}

#Called when a message arrives
function onMessageArrived(message) {
  console.log("Message arrived: topic=" + message.destinationName + ", message=" + message.payloadString);
  if (message.destinationName == "subTopic") {
    #Do something
  }

通过使用代码,您的应用程序将连接到代理并收听一个或多个主题。这意味着您可以实时获取传感器的数据。这需要在您的硬件设备(例如ESP模块或Raspberry PI)上发布传感器的数据。 您很可能希望将命令从应用程序发送到执行器以将其打开或关闭。为此,您需要从应用程序中发布一些消息,硬件将监听这些消息。 假设您有一个切换开关,希望通过切换来发布消息。

<label id="switch{{ device.unique_id }}" class="switch">
  <input id="state{{ device.unique_id }}" type="checkbox" onclick="publish('{{ device.unique_id }}')">
  <span class="slider round"></span>
</label>

以上HTML块应驻留在django for块中。然后,您应该编写publish onclick函数以在切换开关时调用它。您可以在下面看到此类功能的示例。

function publish(x) {
  if(!client){
    return;
  }
  var status = document.getElementById(x);
  if (status.innerHTML == 'ON'){
    status.innerHTML = 'OFF';
    var message = new Paho.MQTT.Message("TurnOFF");
    message.destinationName = "pubTopic";
    client.send(message);
  } else {
    status.innerHTML = 'ON';
    var message = new Paho.MQTT.Message("TurnON");
    message.destinationName = "pubTopic";
    client.send(message);
  }
}
发布功能中的

x是嵌入在HTML文件中的ID。要接收发布的消息,您应该在硬件设备上收听特定的主题。