ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.net 通过蓝牙调用佳博标签打印机

2022-06-10 09:32:00  阅读:180  来源: 互联网

标签:佳博 string sw args 蓝牙 var StartInfo net message


  最近公司有个需求,需要使用程序打印一张标签,标签内容为一张二维码以及对应的描述信息,并且,要贴在注射器上面,然后供扫码机扫描识别。看到这个需求的第一瞬间,我的想法就是很简单,生成一张图片上面是二维码,下面是描述信息,然后拉起浏览器的打印。咔咔写完了后,测试一下打印,非常的模糊,反复调整了大小还是不行。最后问了一下公司的大佬,大佬说可以直接用打印机指令去生成二维码,直接用图片打印存在缩放的问题。OK,说干就干,找客服要了编程手册,开始写代码。

框架为 .net framework 4.5.2

class Program
    {
        static void Main(string[] args)
        {

            if (args == null || args.Length < 2)
            {
                Console.WriteLine($"【error】打印失败,参数错误!");
                return;
            }

            string code = args[0];
            var content = args[1].Split('$');
            string printrName = "Printer_0E92";
            string pin = "0000";
            if (args.Length >= 3)
            {
                printrName = args[2];
            }
            if (args.Length >= 4)
            {
                printrName = args[3];
            }

            Print(code, content, printrName, pin);
        }

        static void Print(string code, string[] content, string printrName, string pin)
        {
            BluetoothClient client = new BluetoothClient();

            BluetoothDeviceInfo device = client.PairedDevices.FirstOrDefault(x => x.DeviceName.Equals(printrName));

            if (!device.Authenticated)
            {
                BluetoothSecurity.PairRequest(device.DeviceAddress, pin);
            }

            device.Refresh();

            try
            {
                client.Connect(device.DeviceAddress, BluetoothService.SerialPort);
            }
            catch (Exception)
            {
                Console.WriteLine($"【error】无法连接到打印机,请检查打印机!");
                client.Close();
                return;
            }

            var stream = client.GetStream();
            StreamWriter sw = new StreamWriter(stream, Encoding.GetEncoding(54936));
            sw.Write("SIZE 50 mm,70 mm\r\n");//标签尺寸
            sw.Write("GAP 2 mm\r\n");//间距
            sw.Write("CLS\r\n");//清空缓冲区
            sw.Write($"QRCODE 220,50,L,4,A,0,\"{code}\"\r\n");

            var lines = GetLines(content[0]);

            foreach (var item in lines)
            {
                sw.Write($"TEXT 20,{170 + (item.index * 30)},\"TSS24.BF2\",0,1,1,\"{item.message}\"\r\n");
            }

            sw.Write($"TEXT 20,{170 + (lines.Count * 30)},\"TSS24.BF2\",0,1,1,\"{content[1]}\"\r\n");
            sw.Write("PRINT 1,1\r\n");
            sw.Flush();
            sw.Close();
            client.Close();

            Console.WriteLine($"【success】打印成功");
        }

        /// <summary>
        /// 每行16个字,获取每行的数据
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        static List<CodeTextModel> GetLines(string message)
        {
            var result = new List<CodeTextModel>();
            if (message.Length > 16)
            {
                var line = Math.Ceiling(message.Length / 16 * 1.0);
                var length = Math.Ceiling(message.Length / line);
                for (int i = 0; i < line; i++)
                {
                    var t = new CodeTextModel();
                    if (i == line - 1)
                    {
                        t.message = message.Substring(i * (int)length, message.Length - (i * (int)length));
                    }
                    else
                    {
                        t.message = message.Substring(i * (int)length, (int)length);
                    }
                    t.index = i;
                    result.Add(t);
                }
            }
            else
            {
                var t = new CodeTextModel();
                t.message = message;
                t.index = 0;
                result.Add(t);
            }
            return result;
        }
    }
internal class CodeTextModel
    {
        internal int index { get; set; }

        internal string message { get; set; }
    }

  试着打印了一下,很清晰,但是我们项目是.net core 2.2的,我试了一下调用蓝牙的库 InTheHand.Net.Bluetooth 直接抛异常,不支持。改用了3.1版本还是不行。那只能用Process 来调用,并且接收命令行的输出当作返回值,判断是否成功。


 private object locker = new object();
 Process p;


public void StartPrint(string code, string content, string content1) { lock (locker) { string fileName = AppContext.BaseDirectory + "/BluetoothPrinter/"; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { fileName += "BluetoothPrinter.exe"; } Task.Factory.StartNew(() => { p = new Process(); p.StartInfo.FileName = fileName; p.StartInfo.Arguments = $"\"{code}\" \"{content}${content1}\""; p.StartInfo.WorkingDirectory = AppContext.BaseDirectory + "BluetoothPrinter/"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = false; p.StartInfo.CreateNoWindow = false; p.OutputDataReceived += P_OutputDataReceived; p.Start(); p.PriorityClass = ProcessPriorityClass.High; p.PriorityBoostEnabled = true; p.BeginOutputReadLine(); p.WaitForExit(); }); } }
private void P_OutputDataReceived(object s, DataReceivedEventArgs e)
        {
            if (string.IsNullOrWhiteSpace(e.Data)) return;
            if (!string.IsNullOrWhiteSpace(e.Data) && e.Data.StartsWith("【data】"))
            {
                //处理正确
            }
            else if (e.Data.StartsWith("【error】"))
            {
                //处理错误
            }
        }    

 

标签:佳博,string,sw,args,蓝牙,var,StartInfo,net,message
来源: https://www.cnblogs.com/Yuuuuu/p/16362007.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有