【问题标题】:Communicating a GPS/GPRS/GSM tracker with the server与服务器通信 GPS/GPRS/GSM 跟踪器
【发布时间】:2012-09-10 12:24:12
【问题描述】:

我正在开发一个使用 GPS/GPRS/GSM 的车辆跟踪系统。我目前使用的追踪设备是 GV100,这是一款来自 Quectel ([www.quectel.com][1]) 的 GPS/GPRS/GSM 追踪器。 我无法在设备和后端服务器之间建立连接。我的问题特别是:

  1. 如何从服务器向设备发送命令(AT 命令)?
  2. 如何接受来自设备的响应(报告和确认消息)以将其保存到数据库中?

我使用MGV100管理工具(移远通信提供的软件)通过串口向设备发送命令。我在支持 GSM 的手机上收到了确认短信。现在,我想从服务器发送消息并在服务器上接受回复(不是通过短信)。我不知道如何发送命令和接收回复。我以前没有开发此类系统的经验。

如果需要的话,如果我能获得示例代码和设置程序,那就太好了。 我在哪里可以获得我提到的案例的相关教程?


谢谢jhonkola


为了了解服务器如何接收和发送数据到设备,我决定首先实现客户端(当前是我的 PC)和服务器之间的通信。虽然我的最终目标是与设备通信,但目前我正在尝试建立从我的 PC 到服务器的连接。如果我成功了,我会努力从需要服务器的IP地址和端口号来发送和接收数据的设备与服务器通信。
这是我的假设:

  • 我可以从.cs代码打开服务器上的一个端口,以便进行通信 使用 TCP/UDP。
  • 然后客户端可以通过这个发送和接收数据 港口。
  • 我可以将客户端发送的数据保存在服务器的文件中 系统并随时查看。 (我没有将数据存储在关系数据库中,因为我现在不想担心数据库问题。) 这就是我尝试实施的方式:
    服务器 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 跟踪应用程序的优点和缺点是什么? 我浏览得很好,但我找不到一个好的开始。而且,由于我没有使用此类应用程序的经验,因此无法调试我的应用程序。

【问题讨论】:

  • 据我了解,跟踪设备似乎是串行设备。我建议将设备通信拆分到一个单独的项目中,您可以在没有 TCP 或 UDT 客户端/服务器代码的情况下专注于项目的该部分。将设备直接连接到您的开发计算机并首先启动它。有很多串行通信的例子。
  • @mergia 你解决了吗?我正在寻找类似的东西。你能帮忙吗?

标签: gprs


【解决方案1】:

我目前的问题是:

我的假设正确吗?如果不是我应该怎么做?

是的,您的基本假设是正确的。服务器将打开一个侦听端口,然后客户端可以连接到该端口并根据需要丢弃数据。您也可以让服务器将此记录到文件中以供以后查看。

我尝试使用上面的代码保存它,但我没有得到 文件。

文件是否已经创建?如果系统上不存在该文件,您的方法将失败。

使用UDP对比TCP有什么优势和劣势 用于跟踪应用程序?

UPD 在网络设置方面的成本较低。这是“快速而肮脏”的沟通方式。缺点是您可能无法正确传递每条消息。在某些应用程序中,这无关紧要,而且这些好处值得付出代价。

现在我要改变几件事:

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

这将使您的听众能够最广泛地捕捉传入的消息,并且很可能不会影响其他系统(因为这实际上是您的第一个网络程序)。

您还需要让您的侦听器生成一个线程来处理文件写入,然后返回侦听。这是一种非常标准的做法,允许服务器处理多个连接。

【讨论】:

    【解决方案2】:

    很难全面回答这个问题,因为一个好的答案需要对产品有详细的了解。我建议您联系制造商/经销商寻求支持。

    几个一般要点:

    通过网络向设备发送命令要求您能够从互联网连接到设备。这在 GSM 网络上并不总是那么容易,因为运营商可能会阻止所有传入流量。制造商可能已经为此提供了解决方案。

    如果您可以连接到设备,则用于发出命令的协议(假设该协议是内置的)也将包含接收任何响应的机制。

    【讨论】:

    • 我很难得到厂商的支持。他们没有提供参考实现。实际上,我手头有他们提供的文档(虽然不详细。)我的问题是我很难设计应用程序的一部分(设备通信服务器)来建立服​​务器和设备之间的通信。实际实施将是我的下一个关注点。我没有网络编程经验。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2013-12-19
    • 2014-04-21
    • 2011-03-30
    • 2011-07-20
    相关资源
    最近更新 更多