Telnet Verbindung zu Telefonanlage

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Mad Andy.

    Telnet Verbindung zu Telefonanlage

    Also ich bin neu hier, ich programmiere noch nicht lange mit vb.net ... bin also blutiger Programmieranfänger.
    Nun ich suche nach einer Möglichkeit wie ich die Performancedaten meiner Telefonanlage auslesen kann.
    Im wesentlichen könnt ihr euch das so vorstellen. Ich erkläre das mal, wie das geht wenn ich das von Hand über cmd.exe mache.

    Also ich starte cmd.exe -> telnet 192.168.104.70:1107 -> danach wird nach dem User gefragt (ich kann einfach weiter mit "ENTER") -> eine weitere Abfrage nach einem PW ist verlangt (auch hier kann ich nur "ENTER") -> Es wird nochmal nach einem Master PW gefragt (und wieder kann ich nur "ENTER") eingeben. Ich brauche also keine Namen oder PW einzugeben, es reicht wenn ich einfach mit "ENTER" weiter gehe.

    Ist der Teil abgeschlossen bekomme ich ein Menu wo ich (7 "ENTER") eingebe und schon kommen die Daten raus. Jede sec. wird ein wert in die Shell geschrieben. Diesen Wert, werte ich dann aus.

    Mein Problem ist nun das ich überhaupt keine Ahnung habe wie ich diese Telnetverbindung zusammengebaut kriege.

    Fast jedes Beispiel das ich im Netz find baut auf einen Server auf der auch mit gestartet wird. Diesen brauche ich jedoch nicht. Eine besondere Schwierigkeit für mich ist, wie ich diese "Enter commands " überhaupt senden soll.

    Kann mir hier jemand weiterhelfen?
    Dein Link bei google hilft mir leider überhaupt nicht.
    Nur weil da in irgend einem Text einer vb.net und telnet zusammenstehen bringt mich das nicht weiter.

    Ich sags mal so: ca 90% aller Beitäge die ich mit google finde funktionieren eh nicht oder es fehlen markante Inputs wie zB die authorisierung.
    Weitere 8% sind zwar zum Teil gute Beispiele (sind aber in c# geschrieben), 1% baut auf völlig veraltete Technik auf, das verbleibende restliche Prozent habe ich noch nicht gefunden.
    Ich möchte mich jetzt auch nicht in 25 anderen Foren registrieren um dann gleich weit zu sein wie zuvor auch schon.

    Meine Idee:
    ich möchte das über eine Form lösen.
    Quasi "ein Button" und eine "Multiline textbox".
    Wenn ich den Button klicke solle er mir halt direkt connecten und die Daten die per telnet raus kommen in die multiline Textbox schreiben.

    Diese Textbox lese ich dann aus.
    OK, ich hab es jetzt mal so probiert ...

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Net.Sockets
    3. Imports System.IO
    4. Imports CommonComponent
    5. Public Module TcpClientConsole
    6. Public Const RequestConnect As String = "Hallo"
    7. Public Const Disconnect As String = "Bye"
    8. Private Stream As NetworkStream
    9. Public Sub main()
    10. ' Auf das Laden des Servers warten.
    11. System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1))
    12. Dim Client As New TcpClient()
    13. Try
    14. Console.WriteLine("Verbindungsversuch mit Server über Anschluss 1056.")
    15. Client.Connect(IPAddress.Parse("192.168.104.70"), 1056)
    16. Console.WriteLine("Verbindung hergestellt.")
    17. ' Den Netzwerk-Stream abrufen.
    18. Stream = Client.GetStream()
    19. ' Einen BinaryWriter erstellen, um in den Stream zu schreiben.
    20. Dim w As New BinaryWriter(Stream)
    21. ' Einen BinaryReader erstellen, um aus dem Stream zu lesen.
    22. Dim r As New BinaryReader(Stream)
    23. ' Einen Dialog starten.
    24. w.Write(ClientMessages.RequestConnect)
    25. If r.ReadString() = ServerMessages.AcknowledgeOK Then
    26. Console.WriteLine("Verbunden.")
    27. Console.WriteLine("Enter drücken, um Verbindung zu trennen.")
    28. Console.ReadLine()
    29. Console.WriteLine("Trenne Verbindung...")
    30. w.Write(ClientMessages.Disconnect)
    31. Else
    32. Console.WriteLine("Verbindung nicht beendet.")
    33. End If
    34. ' Den Verbindungs-Socket schließen.
    35. Client.Close()
    36. Console.WriteLine("Anschluss geschlossen.")
    37. Catch Err As Exception
    38. Console.WriteLine(Err.ToString())
    39. End Try
    40. Console.ReadLine()
    41. End Sub
    42. End Module


    Aber nach Console.WriteLine("Verbindung hergestellt.") geht es irgendwie nicht weiter.
    Habe das problem das ich nur cryptische Zeichen bekomme. zb -> Server: ÿþÿûÿû

    Ich denke ich muss die ausgabe vom Socket irgendwie encodieren in ascii aberr wie?

    Wäre für Hilf Dankbar ...

    VB.NET-Quellcode

    1. 'Button Verbinden
    2. Private Sub btnTelnetConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTelnetConnect.Click
    3. 'Winsock wird geschlossen
    4. Winsock1.Close()
    5. 'Die IP des Servers
    6. Winsock1.RemoteHost = txtTelnetHost.Text
    7. 'Der Port des Servers
    8. Winsock1.RemotePort = txtTelnetPort.Text
    9. 'Verbinde Winsock !
    10. Winsock1.Connect()
    11. 'Textfeld und Button aktivieren
    12. txtTelnetSend.Enabled = True
    13. btnTelnetSent.Enabled = True
    14. 'ConnectButton deaktivieren
    15. btnTelnetConnect.Enabled = False
    16. End Sub
    17. 'Button Trennen
    18. Private Sub btnTelnetdisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTelnetdisconnect.Click
    19. 'Winsock wird geschlossen
    20. Winsock1.Close()
    21. 'ConnectButton aktivieren
    22. btnTelnetConnect.Enabled = True
    23. 'Textfeld und Button deaktivieren
    24. txtTelnetSend.Enabled = False
    25. btnTelnetSent.Enabled = False
    26. End Sub
    27. 'Button Senden
    28. Private Sub btnTelnetSent_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTelnetSent.Click
    29. txtTelnetMain.Text = txtTelnetMain.Text & "Client: " & txtTelnetSend.Text & vbCrLf
    30. 'senden was in der Textbox steht
    31. txtTelnetSend.SelectionStart = Len(txtTelnetSend.Text)
    32. 'senden der daten
    33. Winsock1.SendData(txtTelnetSend.Text & vbCrLf)
    34. 'Textbox leer überschreiben
    35. txtTelnetSend.Text = ""
    36. End Sub
    37. 'status der verbindung
    38. Private Sub TimerTelnetState_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerTelnetState.Tick
    39. lblTelnetConnectstate.Text = CStr(Winsock1.CtlState)
    40. End Sub
    41. 'wenn daten ankommen
    42. Private Sub Winsock1_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles Winsock1.DataArrival
    43. 'Sub wenn Datem am Winsock ankommen
    44. Dim Result As String = ""
    45. Winsock1.GetData(Result)
    46. txtTelnetMain.Text = txtTelnetMain.Text & "Server: " & Result.ToString & vbCrLf
    47. End Sub
    48. 'Verbindung Prüfen
    49. Private Sub btnTelnetCheckState_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTelnetCheckState.Click
    50. If Winsock1.CtlState = MSWinsockLib.StateConstants.sckConnected Then
    51. MessageBox.Show("Server is connected")
    52. Else
    53. MessageBox.Show("Server is not connected")
    54. End If
    55. End Sub
    Ich bin mir nicht sicher, welches Encoding wo verwendet wird. Gibt aber quasi nur 3:
    - Western ISO-8859-X (1 Byte pro Zeichen)
    - UTF-8 (1 Byte für geöhnliche Zeichen, 2 Byte für Sonderzeichen)
    - UTF-16 (2 Byte pro Zeichen)

    Weiß vielleicht jemand, was .net verwendet? VB6 hat damals UTF-16 verwendet.
    Dass die Telefonanlage UTF-16 verwendet, schließ ich mal aus, somit wären normale Zeichen mit ASCII kompatibel.

    Folgendes hab ich aber im Zusammenhang mit Sockets und Encoding gefunden:

    VB.NET-Quellcode

    1. ' Do a simple write.
    2. Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("Is anybody there")
    3. networkStream.Write(sendBytes, 0, sendBytes.Length)
    4. ' Read the NetworkStream into a byte buffer.
    5. Dim bytes(tcpClient.ReceiveBufferSize) As Byte
    6. networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
    7. ' Output the data received from the host to the console.
    8. Dim returndata As String = Encoding.ASCII.GetString(bytes)
    9. Console.WriteLine(("Host returned: " + returndata))
    Ok, bin immer noch drann ... von den entwicklern der Telefon anlage habe ich erfahren das wenn ich beim zugriff "kryptische Zeichen" --> laut entwickler nicht druckbare Zeichen erhalte, dann soll ich der PBX eine ECHO anforderung senden.

    Zitat des entwicklers: "du musst die HEX zeichen ff fd 01 senden"

    Das sei ein 3 byte langes Kommando das aus den rfc 854 , 857 , 858 stamme.

    Mit dem ganzen kann ich natürlich überhaupt nichts anfangen da ich nur Bahnhof verstehe.

    Wo müsste das in meinem Code hin und wie würde das aussehen ????

    VB.NET-Quellcode

    1. Public Class Form1
    2. Inherits System.Windows.Forms.Form
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Try
    5. If AxWinsock1.CtlState = MSWinsockLib.StateConstants.sckConnected Then
    6. MessageBox.Show("Server is already connected")
    7. Exit Sub
    8. Else
    9. AxWinsock1.RemoteHost = txtRemoteHost.Text
    10. AxWinsock1.RemotePort = txtRemotePort.Text
    11. AxWinsock1.Connect()
    12. End If
    13. Catch ex As Exception
    14. End Try
    15. End Sub
    16. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    17. If AxWinsock1.CtlState = MSWinsockLib.StateConstants.sckConnected Then
    18. MessageBox.Show("Server is connected")
    19. Else
    20. MessageBox.Show("Server is not connected")
    21. End If
    22. End Sub
    23. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    24. If AxWinsock1.CtlState <> MSWinsockLib.StateConstants.sckConnected Then
    25. MessageBox.Show("Server is not connected")
    26. Else
    27. AxWinsock1.SendData(TextBox1.Text)
    28. TextBox1.Text = ""
    29. End If
    30. End Sub
    31. Private Sub AxWinsock1_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles AxWinsock1.DataArrival
    32. Dim strData As Object
    33. Dim i As Integer
    34. Dim tstring As String
    35. tstring = ""
    36. AxWinsock1.GetData(strData)
    37. For i = 0 To UBound(strData)
    38. tstring = tstring + Chr(strData(i))
    39. Next
    40. TextBox2.Text = tstring
    41. End Sub
    42. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    43. AxWinsock1.Close()
    44. End Sub
    45. End Class
    Hi!

    Ich weiß leider nicht, was das AxWinsock annimmt. Wenns einen Byte-Array annimmt, gehts wohl per

    VB.NET-Quellcode

    1. Dim data(2) as Byte
    2. data(0) = &HFF&
    3. data(1) = &HFD&
    4. data(2) = &H01&
    5. AxWinsock1.SendData(data)


    Ansonsten musst du das Array in einen String umwandeln.