部屋に転がっているルータを使ってUSBプリンタをネットワーク対応にする（OpenWrtでプリンタサーバーを建てる）

## やったこと

- USBポート付きルータ（WZR-900DHP）にOpenWrtを導入してプリンタサーバー化
- 上記プリンタサーバーにプリンタ（PIXUS iP2700）を接続して同一ネットワーク内のWindownから印刷など動作確認

## きっかけ

現在自宅では、なんと発売当時はインクより安かった激安プリンタ（PIXUS iP2700）を使っているのですが、コイツはその安さ故にUSB-A to USB-BケーブルでPCと接続する他に印刷手段がありません。（ついでにたまに起動しなくなる）

ところが新居に越してきてデスク周りの環境を整えたところ、絶望的にプリンタの設置場所とPCの設置場所が遠くなってしまいました。このためだけに長いUSBケーブルを買うのも癪だったので、仕方がなく（ネットワークプリンタ化するか...）と思い至りました。長いLANケーブルならたくさんありますからね。

軽く調べたところ、プリンタサーバー化するための小型ボードみたいなものはAmazonで3～5千円くらいあれば購入できそうです。しかしUSBケーブルをケチっている自分がそんなものに手を出すはずもなく、いっそ[前回の記事](https://qiita.com/mikansensei/items/2f36fabc142da1a72b86)でOpenWrt化した中古800円くらいのルータを用いて何かできないかな...といったところで本記事の内容を試すに至りました。

**参考記事**

https://qiita.com/mikansensei/items/2f36fabc142da1a72b86

## 使用環境

- WZR-900DHP（OpenWrt導入済み）
- PIXUS iP2700
- Windows11（印刷）

今回使っているルータの動作環境は以下の通りです。

- CPU: Broadcom BCM47081A0CPU
- Package architecture: arm_cortex-a9
- Core: 1
- CPU MHz: 800
- Flash MB: 128
- RAM MB: 256

今回はARMv7環境のルータで検証を行っています。MIPSなどでも動作するかは未検証。また、フラッシュもRAMも割と潤沢な環境で試しています。そのうち他の安価な機種でも動くか試してみたいと思っています。
当たり前ですが、USBポートが必須である点にはご注意ください。

## 手順

### 1. 転がっていたルータにOpenWrtを導入する

一番重たい手順ですが、残念ながら機種ごとに細かい手順が変わってきてしまうためここでは割愛します。私と同じ機種（WZR-900DHP）をお使いの方は[こちらの記事](https://qiita.com/mikansensei/items/2f36fabc142da1a72b86)を参考にOpenWrtをインストールしてください。

初めからOpenWrtが導入済みのルータが欲しい場合はAmazonですぐ買えるGL-iNet社の機種がおススメです。ただしこちらも安くて3000円くらいはします。（ちなみに今回使っている中古ルータと近い環境の機種だと1万円くらい）もはや新しいプリンタ買った方が安いみたいなことになる可能性もありますが、他の用途でもオモチャにする予定がある方はご検討してみてはいかがでしょうか。

もし手持ちの機種が最新版のOpenWrtに対応しているか調べたい場合、[こちらのサイト](https://firmware-selector.openwrt.org/)に型番を入力してみるのが一番手っ取り早いです。それか「[機種名] OpenWrt」で普通にググっていただくと、運が良ければドンピシャの情報がヒットする可能性もあります。

https://firmware-selector.openwrt.org/

### 2. 必要パッケージをインストール

USBポートからプリンタを扱えるようにするためのドライバと、プリンタサーバーとして振舞うためのプログラムをインストールします。ルータからのインターネットアクセス及び作業端末からLuciへのアクセスが必要となりますので、LANポートには作業用PCを、WANポートにはインターネットアクセス可能な上位ルータを接続していただくのが良いかと思います。

まずは作業PCのWebブラウザからルータのIPアドレスによりLuciへアクセスし、System->SoftwareよりUpdate lists...を押下。パッケージリストの更新が完了したら検索窓に「p910nd」と検索して出てくる2つのパッケージを両方インストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15850/ab63e5c1-7e6c-41dc-76d0-8d87661e1f4f.png)

続けて、Services->p910nd - Printer serverとアクセスします。（Servicesが表示されていない場合は画面リロードで出てきます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15850/daf5426c-8f84-0b5e-107f-9f90c1c129bd.png)

ここにkmod-lpとkmod-usb-printerの2つが表示されていますが、グレーアウトしていない方は必要なUSBドライバパッケージが未インストールであることを示しています。それらを押すことで必要な汎用USBドライバのインストール画面（System->Softwareの画面）に移動しますので、両方インストールしておきましょう。（両方のインストールが完了した後にこのボタン表示は消えます）

### 3. p910ndのセットアップ

ここまでインストールが完了したら、プリンタを起動してルータとUSBケーブルで接続し、ルータを再起動しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15850/66431549-8aea-d91e-a0d6-c596beadbc9d.png)

私の環境ではこの時点でp910ndが機種を特定しており、Luciから再びServices->p910nd - Printer serverに戻った時点で必要な情報が入力されている状態となっていました。ただしこの時点ではサーバーが有効化されていないため、EditボタンよりEnabledにチェックを付けてSave->Save & Applyより保存しておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15850/909bbc7a-7541-2d83-8228-a1d6ab5e470f.png)

自動的に入力された機種情報などはすべてmDNSの動作のために設定されているため、恐らく自動取得されなかった場合もmDNSのチェックが外れたままの状態で上の画像と同様に設定されていれば問題ないかと思います。

ただしDeviceの部分が「/dev/usb/lp*」の表示のままであった場合、プリンタのUSB接続が検出されていない可能性があります。その場合SSHでアクセスしてデバイス一覧に出力されるものがあるかどうかを確認する必要があります。

例）
```
ssh root@192.168.1.1
```

```
ls /dev/usb/lp* # <- このコマンドで何も出力されなかった場合はプリンタが検出されていない
```

### 4. ファイアウォールの設定

ここからはどのようなネットワーク構成で運用するかに依って設定が異なります。
まずは一般的な構成から。

```
インターネット
      │
   OpenWrt化
    ルータ
     │ │
┌────┘ └────┐
│           │
印刷する   プリンタ
PCなど      (USB)
(LAN)     
```

このような構成でPCをインターネットに繋げてかつプリンタへの印刷指示を行いたい場合、特にファイアウォールの設定は不要です。（LANインターフェースの通信はデフォルトで遮断されない設定となっています）ただしこの場合、OpenWrt化したルータにはプリンタサーバーとしての設定だけではなく、インターネット接続などその他通信の設定も行う必要があります。また、あらゆる通信がOpenWrt化したルータのスペックにより制限を受けます。

しっかりしたルータを買って来てOpenWrt化するような運用には適した理想的な構成ではありますが、中古のオモチャルータを買ってきて適当に運用するようなシーンにおいてはあまり向かないかなと思います。

今回みたいな場合におススメの構成は以下の通りです。

```
インターネット
      │
 本当に一般的な
    ルータ 
      │
┌─────┴─────┐
│           │
PC      ルータとしての
(LAN)    自我を捨てた
        OpenWrtルータ
           (LAN)
            │
         プリンタ
          (USB)
```

要するに今まで使っていたルータはそのままに、今回準備したOpenWrtルータをただの低スペックPCとして扱うという方法です。

この場合はWANポートに上位ルータのLANを接続してDHCP Clientとして動作させるのが一番簡単です。ただし、WANからのInputルールはACCEPTにする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15850/60e66d21-5777-1c67-63d4-5265f851e957.png)

また、OpenWrtルータ本体のローカルIPアドレスは上位ルータのDHCP払い出し状況などから確認するか、一時的にLANポートにPCを接続してNetwork->InterfacesのWANインターフェースの項から確認する必要があります。（定期的にIPアドレスが変わる可能性がありますので、できればEditからプロトコルをDHCP Client->Static addressに変更してIPアドレスを固定しておくと良いです）

![スクリーンショット 2024-08-06 042836.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15850/24b98226-c180-1e1d-64fa-7fa957721cd2.png)

ここまででルータ側の設定は完了です！

### 5. 印刷設定

いざPCから印刷設定を行っていきましょう。今回はWindows11にて設定を検証しました。プリンタのドライバは事前にメーカーのサイトや付属CDから機種に対応したものをダウンロードしてインストールしておきましょう。

設定->プリンタとスキャナから追加を押すと、しばらくして「手動で追加」というボタンが出てくるのでこちらから登録を進めます。

![スクリーンショット 2024-08-06 041356.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15850/d3f21098-c546-21f0-4572-b2f81792d532.png)

ここからはウィザードに従って情報を入力していきます。
スクリーンショットを何枚か貼り付けておきますので、参考にしてください。
（今回はプリンタのIPアドレスを192.168.100.1として設定を行っています）

![スクリーンショット 2024-08-06 041429.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15850/6466a6c9-e344-b392-acc7-78f8ded348b3.png)

![スクリーンショット 2024-08-06 041459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15850/eac672df-a211-b715-24fa-86dbfbcb76b0.png)

![スクリーンショット 2024-08-06 041814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15850/ed0eac10-534b-7252-9f82-5d585c884ec8.png)

![スクリーンショット 2024-08-06 041934.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15850/370fefaf-c259-5c0d-caaf-3e4d7957cace.png)

![スクリーンショット 2024-08-06 041948.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15850/fbeb2033-7e59-9cc9-bf85-c5b29dfdc865.png)

![スクリーンショット 2024-08-06 042041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15850/9c11ba6d-104c-9ab5-0b72-9f7e22e450d1.png)

最後にテストページを印刷し、成功すれば設定完了となります！

## 備忘録

印刷が途中で止まってしまったりする場合、ルータごと再起動すると改善することがありました。（手元では設定直後の初回印刷でのみ発生しました）

「プリンタと通信できません」という表示がプリンタプロパティ上に表示されている場合も問題なく印刷自体は行えるようです。（インク状況も取得できません）p910ndが対応していないプロトコルで取得しているのか、環境依存のものであるかは未調査です。（残念ながら何台もプリンタを持っていませんので...）

クリーニングや強制クリーニング、ヘッダの位置調整なども問題なく行えています。

ルータを立ち上げたままプリンタの電源をOFF/ONした場合も、その後問題なく印刷指示が飛んでいることを確認しています。試してませんがUSBケーブルの抜き差しを行ってもホットプラグが機能するはずなので、問題ないかな？

## あとがき

思ったよりスムーズにできて良かったです（感想）ただ、今回使ったルータはこれだけの仕事をさせるためだけに使う環境としてはあまりにもリッチ過ぎる気がしてしまい、その点少し残念感がありますね。発売当時の定価で7000円以上はする品だと思いますし。

現在このルータでもう少し踏み込んだことができないか、また他のより低スペックなルータで同じことができないか検証を行ってます。続報があれば追記します。（可能性低）

また、そもそものOpenWrtのことについてはあまり深く触れる余裕がありませんでしたので、もしご興味があればいつでも私宛にお声掛けください。一緒にOpenWrt沼に片足を突っ込みましょう。