mqtt打造消息聊天軟件
基於mqtt打造消息聊天軟件,非常簡單而適用。比傳統的基於tcp\websocket socket打造要省事得多。
mqtt是典型的發布(pub)\訂閱(sub)消息模式。
mqtt server就用現成的,無須自己打造,以Mosquitto為例
https://www.cnblogs.com/hnxxcxg/p/12393808.html
mqtt client使用tms mqtt client控件
/// <author>cxg 2021-1-30</author> unit Unit2; interface uses TMS.MQTT.Global, TMS.MQTT.Client, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; type TForm2 = class(TForm) Button1: TButton; Memo1: TMemo; Edit1: TEdit; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } fMsgs: TStringList; fclient: TTMSMQTTClient; //既是發布者,又是訂閱者 procedure sub; //可訂閱多個主題 procedure Received(ASender: TObject; APacketID: Word; ATopic: string; APayload: TArray<System.Byte>); procedure ConnectedStatusChanged(ASender: TObject; const AConnected: Boolean; AStatus: TTMSMQTTConnectionStatus); public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} var topic: string = 'chat'; //主題 procedure TForm2.Button1Click(Sender: TObject); begin fclient.Publish(topic, '詠南中間件:' + Edit1.Text, qosExactlyOnce, False); //發布消息 end; procedure TForm2.ConnectedStatusChanged(ASender: TObject; const AConnected: Boolean; AStatus: TTMSMQTTConnectionStatus); begin case AStatus of csConnectionLost: ShowMessage('connection lost'); end; end; procedure TForm2.FormCreate(Sender: TObject); begin fMsgs := TStringList.Create; fclient := TTMSMQTTClient.Create(nil); fclient.BrokerHostName := '127.0.0.1'; fclient.BrokerPort := 1883; fclient.OnConnectedStatusChanged := ConnectedStatusChanged; fclient.OnPublishReceived := Received; fclient.Connect(); sub; end; procedure TForm2.FormDestroy(Sender: TObject); begin fclient.Free; fMsgs.Free; end; procedure TForm2.Received(ASender: TObject; APacketID: Word; ATopic: string; APayload: TArray<System.Byte>); begin fMsgs.Add(TEncoding.UTF8.GetString(APayload)); end; procedure TForm2.sub; begin fclient.Subscribe(topic, qosExactlyOnce); fclient.Subscribe('topic', qosExactlyOnce); end; procedure TForm2.Timer1Timer(Sender: TObject); begin if fMsgs.Count > 0 then for var i: Integer := 0 to fMsgs.Count - 1 do Memo1.Lines.Add(fMsgs[i]); fMsgs.Clear; end; end.
消息質量說明
TTMSMQTTQoS = (
> / / / <總結
///最多一次交付
/ / / < /總結>
qosAtMostOnce = 0,
> / / / <總結
///至少一次交付
/ / / < /總結>
qosAtLeastOnce = 1,
> / / / <總結
///精確一次交貨
/ / / < /總結>
qosExactlyOnce = 2,
> / / / <總結
/// Forbidden -保留
/ / / < /總結>
qosRESERVED = 3);
mqtt client 既可以是消息的發布者,又可以是消息的訂閱者。
同一個mqtt client可以同時訂閱n個主題的消息。
主題(topic)
不論是發布消息,還是訂閱消息,都必須提供主題,也就是說主題是發布消息和訂閱消息的唯一依據,沒有主題,便不能發布和訂閱消息。
以聊天軟件為例,主題就是好友的id或已加入群的id
mqtt 客戶端
-能被 VCL,FMX and LCL 應用程序使用
- 支持 Windows, iOS, Android, macOS, Linux, Raspberry Pi
不安裝,直接引用源碼單元使用,可支持10.4
支持DELPHI,LAZARUS開發
配合MSGPACK,BSON等序列,可發送 文字、圖片、文件、視頻。。。
MQTT v3規范定義的允許的最大消息大小(256MB)。這已經能滿足許多應用場合數據傳輸的要求。