前段時間,承接了一個專案,軟體開發的,時間緊,就用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了,
有興趣的人,我們可以一起討論,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263909.html
標籤:其他
