我想在收到 MQTT 数据包时在我的 RP 上启动一个任务(例如播放音频文件)。接近它的最佳方法是什么?我在考虑要么写c++脚本,要么写python。我对 Linux shell 不太熟悉,可能有更简单的方法来做到这一点。有什么建议么?
MQTT 是一种发布/订阅协议。每当发布者发布到某个主题时,所有订阅该主题的订阅者都将通过 MQTT 代理获取消息。我想知道 MQTT 代理可以处理的最大客户端数量。有上限吗?
我对不同的消息代理感到困惑。
我的设备正在使用 MQTT。到目前为止,我已经研究过 HiveMQ、IBM Messagesight、RabbitMQ、google pub and sub、AWS SQS。
HiveMQ(MQTT消息代理)和RabbitMQ(或pub and sub,SQS)有什么区别?
除了协议和成本可能不同之外,它们的功能有什么区别吗?还有一个问题,IBM messagesight 是一种消息代理吗?它与 google pub and sub 或rabbit 有什么不同吗?
我找不到任何有关 messagesight 的信息。
我正在使用 MQTTNet,这是一个 .NET 库,用于基于以下链接的 MQTT 通信
https://github.com/chkr1011/MQTTnet
我正在使用managed MQTT Client
下面的链接
https://github.com/chkr1011/MQTTnet/wiki/ManagedClient
我有以下代码来publish
发送消息MQTT server
。
var messagePayload = new MqttApplicationMessageBuilder()
.WithTopic("Topic1")
.WithPayload(message)
.WithExactlyOnceQoS()
.WithRetainFlag()
.Build();
try
{
await mqttClient.PublishAsync(messagePayload);
}
catch (Exception ex)
{
//Why I am not getting exception?
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用 MQTT 的 Android 应用程序。
在发布版本中,我收到一个异常:
MqttClient client = new MqttClient(host, clientId, new MemoryPersistence());
Run Code Online (Sandbox Code Playgroud)
在调试构建上,一切正常。我正在使用mqtt-client-0.4.0.jar。
执行(我在发布中得到的是):
W/System.err: java.util.MissingResourceException: Error locating the logging class
W/System.err: at d.a.a.a.a.b.b.a(:2)
W/System.err: at d.a.a.a.a.e.<init>(Unknown Source:7)
W/System.err: at c.b.a.j.a(:2)
W/System.err: at c.b.a.j.<init>(Unknown Source:14)
W/System.err: at c.b.a.d.onStarted(:1)
W/System.err: at android.location.LocationManager$GnssStatusListenerTransport$GnssHandler.handleMessage(LocationManager.java:1424)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:106)
W/System.err: at android.os.Looper.loop(Looper.java:164)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6626)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
Run Code Online (Sandbox Code Playgroud)
我查看了 mqtt 库,发现了生成此错误的源代码:
第 76 行:
public static Logger getLogger(String messageCatalogName, …
Run Code Online (Sandbox Code Playgroud) 我需要帮助来配置此 MQTT 以在TLS模式下工作。我已经在服务器中设置了 MQTT。服务器受LetsEncrypt证书保护,这就是它的域中有https 的原因,然后我也在远程计算机中设置它。
服务器运行此命令
mosquitto_sub -h localhost -t 'testtopic' -p 1883
Run Code Online (Sandbox Code Playgroud)
远程计算机运行此命令
mosquitto_pub -h domainName -t 'testtopic' -m "test message" -p 1883
Run Code Online (Sandbox Code Playgroud)
两台电脑上的MQTT配置是这样的
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
port 1883
persistence_file mosquitto.db
log_dest syslog
log_dest stdout
log_dest topic
log_type error
log_type warning
log_type notice
log_type information
connection_messages true
log_timestamp true
allow_anonymous true
tls_version tlsv1.2
Run Code Online (Sandbox Code Playgroud)
这个有效。但如何让通讯变成TLS模式呢?有人可以让我知道什么是正确的配置吗?如何在两台计算机中传递参数?
我正在 Java 中使用 MqttAsyncClient。以下代码只是我使用它的一部分,当我尝试订阅任何主题时出现错误时,问题就出现了:
客户端未连接 (32104)
private int connections;
private String topic;
private MqttAsyncClient client;
private MqttConnectOptions connOpts;
private MemoryPersistence persistence;
private void configureMqtt()
{
try
{
logger.info("Starting the Mqtt Configuration...");
client = new MqttAsyncClient(conf.getServerURI(), conf.getClientID(), persistence);
connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
connOpts.setUserName(conf.getUserName());
connOpts.setPassword(conf.getPassword().toCharArray());
connOpts.setAutomaticReconnect(true);
logger.info("The Mqtt protocol has been configured successfully!!!");
}
catch (Exception e)
{
logger.error("An error has happened during Mqtt configuration");
logger.error(e);
}
}
public void startSub()
{
try
{
logger.info("Conecting to: " + conf.getServerURI() + " …
Run Code Online (Sandbox Code Playgroud) 我正在使用React Native 0.61 (CLI)构建 Android 应用程序,并在此处使用常见的 MQTT.js 包:https://www.npmjs.com/package/mqtt (v.3.0.0)
这是我的build.gradle
buildToolsVersion = "28.0.3"
minSdkVersion = 25
compileSdkVersion = 28
targetSdkVersion = 28
supportLibVersion = "28.0.0"
Run Code Online (Sandbox Code Playgroud)
我使用WebSocket协议连接到我自己的 mqtt 代理。
在调试模式下,一切在任何手机上都能完美运行。但奇怪的是,当我通过命令(gradlew assembleRelease(签名))发布 APK 时,它无法连接到 Android 9+ 上的代理(均为模拟器)(Android 8 运行良好)
编译为本机代码时似乎出现了问题。
我正在使用客户端与CloudMQTT API交互。我正在尝试创建一个用户,但在尝试下面提供的代码后,我无法创建用户。当使用该项目的 Github 存储库中提供的代码时,我注意到我无法使用方法ShouldThrow()
(显然它应该由Fluent Assertions提供)。
我确实在 StackOverflow 上找到了一篇文章,它看起来与我遇到的问题非常相似。问题中提到 FluentAssertions 不支持异步方法。然而,在客户端的示例代码中,我可以看到无论ShouldThrow()
这一事实如何,都使用了该方法。
我怎样才能让它ShoudldThrow()
工作,或者我什至需要它工作(因为我认为只有在应用单元测试时才应该在这段代码中需要它)?
这是迄今为止尝试过的:
public static async void CreateCloudUser(ICloudMqttApi client)
{
var users = await client.GetUsers();
Console.WriteLine($"Creating a user. Current users available: {users.Count}");
var expectedUser = new NewUser
{
Password = $"{Guid.NewGuid()}",
Username = $"staging-{Guid.NewGuid()}",
};
var createUserResponse = await client.CreateUser(expectedUser);
createUserResponse.IsSuccessStatusCode.Should().BeTrue();
var actual = await client.GetUser(expectedUser.Username);
actual.Should().NotBeNull();
actual.Username.Should().Be(expectedUser.Username);
//users.Should().Contain(u => u.Username == expectedUser.Username); // <-- This …
Run Code Online (Sandbox Code Playgroud) 我正在尝试开发一个带有微服务的项目。
我对这个主题有一些疑问(有些不清楚):
1)如何实现微服务通信?
A) HTTP:每个微服务都会公开 HTTP API,即 API 网关广播请求。
B) MQTT:每个微服务发布/订阅到代理
C) 两者:但是如何理解一个比另一个更好呢?
即使对于通常通过 HTTP 执行的经典操作,我是否也必须使用 pub/sub 协议作为标准?例如我有两个微服务: 网络管理和Product-service。网络管理是一个面板,允许管理员在其电子商务数字商店中添加、修改...产品。假设我们要实现 createProduct 操作。它是一个命令(根据事件/命令区分),是一对一的通信。
我可以在产品服务中打开一个 API,比如说(POST,“/product”)来添加新产品。我还可以在ProductCreationRequest事件中实现此转换命令。在这种情况下:web-managemnet发布此事件。产品服务监听productCreationRequest事件(以及productUpdateRequest、productGetEvents等),一旦收到通知,它就会执行操作并发出productCreated事件。
我觉得这个案子很边缘化。例如,最后一次服务可以侦听ProductCreated并立即向客户发送消息(电子邮件或推送通知)。您对这个用例有何看法?
2)哪个可能是有效的代理(我将使用 docker-compose 或 kubernetes 来编排容器化微服务:采用的语言可能是 java、javascript、python)?