Flutter如何实现iOS串口通信

在Flutter中如何实现与iOS设备的串口通信?我需要在iOS平台上通过蓝牙或USB与外部硬件进行数据交互,但找不到合适的插件或方法。官方提供的flutter_libserialport好像主要支持Android,是否有适用于iOS的替代方案?或者需要编写原生代码通过Platform Channel实现?求推荐可靠的库或具体实现方案。

2 回复

Flutter本身不支持直接串口通信,但可通过平台通道调用原生代码实现。在iOS端使用Swift/OC的SerialPort库,通过MethodChannel与Flutter通信。需在Xcode中配置串口权限。

更多关于Flutter如何实现iOS串口通信的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中实现 iOS 串口通信,由于 iOS 系统限制,无法直接通过 Flutter 访问串口硬件,但可以通过以下方法实现:

实现方案

  1. 使用 Platform Channels:通过 Flutter 调用原生 iOS 代码(Swift/Objective-C)处理串口通信。
  2. iOS 原生库:使用 iOS 的 ORSSerialPort 等库实现串口功能。

步骤

  1. 创建 Flutter 插件或使用 Platform Channel

    • 在 Flutter 中定义 Method Channel 调用原生代码。
    • 在 iOS 端编写 Swift 代码,集成串口库(如 ORSSerialPort)。
  2. iOS 端配置

    • 添加 ORSSerialPort 依赖(通过 CocoaPods)。
    • 实现串口打开、读写和关闭功能。

示例代码

Flutter 端(Dart)

import 'package:flutter/services.dart';

class SerialPort {
  static const MethodChannel _channel = MethodChannel('serial_port');

  // 打开串口
  static Future<bool> openPort(String portName, int baudRate) async {
    return await _channel.invokeMethod('openPort', {
      'portName': portName,
      'baudRate': baudRate,
    });
  }

  // 发送数据
  static Future<void> sendData(List<int> data) async {
    await _channel.invokeMethod('sendData', {'data': data});
  }

  // 接收数据(通过 Stream 监听)
  static Stream<List<int>>? onDataReceived() {
    const EventChannel eventChannel = EventChannel('serial_port_events');
    return eventChannel.receiveBroadcastStream().map((data) => List<int>.from(data));
  }
}

iOS 端(Swift)

  1. Podfile 添加依赖

    pod 'ORSSerialPort'
    
  2. Swift 实现

    import ORSSerial
    
    public class SerialPortHandler: NSObject, ORSSerialPortDelegate {
        private var serialPort: ORSSerialPort?
        private var eventSink: FlutterEventSink?
    
        // 打开串口
        func openPort(portName: String, baudRate: Int) -> Bool {
            serialPort = ORSSerialPort(path: portName)
            serialPort?.baudRate = NSNumber(value: baudRate)
            serialPort?.delegate = self
            serialPort?.open()
            return serialPort?.isOpen ?? false
        }
    
        // 发送数据
        func sendData(data: [UInt8]) {
            let dataToSend = Data(bytes: data, count: data.count)
            serialPort?.send(dataToSend)
        }
    
        // 接收数据
        public func serialPort(_ serialPort: ORSSerialPort, didReceive data: Data) {
            let receivedData = [UInt8](data)
            eventSink?(receivedData) // 通过 EventChannel 发送到 Flutter
        }
    }
    
  3. Platform Channel 绑定(在 AppDelegate.swift 或插件中注册):

    public class SwiftSerialPortPlugin: NSObject, FlutterPlugin {
        let handler = SerialPortHandler()
    
        public static func register(with registrar: FlutterPluginRegistrar) {
            let channel = FlutterMethodChannel(name: "serial_port", binaryMessenger: registrar.messenger())
            let instance = SwiftSerialPortPlugin()
            registrar.addMethodCallDelegate(instance, channel: channel)
    
            let eventChannel = FlutterEventChannel(name: "serial_port_events", binaryMessenger: registrar.messenger())
            eventChannel.setStreamHandler(instance)
        }
    
        public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
            switch call.method {
            case "openPort":
                let args = call.arguments as! [String: Any]
                let success = handler.openPort(portName: args["portName"] as! String, baudRate: args["baudRate"] as! Int)
                result(success)
            case "sendData":
                let args = call.arguments as! [String: Any]
                handler.sendData(data: args["data"] as! [UInt8])
                result(nil)
            default:
                result(FlutterMethodNotImplemented)
            }
        }
    }
    

注意事项

  • 权限:iOS 应用需在 Info.plist 中声明串口使用(如有必要)。
  • 硬件兼容性:确保外接串口设备通过 MFi 认证或使用 Lightning 转串口适配器。
  • 测试:在真实 iOS 设备上测试,模拟器不支持串口。

通过以上方法,即可在 Flutter 中实现 iOS 串口通信功能。

回到顶部