hp mini 1007tuの余生を考える話

 ネットブックが流行った2009年ぐらいの話、中古PC屋で一目惚れして未だに使っているパソコンにhp mini 1007tuがある。発売から10年近く経ってしまった今では、搭載されているCPU:Atom N270 1.6GHzでは非力な部類となってしまうが、それでも使い続けるにはどうすれば良いかということで、3.5 inch ミニプラグがついたAMラジオを常にON状態にしマイク端子で拾わせて、リアルタイムでエンコード&bluetoothで飛ばしつつ、時報代わりにすればいいかなあということで、そうしたFreeBSDのサーバを構築するという話です。

思い出し思い出しで書いているので、時々追記してるかもしれません。


条件<ハード面>
・CPU: Intel Atom N270 (64bitシステムは非対応)
・MEM: 2GB
・Disk Drive: pSSD 16GB + USBメモリ 8GB
USBドングル
・GPS Receiver: u-blox AG www.u-blox.com u-blox 7 GPS/GNSS Receiver(Vendor:0x1546 Product:0x01a7)
・Wireless: Ralink 802.11 n WLAN(Vendor:0x0411 Product:0x01a2)
・USB Audio: Creative Labs
Sound Blaster Play!(Vendor:0x041e Product:0x30d3)

その他搭載されているデバイスにはUSBに化けているbluetoothやらはありますが、割愛します。カメラ機能も使いません。

構築<ネットワーク環境>
 hp miniだけの問題ではないのですが、FreeBSDはbroadcomのワイアレスデバイスとかなり相性が悪いようで、bwiやbwnのドライバをそのまま読み込んでもほぼ使用できません。ネットブックが流行った頃にはndisgenコマンドによってWindows XP用のドライバを化かして使うという手が使えたのですが、今回使えませんでした。しかもhpの場合、内蔵ワイアレスデバイスを交換してもBIOSによって起動を拒否されるので、どうしてもBIOSに使用可能であると認識させたい場合は、使いたいワイアレスデバイスに細工をする必要があるようです(詳しくは 104 unsupported wireless network device detected で検索してみてください。同様の問題はIBM/Lenovoでもあります)。なお、私は諦めました。そこまでやる必要はないしUSBドングルが割とと余っていたので気にしなかったこともあります。

 今回RalinkのUSBドングルを使うので、下記のような設定をします。
 特にネットワークサーバとして動かす予定はないので、DHCPでネットワークIPアドレスを取得します。
  /etc/wpa_supplicant.conf に追加
   network {
    ssid="接続先SSID"
    ssid="接続先SSIDパスワード"
   }

  /etc/rc.conf に追加
   wlans_run0="wlan0"
   ifconfig_wlan0="WPA DHCP country JP"

 一応書いておきますが、日本国外に住んでいる場合は、countryの後ろのJPの部分を書き換えなければならないかもしれません。逆に日本国内に住んでいる場合はJPの設定にしないと電波法違反になるかもしれません。



構築<正確な時計の獲得>
 正確な時計を作らなければならないのですが、いくつか方法はあるなかで一番簡単なのは、インターネット上にあるNTPサーバから時間を取得する方法です。しかしインターネット未接続条件下では、hp mini内蔵の時計に従ってフラフラとずれていくので、あまり信用できるものではありません。
 秒単位でずれていって戻らないという状態は困るが、ある基準に従って行ったり来たりするのは全く問題ないし、それが秒単位でなければ特段問題ないので、ラズパイで一時期話題になったGPSレシーバーを使った正確な時計を作ることにします。なぜGPSの電波を受信することで正確な時計を作ることができるかについてはここでは説明を避けますが、興味があれば調べてみると良いでしょう。

 単純に下記のように設定していきます。
  /etc/devfs.conf に追加
   link cuaU0 gps0

  /etc/ntp.conf に追加
   pidfile /var/run/ntpd.pid
   driftfile /var/db/ntpd.drift
   server 127.127.20.0 minpoll 4 prefer
   fudge 127.127.20.0 refid GPS stratum 2 flag1 0
   server 127.127.1.0 minpoll 10
   fudge 127.127.1.0 refid LOCAL stratum 13

  /etc/rc.conf に追加
   ntpd_enable="YES"
   ntpd_program="/usr/sbin/ntpd"
   ntpd_config="/etc/ntp.conf"
   ntpd_sync_on_start="YES"

 多少認識の仕方によってはデバイス名が変わってくるところもあるので、そのへんは適時変更する。
 ここで再起動してみて、ルートユーザなりでntpq -p とかコマンドを打ってみてしばらくしてGPSの行頭に半角アスタリスクがついたらいい感じ。



構築<bluetoothスピーカーと接続>
 とりあえず、適当なbluetoothスピーカーと接続します。ダイソーで600円で売ってたBTS-032Aにつなげます。

 パッケージの導入(要インターネット環境)
  pkg install virtual_oss

 /etc/rc.conf に追加
  hcsecd_enable="YES"
  dbus_enable="YES"

 daemon hcsecd の起動コマンド
  service hcsecd restart

 daemon sdpd の起動コマンド
  service sdpd onestart

  ※このデーモンは今回限りで良いので、再起動後自動起動させる必要はない。

 対象のbluetoothスピーカーのBDアドレスの確認コマンド → 出力されるBD_ADDRを記録しておく
  hccontrol -n ubt0hci inquiry

  ※このコマンドを投入する前にbluetoothスピーカーの電源を入れておくこと。

 対象のbluetoothスピーカーの名前を確認する
  hccontrol -n ubt0hci remote_name_request BD_ADDR

  今回の場合、BTS-032Aであること。違う場合は他のを探しましょう。

 /etc/bluetooth/hcsecd.conf に追加
  device {
   bdaddr 記録したBD_ADDR;
   name   "BTS-032A";
   key    nokey;
   pin    "0000";
  }

  詳細はbluetoothスピーカーの説明書を確認してみましょう。そうでなければスマホで一旦接続して確認するのも手です。


 /boot/loader.conf に追加
  cuse_load="YES"


 /etc/rc.local に追加
  sleep 10
  BD_ADDR="記録したBD_ADDR"
  /usr/sbin/hccontrol -n ubt0hci create_connection ${BD_ADDR}
  /usr/local/sbin/virtual_oss -C 2 -c 2 -r 44100 -b 16 -s 1024 -R /dev/null -p /dev/bluetooth/${BD_ADDR} -d dsp &

 ここで再起動して、bluetoothスピーカーの反応を確認しておく。
 接続された反応がなければ、設定を見直す。


構築<AMラジオ→bluetoothスピーカーへ>
 当初icecastなどのストリーミングサーバが必要かと思ったが、そもそもLANで再配信する予定はないので、コーディック変換してスピーカーそのままスルーしてしまえば解決できそう。

 パッケージの導入(要インターネット環境)
  pkg install ffmpeg mpg123


 AMラジオとUSB Audioのマイク端子をつなぎ、以下のコマンドを試す。(下記コマンドでは30秒音声が再生されるはず)
  /usr/local/bin/ffmpeg -f oss -i /dev/dsp1 -vol 3072 -t 00:00:30 -ar 44100 -ac 1 -vn -c:a mp2 -b:a 320k -f mp2 - | mpg123 -
  たいてい一発では成功しないので、AMラジオからジャックが外れたときに耳に触らない程度の音量で、-vol値を操作しつつ音量を調整する必要はある。


構築<crontabの設定>
 今回はユーザ名:fbsdにcronを実行させるので、fbsdでログインし、下記コマンドで編集を始める。
  crontab -e

 ルートユーザでfbsdに実行させるcrontabを書く場合は下記のようにする。
  crontab -u fbsd -e

 今回は、NHK-AMの00分に流れる時報を再生できればいいので、59分から2分間再生できれば良い、ということで下記のように書く。
  59 * * * * /usr/local/bin/ffmpeg -f oss -i /dev/dsp1 -vol 3072 -t 00:02:00 -ar 44100 -vn -c:a mp2 -b:a 320k -f mp2 - | mpg123 -

 これで以上、ではなく、もう一つ設定をする。
  /var/cron/allow に追加
   fbsd

 あとは59分が来るのを待ち、ラジオが流れ始めるかを確認しておしまい。

コメント