StarXpand SDK for iOS / Android 開発者向けマニュアル Ver. 1.7.0

最終更新日: 2024年 6月 24日

Step.2印刷データの送信 : スプーラー機能

スプーラー機能は、上位端末からの印刷要求をプリンターが常に受付可能とし、受付順に印刷処理を行う機能です。
プリンターは1つの印刷要求をジョブとして管理します。

※ 従来の方法では、印刷完了前に印刷要求をしようとすると、要求の送信が待たされたり、通信エラーとなったりして、前の印刷が完了するまで、新たな印刷要求を受け付けることが出来ませんでした。

手順や参照先がOSによって異なります。 表示するOSを選択してください。

iOS Android


スプーラー機能の便利な4大機能

1. 印刷完了前に複数印刷データを送信できる

プリンターが上位端末からの印刷ジョブを貯めておき、受け付けた順番に印刷できます。 MCL32CI/MCL32CBIに対して、用紙保持センサーが用紙を検知している状態でも印刷ジョブを送信することができます。

2. 複数端末から利用できる

複数の上位端末から印刷要求を行っても通信エラーにならず、印刷要求を受け付けられます。

3. 自動再印刷

紙無しなどのエラーで印刷失敗した場合でも、エラー復帰(紙無しの場合は用紙交換)をすると自動で再印刷を行うことができます。

4. 印刷ジョブのステータス・履歴をいつでも参照できる

印刷成功・失敗や、印刷の受付状況を確認できます。
また最新2000件のジョブ情報を確認できます。

Note:
複数のホストデバイス/インターフェイスを同時に接続して利用する場合、いくつかの制限事項があります。
詳しくはマルチインターフェイスご利用時の注意をご確認ください。



スプーラー機能を利用するには

スプーラー機能を利用するには、プリンター本体のスプーラー機能を有効に設定してください。(デフォルト:無効)

また、印刷データの送信: 標準機能で印刷データの送信に使用したprint(commad: string)メソッドの代わりに、 印刷ジョブ設定を含む print (command: string, jobSettings: StarSpoolJobSettings)メソッドを使用してください。
その他、印刷ジョブのステータスを確認する機能も用意されています。 スプーラー機能を利用した印刷処理の実装を参考にしてください。



スプーラー機能対応モデル

print(command: string, jobSettings: StarSpoolJobSettings)メソッドを使用できるモデルがスプーラー機能に対応しています。
対象モデルはリンク先にてご確認ください。

スプーラー機能を利用するには

スプーラー機能を利用するには、プリンター本体のスプーラー機能を有効に設定してください。(デフォルト:無効)

また、印刷データの送信: 標準機能で印刷データの送信に使用した printAsync(command: String)メソッドの代わりに、 印刷ジョブ設定を含むprintAsync(command: String, starSpoolJobSettings: StarSpoolJobSettings)メソッドを使用してください。
その他、印刷ジョブのステータスを確認する機能も用意されています。 スプーラー機能を利用した印刷処理の実装を参考にしてください。



スプーラー機能対応モデル

printAsync(command: String, jobSettings: StarSpoolJobSettings)メソッドを使用できるモデルがスプーラー機能に対応しています。
対象モデルはリンク先にてご確認ください。

スプーラー機能を利用した印刷処理の実装

Step1で作った印刷データをプリンターに送信して印刷を行います。
StarPrinterクラスを利用し、スプーラー機能を利用するためにprint(command: string, jobSettings: StarSpoolJobSetttings)メソッドを呼び出して印刷データの送信を行います。

以下はサンプルコードの説明です。この手順を参考に、印刷データを送信してください。
ページ下部にサンプルコードがあります。また、SDKのサンプルアプリも参考にしてください。

1プリンターの接続先情報を作ります。
通信に使用するinterfaceTypeと、接続先を指定するidentifierをセットしてください。
プリンターを検索するで接続先のプリンターを検索済みの場合、この実装は不要です。
手順2のprinter変数にはmanager(_ manager: StarDeviceDiscoveryManager, didFind printer: StarPrinter)メソッドで取得したStarPrinterインスタンスをセットしてください。

let starConnectionSettings = StarConnectionSettings(interfaceType: .lan,
                                                            identifier: “00:11:62:00:00:01”)

2プリンターの接続先情報を与えてStarPrinterインスタンスを取得します。

let printer = StarPrinter(starConnectionSettings)

3Step1で作った印刷データをcommands変数にセットします。

Task {
    do {
        let command = …

4プリンターに接続するためopenメソッドを呼び出します。

try await printer.open()

5印刷データの送信を行った後にプリンターとの接続を切断するためdeferブロックでcloseメソッドを呼び出します。

defer {
    Task {
        await printer.close()
    }
}

6StarSpoolJobSettingsクラスにより、印刷ジョブの設定を行います。
以下の例では、プリンターエラー時のリトライ有効、印刷ジョブのタイムアウト30秒、印刷ジョブに付加する補足情報を”Print from iOS”に設定しています。

let jobSettings = StarSpoolJobSettings(isRetryEnabled: true, timeout: 30, note: "Print from iOS")

7プリンターに印刷データを送信するためprintメソッドを呼び出します。
戻り値でジョブ ID を取得します。

let jobId = try await printer.print(command: command, starSpoolJobSettings: jobSettings)

8印刷ジョブのステータスを下記2通りの方法で確認できます。
getSpoolJobStatusメソッドを呼び出し、指定したジョブIDのステータスを取得します。

let jobStatus = try await printer.getSpoolJobStatus(jobId: jobId)

getSpoolJobStatusListメソッドを呼び出し、新しく受付した順に指定した数のジョブステータスのリストを取得します。
引数に10を与えた場合、最新から10件のジョブステータスのリストを取得します。

let jobStatusList = try await printer.getSpoolJobStatusList(size: 10)

9エラー時の処理を実装します。errorインスタンスの型によりエラーを判別できます。
発生する可能性のあるエラーはStarPrinterクラスのopenメソッド、 printメソッド、getSpoolJobStatusメソッド、 getSpoolJobStatusListメソッドのAPIリファレンスに記載されています。

} catch StarIO10Error.unprintable(message: let message, errorCode: let errorCode) {
    if errorCode == StarIO10ErrorCode.spoolerIsDisabled {
        // The spooler function is set to disabled.
        // Please set the printer's spooler function to enable.
    }
} catch let error {
    print("Error: \(error)")
}
}
サンプルコード

let starConnectionSettings = StarConnectionSettings(interfaceType: .lan,
                                                            identifier: “00:11:62:00:00:01”)

let printer = StarPrinter(starConnectionSettings)

Task {
    do {
        // Set the print data created in Step 1 to the commands variable. 
        let command = …

        try await printer.open()
        
        defer {
            Task {
                await printer.close()
            }
        }

        let jobSettings = StarSpoolJobSettings(isRetryEnabled: true, timeout: 30, note: "Print from iOS")
                    
        let jobId = try await printer.print(command: command, starSpoolJobSettings: jobSettings)

        let jobStatus = try await printer.getSpoolJobStatus(jobId: jobId)

        // let jobStatusList = try await printer.getSpoolJobStatusList(size: 10)

    } catch StarIO10Error.unprintable(message: let message, errorCode: let errorCode) {
        if errorCode == StarIO10ErrorCode.spoolerIsDisabled {
            // The spooler function is set to disabled.
            // Please set the printer's spooler function to enable.
        }
    } catch let error {
        print("Error: \(error)")
    }
}

Step1で作った印刷データをプリンターに送信して印刷を行います。
StarPrinterクラスを利用し、スプーラー機能を利用するためにprintAsync(command: String, jobSettings: StarSpoolJobSettings)メソッドを呼び出して印刷データの送信を行います。

以下はサンプルコードの説明です。この手順を参考に、印刷データを送信してください。
ページ下部にサンプルコードがあります。また、SDKのサンプルアプリも参考にしてください。

1プリンターの接続先情報を作ります。
通信に使用するinterfaceTypeと、接続先を指定するidentifierをセットしてください。
プリンターを検索するで接続先のプリンターを検索済みの場合、この実装は不要です。
手順2のprinter変数にはonPrinterFoundメソッドで取得したStarPrinterインスタンスをセットしてください。

val settings = StarConnectionSettings(InterfaceType.Lan, “00:11:62:00:00:01”)

2プリンターの接続先情報を与えてStarPrinterインスタンスを取得します。

val printer = StarPrinter(settings, applicationContext)

3Step1で作った印刷データをcommands変数にセットします。

val job = SupervisorJob()
val scope = CoroutineScope(Dispatchers.Default + job)

scope.launch {
    try {
        val commands = …

4StarSpoolJobSettingsクラスにより、印刷ジョブの設定を行います。
以下の例では、プリンターエラー時のリトライ有効、印刷ジョブのタイムアウト30秒、印刷ジョブに付加する補足情報を”Print from Android”に設定しています。

val jobSettings = StarSpoolJobSettings(true, 30, "Print from Android")

5プリンターに接続するためopenAsyncメソッドを呼び出します。

printer.openAsync().await()

6プリンターに印刷データを送信するためprintAsyncメソッドを呼び出します。

val jobId = printer.printAsync(commands, jobSettings).await()

7印刷ジョブのステータスを下記2通りの方法で確認できます。
getSpoolJobStatusAsyncメソッドを呼び出し、指定したジョブIDのステータスを取得します。

var jobStatus = printer.getSpoolJobStatusAsync(jobId).await()

getSpoolJobStatusListAsyncメソッドを呼び出し、新しく受付した順に指定した数のジョブステータスのリストを取得します。
引数に10を与えた場合、最新から10件のジョブステータスのリストを取得します。

var jobStatusList = printer.getSpoolJobStatusListAsync(10).await()

8エラー時の処理を実装します。エラーの型によりエラー要因を判別します。
発生する可能性のあるエラーはStarPrinterクラスのopenAsyncメソッド、 printAsyncメソッド、getSpoolJobStatusAsyncメソッド、 getSpoolJobStatusListAsyncメソッドのAPIリファレンスに記載されています。

} catch (e: StarIO10UnprintableException) {
    if (e.errorCode == StarIO10ErrorCode.SpoolerIsDisabled) {
        // The spooler function is set to disabled.
        // Please set the printer's spooler function to enable.
    }
} catch (e: Exception) {
    Log.d("Printing", "Error: ${e}")

9プリンターとの接続を切断するためcloseAsyncメソッドを呼び出します。

} finally {
    printer.closeAsync().await()
}
}
サンプルコード

val settings = StarConnectionSettings(InterfaceType.Lan, “00:11:62:00:00:01”)
val printer = StarPrinter(settings, applicationContext)

val job = SupervisorJob()
val scope = CoroutineScope(Dispatchers.Default + job)

scope.launch {
    try {
        // Set the print data created in Step 1 to the commands variable. 
        val commands = …

        printer.openAsync().await()

        val jobSettings = StarSpoolJobSettings(true, 30, "Print from Android")

        val jobId = printer.printAsync(commands, jobSettings).await()

        var jobStatus = printer.getSpoolJobStatusAsync(jobId).await()

        // var jobStatusList = printer.getSpoolJobStatusListAsync(10).await()

    } catch (e: StarIO10UnprintableException) {
        if (e.errorCode == StarIO10ErrorCode.SpoolerIsDisabled) {
            // The spooler function is set to disabled.
            // Please set the printer's spooler function to enable.
        }
    } catch (e: Exception) {
        Log.d("Printing", "Error: ${e}")
    } finally {
        printer.closeAsync().await()
    }
}

スプーラー機能シーケンス図

2台の上位端末から、1台のプリンターに対して印刷要求を行なった後、全ての印刷が完了するまで印刷ジョブのステータスを確認する処理のシーケンス図です。