LTEモデムのセットワーク接続を自作C/C++プログラムから制御しょうとWindows10でnetshコマンドを呼び出すのを試したのだけど、mbnサブコマンドがなぜか動かない。
netshコマンドでコマンドラインから、ネットワーク接続を繋いだり切断したりすることはできている。
→ LTEモデムを使ってWindows10のコマンドラインからネットワーク接続と切断をするのにnetshコマンドを試してみた
しかし、 自作C/C++プログラムからnetshを呼び出して実行しようとすると、なぜかうまくいかない。
モバイルネットワークを制御するためのmbnサブコマンドが見つからないというエラーになってしまう。
(有線LANの制御をするlanサブコマンドやWiFi用のwlanサブコマンドについては問題なく使うことができる。)
netshの呼び出し方は、ShellExecute()というAPIを試した。
あと、UNIX風のSystem()というのも試した。
CreateProcess()というAPIだと出来るという情報がStackOverflowにあったので、これも試してみたが駄目だった。
ただし、このAPIの3つめの引数のプロセスのセキュリティ設定をNULLにしてデフォルト設定で試していて、それ以外は試していない。
StackOverflowに出てる情報だとこんなのがあった。
→ issuing Netsh command from Delphi program – Stack Overflow
C/C++ではなくDephiでの事例だが、netshのmbnが動かないということなので、同じ現象だと思われる。
あと他の解決方法としては、Mobile BroadbandというAPIを使うとかがある。
このあたりを参考に接続をするコートを書こうとしたが、うまくいかず挫折している。
→ Mobile Broadband API Best Practices – Windows applications Microsoft Docs
→ 一時的なネットワーク接続を確立する – Windows drivers Microsoft Docs
あと、Mobile Broadband APIよりも簡単なAPIで、WwanEnumerateInterfacesというのがあるらしい。
→ Wireless Wide Area Network Functions (Windows)
こちらは自分はまだ試していない。
—
とりあえずの対症療法的な解決方法として、自作プログラムとは別でバッチファイルを動かしておいて、そのバッチファイル内でループさせておき、条件分岐でnetshを使ったブロードバンドの接続や切断をさせるというのを考えた。
実際に書いてみた。
:p
if exist do_connect.txt goto connect
if exist do_disconnect.txt goto disconnect
timeout /t 2
goto p
:connect
netsh mbn connect interface=Cellular connmode=name name={C31AB014-111F-4EAC-8AAA-E79800436240}
del do_connect.txt
goto p
:disconnect
netsh mbn disconnect interface=Cellular
del do_disconnect.txt
goto p
処理としては単純で、2秒ごとにループしてファイルの存在をチェックし、do_connect.txtというファイルが存在すると、netshでの接続を行い、do_disconnect.txtというファイルが存在するとnetshでも切断を行うというものだ。
このbatファイルを起動して裏で起動させて動かしっぱなしにしておいて、自作C/C++プログラムでは、do_connect.txtとかのファイルを生成することで接続の指令を出す形になる。
interface=Cellularの部分や、name={C31AB014-111F-4EAC-8AAA-E79800436240}の部分は、netshコマンドであらかじめ調べておく。(各自の環境で異なる)
接続がうまくいかない場合のリトライとかも書かないといけないのでちょっと面倒だが、とりあえずは動くものを作ることはできそうだ。