• Vue 和 Zebra 打印机连接直接打印条码


    首先,Vue是无法调用Windows系统功能的,那么打印只能通过浏览器的打印功能来实现,这样显然不行,效率太低,而且斑马打印机是通过ZPL指令进行打印的,用浏览器打印非常不方便。

    两个办法:

    1. 换技术,使用能够调用Windows Api的语言进行开发功能。
    2. 转手给后台程序打印。

    我继续用Vue,用C#写了一个后台打印程序,C#开启websocket服务,Vue连接websocket进行通讯,如果Vue接收到ZPL指令就发送后台打印程序,由后台打印程序完成条码打印。

    后台打印程序Websocket,保持心跳。

    using Fleck;
    using log4net;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace CiemisPrintService
    {
        class WebSocketBootStrap
        {
    
            public static void Start()
            {
                ILog logger = LogManager.GetLogger(typeof(FleckLog));
    
                FleckLog.LogAction = (level, message, ex) =>
                {
                    switch (level)
                    {
                        case LogLevel.Debug:
                            SimpleLogHelper.LogInfo(message);
                            break;
                        case LogLevel.Error:
                            SimpleLogHelper.LogError(message);
                            break;
                        case LogLevel.Warn:
                            SimpleLogHelper.LogError(message);
                            break;
                        default:
                            SimpleLogHelper.LogInfoSuccess(message);
                            break;
                    }
                };
    
                var server = new WebSocketServer("ws://0.0.0.0:8181");
                server.SupportedSubProtocols = new[] { "v10.stomp", "v11.stomp" };
                server.RestartAfterListenError = true;
                server.Start(socket =>
                {
                    socket.OnOpen = () =>
                    {
                        string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                        SimpleLogHelper.LogInfoSuccess("连接进入:"+ clientUrl);
                    };
                    socket.OnClose = () => SimpleLogHelper.LogError("服务关闭!"); ;
                    socket.OnMessage = message => {
                        if (message.Equals("ping"))
                        {
                            socket.Send("pong");
                        }
                        else {
                            ZebraLibrary.ZebraPrintHelper.PrinterType = ZebraLibrary.DeviceType.DRV;
                            ZebraLibrary.ZebraPrintHelper.PrinterName = MainForm.mainWindow.GetDefaultPrinterName();
                            ZebraLibrary.ZebraPrintHelper.PrintCommand(message);
                        }
                        SimpleLogHelper.LogInfoSuccess(message);
                    };
                    socket.OnError = e =>
                    {
                        SimpleLogHelper.LogError(e.Message);
                    };
                    socket.OnPing = ping =>
                    {
                        socket.SendPong(Encoding.Default.GetBytes("pong"));
                        SimpleLogHelper.LogInfoSuccess(Encoding.Default.GetString(ping));
                    };
    
                });
    
            }
    
        }
    }
    
    

    代码很少,很简单的功能。

    Vue Socket进行连接。

      initSocket () {
          // 实例化socket
          // 监听socket连接
          this.socket.onopen = this.open
          // 监听socket错误信息
          this.socket.onerror = this.error
          // 监听socket消息
          this.socket.onmessage = this.getMessage
          this.socket.onclose = this.close
        },
        reInitSocket () {
          // 实例化socket
          // 监听socket连接
          this.socket = new WebSocket(MQTT_SERVICE)
          this.socket.onopen = this.open
          // 监听socket错误信息
          this.socket.onerror = this.error
          // 监听socket消息
          this.socket.onmessage = this.getMessage
          this.socket.onclose = this.close
        },
        countDownChanged (dismissCountDown) {
          this.dismissCountDown = dismissCountDown
        },
        showAlert () {
          this.dismissCountDown = this.dismissSecs
        },
        keepAlive () {
          var timeout = 1000
          if (this.socket.readyState === WebSocket.OPEN) {
            this.$store.commit('PING', true)
            this.socket.send('ping')
          }
          this.timeId = setTimeout(this.keepAlive, timeout)
        },
        cancelKeepAlive () {
          if (this.timeId) {
            clearTimeout(this.timeId)
          }
        },
        open: function () {
          console.log('socket连接成功')
          this.$store.commit('PING', true)
          this.$global.setWs(this.socket)
          JSON.parse(localStorage.getItem('zpl')).forEach((item, i) => {
            this.socket.send(item)
          })
          localStorage.setItem('zpl', '')
          this.keepAlive()
        },
        error: function () {
          console.log('连接错误')
        },
        getMessage: function (msg) {
        },
        send: function (msg) {
          this.socket.send(msg)
        },
        close: function () {
          window._VMA.$emit('PRINTER_ERROR', {
            time: 0,
            show: true,
            text: '打印机已断开连接',
            type: 'danger'
          })
          this.$store.commit('PING', false)
          console.log('socket已经关闭')
          setTimeout(() => {
            this.reInitSocket()
          }, 5000)
        }
      }
    
  • 相关阅读:
    Azure DevOps 中 Dapr项目自动部署流程实践
    使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题
    使用Dapper读取Oracle多个结果集
    .NET(C#) Dapper Oracle(ODP.NET)或SQL Server 执行多条查询(select)语句的方法代码
    C#实现Xml序列化与反序列化的方法
    在.NET 6.0中发布单个Exe文件(PublishSingleFile)
    ADC平台与低代码开发
    Wandb:模型训练最强辅助
    mac 多屏快速切换鼠标 CatchMouse(mac多屏切换鼠标)
    go的stream
  • 原文地址:https://www.cnblogs.com/yangchaojie/p/14397381.html
Copyright © 2020-2023  润新知