如何在Xamarin Android应用中通过便携式蓝牙EPS / POS打印机轻松连接并开始打印

我们从哪里开始?

在Nuget项目中添加一个用于与EPS / POS团队合作的软件包。 为此,请打开软件包管理器控制台,并使用以下命令添加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> 

获取用于蓝牙的适配器:

 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(); 

在实际的应用程序中,应按名称选择打印机,例如,为用户显示一个对话框,供他选择打印机

出于某种原因,Xumarin 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线程中运行它。

在写命令之后,应该列出您发送的字符。

Source: https://habr.com/ru/post/zh-CN463691/


All Articles