Введение
Под 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