前段时间,承接了一个项目,软件开发的,时间紧,就用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 Next
Dim INIFileName As String
Dim MQTTServerIP As String
Dim MQTTServerPort As Long
Dim SocketServerPort As Long
Dim i As Long
'初始化页面代码
Me.TextFasong = ""
Me.TextNeiRongD = ""
Me.ListDingYue.Clear
Me.Label1.Caption = "接收的数据"
Me.Label2.Caption = "发送的数据"
Me.Label3.Caption = "订阅的主题"
Caption = "MQTT Client for VB6 服务程序"
'启动后,缩小为图标
Me.WindowState = vbMinimized
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If
With 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 服务程序" & vbNullChar
End With
Shell_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 - 1
MQTTTopic(i) = ReadINI("MQTTBroker", "Topic" & i + 1, INIFileName)
Me.ListDingYue.AddItem MQTTTopic(i), 0
Next i
'MQTT Socket 初始化
Me.LabelMQTTBrokerName = "MQTT Broker:" & MQTTServerIP
Me.LabelMQTTPort = "MQTT Broker Port:" & MQTTServerPort
Me.LabelMQTTpublisher = "MQTT publisher:" & MQTTpublisherName
MQTTBrokerFlag = True
WinsockMQTT.RemoteHost = MQTTServerIP
WinsockMQTT.RemotePort = MQTTServerPort
WinsockMQTT.Protocol = sckTCPProtocol
TimerMQTTState.Enabled = True
MQTTFlag = False
If WinsockMQTT.State = 0 And MQTTBrokerFlag Then
WinsockMQTT.Connect
End If
'SocketServer 初始化
SocketServerPort = ReadINI("SocketServer", "SocketServerPort", INIFileName)
Me.TimerServerState.Enabled = True
If SocketServerPort >= 1000 Then
WinsockServer.LocalPort = SocketServerPort
WinsockServer.Protocol = sckTCPProtocol
WinsockServer.Listen
Me.LabelSocketServerPort = "Socket Server Port:" & SocketServerPort
End If
End Sub
这是主From启动的代码。
开发这个最大的难点在于 MQTT协议里面的报文结构很特别,需要做大量的转换工作。
前后写了5天时间,大概30个小时吧。
暂时这个MQTT Client for VB 6 只能和基于MQTT 3.1.1 的服务器通信, 例如移动OneNet,阿里云,腾讯云,我们自己的项目是华为云跑的。
等有空,再把加密做上,就能支持加密传输的MQTT Broker了。
有兴趣的人,我们可以一起讨论。