2016년 5월 20일 금요일

Where is my family? - 2편 (android app 만들어서 test 해 보기)

우선 엄마와 아빠 휴대폰에 android 앱을 하나 만들어서 테스트 해 봤다.

30분 만에 급조한 것이라 엄청 간단하다. 동작 방식은,
1. booting 후 자동 실행
2. 위치가 변경 되면 raspberry pi 로 좌표 보내주기 (rest api)

booting 후 자동 실행을 위해 AndroidManifest.xml 에 추가해 줄 것이 있다.
...
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />...
<receiver android:enabled="true" android:name=".BootUpReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter></receiver>...
이렇게 해 준 뒤, BootupReceiver 를 하나 만들어 주면 된다.
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class BootUpReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
      Intent i = new Intent(context, MainActivity.class);
      i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      context.startActivity(i);
   }
}
Location 정보를 획득하는 것은 github 에서 맨처음 찾아지는 코드를 받아서 사용했다.
이 코드를 기반으로 'onLocationChanged' 에다 HttpURLConnection 를 사용해서 raspberry pi 에 logging 하는 코드만 추가 했다. rest server 가 인증 방식을 사용하기 때문에 user-name 과 password 를 넣는 코드를 만들어야 했다.
...
final static String locationURL = "http://rest-server-url";
...
   new Thread() {
      public void run() {
         try {      
            String urlString = locationURL + "location/person=father&lat=" + glocation.getLatitude() + "&lon=" + glocation.getLongitude();
            URL url = new URL(urlString);
            Authenticator.setDefault(new Authenticator() {
               protected PasswordAuthentication getPasswordAuthentication() {
                  return new PasswordAuthentication("username", "password".toCharArray());
               }
            });
            HttpURLConnection c = (HttpURLConnection) url.openConnection();
            c.setUseCaches(false);
            c.connect();
            InputStream is = c.getInputStream();
         } catch (MalformedURLException e) {
            e.printStackTrace();
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }.start();
...
ddns 를 사용하는 집 공유기에 물려 있는 raspberry pi 에서 돌고 있는 rest server 는 'smart home' 과 아들 '알림장 자동알림' 기능을 성실히 수행하고 있는데 이참에 'where is my family' 서버 역할도 하게 됐다.

rest server 의 역할은,
1. 위치 정보를 받으면 logging 한다.
  - logging format 은 '누구 | 위도 | 경도 | 고도' 이고 날짜 postfix 를 붙여서 저장한다.
   예) father-2016-05-20.position 혹은 mother-2016-05-20.position 등등
  - 날짜 로깅 파일의 맨 마지막 위치 정보를 사용하여 map 에 표시해 준다.
2. 지도에 보여준다.
   지난번 google glass 앱 만들 때 사용한 static map api 를 사용하면 가족 모두를 지도에 보여 줄 수 있다.
  - 보여주는 방법은 우리 가족 4명의 좌표를 비교 해서 {minx, miny}, {maxx, maxy} 를 구하고 중간 지점을 center 좌표로 삼고 static map 을 요청한 뒤, 4명 좌표를 marker 로 표시하게 된다.

만든 것도 간단하고, 설명도 간단하니 결과물을 보면 케리비안 베이에는 아빠, 에버랜드에는 엄마가 있는 것을 map 으로 확인할 수 있다.
아빠, 엄마 위치를 marker 로 표시한 capture 화면
우선 테스트로 나와 엄마 휴대폰에 app 을 설치하고 logging 을 했고, static map api 는 'http://maps.googleapis.com/maps/api/staticmap?zoom=16&size=640x640&markers=color:red%7아빠_위도,아빠_경도|엄마_위도,엄마_경도&sensor=false' 를 사용했다.
map 은 raspberry pi 에서 돌고 있는 web server 를 사용했다.

기본 기능은 이정도면 될 것 같다. 이제 기어 S2 앱도 하나 만들고 raspberry pi 기능을 좀 추가 해 주면 완성 될 것 같다.

댓글 없음: