Hatena::ブログ(Diary)

tsntsumi’s NOOTO RSSフィード Twitter

2016-08-15 Mon

Raspberry Pi 3 で ppp を使って IIJ mobile に接続する

Rsapbian jessie で IIJ mobile に 3G モデムを使って接続するのに苦労したのでメモを残しておきます。

ネットでは、接続する方法は wvdial を使う方法が多く存在しましたが、pppconfig を使って設定した pppd を使用しました。

pppconfig で接続用スクリプトを作成する

  1. Create a connection を選択。
  2. Provider Nameプロバイダ名を入力。ここでは iijmobile としました。
  3. Configure Name Servers (DNS)Dynamic を選択。
  4. Authentication Method for <プロバイダ名> では PAP を選択。
  5. User Nameプロバイダから指定されたユーザ名を入力。
  6. Passwordプロバイダから指定されたパスワードを入力。
  7. Speed460800 を入力。
  8. Pulse or ToneTone を選択。
  9. Pone Number*99***1# を入力。
  10. Choose Modem Config MethodNo を選択。
  11. Manually Select Modem Port/dev/ttyUSB2 を入力。
  12. Finished Write files and return to main menu. を選択。
  13. Ok を選択して終了。

/etc/ppp/peers/etc/chatscripts の下に 2. で入力したプロバイダ名の設定ファイルが作成されます。

/etc/ppp/pap-secretsUser Name と Password で入力した内容が保存されます。

chatscript を編集する

/etc/chatscripts/iijmobile# modeminit の次の行を以下のように変更します。

3G モデム富士ソフトの FS01BU を使っています。

...
# modeminit
'' ATH
OK 'AT+CFUN=1'
OK ATZ
OK 'ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0'
OK 'AT+CGDCONT=1,"IP","<APN名>"'
# ispnumber
...

peer を編集する

/etc/ppp/peers/iijmobile の最後に以下を追記します。

persist
replacedefaultroute
iijmobile 用の設定を追加する

/etc/ppp/peers/iijmobile の最後に以下を追記します。

IIJ mobiel は PAP で認証しないと IP アドレスを割り振ってくれないようです。Raspbian jessie の pppd 2.4.6 は、なぜか以下の指定をしないと、最初に CHAP での認証を要求します。しかし、IIJ mobile では CHAP でも認証は通ってしまいますが、CHAPログインすると IP アドレスを割り振ってくれないようです。

また、 オプションで明示的に +pap を指定すると、パスワードが見つからないという pppd のエラーになってしまいます。

そこで PAP 以外の認証方式を使用しないように設定します。

refuse-chap
refuse-mschap
refuse-mschap-v2
refuse-eep

pon で接続

$ sudo pon iijmobile

poff で切断

$ sudo poff

起動時などに自動的に PPP 接続するための設定

Raspberry Pi の起動時や、3G モデムが挿入された時に自動的に接続するための設定を行います。

/etc/network/interfaces に以下を追加して、仮想のネットワークインタフェース wwan0 を用意し、PPP 接続と紐づけます。

allow-hotplug wwan0
iface wwan0 inet ppp
    provider iijmobile
手動でネットワークインタフェースを ifup/ifdown して接続テスト

wwan0 ネットワークインタフェースifup することで、PPP 接続が開始します。

$ sudo ifup wwan0

wwan0 ネットワークインタフェースifdown することで、PPP 接続が終了します。

sudo ifdown wwan0

デバイスが挿入された時に PPP 接続を開始する

/etc/udev/rules.d/40-fs10bu.rules に以下を記述します。

KERNEL=="ttyUSB*",\
  GROUP=="usb",\
  ATTRS{../idVendor}=="1c9e",\
  ATTRS{../idProduct}=="6801",\
  ATTRS{bNumEndpoints}=="02",\
  ATTRS{bInterfaceNumber}=="02",\
  SYMLINK+="ttyFS01BU",\
  ENV{SYSTEMD_WANTS}+="ifup@wwan0"

接続を開始するようのと同時に、3G モデムを認識した時にそのデバイスファイルに ttyFS01BU と言うシンボリックリンクを作成するようにしています。

これは、FS01BU 以外の USB シリアルデバイスが挿入されている時に、ブート時の認識順によってデバイスファイル名が変わってしまう場合に対応するためです。

/etc/ppp/peers/iijmobileシリアルポート名を /dev/ttyUSB2 から /dev/ttyFS01BU に変更しておくと良いでしょう。

2015-12-05 Sat

ピンクのドレスの女の子

ようやく Apple Pencil を手に入れたので久々にお絵かき。

iPad Pro と Apple Pencil と Procreate で。

f:id:tsntsumi:20151209223414j:image:w640

2015-09-16 Wed

Android Studio で Hamcrest の closeTo マッチャーを使いたい

モジュールの build.gradle ファイルの dependencies に以下を追加する。hamcrest.org からライブラリダウンロードするまでもありません。

dependencies {
  // ...
  testCompile 'junit:junit:4.12'
  testCompile 'org.hamcrest:hamcrest-library:1.3'
}

もう一つの方法(追記)

「File > Project Structure」で開いたダイアログモジュールの設定の Dependencies タブを選択し、「+」ボタンをクリックして「1 Library dependency」を選択すると「Choose Dependencyダイアログが表示されます。そこで org.hamcrest を検索するとライブラリがリストアップされるので、そこから選びます。

f:id:tsntsumi:20150916172842p:image

そして、モジュールの build.gradle ファイルの dependencies に挿入された org.hamcrest の行の先頭を compile から testCompile に変更します。

なぜ closeTo を使いたいのか

JUnit4 で浮動小数点の比較をするアサーションを書くとします。

    assertThat(2.32 * 3, equalTo(6.96));

とすると、成功するように見えて失敗します。浮動小数点の演算で「2.32 * 2」が 6.95999999999 となってしまうためです。

そこで、ある程度の誤差を見込んで:

    assertTrue(Match.abs((2.32 * 3) - 6.96) < 0.0005);

のようにすることもできます。が、これでは失敗したときのメッセージも分かりにくくなります。

そこで Hamcrest の closeTo() というマッチャーを使えば:

import static org.hamcrest.number.IsCloseTo.*;
    // ...
    assertThat(2.32 * 3, closeTo(6.96, 0.0005);

と書けるようになります。