寻求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插件完成设备搜索与连接:
- 开启蓝牙,调用
FlutterBluetoothSerial.instance.startDiscovery()搜索周边设备,筛选出Sunmi V2 Pro的蓝牙名称(格式通常为Sunmi V2 Pro-XXXX) - 调用
FlutterBluetoothSerial.instance.requestDeviceBonding(device)发起配对,默认配对码为0000或1234(可参考设备手册) - 配对成功后,通过
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 设备端配置
- 将Sunmi V2 Pro连接到目标WiFi网络
- 进入设备设置:
设置 > 打印设置 > 局域网打印,开启该服务 - 记录设备的局域网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报错
若要使用官方云打印插件,需完成以下步骤:
- 在Sunmi开发者平台注册设备,获取设备SN码和绑定密钥
- 初始化插件时传入正确的设备标识:
import 'package:sunmi_cloud_printer/sunmi_cloud_printer.dart'; void initCloudPrinter() { SunmiCloudPrinter.init( sn: "你的设备SN码", key: "设备绑定密钥", ); }
确保设备已在云平台完成绑定,否则会触发printer not specify错误。
四、备选方案:FCM触发打印
4.1 实现逻辑
- 在Sunmi V2 Pro上部署一个常驻后台的Flutter应用,监听FCM通知
- 其他Android设备通过FCM发送携带打印数据的通知到Sunmi设备的token
- 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
相关产品推荐
相关产品推荐

