服務端用的是 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;
介面效果如下