Я пытаюсь отправить сообщение 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 всегда пуст или содержит только нули, если я все равно пытаюсь их прочитать.Я ожидаю, по крайней мере, что-то похожее на сообщение об ошибке.