Попытка записи в поток TCP (на телефонный сервер с поддержкой CSTA), но DataAvailable всегда ложно - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь отправить сообщение CSTA-XML на телефонный сервер.Я должен отправить сообщение, используя TCP с фреймом, указанным в «ECMA-323 Приложение J.2» (см. Также https://blog.jonaskoeritz.de/2016/10/23/understanding-csta-part-1/). Независимо от того, как я пытаюсь настроить сообщение, а фрейм DataAvailable всегда ложныйи ответ пустой.

После того, как я закончил учебу, мне никогда не приходилось работать над веб-приложением или делать что-либо еще, что потребовало бы от меня использования TCP, так что мои знания чрезвычайно ржавые. Я не уверен, чтоПроблема в том, как я отправляю сообщение или само сообщение XML, поэтому я сначала пытаюсь выяснить, не делаю ли я что-то неправильно, отправляя сообщение. Поскольку я не получаю никакого ответа вместо сообщения об ошибке, я предполагаю, что этопервый.

Сервер Mitel MiVoice Office 400. CSTA активирован, IP-адрес и порт указаны правильно, порт прослушивается, и пользователь, с которым я пытаюсь войти, имеет лицензию CSTA. IЯ пытался отправить различные XML-строки для начала сеанса, но никогда не получал никакой реакции от сервера. XML-строка в примере является лишь одним из многих вариантов, которые япытался.Хотя, учитывая, что я вообще не получил ответа, я предполагаю, что проблема на более фундаментальном уровне, а не проблема с XML.Я взял строку XML прямо из руководства для телефонного сервера и попробовал несколько ее вариантов.

Private Function TestConnection(msg As String, Optional addDataFrame As 
   Boolean = True) As Boolean         
        Dim PBX_Port As Int32 = 1234
        Dim PBX_IPAddress As IPAddress = IPAddress.Parse("192.168.1.111")

        Using TCP_Client As New TcpClient()
            Dim TCP_Encoder As New UTF8Encoding
            TCP_Client.Connect(PBX_IPAddress, PBX_Port)

            Using TCP_Stream As NetworkStream = TCP_Client.GetStream
                Dim bytes(TCP_Client.ReceiveBufferSize) As Byte
                Dim responseData As String = ""

                If TCP_Stream.CanRead = False Then MsgBox("Can't read")
                If TCP_Stream.CanWrite = False Then MsgBox("Can't write")

                Dim Header As Byte() = BitConverter.GetBytes(0)
                ReDim Preserve Header(2)

                Dim InvokeID As Byte() = BitConverter.GetBytes(CInt(1))
                ReDim Preserve InvokeID(4)

                Dim MessageBody As Byte() = TCP_Encoder.GetBytes(msg)

                Dim MessageLength As Byte() = BitConverter.GetBytes(Header.Length + InvokeID.Length + MessageBody.Length + 2) '2 = size of MessageLength field
                ReDim Preserve MessageLength(2)

                Dim Data As Byte()
                If addDataFrame Then
                    Data = Combine(Header, MessageLength)
                    Data = Combine(Data, InvokeID)
                    Data = Combine(Data, MessageBody)
                Else
                    Data = TCP_Encoder.GetBytes(msg)
                End If

                TCP_Stream.Write(Data, 0, Data.Length)
                TCP_Stream.Flush()
                'EDIT: Tried with and without flush and also tried adding Thread.Sleep(10000) here

                If TCP_Stream.DataAvailable Then MsgBox("Data available")
                TCP_Stream.Read(bytes, 0, CInt(TCP_Client.ReceiveBufferSize))

                responseData = Encoding.UTF8.GetString(bytes)

                If responseData = "" Then
                    Return False
                Else
                    For Each b As Byte In bytes
                        If b.ToString <> "0" Then Return True
                    Next
                    Return False
                End If
            End Using
        End Using
   end function

Private Function Combine(first As Byte(), second As Byte()) As Byte()
    Dim result(first.Length + second.Length - 1) As Byte
    Buffer.BlockCopy(first, 0, result, 0, first.Length)
    Buffer.BlockCopy(second, 0, result, first.Length, second.Length)
    Return result
End Function

    Dim msgStartApplication As String = <![CDATA[<?xml version="1.0" encoding="UTF-8">
                                                 <applicationInfo>
                                                    <applicationID>CSTA_Test</applicationID>
                                                    <applicationSpecificInfo>
                                                        <SessionLoginInfo xmlns="http://www.aastra.com/csta">
                                                            <userName xmlns="">xxx</userName>
                                                            <password xmlns="">xxx</password>
                                                        </SessionLoginInfo>
                                                    </applicationSpecificInfo>
                                                </applicationInfo>
                                                   <requestedProtocolVersions> 
                                                    <protocolVersion>http://www.ecma-international.org/standards/ecma-323/csta/ed5"</protocolVersion>
                                                   </requestedProtocolVersions>]]>.Value   

TCP_Stream.DataAvailable всегда ложно.ResponseData всегда пуст или содержит только нули, если я все равно пытаюсь их прочитать.Я ожидаю, по крайней мере, что-то похожее на сообщение об ошибке.

...