Step.2 印刷データの送信 : 標準機能
Step1で生成した印刷データをプリンターに送信して印刷を行います。
以下の手順を参考に印刷データを送信してください。
ページ下部にサンプルコードがあります。
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() } }
6プリンターに印刷データを送信するため、printメソッドを呼び出します。
try await printer.print(command: command)
7StarIO10Errorの値によりエラーを判別し、エラー時の処理を実装します。
発生する可能性のあるエラーはStarPrinterクラスのopenメソッド、printメソッドのAPIリファレンスに記載されています。
} catch StarIO10Error.notFound(message: let message, errorCode: let errorCode) { // Printer not found. // This may be due to the printer not being turned on or incorrect connection information. } catch let error { print("Error: \(error)") } }
Memo
-
インターフェイス自動切り替え機能が動作している場合、プリンターへの接続に失敗したときのエラーはStarIO10Error.communicationに集約されます。
またその際、autoSwitchInterfaceOpenErrorsプロパティ(オプショナル)に値がセットされます。その値を確認することで、インターフェイス自動切り替え機能で各インターフェイスの接続試行が失敗した原因を取得することができます。 詳しくはこちらを参照してください。 -
errorCode値から、より詳細なエラー要因が取得できる場合があります。
こちらで、printメソッドで発生したエラーの例を用いて詳細を説明しています。
サンプルコード
func print() {
let starConnectionSettings = StarConnectionSettings(interfaceType: .lan,
identifier: “00:11:62:00:00:01”)
let printer = StarPrinter(starConnectionSettings)
// Set the print data created in Step 1 to the command variable.
let commands = …
Task {
do {
try await printer.open()
} catch StarIO10Error.communication(message: let message, errorCode: let errorCode) {
// If Auto Switch Interface feature is working, the autoSwitchInterfaceOpenErrors property
// is set to a value indicating errors of each interface.
if let openErrors = printer.errorDetail.autoSwitchInterfaceOpenErrors {
confirmAutoSwitchInterfaceOpenErrors(openErrors)
}
return
} catch let error {
print(error)
return
}
do {
defer {
Task {
await printer.close()
}
}
try await printer.print(command: commands)
} catch StarIO10Error.unprintable(message: let message, errorCode: let errorCode, status: let status) {
// If an error occurs and the print process fails, the StarIO10Error.unprintable is thrown.
// More detailed error information may be obtained with the errorCode property.
switch errorCode {
case .deviceHasError:
// An error (e.g. paper empty or cover open) has occurred in the printer.
// Please retry after resolving the printer error.
print("An error (e.g. paper empty or cover open) has occurred in the printer.")
case .printerHoldingPaper:
// The printer is holding paper.
// Remove the pre-printed paper and printing will begin.
print("The printer is holding paper.")
default:
// Other errors occurred.
print("Other errors occurred.")
}
} catch let error {
// Catch other exceptions.
}
}
}
// Confirm the error that occurred when opening the printer with the Auto Switch Interface feature worked.
func confirmAutoSwitchInterfaceOpenErrors(_ openErrors: Dictionary<InterfaceType, StarIO10Error?>) {
if let lanError = openErrors[.lan],
let lanError = lanError {
switch lanError {
case .illegalDeviceState(message: let message, errorCode: let errorCode):
// The network function of the host device cannot be used.
// Make sure that the host device's Wi-Fi is on and
// is connected to the network.
print("illegalDeviceStat Error: \(lanError)")
case .notFound(message: let message, errorCode: let errorCode):
// Printer is not found.
// Make sure that the printer is connected to the network.
print("notFound Error: \(lanError)")
default:
// Other errors occurred.
print("Other Error: \(lanError)")
}
}
if let bluetoothError = openErrors[.bluetooth],
let bluetoothError = bluetoothError {
switch bluetoothError {
case .illegalDeviceState(message: let message, errorCode: let errorCode):
// The Bluetooth function of the host device cannot be used.
// Make sure that the host device's Bluetooth is on.
print("illegalDeviceState Error: \(bluetoothError)")
case .notFound(message: let message, errorCode: let errorCode):
// Printer is not found.
// Make sure that the printer is paired and connected with the host device.
print("notFound Error: \(bluetoothError)")
default:
// Other errors occurred.
print("Other Error: \(bluetoothError)")
}
}
if let usbError = openErrors[.usb],
let usbError = usbError {
switch usbError {
case .notFound(message: let message, errorCode: let errorCode):
// Printer is not found.
// Make sure that the host device and printer are connected with a USB cable.
print("notFound Error: \(usbError)")
default:
// Other errors occurred.
print("Other Error: \(usbError)")
}
}
// openErrors[InterfaceType.bluetoothLE] is always nil, because there is
// no Auto Switch Interface feature enabled model that supports bluetoothLE InterfaceType.
}
インターフェイス自動切り替え機能動作時の失敗原因取得方法
autoSwitchInterfaceOpenErrorsプロパティは InterfaceType をキー、StarIO10Error? を値とする辞書です。インターフェイス自動切り替え機能動作時の各インターフェイスでの接続試行が失敗したときの例外が格納されています。値がnilの場合、そのインターフェイスをプリンターが持っていないか、そのインターフェイスでの接続試行は実行されなかったことを示します。例えば、LANインターフェイスでの接続失敗原因は下記のように判別できます。
- StarIO10Error.illegalDeviceState : ホスト端末のネットワーク機能が利用できません。ホスト端末のWi-Fiがオンであること、ネットワークに接続されていることを確認してください。
- StarIO10Error.notFound : プリンターが見つかりません。プリンターがネットワークに接続されていることを確認してください。
if let lanError = openErrors[.lan], let lanError = lanError { switch lanError { case .illegalDeviceState(message: let message, errorCode: let errorCode): // The network function of the host device cannot be used. // Make sure that the host device's Wi-Fi is on and // is connected to the network. print("illegalDeviceStat Error: \(lanError)") case .notFound(message: let message, errorCode: let errorCode): // Printer is not found. // Make sure that the printer is connected to the network. print("notFound Error: \(lanError)") default: // Other errors occurred. print("Other Error: \(lanError)") } }
失敗原因の取得処理全体は、サンプルコードのconfirmAutoSwitchInterfaceOpenErrorsメソッドを参照してください。
StarIO10ErrorCodeによるエラー詳細情報取得方法
errorCode値から、より詳細なエラー要因が取得できる場合があります。例えば、printメソッドで印刷処理に失敗した場合、StarIO10Error.unprintableがスローされます。その際errorCode値を参照して、エラー要因ごとに下記のように対処できます。
- deviceHasError : プリンターが用紙無しやカバーオープンなどのエラー状態になっています。エラー状態を解消した後、印刷を再試行します。
- printerHoldingPaper : プリンターが用紙を保持しています。前に印刷した用紙を取り除くと、印刷が始まります。
} catch StarIO10Error.unprintable(message: let message, errorCode: let errorCode, status: let status) { // If an error occurs and the print process fails, the StarIO10Error.unprintable is thrown. // More detailed error information may be obtained with the errorCode property. switch errorCode { case .deviceHasError: // An error (e.g. paper empty or cover open) has occurred in the printer. // Please retry after resolving the printer error. print("An error (e.g. paper empty or cover open) has occurred in the printer.") case .printerHoldingPaper: // The printer is holding paper. // Remove the pre-printed paper and printing will begin. print("The printer is holding paper.") default: // Other errors occurred. print("Other errors occurred.") } } catch let error { // Catch other exceptions. }
以下の手順を参考に印刷データを送信してください。
ページ下部にサンプルコードがあります。
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 = …
4プリンターに接続するためopenAsyncメソッドを呼び出します。
printer.openAsync().await()
5プリンターに印刷データを送信するためprintAsyncメソッドを呼び出します。
printer.printAsync(commands).await()
6エラーの型によりエラー要因を判別し、エラー時の処理を実装します。
発生する可能性のあるエラーはStarPrinterクラスのopenAsyncメソッド、printAsyncメソッドのAPIリファレンスに記載されています。
} catch (e: StarIO10NotFoundException) { // Printer not found. // This may be due to the printer not being turned on or incorrect connection information. } catch (e: Exception) { Log.d("Printing", "Error: ${e}")
Memo
-
インターフェイス自動切り替え機能が動作している場合、プリンターへの接続に失敗したときのエラーはStarIO10CommunicationExceptionに集約されます。
またその際、autoSwitchInterfaceOpenErrorsプロパティ(オプショナル)に値がセットされます。その値を確認することで、インターフェイス自動切り替え機能で各インターフェイスの接続試行が失敗した原因を取得することができます。 詳しくはこちらを参照してください。 -
errorCodeプロパティから、より詳細なエラー要因が取得できる場合があります。
こちらで、printAsyncメソッドで発生したエラーの例を用いて詳細を説明しています。
7プリンターとの接続を切断するためcloseAsyncメソッドを呼び出します。
} finally { printer.closeAsync().await() } }
サンプルコード
fun print() {
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)
// Set the print data created in Step 1 to the commands variable.
val commands = …
scope.launch {
try {
printer.openAsync().await()
} catch (e: StarIO10CommunicationException) {
// If Auto Switch Interface feature is working, the autoSwitchInterfaceOpenErrors property
// is set to a value indicating errors of each interface.
printer.errorDetail.autoSwitchInterfaceOpenErrors?.let { it ->
confirmAutoSwitchInterfaceOpenErrors(it)
}
return@launch
} catch (e: Exception) {
// Catch other exceptions.
return@launch
}
try {
printer.printAsync(commands).await()
} catch (e: StarIO10UnprintableException) {
// If an error occurs and the print process fails, the StarIO10UnprintableException is thrown.
// More detailed error information may be obtained with the errorCode property.
when (e.errorCode) {
StarIO10ErrorCode.DeviceHasError -> {
// An error (e.g. paper empty or cover open) has occurred in the printer.
// Please retry after resolving the printer error.
}
StarIO10ErrorCode.PrinterHoldingPaper -> {
// The printer is holding paper.
// Remove the pre-printed paper and printing will begin.
}
else -> {
// Other errors occurred.
}
}
} catch (e: Exception) {
// Catch other exceptions.
} finally {
printer.closeAsync().await()
}
}
}
// Confirm the error that occurred when opening the printer with the Auto Switch Interface feature worked.
fun confirmAutoSwitchInterfaceOpenErrors(openErrors: Map<InterfaceType, StarIO10Exception?>) {
openErrors[InterfaceType.Lan]?.let {
when (it) {
is StarIO10IllegalHostDeviceStateException -> {
// The network function of the host device cannot be used.
// Make sure that the host device's Wi-Fi is on and
// is connected to the network.
}
is StarIO10NotFoundException -> {
// Printer is not found.
// Make sure that the printer is connected to the network.
}
else -> {
// Other errors occurred.
}
}
}
openErrors[InterfaceType.Bluetooth]?.let {
when (it) {
is StarIO10IllegalHostDeviceStateException -> {
// The Bluetooth function of the host device cannot be used.
// Make sure that the host device's Bluetooth is on.
}
is StarIO10NotFoundException -> {
// Printer is not found.
// Make sure that the printer is paired with the host device.
}
else -> {
// Other errors occurred.
}
}
}
openErrors[InterfaceType.Usb]?.let {
when (it) {
is StarIO10NotFoundException -> {
// Printer is not found.
// Make sure that the host device and printer are connected with a USB cable.
}
else -> {
// Other errors occurred.
}
}
}
// openErrors[InterfaceType.BluetoothLE] is always null, because there is
// no Auto Switch Interface feature enabled model that supports BluetoothLE InterfaceType.
}
インターフェイス自動切り替え機能動作時の失敗原因取得方法
autoSwitchInterfaceOpenErrorsプロパティは InterfaceType をキー、StarIO10Exception? を値とする辞書です。インターフェイス自動切り替え機能動作時の各インターフェイスでの接続試行が失敗したときの例外が格納されています。値がnullの場合、そのインターフェイスをプリンターが持っていないか、そのインターフェイスでの接続試行は実行されなかったことを示します。例えば、LANインターフェイスでの接続失敗原因は下記のように判別できます。
- StarIO10IllegalHostDeviceStateException : ホスト端末のネットワーク機能が利用できません。ホスト端末のWi-Fiがオンであること、ネットワークに接続されていることを確認してください。
- StarIO10NotFoundException : プリンターが見つかりません。プリンターがネットワークに接続されていることを確認してください。
openErrors[InterfaceType.Lan]?.let { when (it) { is StarIO10IllegalHostDeviceStateException -> { // The network function of the host device cannot be used. // Make sure that the host device's Wi-Fi is on and // is connected to the network. } is StarIO10NotFoundException -> { // Printer is not found. // Make sure that the printer is connected to the network. } else -> { // Other errors occurred. } } }
失敗原因の取得処理全体は、サンプルコードのconfirmAutoSwitchInterfaceOpenErrorsメソッドを参照してください。
StarIO10ErrorCodeによるエラー詳細情報取得方法
errorCodeプロパティから、より詳細なエラー要因が取得できる場合があります。例えば、printAsyncメソッドで印刷処理に失敗した場合、StarIO10UnprintableExceptionがスローされます。その際errorCodeプロパティを参照して、エラー要因ごとに下記のように対処できます。
- DeviceHasError : プリンターが用紙無しやカバーオープンなどのエラー状態になっています。エラー状態を解消した後、印刷を再試行します。
- PrinterHoldingPaper : プリンターが用紙を保持しています。前に印刷した用紙を取り除くと、印刷が始まります。
} catch (e: StarIO10UnprintableException) { // If an error occurs and the print process fails, the StarIO10UnprintableException is thrown. // More detailed error information may be obtained with the errorCode property. when (e.errorCode) { StarIO10ErrorCode.DeviceHasError -> { // An error (e.g. paper empty or cover open) has occurred in the printer. // Please retry after resolving the printer error. } StarIO10ErrorCode.PrinterHoldingPaper -> { // The printer is holding paper. // Remove the pre-printed paper and printing will begin. } else -> { // Other errors occurred. } } } catch (e: Exception) { // Catch other exceptions. }