Печать на Brother P-Touch с помощью ESC/P из веб-форм ASP.NET по IP

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

Любой совет приветствуется!

Похоже, вы создали строковое представление шестнадцатеричного числа, а затем отправили его. Я сомневаюсь, что это то, что запрошено, я ожидаю, что запрос заключается в отправке двоичной версии исходной команды. В зависимости от того, какую форму оно принимает, вы можете начать с целого числа в шестнадцатеричной кодировке (начинается с &H), вы можете пропустить строку в шестнадцатеричном коде через одно из семейств Convert.ToInt (я думаю, доступно с шириной от 16 до 64) или вы можно использовать что-то вроде Convert.FromHexString (что может быть только в наследственных версиях .NET Core).

Craig 27.06.2024 19:12

Или вы можете использовать Encoding.GetBytes аналогично тому, что вы делаете сейчас, за исключением исходной формы команды, а не шестнадцатерично преобразованной формы.

Craig 27.06.2024 19:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Таким образом, проблема определенно заключалась в формате, в котором я отправлял данные на принтер. Принтер не интерпретировал строку и для работы требовал массив байтов.

Что-то вроде этого работает.

    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, а не текстом, который вам предоставляют.

Другие вопросы по теме