GPS/GPRS/GSM を使用した車両追跡システムを開発しています。現在使用しているトラッキング デバイスは、Quectel ([www.quectel.com][1]) の GPS/GPRS/GSM トラッカーである GV100 です。デバイスとバックエンド サーバー間の接続を確立できません。私の質問は特に次のとおりです。
- コマンド (AT コマンド) をサーバーからデバイスに送信するにはどうすればよいですか?
- デバイスからの応答 (レポートと確認メッセージ) を受け入れてデータベースに保存するにはどうすればよいですか?
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;
}
}
私の現在の質問は次のとおりです。
- 私の仮定は正しいですか?そうでない場合、どうすればよいですか?
- 上記のコードを使用して保存しようとしましたが、ファイルを取得できませんでした。
- アプリケーションを追跡するために、TCP と比較して UDP を使用する利点と欠点は何ですか? よく閲覧しましたが、良いスタートの場所が見つかりませんでした。また、そのようなアプリケーションの経験がないため、アプリケーションをデバッグできませんでした。