Notice
Recent Posts
Recent Comments
Today
Total
04-26 17:29
Archives
관리 메뉴

Jeongchul Kim

Google Map API 이용 마커(위도,경도) 웹서버 MySQL DB 전송 본문

Android

Google Map API 이용 마커(위도,경도) 웹서버 MySQL DB 전송

김 정출 2016. 2. 27. 18:15


Google Map API 이용 마커(위도,경도) 웹서버 MySQL DB 전송



매 5초마다 찍는 마커(Marker) 의 정보(위도 latitude, 경도 longtitude)를 통해 라이딩에 통계를 위해

아이디(id)와 날짜와 시간(date), 주소(address)를 위해 위도와 경도를 전송할 것입니다.

APP 단에서는 httpUrlConnection을 이용해 서버로 접근하고, 웹 서버의 php문의 쿼리 전송으로

MySQL로 전송할 것입니다.






APP 안드로이드 애플리케이션

DB_Manager

우선 첫째로 Fragment에서 호출할 메소드 정의합니다.

파라미터로 아이디, 날짜/시간, 위도, 경도를 입력받고  변수에 저장합니다.


/* Google Map 라이딩 서버 전송 부분 */

/* -- 아이디, 날짜/시간 위도, 경도를 파라미터로 받는다. */

public ArrayList<String> riding_user_information(String str_user_id, String str_datetime,

                                               String str_latitude, String str_longitude) {

  urlPath = riding_user_information_UrlPath;

  this.str_user_id = str_user_id;

  this.str_datetime = str_datetime;

  this.str_latitude = str_latitude;

  this.str_longitude = str_longitude;


  try {

      results = new RidingPostUser().execute().get();

  } catch ( InterruptedException e ) {

      e.printStackTrace();

  } catch ( ExecutionException e ) {

      e.printStackTrace();

  }

  return results;

}


둘째로 HttpUrlConnection을 전송하는 클래스 정의 입니다.

데이터 전송 시 구분자는 &이며, 아이디, 날짜/시간, 위도, 경도를 전송합니다.

/* -- 문자열로 이루어진 데이터를 서버에 POST 방식으로 전송한다 */

class RidingPostUser extends AsyncTask<Void, Void, ArrayList<String>> {

  @Override

  protected ArrayList<String> doInBackground(Void... voids) {

      // TODO Auto-generated method

      try {

          URL url = new URL(urlPath); // Set url

          HttpURLConnection con = (HttpURLConnection) url.openConnection();

          con.setDoInput(true); // Available Write

          con.setDoOutput(true); // Available Read

          con.setUseCaches(false); // No cash

          con.setRequestMethod("POST");


          /* 구분자는 &이며,

          아이디 str_user_id, 날짜/시간 str_datetime

          위도 str_latitude, 경도 str_longitude 순으로 보낸다.*/

          String param = "str_user_id="+str_user_id+"&str_datetime="+str_datetime+

                  "&str_latitude="+str_latitude+"&str_longitude"+str_longitude;


          OutputStream outputStream = con.getOutputStream();

          outputStream.write(param.getBytes());

          outputStream.flush();

          outputStream.close();


          BufferedReader rd = null;

          ArrayList<String> qResults = new ArrayList<String>();


          rd = new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8"));

          String line = "";

          while((line = rd.readLine()) != null) {

              Log.d("BufferedReader:", line);

              if(line != null) {

                  qResults.add(line);

              }

          }

          return qResults;

      } catch (UnsupportedEncodingException e) {

          e.printStackTrace();

      } catch (IOException e) {

          e.printStackTrace();

      }

      return null;

  }

  protected void onPostExecute(ArrayList<String> qResults) {

      super.onPostExecute(qResults);

  }

}


셋째로 urlpath를 지정해줍니다.

본인 서버의 주소와 이후부터는 디렉터리입니다.

우리는 /www 디렉터리 하위로 user_riding 디렉터리를 생성하고 riding_user_information.php 파일을

작성할 것입니다.


private final String riding_user_information_UrlPath = "http://….../user_riding/riding_user_information.php";



Fragment

Fragment db에 전송을 위한 dbmanager 추가

private DB_Manager dbmanger;

dbmanger = new DB_Manager();


매 5초마다 반복적으로 Marker 찍는 부분에서부터 웹 전송을 보내는 작업을 시작하겠습니다.


btn_timer_start.setOnClickListener(new View.OnClickListener() {

  @Override

  public void onClick(View view) {

time_handler = new Handler() {

  @Override

  public void handleMessage(Message msg) {

………………………………… <- 코딩은 이 부분입니다.

}


유저의 아이디를 가져오기

SharedPreferences를 통해 기존의 아이디를 가져오는 부분입니다.

facebook login API를 사용했기 때문에, facebook으로 로그인했는지, 자체 회원 가입을 통한 로그인인지

알아 내어, id를 가져옵니다.

/** 사용자 id 알아오는 부분 */

SharedPreferences prefs = getActivity().getSharedPreferences("login", 0);

String login = prefs.getString("USER_LOGIN", "LOGOUT");

String facebook_login = prefs.getString("FACEBOOK_LOGIN", "LOGOUT");

String user_id = "";


if(facebook_login.equals("LOGIN")) {

  FacebookSdk.sdkInitialize(rootView.getContext());

  Profile profile = Profile.getCurrentProfile();

  user_id = profile.getId();

}else if(login.equals("LOGIN")) {

  user_id = prefs.getString("USER_ID", "NULL");

}

final String str_user_id = user_id; // inner class 오류를 위한

//Toast.makeText(getActivity(),user_id,Toast.LENGTH_SHORT).show();

/** */


현재 시간

우선 현재 시간을 찍어봅시다.

long now = System.currentTimeMillis();

Date date = new Date(now);

SimpleDateFormat sdfNow = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

String str_datetime = sdfNow.format(date);


위도와 경도

String 클래스의 valueof 메소드를 이용하여 double형 변수를 문자열로 형변환 합니다.

double latitude = gps.getLatitude(); // 위도

double longitude = gps.getLongitude(); // 경도


String str_latitude = String.valueOf(latitude);

String str_longitude = String.valueOf(longitude);


db로 보낼 String 문자열 변수

웹서버 db로 보낼 변수들은 다음과 같습니다. 모두 String 변수 입니다.


아이디 : str_user_id

날짜/시간 str_datetime

위도 str_latitude

경도 str_longitude


자 이제, db_manager를 호출해서 정의했던 메소드를 호출합니다.

dbmanger.riding_user_information(str_user_id,str_datetime,str_latitude,str_longitude);


앱 부분은 완료되었습니다.


Mysql table 생성하기

phpmyadmin으로 접속합니다.


table을 생성합니다.

table은 riding_user_information 으로 하겠습니다.




필드는 str_user_id, str_datetime, str_latitude, str_longitude



저장 버튼을 누릅니다.


Mysql 완료가 되었습니다.



웹 서버 php 작성

putty를 이용해 웹 서버로 접속합니다.

/www 디렉터리에서 mkdir를 이용해 디렉터리를 새로 만듭니다.

vim을 이용해 php문을 작성합니다.


소스 코드는 이러합니다.

필히!! database_name, database_password를 본인db 정보로 변경해주세요!!


<?php

$connect = mysql_connect("localhost", "database_name", "database_password");

// db와 연결을 시도합니다.

if(!$connect) {

     die('Could not connect : '.mysql_error());

}

// db를 선택합니다.

mysql_select_db("smartwheel",$connect);

// 한국어로 입력 가능하도록 설정합니다.

mysql_query("set names utf8");

// INSERT 쿼리 명령어로 테이블에 삽입합니다.

// INSERT INTO 테이블명

// INSERT INTO 테이블명 (필드명,필드명) VALUES (‘$_POST[]’,$_POST[]);

// $_POST[]는 app 또는 web에서 post로 전송한 데이터를 입력받습니다.

$qry = "INSERT INTO riding_user_information (str_user_id, str_datetime, str_latitude, str_longitude) VALUES('$_POST[str_user_id]','$_POST[str_datetime]','$_POST[str_latitude]','$_POST[str_longitude]')";

// 쿼리를 실행합니다.

if(!mysql_query($qry,$connect)) {

     die('Error : '.mysql_error());

}

echo "1 record added";

// db 연결을 닫습니다.

mysql_close($connect);

?>


완료되었습니다.


테스트 해보기

APP을 통해 실행해봅니다.


MySQL 데이터가 잘 삽입되어집니다. str_user_id에는 페이스북 아이디가 들어옵니다.






Comments