6

SIM900 GSM アドオン ボードが接続された Raspberry Pi があります。このガイドpppdに従って、 との GPRS 接続を確立することができました。(別のGSMモジュール用ですが、手順は同じです)

定期的にATコマンド( AT+CCLK?)をSIM900に送信して時計を確認したい。を使用してアドホック AT コマンドの送信を管理しましscreenたが、起動時にシリアル回線への接続にpppd使用できません。screenと言ってすぐに終了します[screen is terminating]pppdこれは、インターネットに接続するために使用しているためだと思います。

Q: pppd を閉じずに時刻を取得するにはどうすればよいですか?

ユーザー マニュアルの一部を見ると、SIM900 には GSM0710 規格に合わせて設計されたマルチプレクサが搭載されていると書かれています。これは役に立ちますか?もしそうなら、どうすればこれを達成できますか?

4

4 に答える 4

5

さて、私はこれをほぼ解決しましたが、最後のハードルで立ち往生しています。他の誰かを助けるかもしれないので、私がなんとかしたことを示すと思いました。

これを達成するための3つの可能な方法をリストしたスタックオーバーフローに関するこの他の投稿を見つけました。PPP (私の限られた経験では) がこれをうまく簡単に処理するとき、私は AT コマンドを介して gpr を制御したくありませんでした。RPi にはシリアル ポートが 1 つしかないため、複数のシリアル インターフェイスを多重化することはできませんでした。

そのため、単一のシリアル インターフェイスで多重化する必要がありました。SIM900 がこれをサポートすることを期待しましょう。GSM07.10 規格を使用する SIM900 マルチプレクサのユーザー マニュアルを見つけました。

多重化の設定方法に関する情報はあまり見つかりませんでしたが、最終的に掘り下げた結果、Linux カーネルの n_gsm モジュールに関するこのドキュメントを見つけました。私はそれが話していることについてはほぼ理解できますが、多数の仮想シリアルポートをセットアップするための独自のプログラムを作成するには不十分です。

ありがたいことに、グーグルをさらに精査した後、この並外れた紳士がn_gsm モジュールを使用して仮想シリアルポートをセットアップするC プログラムを作成したことがわかりました。

指示に従ってプログラムをダウンロード、構成、およびビルドし、n_gsm モジュールをロードしようとしました。残念ながら、RPi にはデフォルトで n_gsm モジュールが含まれていないため、n_gsm をモジュールとして追加した新しいカーネルを構築する必要がありました。非常に優れたRPi Webサイトの指示に従いました。

SIM900 の場合、322 行目を変更して、コマンド&wの末尾を削除する必要がありました。AT+IPR次のようになります。

if (send_at_command(serial_fd, "AT+IPR=115200\r") == -1) errx(EXIT_FAILURE, "AT+IPR=115200: bad response");

sleep(1.5)また、応答が間に合わなかったためにエラーが返されることがあったため、応答を読み取ろうとする前に 128 行目を編集しました。

したがって、cmux プログラムを実行し (新しい /dev/ttyGSM* デバイスを作成する必要があるため、sudo を使用)、AT コマンドを実行し、回線規則を設定して新しい仮想シリアル デバイスを作成しますが、シリアルを開こうとすると、screen /dev/ttyGSM1 115200画面付きの端末はそのまま戻ります[screen is terminating]

私はsudo fuser /dev/ttyGSM1何も返さなかったので、他のプロセスはそれを使用していません。

echo AT > /dev/ttyGSM1次に、どちらが返されたかを試しました-bash: /dev/ttyGSM1: Level 2 halted

これが何を指しているのかわかりません。このメッセージに関する情報は見つかりませんでした。OSIモデルの第2層、別名データリンク層について話しているのでしょうか?

とにかく、これは私がどこまで持っているかです。とりあえず脇に置いて NTP だけを使用することにしましたが、これが他の人の助けになることを願っています。これに対する解決策を見つけた場合、または私が見逃した可能性のある何かを提案できる場合は、教えてください. ありがとう

于 2015-03-12T10:56:04.103 に答える
3

他の人にも役立つかもしれないので、この質問に答えます。しかし、UART インターフェイスの多重化に関する私の経験を共有することから始めたいと思います。すべてをセットアップした後、すべてがうまく機能しているように見えます。しかし、VPN に接続したり、いくつかのファイルを転送しようとしたときに、Raspbian が完全にフリーズしました。何が問題なのか正確にはわかりませんが、n_gsmまたはcmuxコンポーネントに関連しているようです。ただし、ping、telnet、SSH などの低帯域幅アプリケーションは問題なく動作するようです。モジュールは実験的なものとしてマークされており、n_gsmおそらく本番環境では使用しないでください。


カーネル モジュールは、n_gsmデフォルトでは Raspbian に含まれていません。CMUX ドライバーの使用を開始するには、Raspbian を更新してカーネル ソース ファイルをダウンロードする必要があります。その後、n_gsmモジュールをコンパイルできます。

  1. システムが最新であることを確認し、依存関係をインストールしてカーネルを更新します
sudo -i
apt update
apt dist-upgrade
apt install bc bison git build-essential flex libssl-dev
rpi-update
sync
reboot
  1. カーネル ソースをダウンロードして、独自のカーネル モジュールを作成できるようにします
wget -O /usr/bin/rpi-source https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source
chmod +x /usr/bin/rpi-source
/usr/bin/rpi-source -q --tag-update
rpi-source
  1. 実験的な GSM MUX 回線規則サポート用のカーネル モジュールをビルドします。
cd /root/linux/drivers/tty/
make -C /lib/modules/$(uname -r)/build M=$(pwd) -e CONFIG_N_GSM=m modules
cp /root/linux/drivers/tty/n_gsm.ko /lib/modules/`uname -r`/kernel/drivers/tty/
depmod
modprobe n_gsm

起動時にモジュールを自動的にロードする場合は、モジュールを /etc/modules にも追加することをお勧めします。

  1. GSM MUX ドライバー (CMUX) をダウンロードしてコンパイルします。
cd /usr/local/src/
git clone https://github.com/Rtone/cmux.git
cd cmux

cmux.c通常、コンパイルする前に編集する必要があります。これが私のセットアップに使用した差分です。

diff --git a/cmux.c b/cmux.c
index 1af0f50..f13edfe 100644
--- a/cmux.c
+++ b/cmux.c
@@ -29,6 +29,7 @@
 #include <linux/types.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/sysmacros.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <err.h>
@@ -50,13 +51,13 @@
 #endif

 /* serial port of the modem */
-#define SERIAL_PORT    "/dev/ttyS1"
+#define SERIAL_PORT    "/dev/ttyAMA0"

 /* line speed */
 #define LINE_SPEED     B115200

 /* maximum transfert unit (MTU), value in bytes */
-#define MTU    512
+#define MTU    1400

 /**
 * whether or not to create virtual TTYs for the multiplex
@@ -66,7 +67,7 @@
 #define CREATE_NODES   1

 /* number of virtual TTYs to create (most modems can handle up to 4) */
-#define NUM_NODES      4
+#define NUM_NODES      2

 /* name of the virtual TTYs to create */
 #define BASENAME_NODES "/dev/ttyGSM"
@@ -313,15 +314,9 @@ int main(void) {
        *       to fit your modem needs.
        *       The following matches Quectel M95.
        */
-       if (send_at_command(serial_fd, "AT+IFC=2,2\r") == -1)
-               errx(EXIT_FAILURE, "AT+IFC=2,2: bad response"); 
-       if (send_at_command(serial_fd, "AT+GMM\r") == -1)
-               warnx("AT+GMM: bad response");
        if (send_at_command(serial_fd, "AT\r") == -1)
                warnx("AT: bad response");
-       if (send_at_command(serial_fd, "AT+IPR=115200&w\r") == -1)
-               errx(EXIT_FAILURE, "AT+IPR=115200&w: bad response");
-       sprintf(atcommand, "AT+CMUX=0,0,5,%d,10,3,30,10,2\r", MTU);
+       sprintf(atcommand, "AT+CMUX=0,0,0,%d,253,3,254,0,0\r", MTU);
        if (send_at_command(serial_fd, atcommand) == -1)
                errx(EXIT_FAILURE, "Cannot enable modem CMUX");

変更を行った後、マルチプレクサをコンパイル、インストール、および実行する準備ができているはずです。

make
cp cmux /usr/bin/cmux
cmux
  1. 新しいシリアル インターフェイスの使用

これで、新しいインターフェイスを使用できるようになります。を使用する代わりに、と の/dev/ttyAMA0両方/dev/ttyGSM1を使用できるようになり/dev/ttyGSM2ました。私は pppd で最初のものを使用し、AT コマンドを同時に送信するために 2 番目のものを使用しています。なぜか使い続けられなくなったwvdialので、すっかり捨ててpppdそのまま使い始めました。両方ともcmuxpppd起動時に実行される systemd サービスを作成したので、起動時に Raspbian はマルチプレクサをセットアップし、PPP 経由でインターネットに接続します。接続が有効な場合、端末がオンラインになったことを報告するために、SMS メッセージを (セカンダリ マルチプレクサ経由で) 送信します。


また、同様の質問に答えるために Seeed フォーラムにこの投稿を書きました。誰かが私の経験を安定性について共有してくれるかどうか、または誰かがいくつかの改善を共有できるかどうかに興味があります。

于 2019-12-16T14:24:32.813 に答える
1

私は同じ問題を抱えていました([画面が終了しています]、レベル2が停止しました)。cmux AT コマンドからシリアル ポートへのコマンドと、 を介したライン ディシプリンの設定とsleep()の間の遅延に注意してください。遅延は長くはありません。時間内に回線規律を設定しない場合、モデムには cmux モードからリセットするためのタイムアウトがあります。ここにいくつかの詳細と証拠があります。write()ioctl()

私に関しては、この遅延をまったく削除しました。

于 2016-01-25T19:18:14.090 に答える