Delphi TMSMQTT使用笔记

news/2024/11/17 21:41:18/文章来源:https://www.cnblogs.com/liessay/p/18199981

服务端用的是 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;

界面效果如下

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/708529.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

沪锡

沪锡要想牛市 必须要突破这里286700 要不然就是ABC反弹结束了。 小周期 反弹还有最后一个3-5 然后迎来回调 然后等待看是什么级别的回调。

产业园区开发运营及盈利模式分析

摘 要:产业园区一般由政府或企业开发建设,是区域经济和产业发展的重要空间载体,具有显著的资源集聚能力和产业规模效益,承担着产业要素集聚、新型产业培育、经济高质量发展和新型城镇化建设等重要使命。然而,当前国内部分产业园区因前期开发投入规模大、后期招商及运营管理…

使用Github Actions + Watchtower 实现项目CI/CD

使用Github Actions + Watchtower 实现项目CI/CD 前言 对于我们这种个人开发者,将程序部署在服务器上一般都是通过宝塔部署来确保服务能够一直存活,但是对于一个经常改来改去的项目,这是一个非常头疼的事情,需要重复地本地编译-->打开宝塔-->输入账号密码(甚至安全模…

Atcoder 题目选做(三)

Atcoder 题目选做(三)(20/20)推荐阅读:#5、#7、#11、#13、#15、#18、#19\(\text{By DaiRuiChen007}\)1. [ARC152E] Xor Annihilation Problem Link给 \(2^n-1\) 个动点,权值为 \(1\sim 2^n-1\) 的排列,对于每个点,设其左右两边所有点权异或和分别为 \(L,R\),那么他会向…

铁矿石 短线

周初要关注893一线阻力 ABC调整结构会出现 30分钟周期:

简单纯粹

如何做到极致的简单纯粹 2024.5.16-5.172024.5.17

.Net6 web API (Log日志)

前言 需要给项目打上日志 可以查询哪里的信息下面是步骤注意:不能允许没有任何监控的系统上线 如何监控---日志记录 需要日志信息的持久化-保存到文件中,保存到数据库中; 11.11og4net日志记录 1、Nuget引l入程序包Log4net+Microsoft.Extensions.Logging.Log4Net.AspNetcore …

给github新增讨论功能

给github新增讨论功能给github新增讨论功能 giscus讨论功能说明 https://giscus.app/zh-CN giscus GitHub https://github.com/giscus/giscus/blob/main/README.zh-CN.md网站:http://shibowl.topgithub:https://github.com/hanbinjxnc博客园:https://www.cnblogs.com/hool 博…

BUUCTF-WEB(4-8)

[ACTF2020 新生赛]Include 打开题目,是一个超链接,点击后,发现URL发生了变化可以看出是文件包含,包含了一个flag.php的文件 我们试着访问/etc/passwd我又试了试伪协议,显然是被过滤了然后我们就访问了一下nginx的日志,访问成功 ?file=/var/log/nginx/access.log那我们就…

CentOS配置静态IP

CentOS配置静态IP1.查看虚拟机使用的网络连接方式2.查看虚拟机的网络连接方式IP3.1.CentOS6.8之前IP配置方法 打开系统输入setup,进入文本模式设置工具进入网络配置模式进入网络配置模式过后在进入设置配置,选项eth0网卡进入配置静态IP关闭DHCP,在静态IP,子网掩码和默认网关…

贝叶斯推断架构实现

本文用于记录贝叶斯框架原理和架构实现方案贝叶斯推断基础 贝叶斯方法提出了一个概率框架来描述如何将新的观察结果整合到决策过程中。传统的贝叶斯推断的二进制算术结构中,后验概率的计算需要大量的乘、除、加。 先验概率(由历史求因):根据以往经验和分析得到的概率,观测…