Подключитесь к серверу gps deamon с помощью С#

Я работаю с GPS, подключенным к Raspberry Pi, на котором работает служба gpsd. Я пытаюсь подключиться к сервису с помощью tcp, но не могу заставить его работать. Я также не нахожу никакой документации об этом.

Это код, который у меня есть прямо сейчас:

  private static void Main(string[] args)
  {
        Console.WriteLine($"Trying to connect to {ServerAddress}...");
        var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        client.Connect(ServerAddress, 80);
        var result = new byte[256];
        client.Receive(result);
        Test();
  }

Может кто-нибудь сказать мне, как это делается, или дать мне ссылку на документацию или пример С#.


person kevingoos    schedule 02.08.2016    source источник
comment
Этот ссылка полезен?   -  person    schedule 02.08.2016
comment
Я действительно прочитал веб-сайт, на который вы ссылались, и он очень полезен, когда вы используете python или c++. Но на самом деле он не содержит никакой информации о том, когда вы используете С#.   -  person kevingoos    schedule 02.08.2016
comment
По сути, вы хотите перевести эти примеры C или C++ на C#? Просто чтобы лучше понять: почему вы не можете вызвать C++? Собираетесь ли вы запускать C# (моно) на Raspberry Pi?   -  person    schedule 02.08.2016
comment
То, что я пытаюсь сделать, это создать клиент, который подключается к службе gpsd. Мой клиент — это более крупная программа, которая хочет использовать GPS-местоположение Raspberry Pi (удаленно). Эта программа написана на С# и работает в разных местах.   -  person kevingoos    schedule 02.08.2016
comment
Итак... вы можете использовать стандартный клиент на raspberry pi и создать новую сетевую службу на малине, к которой вы сможете подключиться более стандартным способом из С#. Имеет ли это смысл?   -  person    schedule 02.08.2016
comment
Хорошо, я понимаю, что вы имеете в виду, но я также использую qgis, и мне не нужны дополнительные услуги. Есть ли способ создать программу на С++ и импортировать ее в мой проект С#? Это устранит дополнительную задержку обслуживания   -  person kevingoos    schedule 02.08.2016


Ответы (1)


Посмотрите раздел о примерах C из этого источника.

Основной клиент C — это сокет приемник.

Если вам нужен полнофункциональный клиент, я предлагаю обходной путь в своих первых комментариях.

вы можете использовать стандартный клиент на Raspberry Pi и создать новую сетевую службу на Raspberry, к которой вы сможете подключиться более стандартным способом из С#"

Слушатель С#

В противном случае вы можете попробовать создать просто базовый прослушиватель C#: следуйте msdn Как сделать.

public void createListener()
{
    // Create an instance of the TcpListener class.
    TcpListener tcpListener = null;
    IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];
    try
    {
        // Set the listener on the local IP address 
        // and specify the port.
        tcpListener = new TcpListener(ipAddress, 13);
        tcpListener.Start();
        output = "Waiting for a connection...";
    }
    catch (Exception e)
    {
        output = "Error: " + e.ToString();
        MessageBox.Show(output);
    }
    while (true)
    {
        // Always use a Sleep call in a while(true) loop 
        // to avoid locking up your CPU.
        Thread.Sleep(10);
        // Create a TCP socket. 
        // If you ran this server on the desktop, you could use 
        // Socket socket = tcpListener.AcceptSocket() 
        // for greater flexibility.
        TcpClient tcpClient = tcpListener.AcceptTcpClient();
        // Read the data stream from the client. 
        byte[] bytes = new byte[256];
        NetworkStream stream = tcpClient.GetStream();
        stream.Read(bytes, 0, bytes.Length);
        SocketHelper helper = new SocketHelper();
        helper.processMsg(tcpClient, stream, bytes);
    }
}

Полная, подробная реализация здесь будет неуместна.

Дополнительное примечание

Имейте в виду, что вам нужно спать во время цикла.

Вероятно более простое решение

Однако, на первый взгляд, использование собственных клиентских привязок кажется более простым методом.

Например, gps_read() описывается как

Блокировка чтения данных от демона.

Идея здесь состоит в том, чтобы вызвать оболочка C++ из C# и писать клиентские модульные операции, как описано в этом другом ответе

person Community    schedule 02.08.2016