Trouble programmatically getting the firmware and hardware versions (link-os)

I have an iOS app which implements Link-OS for receipt printing to the iMZ220 bluetooth printer.


Occasionally a couple of our customers complain about receipts printing multiple copies (not at the end of a roll).  One of the troubleshooting steps that could really help me (I think) is being able to correlate details, like firmware version, and possibly hardware version.


Looking through Link-OS, I couldn't find a way to get the firmware version and the hardware version.


I *am* able to provide a way for the user to print a configuration label as follows:


    var serialNumber: String?

    if let connectedPrinter = EAAccessoryManager.shared().connectedAccessories.first(where:{$0.protocolStrings.contains(where: {$0 == "com.zebra.rawport"})}){

      serialNumber = connectedPrinter.serialNumber .utility).async(execute: {

          let zebraConnection = MfiBtPrinterConnection(serialNumber: serialNumber)



            let zebraPrinter = try ZebraPrinterFactory.getInstance(zebraConnection)

            try zebraPrinter.getToolsUtil().printConfigurationLabel()

          } catch{

            DDLogVerbose("Couldn't get the zebraPrinter instance or the printConfigurationLabel failed")






which spits out some useful info, but I want to programmatically log those versions, not require the end user to print the configuration label and then somehow send it to me (via email, mms or some such).


So I resorted to using iOS's EAAccessory.  This does not appear to be accurate for firmareRevision and harwareRevision.


    let connectedPrinter = EAAccessoryManager.shared().connectedAccessories.first(where:{$0.protocolStrings.contains(where: {$0 == "com.zebra.rawport"})}){


In Xcode's debug console, I print the connectedPrinter object:


po connectedPrinter


<EAAccessory: 0x174007950> {



  name: XXXXJ154601825

  manufacturer: Zebra Technologies

  modelNumber: iMZ220

  serialNumber: XXXXJ154601825

  firmwareRevision: 0.0.1

  hardwareRevision: 0.0.1

  dockType: (null)

protocols: (




As you can see, some of the info is very helpful to me: name, manufacturer, modelNumber, and serialNumber.  But the firmwareRevison and hardwareRevision are useless.


The printed configuration label shows me:


V73.19.13Z <- FIRMWARE

6.5.0 4.8 HARDWARE ID


Not actually sure if the hardware id is all that helpful, but the firmware definitely would be.


Any recommendations?




Anonymous (not verified)
Hi Del, This is where the SGD

Hi Del,

This is where the SGD class comes in.  It is the primary way to work with settings and printer configuration.  The two "settings" you are looking for are "" for firmware, "device.product_name" for model, and  "device.unique_id" for serial number.

BOOL success = [zebraPrinterConnection open];

NSError *error = nil;

id<ZebraPrinter,NSObject> printer = [ZebraPrinterFactory getInstance:zebraPrinterConnection error:&error];

NSString *firmware = [SGD GET:"" withPrinterConnection:zebraPrinterConnection error:&error];

NSLog(@"The Firmware version is: %", firmware);

[zebraPrinterConnection close];

if (error != nil || printer == nil || success == NO)


    UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];

    [errorAlert show]; [errorAlert release];


[zebraPrinterConnection release];

Vote up!
Vote down!

Points: 0

You voted ‘up’

Log in to post comments