4

GPS/GPRS/GSM を使用した車両追跡システムを開発しています。現在使用しているトラッキング デバイスは、Quectel ([www.quectel.com][1]) の GPS/GPRS/GSM トラッカーである GV100 です。デバイスとバックエンド サーバー間の接続を確立できません。私の質問は特に次のとおりです。

  1. コマンド (AT コマンド) をサーバーからデバイスに送信するにはどうすればよいですか?
  2. デバイスからの応答 (レポートと確認メッセージ) を受け入れてデータベースに保存するにはどうすればよいですか?

MGV100 Manage Tool (Quectel が提供するソフトウェア) を使用して、シリアル ポート経由でデバイスにコマンドを送信しました。そして、GSM 対応の携帯電話で確認 SMS メッセージを受け取りました。今、私はサーバーからメッセージを送信し、サーバーで返信を受け入れたいと思っています(SMSではありません)。コマンドを送信して応答を受信する方法がわかりません。そのようなシステムを開発した経験はありません。

必要に応じて、サンプル コードとセットアップ手順を入手できるとよいでしょう。私が言及したケースに関連するチュートリアルはどこで入手できますか?


ありがとう


サーバーがデバイスにデータを送受信する方法を理解するために、まずクライアント (現在は私の PC) とサーバーの間の通信を実装することにしました。私の最終的な目標はデバイスと通信することですが、現在、PC からサーバーへの接続を確立しようとしています。これに成功すると、データの送受信にサーバーのIPアドレスとポート番号が必要なデバイスからサーバーへの通信に努めます。
これは私の仮定です:

  • TCP/UDP を使用して通信するために、.cs コードからサーバーのポートを開くことができます。
  • その後、クライアントはこのポートを介してデータを送受信できます。
  • クライアントから送信されたデータをサーバーのファイル システムに保存し、いつでも確認できます。(今はデータベースの問題を気にしたくないので、データをリレーショナルデータベースに保存していません。)これが私が実装しようとした方法です:
    C#Webアプリケーションのサーバー:
    ボタンをクリックするとポートが開き、クライアントをリッスンします

    protected void btnConnect_Click(object sender, EventArgs e)
    {
        try
        {
            continueListening = true;
            while (continueListening)
            {
                int port=Int32.Parse(txtPort.Text);
                lblOutput.Text = "Port is now " + port +". Waiting for connection";
                TcpListener myList = new TcpListener(IPAddress.Parse(txtIpAddress.Text), port);
                myList.Start();
                Socket s = myList.AcceptSocket();
                lblOutput.Text="Connection accepted from " + s.RemoteEndPoint;
    
                byte[] b = new byte[100];
                int k = s.Receive(b);
                lblOutput.Text = ("Recieved...");
                String obtainedText = "";
                for (int i = 0; i < k; i++)
                {
                    obtainedText = obtainedText + "  " + (Convert.ToChar(b[i]));
                }
                writeToTextFile("C:/Users/MekAtIbex/Desktop/TESTED/RECIEVED.txt", obtainedText);
                lblOutput.Text = obtainedText;
                ASCIIEncoding asen = new ASCIIEncoding();
                lblOutput.Text = lblOutput.Text +"  "+ ("The string was recieved by the server.");
                lblOutput.Text = lblOutput.Text +"  "+ ("\r\nSent Acknowledgement");
            } 
    

クライアント: C# Windows アプリケーション

        private void btnSend_Click(object sender, EventArgs e)
        {
            try
            {
                TcpClient tcpClient = new TcpClient();
                int port=Int32.Parse(txtPort.Text.Trim());

                tcpClient.Connect(txtIpAddress.Text, port);
                lblStatus.Text = ("Connected");
                Stream stm = tcpClient.GetStream();
                ASCIIEncoding asen = new ASCIIEncoding();
                byte[] bytesToSend = asen.GetBytes(txtData.Text);
                lblStatus.Text = ("Transmitting.....");

                stm.Write(bytesToSend, 0, bytesToSend.Length);

                byte[] bb = new byte[100];
                int k = stm.Read(bb, 0, 100);

                for (int i = 0; i < k; i++)
                {
                    txtaResponse.Text = txtaResponse.Text + "\n" + "Res... " + new DateTime() + " " + Convert.ToChar(bb[i]);
                    Console.Write(Convert.ToChar(bb[i]));
                }
                tcpClient.Close();
            }

            catch (Exception ex)
            {
                lblStatus.Text = ("Connected");
                txtaRequest.Text = txtaRequest.Text + "\n" + "Err... " + new DateTime() + " " + ex.StackTrace;
            }
        }

私の現在の質問は次のとおりです。

  1. 私の仮定は正しいですか?そうでない場合、どうすればよいですか?
  2. 上記のコードを使用して保存しようとしましたが、ファイルを取得できませんでした。
  3. アプリケーションを追跡するために、TCP と比較して UDP を使用する利点と欠点は何ですか? よく閲覧しましたが、良いスタートの場所が見つかりませんでした。また、そのようなアプリケーションの経験がないため、アプリケーションをデバッグできませんでした。
4

2 に答える 2

2

適切な回答には製品に関する詳細な知識が必要になるため、これを包括的に回答することは困難です。サポートについては、製造元/再販業者にお問い合わせいただくことをお勧めします。

いくつかの一般的なポイント:

ネットワーク経由でデバイスにコマンドを送信するには、インターネットからデバイスに接続できる必要があります。これは、オペレーターがすべての着信トラフィックをブロックする可能性があるため、GSM ネットワークでは必ずしも簡単ではありません。製造元がこれに対する解決策を提供している場合があります。

デバイスに接続できる場合、コマンドを送信するために使用されるプロトコル (そのようなプロトコルが組み込まれていると仮定) には、応答を受信するためのメカニズムも含まれます。

于 2012-09-10T17:20:44.247 に答える
2

私の現在の質問は次のとおりです。

私の仮定は正しいですか?そうでない場合、どうすればよいですか?

はい、あなたの基本的な仮定は正しいです。サーバーはリッスン ポートを開き、クライアントはこのポートに接続して、必要に応じてデータを削除できます。後で確認するために、サーバーにこれをファイルに記録させることもできます。

上記のコードを使用して保存しようとしましたが、ファイルを取得できませんでした。

ファイルはすでに作成されていますか?システムにファイルが存在しない場合、この方法は失敗します。

アプリケーションを追跡するために、TCP と比較して UDP を使用する利点と欠点は何ですか?

UPD は、ネットワーク設定の点で安価です。それは「速くて汚い」通信方法です。欠点は、すべてのメッセージが適切に配信されるとは限らないことです。一部のアプリケーションでは、これは問題ではなく、このコストに見合うメリットがあります。

今私が変更したいいくつかのこと:

Change IPAddress.Parse(txtIpAddress.Text) to IPAddress.Any

これにより、リスナーは着信メッセージをキャッチする最も幅広い機能を使用できるようになり、他のシステムに影響を与えることはほとんどありません (これは本質的に最初のネットワーク プログラムであるため)。

また、リスナーがスレッドを生成してファイルの書き込みを処理し、リスニングに戻るようにすることもできます。これは非常に標準的な方法であり、サーバーが複数の接続を処理できるようにします。

于 2015-05-11T12:42:22.347 に答える