C# 通过gprs从设备读取信息

C# 通过gprs从设备读取信息,c#,tcp,gprs,C#,Tcp,Gprs,我有一个GPS设备,将安装在许多卡车上。 我可以将设备配置为通过gprs向IP和端口发送数据声明“gps数据,设备id”。 我正在使用TcpListener类读取服务器端的数据 TcpListener server = null; private void listen_data() { Int32 port = controller_port; IPAddress localAddr = IPAddress.Parse(this_ip); server = new Tc

我有一个GPS设备,将安装在许多卡车上。 我可以将设备配置为通过gprs向IP和端口发送数据声明“gps数据,设备id”。 我正在使用
TcpListener
类读取服务器端的数据

TcpListener server = null;
private void listen_data()
{
    Int32 port = controller_port;
    IPAddress localAddr = IPAddress.Parse(this_ip);
    server = new TcpListener(localAddr, port);
    server.Start();
    Byte[] bytes = new Byte[256];
    String data = null;
    while (true)
    {
        Console.Write("Waiting for a connection...-- ");
        TcpClient client = server.AcceptTcpClient();
        Console.Write("Connected!");
        data = null; int i;
        NetworkStream stream = client.GetStream();
        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
        {
            data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
        }
    }
}
该方法正在侦听服务器ip和端口上的内容

  • 我想知道是否已将设备配置为在同一端口上发送到服务器。我是否能够侦听所有设备,或者第一个连接的设备将是唯一的设备

  • 这种方法是从设备读取即将到来的数据的最佳方法吗

  • 我是否需要为每个设备配置不同的端口,并为每个设备端口创建新的侦听线程

  • 有时我会遇到异常“请求通道在等待答复时超时”

  • 非常感谢你的帮助

    1)两者都有。您应该能够侦听所有设备,但您的代码通常无法侦听,因为侦听器线程被占用,等待来自先前连接的设备的流

    2) 可能不会。当对等设备关闭连接时,IIRC,NetworkStream.Read返回0。这是您的协议吗?即设备连接、发送一些数据和断开连接?如果是这样的话,那就行了,尽管速度很慢。无论如何,还有一个问题。您应该将流中接收到的字节连接到数据,而不仅仅是将它们替换为一次通信的-Read()my return多次,甚至每次只返回一个字节(不太可能,但TCP流允许)。您可以保留一个字节计数。到目前为止,请使用“offset”参数执行此操作

    3) 您只需要一个侦听线程,即调用AcceptTcpClient()的线程。此线程不应进行阻止调用以从AcceptTcpClient()返回的套接字接收数据。创建/allocate/depol/anywhere新的客户机-服务器线程,以便为AcceptTcpClient()返回的每个“客户机”套接字运行Read()循环,或者使用异步IO

    4) 您的单个侦听器/读取线程在等待NetworkStream时对新连接没有响应-其他设备将无法连接。侦听器应该快速返回AcceptTcpClient(),而不是等待速度较慢的网络/设备发送数据

    Rgds,
    Martin

    在您的代码中,您正在侦听所有设备,但只有在完成从第一个设备读取所有数据后,您才会收到“请求通道在等待答复时超时”。您应该有不同的线程,每个线程处理一个
    tcpClient

    所以代码应该是这样的:

    TcpListener server = null;
    private void listen_data()
    {
        Int32 port = controller_port;
        IPAddress localAddr = IPAddress.Parse(this_ip);
        server = new TcpListener(localAddr, port);
        server.Start();
        while (true)
        {
            Console.Write("Waiting for a connection...-- ");
            TcpClient client = server.AcceptTcpClient();
            Console.WriteLine("new client connected");
            ThreadPool.QueueUserWorkItem(new WaitCallback(HandleClient), client);//or use Task if 4.0 or new Thread...
        }
    }
    
    private void HandleClient(object tcpClient)
    {
        TcpClient client = (TcpClient)tcpClient;
        Byte[] bytes = new Byte[256];
        String data = null;
        int i;
    
        NetworkStream stream = client.GetStream();
        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
        {
            data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
        }
    
        Console.WriteLine(data);
    }
    

    错误1“System.Threading.ThreadPool.QueueUserWorkItem(System.Threading.WaitCallback)”的最佳重载方法匹配项有一些无效参数,另一个错误错误Error2Argument“1”:无法从“void”转换为“System.Threading.WaitCallback”非常感谢我没有尝试,但已修复了旧的参数。非常感谢