mqtt打造消息聊天軟件


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM