Delphi TMSMQTT使用筆記

liessay發表於2024-05-19

服務端用的是 mosquitto ,下載地址https://mosquitto.org/download/

安裝完成後需要配置

找到安裝目錄:mosquitto.conf,開啟後修改 allow_anonymous false(禁止匿名登入),password_file D:\Program Files\mosquitto\pwfile.example(密碼存放位置)

建立新使用者,安裝目錄下執行 mosquitto_passwd -c pwfile.example 使用者名稱1 然後輸入密碼

主要記錄Delphi開發過程,mosquitto 具體使用及配置自行百度

介面佈局如下

當使用 TMSMQTTClient1 元件進行 MQTT 通訊時,常用屬性的詳細設定如下:

  • BrokerHostName:設定為 MQTT 伺服器的主機名或 IP 地址,例如 "mqtt.example.com"。
  • BrokerPort:設定為 MQTT 伺服器的埠號,通常預設為 1883 或 8883(如果使用了 SSL 加密)。
  • Credentials.Username:設定為連線 MQTT 伺服器所需的使用者名稱。如果伺服器不需要使用者名稱認證,可以將其留空。
  • Credentials.Password:設定為連線 MQTT 伺服器所需的密碼。如果伺服器不需要密碼認證,可以將其留空。
  • ClientID:設定為客戶端的唯一識別符號,通常可以使用裝置的序列號或其他唯一識別符號。
  • LastWillSettings.QoS:設定遺囑訊息的服務質量等級,可選擇 qosAtLeastOnce、qosAtMostOnce 或 qosExactlyOnce,取決於訊息的重要性和可靠性要求。
  • LastWillSettings.Retain:設定為 true 或 false,指定是否將遺囑訊息保留在伺服器上,以便訂閱者在客戶端斷開連線後收到該訊息。
  • KeepAliveInterval:設定客戶端與伺服器之間的通訊心跳間隔時間,通常以秒為單位,例如 60 表示每 60 秒傳送一次心跳。
  • CleanSession:設定為 true 或 false,指示伺服器在客戶端斷開連線時是否清除會話資訊。一般情況下,如果設定為 false,伺服器會儲存客戶端的會話資訊,以便客戶端重新連線後可以恢復之前的訂閱狀態和會話資訊。
  • OnConnect:設定連線成功時觸發的事件處理程式,可以在此事件中執行連線後的操作。
  • OnDisconnect:設定斷開連線時觸發的事件處理程式,可以在此事件中處理連線斷開後的清理工作。
  • OnMessage:設定接收到訊息時觸發的事件處理程式,可以在此事件中處理接收到的 MQTT 訊息。

TMSMQTTLogger1可以用於記錄以下內容:

  • 連線建立和斷開的事件;
  • 客戶端訂閱和取消訂閱主題的操作;
  • 接收到的訊息內容;
  • 釋出訊息的操作;
  • 錯誤和異常資訊的記錄。

連線按鈕事件如下,詳情見中文註釋

// 設定MQTT伺服器主機名和埠
TMSMQTTClient1.BrokerHostName := Edit1.Text;
TMSMQTTClient1.BrokerPort := StrToInt(Edit2.Text);

// 設定使用者名稱和密碼
TMSMQTTClient1.Credentials.Username := Edit3.Text;
TMSMQTTClient1.Credentials.Password := Edit4.Text;

// 設定客戶端ID
TMSMQTTClient1.ClientID := Edit5.Text;

// 設定遺囑訊息的服務質量等級
if ComboBox1.Text = 'qosAtLeastOnce' then
  TMSMQTTClient1.LastWillSettings.QoS := qosAtLeastOnce
else if ComboBox1.Text = 'qosAtMostOnce' then
  TMSMQTTClient1.LastWillSettings.QoS := qosAtMostOnce
else if ComboBox1.Text = 'qosExactlyOnce' then
  TMSMQTTClient1.LastWillSettings.QoS := qosExactlyOnce
else if ComboBox1.Text = 'qosRESERVED' then
  TMSMQTTClient1.LastWillSettings.QoS := qosRESERVED;

// 設定遺囑訊息的保留標誌
TMSMQTTClient1.LastWillSettings.Retain := CheckBox1.Checked;

// 連線到MQTT伺服器
TMSMQTTClient1.Connect();

連線後只有訂閱相同Topic的才能收到內容,所以連線後需要先訂閱,訂閱按鈕如下

TMSMQTTClient1.Subscribe(edit7.Text);

狀態改變後顯示目前連線狀態

procedure TMQTTClient.TMSMQTTClient1ConnectedStatusChanged(ASender: TObject; const AConnected: Boolean; AStatus: TTMSMQTTConnectionStatus);
begin
  case AStatus of
    csConnectionLost:
      Memo3.Lines.Add('連線丟失');
    csAuthenticating:
      Memo3.Lines.Add('正在進行身份驗證');
    csConnecting:
      Memo3.Lines.Add('連線中');
    csConnected:
      Memo3.Lines.Add('已連線');
    csNotConnected:
      Memo3.Lines.Add('未連線狀態');
    csReconnecting:
      Memo3.Lines.Add('重新連線中');
    csDisconnecting:
      Memo3.Lines.Add('斷開連線中');
  end;
end;

具體狀態內容如下

csNotConnected:未連線狀態
csConnectionRejected_InvalidProtocolVersion:連線被拒絕,協議版本無效
csConnectionRejected_InvalidIdentifier:連線被拒絕,識別符號無效
csConnectionRejected_ServerUnavailable:連線被拒絕,伺服器不可用
csConnectionRejected_InvalidCredentials:連線被拒絕,憑據無效
csConnectionRejected_ClientNotAuthorized:連線被拒絕,客戶端未授權
csConnectionRejected_UnspecifiedError:連線被拒絕,未指定的錯誤
csConnectionRejected_MalformedPacket:連線被拒絕,資料包格式錯誤
csConnectionRejected_ProtocolError:連線被拒絕,協議錯誤
csConnectionRejected_ImplementationSpecificError:連線被拒絕,特定實現的錯誤
csConnectionRejected_ServerBusy:連線被拒絕,伺服器繁忙
csConnectionRejected_Banned:連線被拒絕,被禁止
csConnectionRejected_BadAuthenticationMethod:連線被拒絕,身份驗證方法錯誤
csConnectionRejected_TopicNameInvalid:連線被拒絕,主題名無效
csConnectionRejected_PacketTooLarge:連線被拒絕,資料包太大
csConnectionRejected_QuotaExceeded:連線被拒絕,超出配額
csConnectionRejected_PayloadFormatInvalid:連線被拒絕,負載格式無效
csConnectionRejected_RetainNotSupported:連線被拒絕,不支援retain
csConnectionRejected_QoSNotSupported:連線被拒絕,不支援QoS
csConnectionRejected_UseAnotherServer:連線被拒絕,使用其他伺服器
csConnectionRejected_ServerMoved:連線被拒絕,伺服器已移動
csConnectionRejected_ConnectionRateExceeded:連線被拒絕,連線速率超過限制
csConnectionLost:連線丟失
csAuthenticating:正在進行身份驗證
csConnecting:連線中
csReconnecting:重新連線中
csConnected:已連線
csDisconnecting:斷開連線中

釋出訊息程式碼如下

TMSMQTTClient1.Publish(Edit6.Text, Memo1.Text);

訂閱後收到的訊息,在onPublishReceived事件中,可以根據收到的訊息內容做自己想做的事,程式碼如下

procedure TMQTTClient.TMSMQTTClient1PublishReceived(ASender: TObject; APacketID: Word; ATopic: string; APayload: TBytes);
begin
  Memo3.Lines.Add('PublishReceived:' + TEncoding.UTF8.GetString(APayload));
  if TEncoding.UTF8.GetString(APayload) = 'Hello' then
    Memo3.Lines.Add('Say hello to you in the opposite direction!');
  if TEncoding.UTF8.GetString(APayload) = '你好' then
    Memo3.Lines.Add('對方向你問好!');
end;

記錄TMSMQTTClient狀態事件在TMSMQTTLogger1的onLog中,程式碼如下

procedure TMQTTClient.TMSMQTTLogger1Log(Sender: TObject; ALevel: TTMSMQTTLogLevel; AMessage: string);
begin
  Memo3.Lines.Add(AMessage);
end;

介面效果如下

相關文章