Armadilloフォーラム

LTE接続時の掴んでいる周波数帯の確認方法について

yuto.tsukada

2021年10月6日 16時30分

お世話になっております。

表題の件につきまして、質問がございます。
<質問>
・LTE接続を切らずに、現在掴んでいる周波数帯(バンド)を取得する方法はございますか。

下記の記事1から、ATコマンドを使用し、現在掴んでいるバンドを取得する方法は分かりました。
 1) https://armadillo.atmark-techno.com/forum/armadillo/3188
しかし下記の記事2ではATコマンドを使用する際は、ModemManagerを停止すると書かれております。
 2) https://armadillo.atmark-techno.com/howto/armadillo_3g-lte_at-command
ModemManagerを停止すると、LTE接続が切れてしまうため、上記質問に至りました。

以上、お手数をおかけしますが、
ご回答の程よろしくお願いいたします。

コメント

at_mitsuhiro.yoshida

2021年10月6日 17時56分

吉田です。

LTE 接続中でも、/dev/ttymxc6 からの AT^SMONI コマンドは入力可能です。

root@armadillo:~# nmcli d
DEVICE    TYPE      STATE      CONNECTION
eth0      ethernet  connected  Wired connection 1
ttyACM0   gsm       connected  gsm-ttyACM0
 
root@armadillo:~# cu -l /dev/ttymxc6 -s 115200
Connected.
AT^SMONI
^SMONI: 4G,5900,18,10,10,FDD,440,51,BE09,0013A801,188,18.35,-104.90,-12.40,CONN
 
OK
~.  (チルダ ドット で cu から抜けます)

yuto.tsukada

2021年10月7日 9時05分

吉田様

ご回答ありがとうございました。

> LTE 接続中でも、/dev/ttymxc6 からの AT^SMONI コマンドは入力可能です。
 上記ATコマンドで、バンド取得が可能な件、確認いたしました。

追加で、もう一つ質問がございます。
 ・ AT^SMONIを用いて、定期的にバンドを取得しても、NetworkManagerに影響を及ぼすことはない(LTE接続が切れない)という認識でよろしいでしょうか。

AT^SMONIを用いて、アプリ or シェルにて自動で定期的にバンドを取得し、ログを出力する仕様を考えております。
その際、以下URLの「外部からATコマンドを送信すると、ModemManagerが正しく動作しない可能性があります。」という文が気になったため、質問に至りました。
https://armadillo.atmark-techno.com/howto/armadillo_3g-lte_at-command

以上、ご回答の程よろしくお願いいたします。

at_koseki

2021年10月7日 12時05分

古関です。

ModemManagerはUSBシリアルインターフェイス(/dev/ttyACM0)から
ATコマンドを実行することでLTEモジュールを制御しています。

---------------------------------------
root@armadillo:~# cu -l /dev/ttymxc6 -s 115200
Connected.
AT^SMONI
^SMONI: 4G,5900,18,10,10,FDD,440,51,BE09,0013A801,188,18.35,-104.90,-12.40,CONN

OK
---------------------------------------

ModemManagerを止めずに上記を実行すると、制御に割り込む形で、
UART(/dev/ttymxc6)からATコマンドを実行することになります。
基本的にModemManager側の制御からすると想定外の使われ方になります。

ModemManagerでATコマンドの実行シーケンス(実行する順番・前後関係)に
意味がある制御をしている場合、横から割り込まれるコマンドの種類によっては
辻褄が合わなくなり誤動作につながります。

例えば通信をしているのに無線出力を切るATコマンドを横から実行したり、
APN設定をクリアするATコマンドを実行するなどです。

しかし、AT^SMONIは状態表示のコマンドであり、ModemManagerの制御シーケンスを壊さず実行ができます。
まず大丈夫だと考えていますが、設置運用前に十分な試験をお願いいたします。

また、状態表示のコマンドでも間隔を開けずに短期間に連続実行すると
LTE接続完了までに時間がかかるなど、悪影響がある可能性があります。
数分に一度くらいであれば問題ないと思います。

よろしくお願いいたします。

at_shinya.koga

2021年10月7日 13時12分

アットマークテクノの古賀です。

>ModemManagerはUSBシリアルインターフェイス(/dev/ttyACM0)から
>ATコマンドを実行することでLTEモジュールを制御しています。

>ModemManagerを止めずに上記を実行すると、制御に割り込む形で、
>UART(/dev/ttymxc6)からATコマンドを実行することになります。
>基本的にModemManager側の制御からすると想定外の使われ方になります。
>
>ModemManagerでATコマンドの実行シーケンス(実行する順番・前後関係)に
>意味がある制御をしている場合、横から割り込まれるコマンドの種類によっては
>辻褄が合わなくなり誤動作につながります。
>
>例えば通信をしているのに無線出力を切るATコマンドを横から実行したり、
>APN設定をクリアするATコマンドを実行するなどです。
>
>しかし、AT^SMONIは状態表示のコマンドであり、ModemManagerの制御シーケンスを壊さず実行ができます。
>まず大丈夫だと考えていますが、設置運用前に十分な試験をお願いいたします。

実際に試していないのですが、ModemManager に DBus 経由でリクエストして AT コマンドを発行してもらうことができるかも知れません。そうすることで、ModemNager が AT コマンドを発行する動作と重複するタイミングで AT コマンドを発行してしまう心配がない、という利点はあると思います。ただし、モデムの動作制御を行う AT コマンドを発行するのは危険、というのは、変わりません。
 https://www.freedesktop.org/software/ModemManager/api/latest/gdbus-org…
 https://www.freedesktop.org/software/ModemManager/doc/latest/ModemManag…

>また、状態表示のコマンドでも間隔を開けずに短期間に連続実行すると
>LTE接続完了までに時間がかかるなど、悪影響がある可能性があります。
>数分に一度くらいであれば問題ないと思います。

についても、同様です。

ということで、大きな利点は無いものの、もし、dbus-send を使った以下のコマンドで、AT^SMONI のレスポンスが得られるなら、ModemManager を停止せずに /dev/ttymxc6 から AT コマンドを発行するのに比べ、ちょっとだけ安心かも知れません:

$ dbus-send --system --dest=org.freedesktop.ModemManager1 --print-reply /org/freedesktop/ModemManager1/Modem/0 --type=method_call org.freedesktop.ModemManager1.Modem.Command string:'AT^SMONI' uint32:2000

yuto.tsukada

2021年10月7日 20時00分

古関様、古賀様

ご回答ありがとうございました。

十分に試験を行い、AT^SMONIを実行する間隔や、ModemManagerに影響がないことを検討、確認したいと思います。
UARTからATコマンドを実行する方法よりも、DBus経由でModemManagerからATコマンドを実行する方が安全であること、理解いたしました。

また、ご教示いただいたdbus-sendを用いたコマンドを実行したところ、以下のエラーが発生しました。

Error org.freedesktop.ModemManager1.Error.Core.Unauthorized: Cannot send AT command to modem: operation only allowed in debug mode

ModemManagerをdebug modeで動作させる方法がわからず、ご教示いただきたく存じます。

以上、ご回答の程よろしくお願いいたします。

at_shinya.koga

2021年10月8日 5時53分

アットマークテクノの古賀です。

yuto.tsukadaさん:
>また、ご教示いただいたdbus-sendを用いたコマンドを実行したところ、以下のエラーが発生しました。

Error org.freedesktop.ModemManager1.Error.Core.Unauthorized: Cannot send AT command to modem: operation only allowed in debug mode

>ModemManagerをdebug modeで動作させる方法がわからず、ご教示いただきたく存じます。

ModemManager を debug mode で動作させるには、起動オプションで --debug を指定しないといけません:
 https://www.freedesktop.org/software/ModemManager/man/latest/ModemManag…
 https://armadillo.atmark-techno.com/blog/750/2508
debug mode で実行すると、ModemManager の吐くログが大量になるので、それが少々難点ではあります。

なお、ModemManager のソースを見ると、上記のエラーメッセージを出しているのは、ここです:
 https://github.com/freedesktop/ModemManager/blob/master/src/mm-iface-mo…

ここを見ると、WITH_AT_COMMAND_VIA_DBUS が定義されていると、debug mode かどうかのチェックを行わないようになっています。ModemManger の DBus インタフェースのリファレンスで、org.freedesktop.ModemManager1.Modem の Command() メソッドの説明に記載されている通り、ビルド時のコンフィグレーションに with-at-command-via-dbus オプションを付けると、WITH_AT_COMMAND_VIA_DBUS が定義されて、debug mode でなくても AT コマンド実行のリクエストに応答するのでしょう。

yuto.tsukada

2021年10月8日 19時26分

古賀様

お世話になっております。

ご回答ありがとうございます。

> ビルド時のコンフィグレーションに with-at-command-via-dbus オプションを付ける
上記についてですが、具体的な方法がわからず、ご教示いただけますでしょうか。

以下のように、行いましたが、同じエラーが出てしまいました。
1./etc/systemd/system/dbus-org.freedesktop.ModemManager1.serviceファイルを編集

:
[Service]
:
#ExecStart=/usr/sbin/ModemManager
ExecStart=/usr/sbin/ModemManager with-at-command-via-dbus
:

2.ModemManagerの再スタート

$ systemctl stop ModemManager
$ systemctl start ModemManager

3.dbus-sendを用いたコマンド実行

$ dbus-send --system --dest=org.freedesktop.ModemManager1 --print-reply /org/freedesktop/ModemManager1/Modem/0 --type=method_call org.freedesktop.ModemManager1.Modem.Command string:'AT^SMONI' uint32:2000

コマンド結果は、以下になります。

Error org.freedesktop.ModemManager1.Error.Core.Unauthorized: Cannot send AT command to modem: operation only allowed in debug mode

お手数をおかけしますが、ご回答の程、よろしくお願いいたします。

at_shinya.koga

2021年10月12日 17時45分

アットマークテクノの古賀です。

yuto.tsukadaさん(2021年10月8日 19時26分):
>ご回答ありがとうございます。
>
>>ビルド時のコンフィグレーションに with-at-command-via-dbus オプションを付ける
>上記についてですが、具体的な方法がわからず、ご教示いただけますでしょうか。
>
>以下のように、行いましたが、同じエラーが出てしまいました。
>1./etc/systemd/system/dbus-org.freedesktop.ModemManager1.serviceファイルを編集

「ビルド時のコンフィグレーション」というのは、ModemManager をソースコードからビルドする時のコンフィグレーションなのです。設定ファイルに記述する、起動オプションとは違います。こちらに記載されている、configure スクリプトに与えるオプションなのです:
https://modemmanager.org/docs/modemmanager/building/

with-at-command-via-dbus オプション付きでビルドした ModemManager を得るには、ご自分でビルドして頂かないといけません。ModemManager の各バージョンの、オリジナルのソースと Armadillo 用のパッチセットは、こちらからダウンロードできます:
 https://download.atmark-techno.com/debian/pool/main/m/modemmanager/
が、こちらのソースとパッチを使ってビルドするよりは、UART (/dev/ttymxc6) から AT コマンドを実行して頂く方が簡単かと思います。ごめんなさい。

yuto.tsukada

2021年10月13日 12時03分

古賀様

いつも大変お世話になっております。

ご回答ありがとうございました。

下記、ビルド時にオプションを設定する旨、承知しました。
今回は簡単に実装できそうな、UARTからATコマンドを実行する方法を採用しようと思います。

以上、今後ともよろしくお願いいたします。

> アットマークテクノの古賀です。
>
> yuto.tsukadaさん(2021年10月8日 19時26分):
> >ご回答ありがとうございます。
> >
> >>ビルド時のコンフィグレーションに with-at-command-via-dbus オプションを付ける
> >上記についてですが、具体的な方法がわからず、ご教示いただけますでしょうか。
> >
> >以下のように、行いましたが、同じエラーが出てしまいました。
> >1./etc/systemd/system/dbus-org.freedesktop.ModemManager1.serviceファイルを編集
> …
>
> 「ビルド時のコンフィグレーション」というのは、ModemManager をソースコードからビルドする時のコンフィグレーションなのです。設定ファイルに記述する、起動オプションとは違います。こちらに記載されている、configure スクリプトに与えるオプションなのです:
> https://modemmanager.org/docs/modemmanager/building/
>
> with-at-command-via-dbus オプション付きでビルドした ModemManager を得るには、ご自分でビルドして頂かないといけません。ModemManager の各バージョンの、オリジナルのソースと Armadillo 用のパッチセットは、こちらからダウンロードできます:
>  https://download.atmark-techno.com/debian/pool/main/m/modemmanager/
> が、こちらのソースとパッチを使ってビルドするよりは、UART (/dev/ttymxc6) から AT コマンドを実行して頂く方が簡単かと思います。ごめんなさい。