使用 Flutter 打印到 ESC/POS 时如何防止套接字超时错误

Posted

技术标签:

【中文标题】使用 Flutter 打印到 ESC/POS 时如何防止套接字超时错误【英文标题】:How to prevent socket timeout error when printing to ESC/POS with Flutter 【发布时间】:2020-04-17 10:58:14 【问题描述】:

我正在使用Flutteresc_pos_printer 1.5.0 打印到热敏收据打印机。如果打印机在线,它工作正常,但当它不在线时,我得到一个套接字超时,即使我将代码嵌套在 try / catch 块中。

通常我希望打印机将通过以太网连接,但也可以是 WiFi。

包作者推荐使用andrey-ushakov/ping_discover_network 但那个包裹在README

可用于查找打印机(例如,在端口 9100 上)和任何 本地网络中的其他设备和服务。

设备应连接到 Wi-Fi 网络。 wifi包允许 获取本地 IP 地址/网络子网。

这是错误:

错误:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常: SocketException:操作系统错误:连接超时,errno = 110

这是我的代码:

  try     

    Printer.connect('192.168.1.100', port: 9100).then( (printer) 

      printer.println('welcome',
        styles: PosStyles(
          height: PosTextSize.size2,
          width: PosTextSize.size2,
        ));

      printer.cut();
      printer.disconnect();
      
    );
        
    catch (e)     
      print(e);
      // do stuff
      
  

【问题讨论】:

【参考方案1】:

问题是Printer.connect 方法返回一个Future,这意味着工作是异步完成的。

由于await没有暂停代码执行,因此执行完成方法并返回调用者方法,而不关心.then()中块内代码的执行。

您可以执行以下操作:

    您可以使用 Future 的 catchError 并捕获异常,而无需等待 .then() 块执行:
    Printer.connect('192.168.1.100', port: 9100).then( (printer) 
      printer.println('welcome',
        styles: PosStyles(
          height: PosTextSize.size2,
          width: PosTextSize.size2,
        ));

      printer.cut();
      printer.disconnect();
      
    ).catchError((e) 
      //handle the exception the way you want, like following
      print('Caught error when processing: $e');
    );
    保持 try catch 不变,只需为方法调用添加 await

try
   final printer = await Printer.connect('192.168.1.100', port: 9100);
   printer.println('welcome',
        styles: PosStyles(
          height: PosTextSize.size2,
          width: PosTextSize.size2,
   ));

   printer.cut();
   printer.disconnect();
   catch (e)     
      print(e);
      // do stuff
    

基于 Future 的错误处理来源:https://dart.dev/guides/libraries/futures-error-handling

如果您有任何疑问,请告诉我。

【讨论】:

使用 1. 上面我得到 'E/flutter (9624): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理异常:NoSuchMethodError: Class 'SocketException' has no instance吸气剂'错误'。 E/flutter(9624):接收者:'SocketException'实例 E/flutter(9624):尝试调用:错误 这只是一个示例代码,您可以做任何您想要处理的异常。让我更新答案以消除任何混乱。

以上是关于使用 Flutter 打印到 ESC/POS 时如何防止套接字超时错误的主要内容,如果未能解决你的问题,请参考以下文章

C# ESC/POS 打印越南语

如何定义 ESC/POS 中参数的长度?

求助关于Qt5打印使用ESC/POS指令集,一直没弄明白,求示例

ESC/POS 热敏打印机 UTF-8 字符集设置

在 ESC/POS 命令中选择字符代码表

在 android 上如何使用支持 ESC/POS 命令集的 USB 打印机?