LTEモデムを使ってWindows10のコマンドラインからネットワーク接続と切断をするのにnetshコマンドを試してみた。
通常の使い方ならば通信の量をあまり気にせずにつなぎっぱなしにしてもよいのだが、組み込み用に使う場合などは通信をできる限り減らしたいという事情がある。
勝手に通信するのを防ぐためには、必要時以外には通信を切っておきたい。
必要時のみ通信するためには、自作のプログラムからネットワークの接続や切断を制御したい。
とりあえずコマンドラインからのコマンド入力で制御できれば、それをプログラム中から呼び出すことが可能だ。
ネットワーク接続の制御用にはnetshというコマンドがある。
netsh lan show interfaces
とか
netsh wlan show interfaces
というコマンドで、有線LANやWiFiのインターフェースの情報を表示させることができる。
同様に、モバイルネットワークについても
netsh mbn show interfaces
というコマンドで表示させることができる。
「携帯電話」という名前のインターフェースが見つかる。
このインターフェースに対して接続や切断のコマンドを送るのだが、日本語の文字列だとちょっと困るので、名前を変更した。
コントロールパネルのネットワークの設定画面から、「携帯電話」のアイコンを右クリックして名前を変更できる。
「Cellular」という名前に変更した。(当初、LTE-modemという名前にしたのだが、英語版Windowsのデフォルト名のCellularのほうが無難なので、Cellularにしておいた)
ネットワークに接続する場合、
netsh mbn connect
というコマンドを使う。
しかし、
netsh mbn connect interface=Cellular
とするだけではコマンドのパラメータが足らずに実行できない。
APN情報などを設定したprofileを指定する必要がある。
profileを指定するには、OSに設定されたprofileを使うか、それとは別にxmlファイルを作って指定するやり方があるらしい。後者はよくわからないので、前者の設定済みのprofileを使うことにする。
既に設定済みのprofileは、次のコマンドで表示させることができる。
netsh mbn show profile interface=Cellular
ドコモ系のMVNOだと、moperaの設定などがあらかじめ入っている。
自分でDMMのSIMのAPNを設定したものも入っている。
分かりやすい名前で表示されず、
{C31AB014-1mF-4EAC-8AAA-E79800436240}
みたいな16進数の羅列の文字列で表示される!(どれがどの設定なのか分からないので困る)
適用済みのprofileは「{」と「}」で囲われた文字列になっているので、それでDMM用のAPNがどれだかわかる。
確認方法としては、次のようなコマンドでprofileの中身を表示させて確認が可能だ。
netsh mbn show profile interface=Cellular {C31AB014-111F-4EAC-8AAA-E79800436240}
あとは、このprofileを使って接続を行う。
接続コマンドは、
netsh mbn connect interface=Cellular connmode=name name={C31AB014-111F-4EAC-8AAA-E79800436240}
となる。
切断のコマンドは、
netsh mbn disconnect interface=Cellular
と、特にprofileを指定しなくてもよい。
実際に試してみたのだが、エラーが出たりして接続できなかったりした。
試した場所の電波が弱くて圏外になっていたりとか、電源を入れたばかりとかUSBでモジュールを取り付けたばかりとかの場合には電波を掴むまでに時間が掛かって圏外になっていたりする場合があり、そういう場合にエラーになるのだと思われる。
失敗した場合に、何度かコマンドを実行しなおしてリトライするとネットワークに接続できた。
自作のプログラムから接続をさせようとする場合には、リトライを掛ける仕組みを作らなければならないようだ。
—
追記
自作のプログラムからsystem()関数を使ってシェル経由で実行しようとするとなぜかうまくいかない。
systemから呼び出したシェルでnetshコマンドを実行した場合には、mbnが指定できない?