前段时间,承接了一个项目,软件开发的,时间紧,就用VB扣了一个。后来用户提出要把数据传输到他们的MQTT服务器上进行分发,就用VB 6.0的代码又扣了个几天,弄出来个能和MQTT Broker 进行通信的 VB 6.0 的程序。
为了支持其他人快速开发使用。就做成了个带 Socket 通信端口的程序。
MQTT Client for VB 6 服务程序
所有的代码都是用 VB6.0 写的。
调用了4个API函数
Sleep
Shell_NotifyIcon
SendMessage
GetPrivateProfileString
前三个是为了做个托盘图标,后面一个是为了读写配置的INI文件。
使用了 Winsocket 控件,Timer控件,Textbox控件,Frame控件,Label控件。
没有任何的第三方控件。
没有任何的第三方控件。
没有任何的第三方控件。
主界面如下:
注意:我们自己测试的MQTT Broker 端口是 1884,而常规的MQTT Broker端口是1883
软件运行后,界面
程序平时以托盘图标方式存在
图标也是自己画的。
开发思路:在OSI 7层协议中的会话层进行开发的。 就是SOCKET编程序。
用户自己开发的VB程序,使用TCP SOCKET 与 MQTT Client for VB 6 通信,通过socket 传输特定的报文结构,就可以向 MQTT Broker 发送 Topic,订阅Topic,接受订阅的Topic的内容。
On Error Resume NextDim INIFileName As StringDim MQTTServerIP As StringDim MQTTServerPort As LongDim SocketServerPort As LongDim i As Long'初始化页面代码Me.TextFasong = ""Me.TextNeiRongD = ""Me.ListDingYue.ClearMe.Label1.Caption = "接收的数据"Me.Label2.Caption = "发送的数据"Me.Label3.Caption = "订阅的主题"Caption = "MQTT Client for VB6 服务程序"'启动后,缩小为图标Me.WindowState = vbMinimizedIf WindowState = vbMinimized ThenLastState = vbNormalElseLastState = WindowStateEnd IfWith mydata.cbSize = Len(mydata).hwnd = Me.hwnd.uID = 0.uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP.uCallbackMessage = WM_MOUSEMOVE.hIcon = Me.Icon.Handle '默认为窗口图标.szTip = "MQTT client for VB6 服务程序" & vbNullCharEnd WithShell_NotifyIcon NIM_ADD, mydata'读取配置文件打开MQTT链接INIFileName = FormatFileName("config.ini")MQTTServerIP = ReadINI("MQTTBroker", "BrokerADD ", INIFileName)MQTTServerPort = Val(ReadINI("MQTTBroker", "BrokerPort", INIFileName))MQTTpublisherName = ReadINI("MQTTBroker", "MQTTpublisherName", INIFileName)MQTTTopicquantity = Val(ReadINI("MQTTBroker", "Topicquantity", INIFileName))MQTTPublish = ReadINI("MQTTBroker", "MQTTPublish", INIFileName)For i = 0 To MQTTTopicquantity - 1MQTTTopic(i) = ReadINI("MQTTBroker", "Topic" & i + 1, INIFileName)Me.ListDingYue.AddItem MQTTTopic(i), 0Next i'MQTT Socket 初始化Me.LabelMQTTBrokerName = "MQTT Broker:" & MQTTServerIPMe.LabelMQTTPort = "MQTT Broker Port:" & MQTTServerPortMe.LabelMQTTpublisher = "MQTT publisher:" & MQTTpublisherNameMQTTBrokerFlag = TrueWinsockMQTT.RemoteHost = MQTTServerIPWinsockMQTT.RemotePort = MQTTServerPortWinsockMQTT.Protocol = sckTCPProtocolTimerMQTTState.Enabled = TrueMQTTFlag = FalseIf WinsockMQTT.State = 0 And MQTTBrokerFlag ThenWinsockMQTT.ConnectEnd If'SocketServer 初始化SocketServerPort = ReadINI("SocketServer", "SocketServerPort", INIFileName)Me.TimerServerState.Enabled = TrueIf SocketServerPort >= 1000 ThenWinsockServer.LocalPort = SocketServerPortWinsockServer.Protocol = sckTCPProtocolWinsockServer.ListenMe.LabelSocketServerPort = "Socket Server Port:" & SocketServerPortEnd IfEnd Sub
这是主From启动的代码。
开发这个最大的难点在于 MQTT协议里面的报文结构很特别,需要做大量的转换工作。
前后写了5天时间,大概30个小时吧。
暂时这个MQTT Client for VB 6 只能和基于MQTT 3.1.1 的服务器通信, 例如移动OneNet,阿里云,腾讯云,我们自己的项目是华为云跑的。
等有空,再把加密做上,就能支持加密传输的MQTT Broker了。
有兴趣的人,我们可以一起讨论。