You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求Sunmi V2 Pro与其他Android设备绑定打印的Flutter实现指南

跨Android设备连接Sunmi V2 Pro实现打印指南

一、先明确Sunmi V2 Pro的打印支持能力

  • Sunmi V2 Pro支持蓝牙从机连接打印和局域网打印,并非只能本地调用打印。你遇到的sunmi_cloud_printer报printer not specify是因为未完成设备云绑定配置,sunmi_printer_plus本身就是针对Sunmi设备本地打印的插件,不适配跨设备调用。

二、蓝牙连接打印方案(Flutter 3.0.5实现)

2.1 权限配置

在android/app/src/main/AndroidManifest.xml中添加蓝牙相关权限:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Android 12+ 新增权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

注意:Android 6+需要动态申请位置、蓝牙扫描/连接权限。

2.2 蓝牙搜索与配对

使用flutter_bluetooth_serial插件完成设备搜索与连接:

  1. 开启蓝牙,调用FlutterBluetoothSerial.instance.startDiscovery()搜索周边设备,筛选出Sunmi V2 Pro的蓝牙名称(格式通常为Sunmi V2 Pro-XXXX)
  2. 调用FlutterBluetoothSerial.instance.requestDeviceBonding(device)发起配对,默认配对码为0000或1234(可参考设备手册)
  3. 配对成功后,通过BluetoothConnection.toAddress(device.address)建立RFCOMM连接,打印服务默认端口为1

2.3 发送打印指令

连接建立后,直接向蓝牙套接字发送ESC/POS标准打印指令:

import 'package:flutter_bluetooth_serial/flutter_bluetooth_serial.dart';
import 'dart:typed_data';

BluetoothConnection? _printerConnection;

// 发送打印任务
void sendPrintTask() async {
  if (_printerConnection != null && _printerConnection!.isConnected) {
    // 构造ESC/POS打印指令
    final List<int> printBytes = [
      0x1B, 0x40, // 初始化打印机
      ..."跨蓝牙打印测试\n".codeUnits,
      0x1B, 0x64, 0x02, // 走纸2行
      0x1D, 0x56, 0x41, 0x00 // 全切纸
    ];
    _printerConnection!.output.add(Uint8List.fromList(printBytes));
    await _printerConnection!.output.allSent;
  }
}

三、无线局域网(WiFi)打印方案

3.1 设备端配置

  1. 将Sunmi V2 Pro连接到目标WiFi网络
  2. 进入设备设置:设置 > 打印设置 > 局域网打印,开启该服务
  3. 记录设备的局域网IP地址和打印端口(默认端口为9100)

3.2 Flutter端TCP打印实现

使用Dart原生socket库建立TCP连接,发送ESC/POS指令:

import 'dart:io';

Socket? _tcpSocket;

// 连接打印机并发送打印内容
void connectAndPrint(String printerIp, int port) async {
  try {
    _tcpSocket = await Socket.connect(printerIp, port, timeout: const Duration(seconds: 5));
    // 构造打印指令
    final List<int> printBytes = [
      0x1B, 0x40,
      ..."局域网打印测试\n".codeUnits,
      0x1B, 0x64, 0x03,
      0x1D, 0x56, 0x41, 0x00
    ];
    _tcpSocket!.add(Uint8List.fromList(printBytes));
    await _tcpSocket!.flush();
    _tcpSocket!.close();
  } catch (e) {
    print("局域网打印连接失败: $e");
  }
}

3.3 修复sunmi_cloud_printer报错

若要使用官方云打印插件,需完成以下步骤:

  1. 在Sunmi开发者平台注册设备,获取设备SN码和绑定密钥
  2. 初始化插件时传入正确的设备标识:
import 'package:sunmi_cloud_printer/sunmi_cloud_printer.dart';

void initCloudPrinter() {
  SunmiCloudPrinter.init(
    sn: "你的设备SN码",
    key: "设备绑定密钥",
  );
}

确保设备已在云平台完成绑定,否则会触发printer not specify错误。

四、备选方案:FCM触发打印

4.1 实现逻辑

  1. 在Sunmi V2 Pro上部署一个常驻后台的Flutter应用,监听FCM通知
  2. 其他Android设备通过FCM发送携带打印数据的通知到Sunmi设备的token
  3. Sunmi设备收到通知后,调用本地sunmi_printer_plus插件执行打印

4.2 核心代码

  • Sunmi设备端监听FCM:
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:sunmi_printer_plus/sunmi_printer_plus.dart';

void setupFCMListener() {
  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    if (message.data.containsKey('print_content')) {
      final String content = message.data['print_content'];
      // 调用本地打印API
      SunmiPrinterPlus.printText(content);
      SunmiPrinterPlus.lineWrap(2);
      SunmiPrinterPlus.cutPaper();
    }
  });
}
  • 其他设备通过Firebase Admin SDK或HTTP API发送FCM通知,携带打印内容到目标设备的token。

五、注意事项

  • 蓝牙方案需适配Android版本权限差异,Android 12+必须动态申请BLUETOOTH_SCAN和BLUETOOTH_CONNECT权限
  • 局域网打印需确保设备在同一WiFi网络,建议给Sunmi V2 Pro设置静态IP避免地址变动
  • FCM方案需保证Sunmi设备后台进程不被系统查杀,可通过前台服务提升进程优先级

内容的提问来源于stack exchange,提问作者yogithesymbian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:54:55