VB 6.0 可以使用MQTT

前段时间,承接了一个项目,软件开发的,时间紧,就用VB扣了一个。后来用户提出要把数据传输到他们的MQTT服务器上进行分发,就用VB 6.0的代码又扣了个几天,弄出来个能和MQTT Broker 进行通信的 VB 6.0 的程序。

为了支持其他人快速开发使用。就做成了个带 Socket 通信端口的程序。
VB 6.0 可以使用MQTT_第1张图片
MQTT Client for VB 6 服务程序

所有的代码都是用 VB6.0 写的。

调用了4个API函数
Sleep
Shell_NotifyIcon
SendMessage
GetPrivateProfileString
前三个是为了做个托盘图标,后面一个是为了读写配置的INI文件。
使用了 Winsocket 控件,Timer控件,Textbox控件,Frame控件,Label控件。
没有任何的第三方控件。
没有任何的第三方控件。
没有任何的第三方控件。
主界面如下:

VB 6.0 可以使用MQTT_第2张图片
注意:我们自己测试的MQTT Broker 端口是 1884,而常规的MQTT Broker端口是1883
软件运行后,界面

VB 6.0 可以使用MQTT_第3张图片
程序平时以托盘图标方式存在

在这里插入图片描述
图标也是自己画的。

开发思路:在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了。

有兴趣的人,我们可以一起讨论。

你可能感兴趣的:(socket,vb6,mqtt,物联网)