IoT:我需要使用MQTT还是HTTP?

IoT:我需要使用MQTT还是HTTP?,http,mqtt,iot,Http,Mqtt,Iot,我正在研制一种能够感知和收集环境信息(如温度、湿度等)的设备 该设备没有连接任何电源,但它有一个电池和一个太阳能电池板为其充电 它大部分时间几乎处于深度睡眠状态,只有在需要感知和传输数据时才会醒来。此操作大约需要1-2分钟,然后再次进入睡眠状态 我不是这方面的专家,但我认为如果设备需要随时可以访问以接收来自某个主题的消息,那么MQTT应该是一个不错的选择,但在我的场景中,它只读取传感器,并定期向服务器发送数据 目前我通过HTTP发送数据,但我想知道实现MQTT是否有意义?在这种情况下,我应该比H

我正在研制一种能够感知和收集环境信息(如温度、湿度等)的设备

该设备没有连接任何电源,但它有一个电池和一个太阳能电池板为其充电

它大部分时间几乎处于深度睡眠状态,只有在需要感知和传输数据时才会醒来。此操作大约需要1-2分钟,然后再次进入睡眠状态

我不是这方面的专家,但我认为如果设备需要随时可以访问以接收来自某个主题的消息,那么MQTT应该是一个不错的选择,但在我的场景中,它只读取传感器,并定期向服务器发送数据


目前我通过HTTP发送数据,但我想知道实现MQTT是否有意义?在这种情况下,我应该比HTTP有什么优势吗?

关于MQTT和HTTP的文献很多,您应该深入了解它们的详细信息,但下面是您的应用程序的一些要点

MQTT

  • MQTT允许持久连接,这可以通过HTTP节省大量资源。如果您使用的是SSL,这是最相关的
  • 如果您只发送几个指标,MQTT通常比HTTP的带宽效率更高
  • 由于MQTT是为交付数据(而不是整个页面)而设计的,因此其发布/订阅模型提供了许多有用的内置功能,如保留和最后意志
  • MQTT还提供了一种实现加密、身份验证和访问控制的简单方法
  • MQTT适用于连接可能断断续续或不可靠的情况。它的各种服务质量级别为您提供了确保可靠发送数据的重要方法
  • 根据我的经验,在更大的应用程序中,MQTT代理提供了更简单的管理。我特别喜欢有一套标准化的衡量绩效的指标
  • MQTT的topic/subtopic值结构有助于组织您的数据,并便于在多个项目之间扩大规模和共享资源
  • 这可能是个人偏好,但我发现MQTT协议比使用HTTP更容易理解、故障排除和编程。特别是,Python Paho MQTT库非常简单,运行良好
总之,MQTT具有许多似乎非常适合您的应用程序的特性。也就是说,您可能可以使用HTTP复制其中的许多内容,但这需要更多的工作

HTTP

  • 几乎到处都支持,这确保了与防火墙的兼容性。如果要在不受控制的网络上部署,这一点可能很重要

  • 这是一个更常见的协议,因此您(和您的最终用户)可能已经对它感到满意。类似地,您可能已经了解了安全模型,这将使其更易于安全

  • 不同的MQTT实现之间存在一些差异,这可能会造成困难(例如,我使用MOSQUITO,当人们谈论他们的HiveMQ设置时,有时会感到困惑)。HTTP给我的印象是更具普遍性,并且有更多的人可以帮助您

因此,HTTP与MQTT相比有一些固有的缺点,但它将完成任务,如果MQTT的特定特性不吸引您,它可能更实用

但实际上,如果这是一个大型项目,那么值得在您的特定应用程序和环境中尝试并运行一些基准测试和测试。建立一个测试环境并获得一些指标并不难。如果这更像是一个业余爱好/一次性项目,那么我会选择你更喜欢或更感兴趣的项目

资料来源/进一步阅读:


我对游戏不熟悉,但我喜欢mqtt收集数据和向设备发送信息

我正在使用synapses rf200芯片(自愈网状网络),我已经通过将一个rf200芯片串行连接到esp8266 wifi芯片,搭建了一座桥梁

基本上,我将mqtt_in和mqtt_out作为主题,我的c#xamarin iOs/android应用程序连接到mqtt代理,使用mqtt_in从rf200请求信息(进入rf200网状网络),节点使用mqtt_out响应(离开rf200网状网络)我收集所有信息作为字符串,并根据需要进行解析,然后将其转换为我需要的任何内容

它的开销非常低,而且mqtt代理非常容易设置。

我们已经从性能和能耗的角度对普通服务器和Raspberry Pi板上的SSL进行了测试。结果取决于进程运行的用例和设备

关于您的用例,我们也有特殊的测试=>通过HTTP、HTTP批处理或MQTT传递许多消息(多个探测)。结果非常简单,如果您可以在一个HTTP请求中发送数据,那么这将是最好的选择。MQTT排在第二位,具有每条消息传递的HTTP的能效比MQTT低得多,速度也慢得多

我认为MQTT最适合您。您可以使用eclipse paho库。。 这门课可以帮助你

公共类PahoMqttClient{

private static final String TAG = "PahoMqttClient";
private MqttAndroidClient mqttAndroidClient;
私有字符串broker\u用户名、broker\u密码; 公共MqttAndroidClient getMqttClient(上下文上下文、字符串brokerUrl、字符串clientId、字符串broker_密码){


}

您可能会在物联网网站上发现有趣的内容。如果您没有得到有关堆栈溢出的任何答案,您也可以在那里提问。物联网网站可能会更关注您感兴趣的位。这并没有回答您提出的问题。
    this.broker_userName=clientId;
    this.broker_password=broker_password;

    mqttAndroidClient = new MqttAndroidClient(context, brokerUrl, clientId);
    try {
        IMqttToken token = mqttAndroidClient.connect(getMqttConnectionOption(), null, new IMqttActionListener() {
                    @Override
                    public void onSuccess(IMqttToken iMqttToken) {
                        Log.d(TAG, "Success");
                    }

                    @Override
                    public void onFailure(IMqttToken iMqttToken, Throwable exception) {
                        Log.d(TAG, "Failure " + exception.toString());

                    }
                });


    } catch (MqttException e) {
        e.printStackTrace();
    }

    return mqttAndroidClient;
}

public void disconnect(@NonNull MqttAndroidClient client) throws MqttException {
    IMqttToken mqttToken = client.disconnect();
    mqttToken.setActionCallback(new IMqttActionListener() {
        @Override
        public void onSuccess(IMqttToken iMqttToken) {
            Log.d(TAG, "Successfully disconnected");
        }

        @Override
        public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
            Log.d(TAG, "Failed to disconnected " + throwable.toString());
        }
    });
}

@NonNull
private DisconnectedBufferOptions getDisconnectedBufferOptions() {
    DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions();
    disconnectedBufferOptions.setBufferEnabled(true);
    disconnectedBufferOptions.setBufferSize(100);
    disconnectedBufferOptions.setPersistBuffer(false);
    disconnectedBufferOptions.setDeleteOldestMessages(false);
    return disconnectedBufferOptions;
}

@NonNull
private MqttConnectOptions getMqttConnectionOption() {
    MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
    mqttConnectOptions.setCleanSession(false);
    mqttConnectOptions.setAutomaticReconnect(true);
    mqttConnectOptions.setKeepAliveInterval(120);
    //mqttConnectOptions.setWill(Constants.PUBLISH_TOPIC, "I am going offline".getBytes(), 1, true);
    mqttConnectOptions.setUserName(broker_userName);
    mqttConnectOptions.setPassword(broker_password.toCharArray());
    return mqttConnectOptions;
}


public void publishMessage(@NonNull MqttAndroidClient client, @NonNull String msg, int qos, @NonNull String topic)
        throws MqttException, UnsupportedEncodingException {
    byte[] encodedPayload = new byte[0];
    encodedPayload = msg.getBytes("UTF-8");
    MqttMessage message = new MqttMessage(encodedPayload);
    message.setId(320);
    message.setRetained(false);
    message.setQos(qos);
    try {
        client.publish(topic, message);
    }catch (Exception e){ Log.e("PUB", e.getMessage());}

}

public void subscribe(@NonNull MqttAndroidClient client, @NonNull final String topic, int qos) throws MqttException {
    IMqttToken token = client.subscribe(topic, qos);
    token.setActionCallback(new IMqttActionListener() {
        @Override
        public void onSuccess(IMqttToken iMqttToken) {
            Log.d(TAG, "Subscribe Successfully " + topic);
        }

        @Override
        public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
            Log.e(TAG, "Subscribe Failed " + topic);

        }
    });
}

public void unSubscribe(@NonNull MqttAndroidClient client, @NonNull final String topic) throws MqttException {

    IMqttToken token = client.unsubscribe(topic);

    token.setActionCallback(new IMqttActionListener() {
        @Override
        public void onSuccess(IMqttToken iMqttToken) {
            Log.d(TAG, "UnSubscribe Successfully " + topic);
        }

        @Override
        public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
            Log.e(TAG, "UnSubscribe Failed " + topic);
        }
    });
}