他の人にも役立つかもしれないので、この質問に答えます。しかし、UART インターフェイスの多重化に関する私の経験を共有することから始めたいと思います。すべてをセットアップした後、すべてがうまく機能しているように見えます。しかし、VPN に接続したり、いくつかのファイルを転送しようとしたときに、Raspbian が完全にフリーズしました。何が問題なのか正確にはわかりませんが、n_gsm
またはcmux
コンポーネントに関連しているようです。ただし、ping、telnet、SSH などの低帯域幅アプリケーションは問題なく動作するようです。モジュールは実験的なものとしてマークされており、n_gsm
おそらく本番環境では使用しないでください。
カーネル モジュールは、n_gsm
デフォルトでは Raspbian に含まれていません。CMUX ドライバーの使用を開始するには、Raspbian を更新してカーネル ソース ファイルをダウンロードする必要があります。その後、n_gsm
モジュールをコンパイルできます。
- システムが最新であることを確認し、依存関係をインストールしてカーネルを更新します
sudo -i
apt update
apt dist-upgrade
apt install bc bison git build-essential flex libssl-dev
rpi-update
sync
reboot
- カーネル ソースをダウンロードして、独自のカーネル モジュールを作成できるようにします
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
- 実験的な 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 にも追加することをお勧めします。
- 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
- 新しいシリアル インターフェイスの使用
これで、新しいインターフェイスを使用できるようになります。を使用する代わりに、と の/dev/ttyAMA0
両方/dev/ttyGSM1
を使用できるようになり/dev/ttyGSM2
ました。私は pppd で最初のものを使用し、AT コマンドを同時に送信するために 2 番目のものを使用しています。なぜか使い続けられなくなったwvdial
ので、すっかり捨ててpppd
そのまま使い始めました。両方ともcmux
、pppd
起動時に実行される systemd サービスを作成したので、起動時に Raspbian はマルチプレクサをセットアップし、PPP 経由でインターネットに接続します。接続が有効な場合、端末がオンラインになったことを報告するために、SMS メッセージを (セカンダリ マルチプレクサ経由で) 送信します。
また、同様の質問に答えるために Seeed フォーラムにこの投稿を書きました。誰かが私の経験を安定性について共有してくれるかどうか、または誰かがいくつかの改善を共有できるかどうかに興味があります。