業務用スマホ SUNMI V2 PRO の開発準備の手引き

:::note info
本記事は [技術書典14](https://techbookfest.org/event/tbf14) で無料配布する同人誌「ゆめみ大技林 '23」の寄稿です。加筆や修正などがある場合はこの記事で行います。
:::

2022 年 12 月、SUNMI V2 というサーマルプリンターを搭載した業務用 Android スマートフォンが中古スマホ販売店で販売されました。スマートフォンに興味のある方は、その販売が話題になったことは記憶に新しいでしょう。

戻ること 2022 年の春、SUNMI V2 の前衛機にあたる SUNMI V1s がアマゾンでセールになり、一部の界隈で話題になりました。このとき、私はこのスマホの存在を知り、そして「こんな面白いスマホを個人でも簡単に買えるのか」と衝撃を受けました。

そして、同年 10 月に私はついに SUNMI V2 PRO を手に入れました。SUNMI V2 PRO は SUNMI V2 の後継機にあたり、SoC や OS がアップデートされています。このスマホを使ったアプリに興味があったので、アプリ開発に着手しました。しかし、業務用スマホということで、すぐには開発を始めることができませんでした。いろいろ調査して開発手段が分かると、通常のスマホでは体験できない開発に熱中しました。気がつけば、私は SUNMI V2 PRO を 3 台所有するほど、ハマっていました。

本記事は、SUNMI V2 PRO でアプリ開発をしたい人向けの情報をまとめました。具体的な実装例として個人開発したアプリを紹介しますが、API の使い方などの詳細な開発方法は説明しません。本記事は「開発ができるようになるまで」の悩みを解決します。

### 免責事項

本記事に記載された内容は、私が調査・収集した情報をまとめたものです。また、私は iOS アプリ開発を主に行っているので、Android アプリ開発に関する記述は不明瞭な場合があります。本記事を用いた運用は、必ず各自の責任と判断のもとで行ってください。

取り上げるスマホは業務向けで特定のサービスを対象にした OEM モデルであり、対象アプリ外の実行や開発を想定していません。また、製造時期によって、OS のバージョンやファームウェアは異なる場合があるため、記述どおりの結果にならない場合があります。

### 商標、登録商標について

本記事に記載される製品の名称は、各社の商標または登録商標です。本文中では、&trade;, &reg; などのマークは省略しています。

## SUNMI V2 PRO について

SUNMI V2 PRO は SUNMI（サンミ）が販売する業務用 Android スマートフォンの 1 つで、2018 年 9 月[^sunmi-blog] に登場しました。その特徴的な形状を構成するサーマルプリンターを搭載しているため、スマホ単体でのレシート印刷が可能で、小売店のレジ業務などに利用されています。なお、SUNMI は 2013 年に Xiaomi と Ant Financial が設立した企業です。モバイル決済端末やキオスク製品など、多くの業務向けの端末を開発しています。

[^sunmi-blog]: Sunmi. "SUNMI launches a new version of V2 PRO, with label printing and high-definition 2D scanner". Sunmi Blog. 2020-07-31. https://blog.sunmi.com/?p=895

### スペック

取扱説明書から主なスペックを次に抜粋しました。業務向けということで、エントリーモデル（ローレンジ）向けの SoC、少ないメモリ容量と最小限の構成になっています。一般的なスマホの使用用途は難しいです。また、感熱紙ロールは幅が 58 mm の市販品で問題ありません。私はコクヨの「感熱ロールペーパー領太くん用 NS-RYP1W」を利用しています。

| 項目 | 技術仕様 |
| :-- | :-- |
| OS | SUNMI OS（Android 7.1）
| CPU（SoC） | Qualcomm Snapdragon 425 Quad-core 1.4 GHz |
| ストレージ | 8 GB / 16 GB |
| メモリ | 1 GB / 2 GB |
| ディスプレイ | 5.99インチ IPS, 解像度 1440×720 |
| カメラ | 500万画素 AF |
| 通信方式 |  4G LTE（docomo, SoftBank） |
| | 802.11 a / b / g / n（2.4 GHz / 5 GHz） |
| | Bluetooth 4.2 |
| | NFC（オプション） |
| インタフェース | USB Type-C |

### モデル

SUNMI V2 PRO は業務用スマホということで、サービス提供事業者向けの OEM モデルがあります。私は次の 3 種類のモデルを所有しています。モデル名の公式名称がないたため、便宜的に事業者・サービスの名称からモデルを呼称します。

- 正規販売店モデル
- STARPAY モデル
- foodpanda モデル

モデルそれぞれは異なるスペックとなっており、簡単にまとめると次のようになります。取扱説明書には SUNMI OS 2 とありますが、端末の設定から読み取れるバージョンを記載しています。なお、同モデルでも製造時期により OS やファームウェアは異なる場合があります。

| モデル | SUNMI OS | ファームウェア | ストレージ | メモリ | NFC |
| :-- | :-- | :-- | :-- | :-- | :-- |
| 正規販売店| 3.6.23 | 754 | 16 GB | 2 GB | あり |
| STARPAY | 1.2.2 | 162 | 8 GB | 1 GB | なし |
| foodpanda | 1.0.33 | 138 | 8 GB | 1 GB | なし |

ラベル（シール）が印刷可能な Label Version もあるようですが、私は所持していないので、取り上げません。

## 開発環境を整える

開発を始めるには、実機を入手して、開発者向けオプションを設定する必要があります。シミュレーターである程度の開発はできますが、印刷は実機がないと試すことはできません。今から実機を入手するならば、私が所有している 3 モデルのどれかになるでしょう。それらのモデルを対象にして、入手方法と開発を有効にする方法を紹介します。なお、開発可能な状態は次の条件を両方満たすと定義します。

- GMS（Google Mobile Service）が有効である
- 開発者向けオプションから USB デバッグが有効になる

Amazon アプリストアや HUAWEI Mobile Service 向けの開発は取り扱いません。

### 正規販売店モデル

文字どおり、正規販売店が販売するモデルです。私はウェルコムデザインが販売するモデルを所有しています。アマゾンや楽天で新品を購入可能です。業務用端末は在庫整理でもない限り、値下げ販売されないので、気になったら即時購入した方がお得です。

このモデルは GMS が最初から有効になっています。設定の「端末の状態」の「OS バージョン」を連打すれば、開発者向けオプションが表示されます。USB デバッグを有効になっているのを確認して、PC に接続すれば準備完了です。

このモデルを開発などで触っていると、動きが何か遅いのを感じます。メモリは 2 GB で平常時のメモリ使用量が約 50 ％ほどですが、なぜか遅いです。Google Play Store でアプリをダウンロードするとき、すぐさまダウンロードされないので、何かしら処理が走っているのかと気になっています。

### STARPAY モデル

決済サービスを提供する事業者の OEM モデルです。プリンターカバーにその事業者のロゴが印刷、またはシールが貼付されています（シールが剥がれてシール跡が残っているのも見かけます）。フリマサイトやオークションサイトに出品される中古品を購入可能です。私が見る限り、流通量が多く、容易かつ安価で入手できます。

しかし、気を付けるべき点があります。あおいど[^starpay-os] さんによると、製造時期によって SUNMI OS もしくはファームウェアのビルドバージョンが異なるようです。

- 素の Android に近いモデル
- カスタマイズされたモデル

<!-- textlint-disable -->
[^starpay-os]: あおいど. "SUNMI V2 ProのPlayストア(GMS)の恒常有効化". 2022-4-14. https://note.com/ubundroid/n/n7fa8fb4a841c
<!-- textlint-enable -->

モデルによって開発を有効にする手段は異なります。
前者の場合、PC と接続して、adb コマンドで GMS を有効化すれば完了です。

```shell
% adb shell pm enable com.google.android.gms
% adb shell pm enable com.android.vending
```

この効果は一時的なため、GMS を無効化しているプロセスを無効化します。

```shell
% adb shell pm disable-user --user 0 com.sunmi.baseservice
```

一方、後者の場合は PC と接続しても `unauthorized` となり、外部から操作できません。さらに開発者向けオプションから USB デバッグを有効にするには、SUNMI の partner platform[^sunmi-partner] に登録する必要があります。これは法人でしか登録できないため、個人で有効化するのは難しいです。端末を初期化して、ネットワークに接続せず体験モードのままで apk を追加してアプリを使う方法もありますが、開発用途では不十分です。

[^sunmi-partner]: SUNMI Partners Platform.  https://partner.sunmi.com

私が所有しているのがこの後者なのですが、開発はおろか、個人でアプリを追加して遊ぶのも難しいです。ただし、決済サービスの端末であるので、ユーザーによって設定が変更できない、セキュリティが高い端末ともいえます。

前者と後者の見分けは外観からではできず、実際にスマホを操作して・PC に接続してからの判断となります。個人的な経験と勘ですが、事業者のロゴがシールではなく、印刷された場合だと、前者の可能性が高いようにみえます。ただし、印刷されていても後者だった場合も見るので、確定はできません。

### foodpanda モデル

2022 年 1 月に撤退したフードデリバリーサービスの OEM モデルです。他モデルのプリンターカバーはオレンジ色ですが、このモデルはピンク色です。ロゴのパンダと合わせて、かわいい見た目になっています。前述の STARPAY モデルと同様に、フリマサイトやオークションサイトから中古品を購入可能です。一時期は多く出品されていましたが、サービス終了から時間が経っているので、今は出品数が徐々に減っている印象です。

このモデルは専用アプリが起動しますが、再起動すると一定時間は制御プロセスが実行されません。その間のうちに「データの初期化（ファクトリーリセット）」をするだけで有効になります。私が SNS などで観測している限り、多くの方がこの方法で有効化できています。

GMS が有効化された後は、素の Android のようになります。設定の「端末の状態」の「OS バージョン」を連打すれば、開発者向けオプションが表示され、開発を始めることができます。なお、搭載されたメモリは 1 GB ですが、動作が比較的軽い印象です。ただし、メモリが少ないことは避けられないので、いくつかアプリをインストールすると遅くなります。

### 今から手に入れるには？

一番は foodpanda モデルがお勧めで、次点は正規販売店モデルです。STARPAY モデルは入手性がよいですが、開発可能・不可のモデルが混在するので、個人的にはお勧めしません。購入前に事前確認すると確実ですが、本来の使い方ではないので適切な回答を貰えるかは不明です。なお、foodpanda・STARPAY の両モデルとも、フリマサイトなどで以前ほど見かけなくなったので、気になる方は早めに確保しておくとよいです。

## 開発を始める

SUNMI が開発 SDK を公開しています。SUNMI Developer docs[^sunmi-dev] にアクセスして、左側のメニューから Documentation → Mobile Products → V2 PRO を選択します。表示されたページで、"Print and customer display description" からプリンターに関する開発情報を取得できます。また、"Description for camera code scanning" からスキャナーに関する情報が取得できますが、今回は取り扱いません。

[^sunmi-dev]: SUNMI Developer docs.  https://docs.sunmi.com/en/

### 印刷機能を作る

プリンター SDK は一般的な SDK と同様にプロジェクトの Gradle に依存関係を設定します。公式が GitHub にデモ[^sunmi-demo] を公開しているので、それを参考にするとよいです。

```gradle:build.gradle
dependencies {
  implementation "com.sunmi:printerlibrary:1.0.20"
}
```

[^sunmi-demo]: shangmisunmi/SunmiPrinterDemo.  https://github.com/shangmisunmi/SunmiPrinterDemo

印刷用のメソッドは、印刷対象の View や画像を事前に作ってメソッドに渡すのではなく、1 行ずつテキスト、画像や QR コードなどを指定します。とても簡単です。

また、一般的なレシート印刷プロトコルがあり、SUNMI V2 PRO も対応しています。しかし、私がガチなレシート印刷ソリューションに興味ないため、あまり調べていません。これについては、syumai さん[^syumai-dev] が開発情報をまとめられているので、それを参考にしてください。

<!-- textlint-disable -->
[^syumai-dev]: syumai. "SUNMI端末アプリを開発したい方向け情報まとめ". 2022-05-08. https://zenn.dev/syumai/articles/c9r4qtp1eqlgtrqf5elg
<!-- textlint-enable -->

:::note warn
上記のレシート印刷プロトコル（ESC/POSコマンド）に興味を持ったので、現在は調査中です。その内容をまとめて、執筆する予定です。
:::

### 私の実装事例

開発の準備ができたので、アプリを作りましょう。ただ、ここで大きな問題があります。私は iOS アプリを日々開発してますが、Android アプリの開発経験はあまりありません。終わった…となったところ、上記の Android SDK を React Native 向けにラッパーしたライブラリが有志により公開されていました。私は React Native でも開発しているので、さっそく React Native で作り始めました。

公開されているライブラリは多いですが、中には正しく動作しないものもあります。私は、比較的新しくて実機で動作する、かつ TypeScript をサポートしているものを基準に探しました。そして、私は、makgabri さんのライブラリ[^makgabri] を採用しました。ドキュメントが充実しており、TypeScript で型補完されるので、分からなくても何とかなります。

[^makgabri]: makgabri, "makgabri/react-native-sunmi-printer: A react native adaptation for sunmi printers". https://github.com/makgabri/react-native-sunmi-printer

開発準備はすべて揃ったということで、私は「名刺レシート印刷アプリ」を作成しました。自分の名刺レシートを印刷するアプリです。 最近はオフラインの勉強会やカンファレンスの開催が戻りつつあるので、対面でのアイスブレークとして利用しています。

![アプリで印刷した名刺レシート](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24345/0b4fffd1-69e2-70a8-09ab-6bed37498649.png "アプリで印刷した名刺レシート")

そのアプリとソースコードは GitHub で公開しています[^me-github]。SUNMI V2 PRO をお持ちであれば、 Releases に最新版の apk を用意しているので遊んでみてください。また Pull Requests は大歓迎です。アプリに関する説明は外部勉強会などで発表しましたので、そちらも参照してみてください[^me-qiita] [^me-speaker-deck]。

[^me-github]: "mitsuharu/mobile-printer: 名刺レシート印刷アプリ for Sunmi V2 Pro ". GitHub. https://github.com/mitsuharu/mobile-printer

[^me-qiita]: "SUNMI V2 PRO で名刺を印刷するスマホアプリを作った". Qiita.  2022-10-16. https://qiita.com/mitsuharu_e/items/2aeb060c6934e763b6c0

[^me-speaker-deck]: "SUNMI V2 PRO を入手した iOS アプリエンジニアが頑張る話". Speaker Deck. 2022-12-09.  https://speakerdeck.com/mitsuharu/kyotolt-20221209

## One more thing...

この記事を執筆してたところ、どうしても気になってしまい、SUNMI V2 / V2 Pro の後継機にあたる SUNMI V2s を入手しました。Android 11 のモダンなスマホです。「え!? 君のスマホはレシート印刷できないの？」といえるぐらい普通のスマホです。簡単なスペックを次にまとめました。今回はラベルシールも印刷可能です。私が入手したモデルは GMS が最初から有効なモデルなので、とくに準備は不要です。

| 項目 | 技術仕様 |
| :-- | :-- |
| OS | SUNMI OS 3.0.11（Android 11）|
| ファームウェア | 242 |
| CPU（SoC） | MediaTek MT8766B Quad-core 2.0 GHz |
| ストレージ | 3 GB |
| メモリ | 32 GB |

拙作アプリを SUNMI V2s にインストールしたところ、印刷できませんでした。では、アプリを SUNMI V2s に対応するように修正しましょう。`AndroidManifest.xml` に次のタグを追加すれば、公式の SDK を利用して印刷できます。

```xml:AndroidManifest.xml
<queries>
  <package android:name="woyou.aidlservice.jiuiv5"/>
</queries>
```

しかしながら、先に挙げたライブラリで文字修飾の印刷でクラッシュしました。そこでライブラリを Surile さんのライブラリ[^Surile] に入れ替えました。ライブラリの画像印刷の仕様が以前と異なっていたのでちょっとアプリ側を手直しが必要でしたが、結果的に印刷速度も上がったので、入れ替えてよかったです。ただし、ネイティブの例外をキャッチしない漢気な実装なのが気になります（時間があればパッチを当てながら PR を考えます）。また、Image Picker で画像取得してアプリに戻ってくる際に react-native-screens の不具合でクラッシュするという別の問題が発生してしまい、違うところで苦労しました。

<!-- textlint-disable -->
[^Surile]: Surile, "Surile/react-native-sunmi-printer: 商米内置打印机".  https://github.com/Surile/react-native-sunmi-printer
<!-- textlint-enable -->

## まとめ

本記事は、業務用スマホ SUNMI V2 PRO / V2s でアプリ開発する手段を紹介しました。スマホから印刷がしたければ、市販の Bluetooth 接続のモバイルサーマルプリンターを買えば、iPhone でも使えて便利だよという声が聞こえそうな気もします。しかし、これは浪漫です。同じく浪漫を持ってアプリ開発する人に役立てば幸いです。

最後に、この中古販売されているスマホは、事業撤退や閉店など、悲しい理由で流通しているのが含まれています。ご縁あって、このスマホを入手された方は、スマホがよいセカンドライフを迎えるようにご活用くださいませ。また、面白いアプリを作られたならば、ぜひ教えてくださいませ。

## 後書き

ある日のこと、とても興味深いニュースが目に入りました。楽天ペイがオールインワン決済端末をリリースするようです[^news-impress]。~~新しいおもちゃが供給される！~~ 同様機種がリリースされるということから、サーマルプリンター対応アプリ開発エンジニアの需要が増えますね。知らんけど。

[^news-impress]: 鈴木淳也. "新デザインの一体型決済ターミナルと“タッチ決済”で攻める「楽天ペイ」". Impress Watch. 2022-10-21. https://www.watch.impress.co.jp/docs/series/suzukij/1449307.html