Передача GPS данных(NMEA) с Android на Windows



    Введение


    Под windows имеются приложения, которые нуждаются в NMEA сообщениях от GPS устройства, передаваемых по COM порту. Под Android’ом же есть возможность с помощью API генерировать подобные сообщения. В целом была идея доставить данные на виртуальный COM порт с Android’a. Если вам интересно как это удалось реализовать, прошу под кат.


    Что же надо было сделать?


    Реализовать требовалось следующее:
    • Настроить TCP/IP соединение между устройством и ПК
    • Получить NMEA данные на Android’e
    • Передать их по UDP протоколу на компьютер
    • Принять на компьютере UDP пакет и отправить его на COM порт


    TCP/IP соединение


    Соединение было организовано с помощью Revers wired tether, для этого на телефоне были, получены права root и с помощью программки android-wired-tether было создано TCP/IP подключение к ПК. Почему же не по WiFi? Да, такая возможность есть, можно на windows 7 создать виртуальный WiFi адаптер и к нему уже подключится с Android’a. Но мой адаптер Atheros AR5B95 через 5 минут подключения уводил систему в синий экран, поэтому и было решено создать подключение все же по проводу + по нему еще и зарядка устройства происходит, что не мало важно при работе GPS(оно прожорливо в плане питания).

    NMEA данные с Android, получение и отправка


    Данные на Android получались следующим кодом:
    //NMEA listener
    LocationManager LM = (LocationManager) getSystemService(Context.LOCATION_SERVICE); ((LocationManager)getSystemService(Context.LOCATION_SERVICE)).requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,new LocationListener(){
    @Override
    public void onLocationChanged(Location loc) {}
    @Override
    public void onProviderDisabled(String provider) {}
    @Override
    public void onProviderEnabled(String provider) {}
    @Override
    public void onStatusChanged(String provider, int status,Bundle extras) {} });

    LM.addNmeaListener(new GpsStatus.NmeaListener() {
    public void onNmeaReceived(long timestamp, String nmea) {
    SendNmea2UDP(nmea);
    }});

    И передавались в метод SendNmea2UDP который отправлял их на UDP порт ПК:
    public void SendNmea2UDP(String nmeastring)
    {
    message = nmeastring;
    msg_length=message.length();
    messageB = message.getBytes();
    nmeapacket = new DatagramPacket(messageB, msg_length,local,server_port);
    try
    {
    socket.send(nmeapacket);
    }
    catch(Exception e) {}
    }


    NMEA данные на ПК


    Для получения данных и отправку их на COM порт со стороны компьютеры, было на C# написано простенькое приложение.
    С помощью программки Virtual Serial Ports Emulator, было создано два связанных виртуальных COM порта, на один из которых приходили данные от программы на ПК, а на втором виртуальном COM порту их уже можно принимать любым положением, которое в них нуждается.

    Заключение


    Если кому интересен исходный код программ, то он тут на Android и Windows

    В итоге можно запустить программу, которая понимает NMEA данные с COM порта:

    В низу справа программка, которая принимает UDP с Android’a и передает NMEA далее на виртуальный COM порт. Программка upd2com отправляет на 3 порт, а к примеру в данном случае SASПланета принимает с 4 порта (организовано это с помощью VSPE). Красненькая точка это где я сейчас тестирую все это.
    Спасибо за внимание, надеюсь, статья была вам интересна.

    Используемые источники


    NMEA data
    wired_tether_1_4.apk
    Virtual Serial Port Emulator
    UDP listener C# sample
    Tethering и Reverse tethering
    root HTC Desire with HBOT 0.93
    Share post

    Comments 20

      0
      В HTC Desire и так по умолчанию есть tethering выбором опции «Интернет-модем» при подключении к компьютеру. Можно ли использовать это соединение без возни с android-wired-tether?
        +1
        нет, к сожалению. она работает только с активным подключением к интернету(либо wifi либо APN).
        0
        Полюзуюсь вот этой

        отлично работает без бубна)
        +1
        Еще связь можно затунелировать через adb sockets — это работатет на любом телефоне и без рута, правда надо в меню включить USB Debugging.
          0
          можно подробнее?
            +1
            Вон Schmak ниже написал:
            adb forward

            Кстати, при желание можно свой клиент вместо стандартного adb сервера написать — протокол простой довольно и исходники есть.
            Есть, правда, маленький нюанс — на Windows для некоторого железа нужен драйвер, чтоб можно было adb его увидел (под Linux просто добавляется строчка в /etc/udev/rules.d/).
              +1
              А, забыл сказать. Со стороны аппликации на телефоне связь можно сделать напрямую, с помошью LocalServerSocket.
              Со стороны PC чтоб направить это на tcp пишем:
                +1
                (сорри, сообщение случайно ушло недописанное)

                пишем:
                adb forward tcp:4444 localabstract:socketname

                Если написать свой сервер, то даже прослойки из tcp не нужно — данные можно забирать напрямую.
            0
            adb forward udp:55555 udp:55555
            После этого подключение к localhost:55555 будут перенаправляться на соответствующий слушающий порт телефона
              0
              что то сразу как то не прикрутилось:

              D:\Android\android-sdk-windows\tools>adb forward udp:12345 udp:12345
              error: cannot bind socket
              D:\Android\android-sdk-windows\tools>

              Все же спасибо, попробую найти как можно настроить подобный коннект.
                0
                Упс, наврал про udp, в справке про него ничего нет:
                adb forward [local] [remote] - forward socket connections
                forward specs are one of:
                tcp:[port]
                localabstract:[unix domain socket name]
                localreserved:[unix domain socket name]
                localfilesystem:[unix domain socket name]
                dev:[character device name]
                jdwp:[process pid] (remote only)

                Но tcp точно работает нормально.
              0
              Вчера поставил себе Bluetooth GPS — буду пробовать. Бесплатная версия работает по 10 минут, платная стоит 50 рублей. Пока нравится.
              0
              В маркете есть не одна программа (как бесплатные, так и не очень) которые шлют данные по BT или TCP. для проброса ТСР действительно лучше использовать adb. Но в любом случае возня с шнурком и кучей запущенных программ напрягает. С другой стороны — мне не удалось найти ниодной программы которая бы передавала данные по ВТ и не глючила. Может кто посоветует?
                0
                Не буду повторяться — посмотрите мой комментарий чуть выше.
                0
                Эту попробуйте. У меня работает нормально.

              Only users with full accounts can post comments. Log in, please.