繁体   English   中英

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

[英]How to build a system to handle MQTT broker and Django

我计划构建一个家庭自动化系统,其中 IoT 设备与 MQTT 代理进行通信。该系统还涉及一个 Django Web 服务器,该服务器为 ios/android 设备提供 API。 我将描述一个我想要实现的示例。

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

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

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

好吧,我在paho-MQTT上做了一个小项目,使用 google chrome 扩展 MQTTLens 是一个很好的体验。(如果你还没有使用它,你应该试试这个)

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

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

  • 您可以查看从任何设备响应 API 调用的视图,您可以检查django-rest-framework这是我们拥有的最佳选择。

现在物联网设备向 MQTT 代理发送一些实时数据

  • 为此,您可以查看谷歌的这篇文章 MQTT 代理可以轻松地处理 Django 视图,如果您将模块化结构与 Django 的DRY概念一起使用,则此过程不会很复杂。

另一方面,你也可以只为客户或经纪人提出不同的观点,这取决于你,但我认为这种方法需要很长时间来开发这样的应用程序我不了解移动开发所以我无法帮助你与那个:(

您可以使用 JavaScript 处理该任务。 我有使用 JavaScript 在 Django 和 Django-REST 项目中实现 MQTT 协议的经验。 你应该在你的前端文件(在我的例子中是 HTML)中嵌入一个 JavaScript 代码块。 首先,您应该在您的文件中调用 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。 要接收您发布的消息,您应该在您的硬件设备上收听特定主题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM