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)。這已經能滿足許多應用場合數據傳輸的要求。
