|
ปฐมบทชุดแรกที่แอดมินก็พึ่งได้เคยทำการเขียนโค้ดโปรแกรมด้วย VB.NET เพื่อทำการเชื่อมต่อเข้ากับ MikroTik และทำการรันทดสอบคอมมานด์ เพื่อดูคุณสมบัติต่างๆภายในตัว MikroTik
มาดูโค้ดกันเถอะ ...
- Public Class frmConnectMikroTik
- Private Sub frmConnectMikroTik_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
- txtIPAddress.Text = "IP ADDRESS"
- txtPort.Text = "8728"
- txtUsername.Text = "admin"
- txtPassword.Text = "PASSWORD"
- Call OnOff(False)
- End Sub
- Sub OnOff(ByVal blnState As Boolean)
- If blnState Then
- GroupBox1.Text = " Connect to MikroTik ... "
- txtIPAddress.Enabled = False
- txtPort.Enabled = False
- txtUsername.Enabled = False
- txtPassword.Enabled = False
- btnConnect.Enabled = False
- btnClear.Enabled = True
- btnSend.Enabled = True
- txtCmd.Enabled = True
- Else
- GroupBox1.Text = " Log in "
- txtIPAddress.Enabled = True
- txtPort.Enabled = True
- txtUsername.Enabled = True
- txtPassword.Enabled = True
- btnConnect.Enabled = True
- btnClear.Enabled = False
- btnSend.Enabled = False
- txtCmd.Enabled = False
- End If
- End Sub
- Function LoginMikrotik(ByVal IP As String, ByVal UN As String, ByVal PW As String) As Boolean
- Dim IPAddress As System.Net.IPAddress = System.Net.IPAddress.Parse(IP)
- Dim mk = New Mikrotik(IPAddress, 8728)
- If Not mk.Login(Trim(txtUsername.Text), Trim(txtPassword.Text)) Then
- Return False
- Else
- Return True
- End If
- End Function
- Private Sub btnConnect_Click(sender As System.Object, e As System.EventArgs) Handles btnConnect.Click
- If Not LoginMikrotik(txtIPAddress.Text.Trim, (txtUsername.Text), Trim(txtPassword.Text)) Then
- OnOff(False)
- MessageBox.Show("Sorry !!! You can't log in.", "Report Status", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
- Return
- Else
- 'MessageBox.Show("Welcome to Mikrotik system.", "Report Status", MessageBoxButtons.OK, MessageBoxIcon.Information)
- OnOff(True)
- txtCmd.Focus()
- '// SAMPLE
- ' /interface/print
- '/ip/arp/print
- '/system/resource/getall
- txtCmd.Text = "/system/resource/print"
- End If
- End Sub
- Private Sub txtData_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtResult.KeyPress
- e.Handled = True
- End Sub
- Private Sub btnSend_Click(sender As System.Object, e As System.EventArgs) Handles btnSend.Click
- If txtCmd.Text.Trim.Length = 0 Then Return
- '//
- Dim IPAddress As System.Net.IPAddress = System.Net.IPAddress.Parse(Trim(txtIPAddress.Text))
- Dim mk = New Mikrotik(IPAddress, 8728)
- Try
- If mk.Login(Trim(txtUsername.Text), Trim(txtPassword.Text)) Then
- txtResult.Clear()
- mk.Send(Trim(txtCmd.Text), True)
- Dim strLog As String = String.Empty
- For Each row In mk.Read
- strLog = strLog & row & vbCrLf
- Next
- txtResult.Text = strLog
- End If
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- End Sub
- Private Sub btnClear_Click(sender As System.Object, e As System.EventArgs) Handles btnClear.Click
- OnOff(False)
- txtResult.Clear()
- End Sub
- End Class
คัดลอกไปที่คลิปบอร์ด
API in VB dot NET ... (https://wiki.mikrotik.com/wiki/API_in_VB_dot_NET)
- '// ORIGINAL ... https://wiki.mikrotik.com/wiki/API_in_VB_dot_NET
- Public Class Mikrotik
- Dim tcpStream As IO.Stream
- Dim tcpCon As New Net.Sockets.TcpClient
- Public Sub New(ByVal IPAddr As System.Net.IPAddress, Optional ByVal port As Integer = -1)
- tcpCon.Connect(IPAddr, If(port = -1, 8728, port))
- tcpStream = tcpCon.GetStream()
- End Sub
- Public Sub Close()
- tcpStream.Close()
- tcpCon.Close()
- End Sub
- Public Function Login(ByVal user As String, ByVal pass As String) As Boolean
- Send("/login", True)
- Dim hash = Read()(0).Split(New String() {"ret="}, StringSplitOptions.None)(1)
- Send("/login")
- Send("=name=" + user)
- Send("=response=00" + EncodePassword(pass, hash), True)
- Dim res = Read()
- If (res(0) = "!done") Then Return True Else Return False
- End Function
- Function EncodePassword(ByVal pass As String, ByVal challange As String) As String
- Dim hash_byte(challange.Length / 2 - 1) As Byte
- For i = 0 To challange.Length - 2 Step 2
- hash_byte(i / 2) = Byte.Parse(challange.Substring(i, 2), Globalization.NumberStyles.HexNumber)
- Next
- Dim response(pass.Length + hash_byte.Length) As Byte
- response(0) = 0
- System.Text.Encoding.ASCII.GetBytes(pass.ToCharArray()).CopyTo(response, 1)
- hash_byte.CopyTo(response, 1 + pass.Length)
- Dim md5 = New System.Security.Cryptography.MD5CryptoServiceProvider()
- Dim hash = md5.ComputeHash(response)
- Dim hashStr As New System.Text.StringBuilder()
- For Each h In hash
- hashStr.Append(h.ToString("x2"))
- Next
- Return hashStr.ToString()
- End Function
- Public Sub Send(ByVal command As String, Optional ByVal EndSentence As Boolean = False)
- Dim bytes = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray())
- Dim size = EncodeLength(bytes.Length)
- tcpStream.Write(size, 0, size.Length)
- tcpStream.Write(bytes, 0, bytes.Length)
- If EndSentence Then tcpStream.WriteByte(0)
- End Sub
- Public Function Read() As List(Of String)
- Dim output As New List(Of String)
- Dim o = ""
- Dim tmp(4) As Byte
- Dim count As Long
- While True
- tmp(3) = tcpStream.ReadByte()
- Select Case tmp(3)
- Case 0
- output.Add(o)
- If o.Substring(0, 5) = "!done" Then
- Exit While
- Else
- o = ""
- Continue While
- End If
- Case Is < &H80
- count = tmp(3)
- Case Is < &HC0
- count = BitConverter.ToInt32(New Byte() {tcpStream.ReadByte(), tmp(3), 0, 0}, 0) ^ &H8000
- Case Is < &HE0
- tmp(2) = tcpStream.ReadByte()
- count = BitConverter.ToInt32(New Byte() {tcpStream.ReadByte(), tmp(2), tmp(3), 0}, 0) ^ &HC00000
- Case Is < &HF0
- tmp(2) = tcpStream.ReadByte()
- tmp(1) = tcpStream.ReadByte()
- count = BitConverter.ToInt32(New Byte() {tcpStream.ReadByte(), tmp(1), tmp(2), tmp(3)}, 0) ^ &HE0000000
- Case &HF0
- tmp(3) = tcpStream.ReadByte()
- tmp(2) = tcpStream.ReadByte()
- tmp(1) = tcpStream.ReadByte()
- tmp(0) = tcpStream.ReadByte()
- count = BitConverter.ToInt32(tmp, 0)
- Case Else
- Exit While 'err
- End Select
- For i = 0 To count - 1
- o += ChrW(tcpStream.ReadByte())
- Next
- End While
- Return output
- End Function
- Function EncodeLength(ByVal l As Integer) As Byte()
- If l < &H80 Then
- Dim tmp = BitConverter.GetBytes(l)
- Return New Byte() {tmp(0)}
- ElseIf l < &H4000 Then
- Dim tmp = BitConverter.GetBytes(l Or &H8000)
- Return New Byte() {tmp(1), tmp(0)}
- ElseIf l < &H200000 Then
- Dim tmp = BitConverter.GetBytes(l Or &HC00000)
- Return New Byte() {tmp(2), tmp(1), tmp(0)}
- ElseIf l < &H10000000 Then
- Dim tmp = BitConverter.GetBytes(l Or &HE0000000)
- Return New Byte() {tmp(3), tmp(2), tmp(1), tmp(0)}
- Else
- Dim tmp = BitConverter.GetBytes(l)
- Return New Byte() {&HF0, tmp(3), tmp(2), tmp(1), tmp(0)}
- End If
- End Function
- End Class
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดฉบับเต็ม VB.NET (2010) ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|