С чего же мы начнём?

Добавим в проект Nuget пакет для работы с EPS/POS командами. Для этого откройте Package Manager Console и добавьте Zebra.Printer.SDK командой

Install-Package Zebra.Printer.SDK

По сути, не имеет значения какую модель принтера вы используете и кто производитель. Вам нужно убедиться в том, что принтер поддерживает работу с EPS/POS командами (их большинство). В этом случае библиотека сможет работать с ним без проблем.

Все дальнейшие действия описаны с предположением того, что вы зашли в настройки Android устройства и подключились к принтеру.

В первую очередь добавим разрешения в файл AndroidManifest.xml:

<manifest ....>
...
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
...
</manifest>

Получим адаптер для работы с Bluetooth:

var bluetoothAdapter = BluetoothAdapter.DefaultAdapter;

Найдем среди всех подключенных устройств принтеры и возьмем первый из них:

var printers = bluetoothAdapter.BondedDevices.Where(c => c.BluetoothClass.MajorDeviceClass == MajorDeviceClass.Imaging && (int)c.BluetoothClass.DeviceClass == PrinterBluetoothMinorDeviceClassCode && c.BondState == Bond.Bonded);

var printer = printers.First();

В реальном приложении следует сделать выбор принтера по имени, например вывести диалог для пользователя, где он сможет выбрать принтер

Код минорного класса устройств, который соответствует принтерам, почему-то отсутствует в enum Xamarin Android поэтому я просто задаю его константой:

private const int PrinterBluetoothMinorDeviceClassCode = 1664;

Дальше нам нужно создать соедининение:

Connection connection;
try
{
    var simpleConnectionString = $"BT:{printer.Address}";
    connection = ConnectionBuilder.Build(simpleConnectionString);
}
catch (Exception exception)
{
    try
    {
        var multiChannelConnectionString = $"BT_MULTI:{printer.Address}";
        connection = ConnectionBuilder.Build(multiChannelConnectionString);
    }
    catch (Exception multichannelException)
    {
        Console.WriteLine(multichannelException);
        throw;
    }
}

Мы пытаемся подключиться двумя разными путями, первый обычный, второй — мультиканальный. Принтер может работать в одном из них, поэтому последовательно пробуем оба.

После того как вам удастся создать подключение, нужно будет открыть соединение, отправить данные на принтер, и закрыть подключение:

try
{
    var testString = "This a test text for printer.";
    var stringBuilder = new StringBuilder();
    stringBuilder.Append(testString);
    stringBuilder.Append("\n");

    connection.Open();
    connection.Write(Encoding.UTF8.GetBytes(stringBuilder.ToString()));
}
catch (Exception exception)
{
    Console.WriteLine(exception);
    throw;
}
finally
{
    if (connection.Connected)
    {
        connection.Close();
    }
}

Не забудьте, что операция открытия соединения длительная, поэтому ее следует выполнять в отдельном потоке. Выполнять ее в главном потоке UI не рекомендуется.

После команды Write должна пойти распечатка отправленных вами символов.

Комментарии (2)


  1. Imbecile
    15.08.2019 02:43

    Что такое EPS/POS? Не, не в этот раз.
    Где именно, каким шрифтом и т.д. будет распечатан текст? Не, зачем вам это.
    Фееричное использование StringBuilder для добавления символа новой строки? Вот оно!
    Про using для IDisposable? Зачем, когда можно удвоить количество кода.

    Итог: поздравляю, вы умеете подключать nuget пакет zebra.printer.sdk!


    1. ukod Автор
      15.08.2019 15:02

      Что такое EPS/POS действительно не в этот раз.
      Распечатан будет на принтере который подключен.
      StringBuilder использован для примера, там можно добавить сколько угодно строк либо заменить его на композер текста с форматированием. Вы перепутали заметку туториала со своей страницей код ревью.
      Будет что-то конструктивное сказать — заходите еще раз.