我们计划使用MQTT将消息从我们的服务器传递到我们决定使用开源服务器mosquitto的Android设备.
在大多数情况下,这就足够了.(发布/订阅)但我们有一种情况,客户端需要发送参数并从服务器获得响应.我知道直接的方法是使用Http(例如Servlets).但我们能否使用MQTT实现这一目标,因为它意味着用户的带宽消耗更低?
我正在使用Mosquitto代理来实现MQTT协议.但我无法找到如何在蚊子经纪人的情况下进行聚类.对于可以与一个代理服务的客户端数量也有任何限制.
我在我的ubuntu机器上安装了mosquitto服务器和客户端软件包.当我运行命令"mosquitto"来运行mosquitto服务器时,我收到错误"错误:地址已在使用中".为什么我收到此错误?我该如何解决这个问题?
我有一个后端设备,MQTT客户端连接到开源MQTT代理(Mosquitto).另一方面,我有许多前端设备(PC,平板电脑,移动),GUI应用程序也连接到代理.所以这里Mosquitto作为后端设备和前端设备之间的通信点,只是在它们之间转发消息.有时传输的数据量可能非常高(例如1 MB/min).
一个后端设备+许多前端设备是一个安装.我需要为数千个此类安装同时工作的基础设施做好准备.所以我的服务需要非常可靠.我的公司使用Azure云解决方案,所以我开始学习这个解决方案,我必须承认我有点困惑.我已经读过我需要使用IoT Hub,但它需要MQTT网关才能与MQTT设备对话.另一方面,如果我理解得很好,网关需要在某个VM上运行,所以这里我失去了我的解决方案的可扩展性.我对吗?现在,如果我需要支持100k或500k设备,那么我将需要另一台VM?还有一件事是我需要将所有这些与一些web服务集成(用于管理后端和前端设备),所以我需要webservice和MQTT代理之间的一些连接......
在我开始使用Azure之前,我想,我将简单地启动一个MQTT代理服务,并且神奇地它将是高度可扩展的,并且能够为数千个设备提供服务.
谁能解释我怎么咬这个?
我正在尝试了解Amazon AWS IoT,我发现在传感器/执行器和AWS(规则引擎)之间连接了一个设备网关.我知道传感器/执行器是MQTT客户端,可以发布/订阅主题.
Device Gateway还支持发布/订阅模式就是这个意思
Device Gateway也是MQTT客户端?
那么MQTT经纪人在哪里?
OR Device Gateway是AWS-IoTservices的Broker +通信接口?
我在AWS IoT上附加了一个Image Amazon演示文稿供参考:
假设我有一个IoT设备,我即将控制(让我们说开/关)和监控(例如收集温度读数).似乎MQTT可能是合适的.我可以将消息发布到设备以控制它,并且设备可以向代理发布消息以报告温度读数.到现在为止还挺好.
当我尝试设计API来控制设备时,问题就开始出现了.
让设备订阅两天主题:
然后我按照某种顺序向这些主题发布消息.但鉴于消息传递通常是异步过程,因此无法保证设备接收的消息顺序.
因此,如果按以下顺序发布两条消息:
它们可以按相反的顺序接收,使设备开启,这可能会产生严重的后果,具体取决于具体情况.
当然,API可以以其他方式设计,例如,可能只有一个主题
并且各个消息的有效载荷将带有单个消息的含义(开/关).因此,如果消息按给定顺序发布到此主题,则应在设备上以完全相同的顺序接收消息.
但是,如果不能保证发布到个别主题的顺序怎么办?假设物联网设备的以下系统架构:
/ control service \
application -> broker -> control service -> broker -> IoT device
\ control service /
Run Code Online (Sandbox Code Playgroud)
该系统的组件是:
重要的是,在大多数现代分布式系统中,控制服务是一个分布式的多实例实体,能够一次处理来自应用程序的多个控制消息.因此,应用程序发布的消息顺序在传送到IoT设备时最终会完全混合.
现在考虑到大多数MQTT代理只实现QoS0和QoS1但没有QoS2它会变得更加有趣,因为这样的控制消息可能会被多次传递(假设QoS1 - 请参阅/sf/answers/2167134091/) .
我的观点是控制消息的单独主题是一个坏主意.单个主题也是如此.在这两种情况下都没有消息传递顺序保证.
我想到的这个特定问题的唯一解决方案是消息版本控制,以便在具有更新版本属性的另一个消息之后传递时可以简单地跳过旧的(过时的)消息.
我正在创建一个包含python和php的docker.我正在编写一个python脚本来连接到驻留在另一个docker中的MQTT代理.
在我的dockerfile中,我确保使用以下命令安装paho客户端:
RUN apt-get install -y python3-dev
RUN apt-get install -y libffi-dev
RUN apt-get install -y libssl-dev
ADD https://bootstrap.pypa.io/get-pip.py /tmp/get-pip.py
RUN cat /tmp/get-pip.py | python3
RUN pip install paho-mqtt
RUN pip install python-etcd
Run Code Online (Sandbox Code Playgroud)
但是,当我运行python脚本时,我收到以下错误:
ImportError: No module named paho.mqtt.client
Run Code Online (Sandbox Code Playgroud)
docker安装没有显示有关paho-mqtt安装的任何错误.如果有人可以指导这一点,那就太棒了.
我正在尝试在Android上创建一个MqttClient,在ADT上使用Android模拟器(Nexus7)(在Linux Fedora17上使用Eclipse 3.8.0.我发现这个问题得到了解答(Android MQTT无法创建客户端),但它无法解决我的问题问题.
我创建了一个活动,允许用户进入存储presistence文件的目录,但是没有办法避免捕获异常.我试过"/ mnt/sdcard /","/ mnt /","/ mnt/sdcard/tmp /"等.
我是否需要关注Eclipse项目中Android模拟器中的特定设置?是否有任何使用权限包含在应用程序中?
我查看了引用的回答问题中提到的各种mqtt资源,但我无法找到答案.
这是我的代码:
package com.storassa.android.mqttsample;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttDefaultFilePersistence;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.TextView;
public class MqttSample extends Activity {
Button okButton = null;
AutoCompleteTextView inputTextView = null;
TextView errorTextView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mqtt_sample);
okButton = (Button)findViewById(R.id.okButton);
inputTextView = (AutoCompleteTextView)findViewById(R.id.InputText);
errorTextView = (TextView)findViewById(R.id.errorText);
okButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) { …Run Code Online (Sandbox Code Playgroud) 我正在开发的应用程序中实现Paho MQTT Android服务.在测试了Paho提供的示例应用程序之后,我发现有一些事情我想改变.
https://eclipse.org/paho/clients/android/
应用程序完全关闭后,应用程序服务似乎会关闭.我希望即使在应用程序关闭后,如果有更多消息进入,我也会保持服务运行.我也在寻找一种方法,一旦收到新消息,就可以将应用程序打开到特定的活动.
这是在消息到达时调用的回调之一,我尝试实现一个简单的startActivity来打开一个特定的活动但是如果应用程序关闭/不再运行它就不起作用.
如果有人使用过PAHO MQTT Android服务,是否有一种特定的方法可以在应用程序关闭时阻止服务停止,如何在消息到达时重新打开应用程序?
/**
* @see org.eclipse.paho.client.mqttv3.MqttCallback#messageArrived(java.lang.String,
* org.eclipse.paho.client.mqttv3.MqttMessage)
*/
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
// Get connection object associated with this object
Connection c = Connections.getInstance(context).getConnection(clientHandle);
// create arguments to format message arrived notifcation string
String[] args = new String[2];
args[0] = new String(message.getPayload());
args[1] = topic + ";qos:" + message.getQos() + ";retained:" + message.isRetained();
// get the string from strings.xml and format
String messageString = …Run Code Online (Sandbox Code Playgroud) 我需要创建一个服务器场,可以处理500多万个连接,500多万个主题(每个客户端一个),处理300k消息/秒.
我试图了解各种消息代理的功能,因此我目前正在使用两个RHEL EC2实例(r3.4xlarge)来创建大量可用资源.所以你不需要查找它,它有16vCPU,122GB RAM.我没有接近使用限制.
我无法通过600k连接限制.因为在客户端和服务器上似乎没有任何O/S限制(大量的RAM/CPU /等)限制了我?
我编辑了/etc/security/limits.conf如下:
* soft nofile 20000000
* hard nofile 20000000
* soft nproc 20000000
* hard nproc 20000000
root soft nofile 20000000
root hard nofile 20000000
Run Code Online (Sandbox Code Playgroud)
我编辑了/etc/sysctl.conf如下:
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 5242880 5242880 5242880
net.ipv4.tcp_tw_recycle = 1
fs.file-max = 20000000
fs.nr_open = 20000000
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_syn_backlog = 10000
net.ipv4.tcp_synack_retries = 3
net.core.somaxconn=65536
net.core.netdev_max_backlog=100000
net.core.optmem_max = 20480000
Run Code Online (Sandbox Code Playgroud)
对于Apollo:导出APOLLO_ULIMIT = 20000000
对于ActiveMQ:
ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS -Dorg.apache.activemq.UseDedicatedTaskRunner=false"
ACTIVEMQ_OPTS_MEMORY="-Xms50G -Xmx115G"
Run Code Online (Sandbox Code Playgroud)
我在客户端为eth0创建了20个额外的私有地址,然后分配它们:ip addr add 11.22.33.44/24 dev …