C\#Mqtt 단선 재연 결 실현 코드

2927 단어 C#Mqtt단선 중 련
Mqtclient 클 라 이언 트 를 통 해 연결 한 후 서버 서비스 가 재 개 될 때 클 라 이언 트 가 재 접속 메커니즘 이 없 으 면 구독 메 시 지 를 받 을 수 없습니다.
사용 하 는 Mqtt 구성 요 소 는 M2Mqtt.Net.dll 입 니 다.
일부 특성 발견
(1)제 공 된 서버 주 소 를 분석 할 수 없 으 면 MqtClient 대상 을 예화 할 수 없 는 이상 이 발생 할 수 있 습 니 다.
(2)Connect 가 연결 되 지 않 을 때 이상 이 발생 하고 IsConnected 는 false 입 니 다.
(3)서버 에서 회 의 를 중단 하고 클 라 이언 트 의 ConnectionClosed 사건 을 촉발 합 니 다.IsConnected 는 false 입 니 다.
(4)다시 연결 하려 면 구독 테 마 를 다시 구독 해 야 합 니 다.
(5)Mqtclient.Subscribe 의 첫 번 째 매개 변 수 는 구독 테마 배열 이 고 두 번 째 는 해당 하 는 qos Level 이 며 두 배열 의 길 이 는 일치 해 야 합 니 다.그렇지 않 으 면 이상 합 니 다.
중 련 공정 제어

주요 코드 구현
(1)스 레 드 주체

//       
private void _TryContinueConnect()
{
  if (IsConnected) return;

  Thread retryThread = new Thread(new ThreadStart(delegate
  {
    while (_MqttClient == null || !_MqttClient.IsConnected)
    {
      if (_ToClose) break;

      if (_MqttClient == null)
      {
        _BuildClient();
        Thread.Sleep(3000);
        continue;
      }

      try
      {
        _TryCount++;
        _Connect(); 
      }
      catch (Exception ce)
      {
        Debug.WriteLine("re connect exception:" + ce.Message);
      }

      //                2 
      if (!_MqttClient.IsConnected)
      {
        Thread.Sleep(2000);
      }
    }
  }));
      
  retryThread.Start();
}
(2)실례 화 부분

//       
private void _BuildClient()
{
  try
  {
    _MqttClient = new MqttClient(_MqttServer);
  }
  catch (Exception e)
  {
    Debug.WriteLine("build client error:" + e.Message);
    return;
  }

  //         
  _MqttClient.MqttMsgPublishReceived += client_MqttMsgPublishReceived;

  //         
  _MqttClient.ConnectionClosed += (sender, e) =>
  {
    if (!_ToClose)
    {
      //     
      _TryContinueConnect();
    }
  };
}
(3)연결 부분 시도

//       ,            
private void _Connect()
{
  if (String.IsNullOrEmpty(_MqttUsername))
  {
    var b = _MqttClient.Connect(_MqttClientId);
  }
  else
  {
    var b = _MqttClient.Connect(_MqttClientId, _MqttUsername, _MqttUserpass);
  } 

  if (_MqttClient.IsConnected)
  {
    _MqttClient.Subscribe(new string[] { "topic1", "topic2" },
      new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE });
  }
}
실측 효과 가 좋 은 데,그 중에서 시간 지연 은 적당 하 게 조정 할 수 있다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기