2012. 8. 27. 09:30

본문스크랩 WM에서의 GPS 구동 원리(스마트 폰만의 위치 추적 처리) - 2탄입니다. 비공개 GPS

2011/01/04 16:53 수정 삭제

복사 http://blog.naver.com/mahamaha7777/150100161900

출처 카페 > 스마트폰카페[갤럭시S/아이폰.. | jinhwkim00
원문 http://cafe.naver.com/bjphone/623307

어제 올린글(http://cafe.naver.com/bjphone/620278)이 도움이 되셨다는 분이 많아 하나 더 적어볼렵니다.

 

티옴니아 쓰시는 분들중 전용요금제를 쓰시는 분들은 TMap이 무료라 많이들 사용하시는거 같은데 TMap 사용시에는 GPS잡는 속도가 많이 다르다는 글이 많이 올라오더군요.(전 쇼옴니아라 체험해보지는 못했습니다.)

 

TMap에서는 보통 다른 S/W가 사용하는 GPS와는 다른 방식으로 처리하는 것으로 알고있습니다.

GPS + 현 위치의 기지국 정보를 이용하는 겁니다.

 

전번 글에 XTRA가 퀄컴의 Assisted GPS 기술이라고 말씀드렸는데요, 사실 XTRA는 퀄컴의 GPS관련 기술중 가장 막내(2007년)입니다. XTRA는 원래 Offline 상태에서 단독 사용을 고려해 둔 기술이지요. 이건 최근의 스마트 폰 추세를 반영한게 아닌가 싶습니다.

 

퀄컴의 GPS기술은 gpsOne이라는 상표명을 가지고 있는데 여기에는 MS-assited, MS-based, MS-assited, MS-assited/Hybrid, XTRA Assistance가 그겁니다. (여기서 MS는 마이크로소프트가 아니고 Mobile Station - 기지국을 뜻합니다.)

 

MS-assited 방식은 단말기가 현재 연결된 기지국ID와 현재 수신되고 있는 GPS 신호를 서버에 보냅니다. 서버는 현재의 해당 기지국 근처의 GPS위성들의 정확한 위치와 정확한 시각 등을 항상 유지하고 있으므로 금방 단말기의 위치를 계산할 수 있습니다. 그런 다음 이 좌표를 다시 단말기에 통신으로 보내줍니다. 단 이 방식은 서버와 계속 통신하지 않으면 현 위치를 계속해서 알아낼 수 없습니다. 하지만 단말에는 위치를 계산하기위한 부분이 필요하지 않고 GPS 전파를 수신하는 부분과 전화 모듈만 있으면(단말기의 원가를 최소로 하면서...) 원하는 시점에 위치를 아주 빠르게 파악할 수 있습니다. 친구찾기 등의 서비스와 같이 추적이 필요없이 현재의 위치만 필요로 한 경우 아주 Good입니다.

 

MS-based 방식은 저번글의 XTRA와 비슷한 방식입니다. 현시점의 전체 위성의 궤도 정보를 받아 이를 이용하는 XTRA와 달리 서버에 기지국의 정보를 보내면 서버는 기지국의 위치로 단말의 대략의 위치를 알수 있으므로 그 위치를 기반으로해서 수신이될 만한 위성의 위치 및 정보만을 보내줍니다. XTRA에 비해 훨씬 적지만 더 정확한 정보지요. 이걸 단말이 GPS장치에 전달해주면 GPS는 이 정보를 기반으로 위치를 계산합니다. 예전부터 폰기반의 네비게이션이 이 방식을 이용했고 TMap도 이걸이용하지 않나 싶습니다.

 

MS-assited/Hybrid 방식은 GPS 신호가 없을때 기지국 정보들 만을 가지고 위치를 파악하는 방식입니다. 사실 도심지의 경우 한 위치에서 1개의 기지국의 전파만이 수신되는 경우는 극히 드뭅니다. 하지만 일반적으로 가장 센 전파강도를 가진 기지국에 자신을 등록하고 사용합니다. 위치 계산때는 등록되지 않은 다른 기지국의 정보를 추가적으로 서버에 보냅니다.(기지국ID/전파 강도 등) 그러면 서버는 각 기지국의 정확한 위치와 전파 강도(이걸로 기지국에서 얼마나 떨어졌나를 유추할 수 있습니다) 등을 고려(삼각측량...)하여 단말기의 대략적인 위치를 계산해 낸 후 단말에 알려주는 거지요. 이건 실내에 있을때와 같이 GPS신호를 전혀 수신할 수 없을때 효과적인 방법입니다.

 

퀄컴의 기술을 주로 설명한 가장 큰 이유는 2G까지 우리나라가 CDMA기술을 이용했기 때문입니다. 기지국 정보를 이용하는 위치정보 시스템을 만들기 위해서는 이를 처리 가능한 단말과 관련 서버기술이 필요한데 CDMA특허권을 가지고 있던 퀄컴이 자신의 휴대폰 칩셋의 부가 칩셋으로 gpsOne을 팔면서 해당 시스템까지 울나라 통신사들에게 판거죠. 그래서 우리나라 통신사들은 모두 퀄컴 gpsOne기반의 위치기반시스템을 갖추고 있습니다.

지금은 3G로 넘어오면서 꼭 퀄컴의 칩을 써야할 이유는 없지만, 기존의 CDMA때 구축한 시스템들을 활용하는데는 퀄컴의 칩(gpsOne)들이 필요할껍니다. 또한 우리나라 핸드폰 제작업체(삼성, LG 등)가 가장 잘 아는 칩셋이니 이걸 쓰는게 그다지 손해는 아닐겁니다.

 

이런 기술들을 내가 만드는 어플에 직접 활용할 수 있을까요? 그건 쉽지 않은 듯 합니다. 일단 통신사가 구축한 시스템(서버)에 접속해야 하는 관계로 사용방법이 알려져있지 않습니다. 예전 위피(WIPI - WI-FI가 아닙니다.)시절에도 위치정보를 이용할 수 있는 API는 존재했지만 특별히 허가받은 관련업체와 허가된 어플만이 이 API를 쓸수 있었습니다.

뭐 우리나라가 분단상황이라는 특별한 상황때문에 군사적인 이유로 법률적인 제제도 상당부분 존재합니다.(인정합니다.)

 

사실 아이폰만 없었더라면 그런가부다 하고 대부분의 사람들이 그냥 넘어갔을지도 모릅니다.

 

아이폰...

 

이놈은 제가 설명드린 대부분의 방법을 지가 알아서 그때그때 사용하는 듯 합니다. 거기에 무선랜 AP기반의 위치 추적등 새로운 기술도 포함하고 있다네요... 어플리케이션을 구현할때는 그냥 현재위치 가져다 쓰면 됩니다. GPS를 켜고 뭘하고 이런거 없습니다. OS가 알아서 다해줍니다.

 

솔찍히 부럽습니다. 하지만 좀 기분 나쁜 부분도 있습니다. 어떤원리로 어떻게 위치를 파악하는지 사용자는 고사하고 개발자에게도 안가르쳐줍니다. (그냥 개인적인 관심일 뿐이지만 알고 싶습니다...)

이번에 애플이 위치정보 사업자로 등록 후에야 아이폰이 시판이 가능해진게 기지국 기반의 위치정보 제공과 좀 관계가 있는게아닌가 싶기도 합니다.

 

얘기가 옆으로 많이 샜습니다...

전 IT엔지니어기는 하지만 LBS쪽 전문가는 아니구요, 그냥 개인적으로 좀 관심을 가지고 있는 정도입니다. 최근에 자료 조사 중에 알아낸 내용을 좀 정리해봤습니다만 내용중 틀린 내용이 있을 수도 있을꺼 같구요...

 

어쨌든  GPS와 함께 즐거운 스마트폰 라이프를 즐기세요~~~

 

Posted by hoonihoon
2012. 8. 27. 09:28

본문스크랩 WM에서의 GPS 구동 원리 설명(GPSGate 등의 사용, XTRA, SNTP) 비공개 GPS

2011/01/04 16:49 수정 삭제

복사 http://blog.naver.com/mahamaha7777/150100161588

출처 카페 > 스마트폰카페[갤럭시S/아이폰.. | jinhwkim00
원문 http://cafe.naver.com/bjphone/620278

먼저 WM의 GPS의 구동 원리부터 간단히 설명합니다.

WM 5 버전 이후부터는 GPS의 관리가 OS로 넘어왔습니다. 그 전 버전은 그냥 시리얼포트...

WM에서는 GPS 장치를 위해 2개의 시리얼 포트를 이용합니다. 설정에 보면 프로그램포트와 하드웨어포트가 그겁니다.

이걸 나눠놓은 이유는 기존의 하나의 실제 시리얼 포트를 이용하는경우 한 어플이 이를 선점하면 다른 어플이 열수 없는 구조 때문입니다. 그래서 하드웨어 포트는 실제 GPS장치의 포트를 지정하고 프로그램 포트는 어플들이 공유할 수 있는 가상 시리얼포트입니다.

첫번째 어플이 GPS 프로그램 포트를 열면 GPS가 켜집니다.(레퍼런스 카운트가 1증가) 그 어플이 GPS를 닫으면(레퍼런스 카운트가 0이됨) 아무도 GPS를 사용하지 않으므로 OS는 GPS를 끄겠지요(바로 끄지는 않는것 같습니다만 곧 꺼집니다) 하지만 이 어플이 GPS를 닫기전에 다른 어플이 또다시 GPS를 사용하면 사용 레퍼런스 카운트가 2가되면서 먼저 열었던 어플이 GPS사용을 중지하더라도 GPS가 계속 켜있게 됩니다.

 

GPSGate 또는 그밖에 GPS수신률을 높혀준다는 어플들은 모두 백그라운드에서 계속 켜져있습니다. 당연히 GPS는 꺼지지 않고 계속 켜있게 됩니다.

 

그럼 GPS가 계속 켜져있는 것과 꺼젔다 켜졌다하는것은 어떤 차이가 있을까요?

GPS는 위성에서 온 표준시각 차이를 이용해 위성과 현 위치의 거리를 일아낸 후 3개 이상의 위성에서의 거리로 삼각측량 방식으로 위치를 잡아냅니다. 이를 위해서는 정확한 현재시각을 먼저 알아내야 하는데 여러 위성에서 오는 신호들을 분석해서 각 위성의 위치와 정확한 시각, 거리를 알아냅니다.(좀 복잡합니다. 사실은 저도 완벽히 이해는 못했습니다...) 어쨋든 한번 위치를 잡으면 최소 2개의 위성만 계속 잡혀도 위치를 알아낼 수 있습니다. - 외장 블루투스 GPS로 테스트해보니 밖에서 위치를 잡은상태로 방안에 들어와도 유지가 되는 경우가 주로 이런 경우더군요. 모든 위성이 잡히지 않는 경우에도 이미 현재 시각은 보정을 해놓은 상태이므로 위성신호만 3개이상 잡히면 바로 위치를 다시 잡을 수 있습니다.

하지만 GPS를 끄게되면 앞에서 계산해놓은 현재시각, 위성위치 등의 정보가 날아가버리니 다시 위치를 잡는데 시간이 많이 걸리겠죠.

 

그럼 초기 위치를 잡는데 걸리는 시간에 영항을 주는 다른 요소를 알아보면 XTRA와 SNTP가 있습니다.

XTRA는 Assistant GPS(A-GPS)의 퀄컴 버전입니다. 네트웍을 통해 40kb정도의 데이터를 다운로드 받는데 거기에는 앞으로 약 6일간의 GPS위성들의 궤도 정보가 들어 있습니다. 어떤ID의 위성이 몇시에는 어디에있다는 정보지요. 이걸이용하면 위성의 위치를 파악하는 시간이 줄어들어서 빨리 위치를 잡을 수 있습니다.(http://www.navi4u.com/bbs/view.php?id=lecture&no=79)

또한 현 시각을 정확히 알아내면 위치를 빨리 잡는데 도움이되기때문에 일부 장치(옴니아2포함)에서는 SNTP(Simple Network Time Protocol - 인터넷을 통해 컴퓨터의 시각을 맞추는데 주로 이용합니다.)을 이용하여 시각을 보정합니다. 이건 한번 다운로드 받는게 아니고 데이터를 보내고 받는데 걸리는 시간을 보정해야 하기때문에 34byte 정도의 데이터를 몇번 보내고 받아 정확한 시각을 구합니다.(http://www.networksorcery.com/enp/protocol/sntp.htm)

 

일단 좀 정리해보면 그렇습니다.

 

일부 어플을 사용하면 GPS가 빨리 잡힌다는것은 그 S/W가 GPS 위치를 빨리 잡을 수 있도록 해준다기 보다는 일단 한번 잡으면 GPS를 계속 켜진상태로 유지하도록 해주어서 바로 위치를 잡아내는것 처럼 보이게 한다는겁니다. - 사실은 미리 위치를 잡아 놓았다는게 맞는 말이겠죠.

외장 GPS의 경우 배터리가 내장된 GPS의 경우 계속 켜두면 거의 항상 바로 위치를 잡을 수 있는 것과 동일한 원리입니다.

 

만일 주요 용도가 네비게이션 등 GPS를 많이 사용하신다면 도움이 되겠지만, 그렇지 않은 경우 GPS가 계속 켜져있으므로해서 발생하는 배터리 소모는 한번 생각해 보심이 좋을듯 합니다.

 

긴글 읽어주셔서 감사합니다.

제가 아는 한도내에서 GPS에 대한 내용을 좀 정리했습니다. 사용하시는데 도움이 되셨으면 하네요.

 

Posted by hoonihoon
2012. 8. 27. 09:23
* statusBarPolicy.java 에 브로드케스터가 등록 되어있습니다. (시간,알람,볼륨,gps, 등등 여러가지 아이콘을 바꿀수 있어 보입니다.
 
 private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {

else if (action.equals(GpsLocationProvider.GPS_ENABLED_CHANGE_ACTION) ||
                    action.equals(GpsLocationProvider.GPS_FIX_CHANGE_ACTION)) {
                updateGps(intent);
            }

}
* 이곳이 gps icon를 셋팅 해주는 부분입니다.
 
 private final void updateGps(Intent intent) {
        final String action = intent.getAction();
        final boolean enabled = intent.getBooleanExtra(GpsLocationProvider.EXTRA_ENABLED, false);

        if (action.equals(GpsLocationProvider.GPS_FIX_CHANGE_ACTION) && enabled) {
            // GPS is getting fixes
            mService.updateIcon(mGpsIcon, mGpsFixIconData, null);
            mService.setIconVisibility(mGpsIcon, true);
        } else if (action.equals(GpsLocationProvider.GPS_ENABLED_CHANGE_ACTION) && !enabled) {
            // GPS is off
            mService.setIconVisibility(mGpsIcon, false);
        } else {
            // GPS is on, but not receiving fixes
            mService.updateIcon(mGpsIcon, mGpsEnabledIconData, null);
            mService.setIconVisibility(mGpsIcon, true);
        }
    } 
Posted by hoonihoon
2012. 8. 27. 09:14
package com.lge.gps.notification;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class GPSnotification extends Activity {
    /** Called when the activity is first created. */
 public static final String GPS_FIX_CHANGE_ACTION =
        "android.location.GPS_FIX_CHANGE";
 public static final String EXTRA_ENABLED = "enabled";
 public static final String GPS_ENABLED_CHANGE_ACTION =
        "android.location.GPS_ENABLED_CHANGE";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button gps1 = (Button)findViewById(R.id.Button01);
        Button gps2 = (Button)findViewById(R.id.Button02);
        Button gps3 = (Button)findViewById(R.id.Button03);
        gps1.setOnClickListener(new OnClickListener() {    //fix
   @Override
   public void onClick(View v) {
    // send an intent to notify that the GPS is no longer receiving fixes.
             Intent intent = new Intent(GPS_FIX_CHANGE_ACTION);
             intent.putExtra(EXTRA_ENABLED, true);
             sendBroadcast(intent);
   }
  });
        gps2.setOnClickListener(new OnClickListener() {   //icon 없앰
   
   @Override
   public void onClick(View v) {
    Intent intent = new Intent(GPS_ENABLED_CHANGE_ACTION);
             intent.putExtra(EXTRA_ENABLED, false);
             sendBroadcast(intent);
   }
  });
        gps3.setOnClickListener(new OnClickListener() {   //gps on  깜박깜박
   @Override
   public void onClick(View v) {
    Intent intent = new Intent(GPS_FIX_CHANGE_ACTION);
             intent.putExtra(EXTRA_ENABLED, false);
             sendBroadcast(intent);
   }
  });
        

 
    }
}

'2019년 이전 정리 > GPS' 카테고리의 다른 글

WM에서의 GPS 구동 원리 설명(GPSGate 등의 사용, XTRA, SNTP)  (0) 2012.08.27
GPS 아이콘 BroadcastReceiver  (0) 2012.08.27
GPS Architecture 분석 1  (0) 2011.01.28
GPS Architecture 정리중....  (0) 2011.01.27
XTRA ?  (0) 2011.01.27
Posted by hoonihoon
2011. 1. 28. 12:14
\frameworks\base\services\java\com\android\server\SystemServer.java
init2() 
public static final void init2() {
        Slog.i(TAG, "Entered the Android system server!");
        Thread thr = new ServerThread();
        thr.setName("android.server.ServerThread");
        thr.start();
 }

ServerThread 에는 powermanager, usbobserver, notificationmanager 외에 모든 서비스를 생성하네요.특히 GPS와 관련된  LocationManagerService 을 생성 합니다.
try {
                location = new LocationManagerService(context);
                ServiceManager.addService(Context.LOCATION_SERVICE, location);
            } catch (Throwable e) {
                Slog.e(TAG, "Failure starting Location Manager", e);
   }

LocationManagerService.java
이곳에서는 Cell-ID/WIFI 를 사용할수있는 coogle 패키지 명을 받아 오네요.
/frameworks/base/core/res/res/values/config.xml   이쪽에서 패키지 값을 가져옵니다.

예전에  froyo 버전에서는 @null 값으로 되어있었네요.  이 부분을 다음과 같이 바꿔주시면 됩니다.

<string name="config_networkLocationProvider">com.google.android.location.NetworkLocationProvider</string>

<String name="config_geocodeProvider">com.google.android.location.GeocodeProvider</string>

    public LocationManagerService(Context context) {
        super();
        mContext = context;
        Resources resources = context.getResources();
        mNetworkLocationProviderPackageName = resources.getString(
                com.android.internal.R.string.config_networkLocationProvider);
        mGeocodeProviderPackageName = resources.getString(
                com.android.internal.R.string.config_geocodeProvider);
        mPackageMonitor.register(context, true);

        if (LOCAL_LOGV) {
            Slog.v(TAG, "Constructed LocationManager Service");
        }
    }



SMS 분석 때문에 ... 잠시 정리를 미룰께요...



'2019년 이전 정리 > GPS' 카테고리의 다른 글

GPS 아이콘 BroadcastReceiver  (0) 2012.08.27
GPS 아이콘을 변경 예제  (0) 2012.08.27
GPS Architecture 정리중....  (0) 2011.01.27
XTRA ?  (0) 2011.01.27
Android Location Providers – gps, network, passive  (0) 2011.01.27
Posted by hoonihoon
2011. 1. 27. 15:02
frameworks\base\services\java\com\android\server\LocationManagerService.java

\frameworks\base\services\java\com\android\server\location

android\frameworks\base\services\jni\com_android_server_location_GpsLocationProvider.cpp

frameworks\base\location\java\com\android\internal\location

frameworks\base\location\java\android\location



'2019년 이전 정리 > GPS' 카테고리의 다른 글

GPS 아이콘을 변경 예제  (0) 2012.08.27
GPS Architecture 분석 1  (0) 2011.01.28
XTRA ?  (0) 2011.01.27
Android Location Providers – gps, network, passive  (0) 2011.01.27
what is gpsOne? and gpsOne can operate in 4 modes  (0) 2011.01.27
Posted by hoonihoon
2011. 1. 27. 14:33
 My Location 위치를 알려면 GPS가 위성이 있는 위치를 잡아야 하는데, 위성은 초당 50 Bit 만의 정보를 보낼수 있기 때문에 GPS 를 off 했다고 다시 on 하는 경우 수분의 스타트 시간이 걸릴수도 있습니다. 

 XTRA는 위성의 궤적이 일정하다는 원리에서 착안 하여, 인터넷 서버에 위성 궤적을 기록한 40KB 정도 용량의 파일을 올려 놓으면, 이파일은 다운로드 받고 참조해서 위성의 위치를 보다 빨리 잡아 낼수 있습니다.


XTRA 를 받아 오는 native 함수가 있습니다.
private native void native_inject_xtra_data(byte[] data, int length)

XTRA server 는 제조사에서 정해놓았네요.  gps.conf 파일에 있네요. (소스는 공개 불가능)


My ideas..
 GPS 를 가장 빨리 받는 방법은?  XTRA DATA 를 받아오고  cell ID 를 이용해서 위치를 받은다음에  AGP로 위치를 측정 하면 가장 빠르고 정확한 데이터를 얻을수 있지 않을까 생각해 봅니다.


Posted by hoonihoon
2011. 1. 27. 11:16

Introduction

There are 3 network providers in Android (ranging from 1.5 to 2.2). They are:

  1. gps –> (GPS, AGPS) 
    Name of the GPS location provider. This provider determines location using satellites. Depending on conditions, this provider may take a while to return a location fix. Requires the permission android.permission.ACCESS_FINE_LOCATION.
  2. network –> (AGPS, CellID, WiFi MACID) 
    Name of the network location provider. This provider determines location based on availability of cell tower and WiFi access points. Results are retrieved by means of a network lookup. Requires either of the permissions android.permission.ACCESS_COARSE_LOCATION or android.permission.ACCESS_FINE_LOCATION.
  3. passive –> (CellID, WiFi MACID) 
    A special location provider for receiving locations without actually initiating a location fix. This provider can be used to passively receive location updates when other applications or services request them without actually requesting the locations yourself. This provider will return locations generated by other providers. Requires the permission android.permission.ACCESS_FINE_LOCATION, although if the GPS is not enabled this provider might only return coarse fixes.

This is what Android calls these location providers, however, the underlying technologies to make this stuff work is mapped to the specific set of hardware and telco provided capabilities (network service).

Here is a table that maps/lists the underlying technologies in a different way:

Accuracy

Power Usage

Technology

20ft

High

Autonomous GPS, Provider: gps

  1. uses GPS chip on the device
  2. line of sight to the satellites
  3. need about 7 to get a fix
  4. takes a long time to get a fix
  5. doesn’t work around tall buildings

200ft

Medium – Low

Assisted GPS (AGPS), Provider: network

  1. uses GPS chip on device, as well as assistance from the network (cellular network) to provide a fast initial fix
  2. very low power consumption
  3. very accurate
  4. works without any line of sight to the sky
  5. depends on carrier and phone supporting this (even if phone supports it, and network does not then this does not work)

5300ft / 1mile

Low

CellID lookup/WiFi MACID lookup, Provider: network or passive

  1. very fast lock, and does not require GPS chip on device to be active
  2. requires no extra power at all
  3. has very low accuracy; sometimes can have better accuracy in populated and well mapped areas that have a lot of WiFi access points, and people who share their location with Google

Android layers these underlying techniques and technologies into the 3 network providers listed above. There is no good way know exactly what Android will use, since all phones are different. Eg, on VZW network, the LG Ally does NOT have AGPS! The Droid 2 has all providers (AGPS, GPS, CellID, etc). On ATT network, almost all phones tend to have AGPS enabled by default, etc. Varies by network, by coverage area, and by country, and by device. Also, on VZW, the passive provider ends up using Verizon Location Services, which are very inaccurate (less accurate than 1 mile).


Summary

The best way to handle GPS is to use the “network” or “passive” provider first, and then fallback on “gps”, and depending on the task, switch between providers. This covers all cases, and provides a lowest common denominator service (in the worst case) and great service (in the best case).


copy - ScreamingToaster LLC  

thank you!

'2019년 이전 정리 > GPS' 카테고리의 다른 글

GPS 아이콘을 변경 예제  (0) 2012.08.27
GPS Architecture 분석 1  (0) 2011.01.28
GPS Architecture 정리중....  (0) 2011.01.27
XTRA ?  (0) 2011.01.27
what is gpsOne? and gpsOne can operate in 4 modes  (0) 2011.01.27
Posted by hoonihoon