Я пытаюсь распечатать калибровочные этикетки на Brother P-Touch P95NW. Принтер настроен со статическим IP-адресом, я могу пропинговать его и распечатать (по IP) из P-Touch Editor.
Для печати из веб-формы я пытаюсь использовать код, который отлично работает на нескольких разных принтерах с разными языками.
Согласно руководству разработчиков принтеров, в качестве примера они предоставляют шестнадцатеричный вывод:
Мой желаемый код отправлял бы необработанный вывод на принтер.
Что-то вроде этого:
Dim clientSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
clientSocket.Connect(New IPEndPoint(IPAddress.Parse(IP), 9100))
Dim Label As String = "1B 69 61 00 1B 40 1B 69-6C D0 02 1B 24 3C 00 1B" &
"6B 00 1B 58 36 41 74 20-69 6F 75 72 20 73 69 64" &
"65 0C"
clientSocket.Send(Encoding.ASCII.GetBytes(Label))
clientSocket.Close()
При выполнении принтер вообще не реагирует.
У Brother есть несколько технических видеороликов, и в их примерах они отправляют данные в текстовом файле, поэтому я попробовал это. Указанный файл имеет то же содержимое, что и строка выше.
Dim filePath As String = "\\myserver\Systems\_MISC\bwtest.txt"
Dim fileReader As String = My.Computer.FileSystem.ReadAllText(filePath, Encoding.ASCII)
Dim clientSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
clientSocket.Connect(New IPEndPoint(IPAddress.Parse(IP), 9100))
clientSocket.SendFile(filePath)
clientSocket.Close()
Опять получаю тот же результат, ничего.
Я также попытался использовать netcat для отправки файла, но снова безрезультатно.
На этом этапе я должен предположить, что мне не хватает чего-то очевидного в моем выходном файле или где-то в конфигурации. Я печатаю на этикетке шириной 0,94 дюйма с той же ориентацией, как показано в их примере.
Любой совет приветствуется!
Или вы можете использовать Encoding.GetBytes
аналогично тому, что вы делаете сейчас, за исключением исходной формы команды, а не шестнадцатерично преобразованной формы.
Таким образом, проблема определенно заключалась в формате, в котором я отправлял данные на принтер. Принтер не интерпретировал строку и для работы требовал массив байтов.
Что-то вроде этого работает.
Dim IP As String = "xxx.xx.xx.xx"
Dim clientSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
clientSocket.Connect(New IPEndPoint(IPAddress.Parse(IP), 9100))
Dim Label As String = "1B 69 61 00 1B 40 1B 69-6C D0 02 1B 24 3C 00 1B " &
"6B 00 1B 58 36 41 74 20-79 6F 75 72 20 73 69 64 " &
"65 0C "
Dim byteArray() As Byte = HexStringToBytes(Label)
clientSocket.Send(byteArray)
clientSocket.Close()
Используя функцию для преобразования.
Function HexStringToBytes(ByVal hexString As String) As Byte()
Dim result As New List(Of Byte)()
For i As Integer = 0 To hexString.Length - 1 Step 3
result.Add(Convert.ToByte(hexString.Substring(i, 2), 16))
Next
Return result.ToArray()
End Function
В реальных приложениях это не совсем практично, поскольку внесение изменений в шестнадцатеричную строку будет затруднительно. Вы также можете выполнить преобразование из кода ESC/p на лету.
Dim myText As String = StrToHex("At your side")
Public Function StrToHex(ByRef Data As String) As String
Dim sVal As String
Dim sHex As String = ""
While Data.Length > 0
sVal = Conversion.Hex(Strings.Asc(Data.Substring(0, 1).ToString()))
Data = Data.Substring(1, Data.Length - 1)
sHex = sHex & sVal & " "
End While
Return sHex
End Function
Самая большая проблема здесь — осознание того, что такие элементы, как FF и ESC, являются символами ASCII, а не текстом, который вам предоставляют.
Похоже, вы создали строковое представление шестнадцатеричного числа, а затем отправили его. Я сомневаюсь, что это то, что запрошено, я ожидаю, что запрос заключается в отправке двоичной версии исходной команды. В зависимости от того, какую форму оно принимает, вы можете начать с целого числа в шестнадцатеричной кодировке (начинается с
&H
), вы можете пропустить строку в шестнадцатеричном коде через одно из семействConvert.ToInt
(я думаю, доступно с шириной от 16 до 64) или вы можно использовать что-то вродеConvert.FromHexString
(что может быть только в наследственных версиях .NET Core).