服务端用的是 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' thenTMSMQTTClient1.LastWillSettings.QoS := qosAtLeastOnce else if ComboBox1.Text = 'qosAtMostOnce' thenTMSMQTTClient1.LastWillSettings.QoS := qosAtMostOnce else if ComboBox1.Text = 'qosExactlyOnce' thenTMSMQTTClient1.LastWillSettings.QoS := qosExactlyOnce else if ComboBox1.Text = 'qosRESERVED' thenTMSMQTTClient1.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); begincase AStatus ofcsConnectionLost: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); beginMemo3.Lines.Add('PublishReceived:' + TEncoding.UTF8.GetString(APayload));if TEncoding.UTF8.GetString(APayload) = 'Hello' thenMemo3.Lines.Add('Say hello to you in the opposite direction!');if TEncoding.UTF8.GetString(APayload) = '你好' thenMemo3.Lines.Add('对方向你问好!'); end;
记录TMSMQTTClient状态事件在TMSMQTTLogger1的onLog中,代码如下
procedure TMQTTClient.TMSMQTTLogger1Log(Sender: TObject; ALevel: TTMSMQTTLogLevel; AMessage: string); beginMemo3.Lines.Add(AMessage); end;
界面效果如下