我目前正在使用mosquitto代理在c#中构建应用程序进行mqtt交易,我可以通过tcp(端口1883)或tls(端口8883)连接应用程序。这是使用conf文件的端口设置完成的,但程序在侦听器值中设置的任何端口崩溃,因此只有默认端口有效 - 我不知道是否允许用户选择tcp或tls,但是我想让这个工作正常。
编辑:
# Config file for mosquitto
user mosquitto
port 8883
cafile /home/ubuntu/mosquitto-certs/ca/cacert.pem
certfile /home/ubuntu/mosquitto-certs/ca/requests/webservercert.pem
keyfile /home/ubuntu/mosquitto-certs/ca/requests/webserverkey.pem
tls_version tlsv1
listener 1883
persistence true
log_dest stderr
log_type error
log_type warning
log_type notice
log_type information
connection_messages true
log_timestamp true
auth_plugin /etc/mosquitto/auth-plug.so
auth_opt_host localhost
auth_opt_port 3306
auth_opt_user ****
auth_opt_pass *****
auth_opt_backends mysql
auth_opt_dbname test
auth_opt_userquery SELECT pw FROM users WHERE username = '%s' LIMIT 1
auth_opt_superquery SELECT IFNULL(COUNT(*), 0) FROM users WHERE username = '%s' AND super = 1
auth_opt_aclquery SELECT topic FROM acls WHERE username = '%s'
auth_opt_superusers S*
如果我通过TLS登录工作正常,但是如果我断开连接并尝试通过TCP登录,则会出现以下错误:
System.dll中出现'System.IO.IOException'类型的第一次机会异常 M2Mqtt.Net.dll中出现'uPLibrary.Networking.M2Mqtt.Exceptions.MqttConnectionException'类型的第一次机会异常 {“无法从传输连接读取数据:远程主机强行关闭现有连接。”}
如果我翻转端口和监听器值,也是一样。
要断开的代码:
if (_mqttClient != null && _mqttClient.IsConnected)
{
_mqttClient.Disconnect();
_mqttClient = null;
SubscribeBtn.Enabled = false;
UnSubBTN.Enabled = false;
PublishBtn.Enabled = false;
ConnectBtn.Enabled = true;
UsernameTB.Enabled = true;
PasswordTB.Enabled = true;
DisplayBox.Items.Clear();
}
答案 0 :(得分:1)
我认为这听起来像你的客户有问题我害怕,它似乎不是一个蚊子问题。我建议使用mosquitto_sub和mosquitto_pub客户端检查你的蚊子设置。您可以将它们用于普通TCP和TLS连接,例如
mosquitto_sub -p 1883 -h <host> -t '$SYS/#' -u <username> -P <password>
或者对于TLS:
mosquitto_sub -p 8883 -h <host> -t '$SYS/#' -u <username> -P <password> --cafile <ca certificate>
如果这些有效,您需要查看程序中的问题。
答案 1 :(得分:1)
我实际上通过在安全侦听器之后设置侦听器1883和侦听器8883以及SSL / TLS的配置来实现此功能。
感谢@ralight代理经纪人和@kartben回复。