В настоящее время я создаю приложение на С#, используя брокера mosquitto для торговли 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.IO.IOException" произошло в System.dll Первое исключение типа "uPLibrary.Networking.M2Mqtt.Exceptions.MqttConnectionException" произошло в M2Mqtt.Net.dll {"Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным узлом."
То же самое, если я переверну значения порта и прослушивателя.
Код для отключения:
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();
}