'통신'에 해당되는 글 3

  1. 2014.09.25 NFC란 ?
  2. 2014.04.09 WebView를 이용해 javascript와 통신하기 (1)
  3. 2013.08.30 httpPost방식으로 웹서버로 데이터 전송하기 (1)
Android/NFC | Posted by 덩치 2014.09.25 11:36

NFC란 ?

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

NFC (Near Field Communication)



RFID(무선 주파수 통신) 기술의 총체로 


카드 모드, 태그 쓰기/읽기 모드, P2P 모드로 사용할 수 있다.




NDEF (NFC Data Exchange Format)


NFC 데이터 교환에 이용되는 데이터 교환 포멧으로 NFC 포럼에서 정의



NDEF Message


기본적인 NFC 데이터 교환 메시지 단위 하나를 NDEF Message라고 한다.


하나의 NDEF Message는 한개 이상의 NDEF Record로 구성되며, 하나의 NDEF Record는 하나의 데이터를 가지고 이를 


'페이로드(payload)' 라고 한다.


개념도


이미지 : http://ibadrinath.blogspot.kr/2012/07/nfc-data-exchange-format-ndef.html




NDEF Record 구성


 항목 길이  설명
 레코드 헤더 (header) 1byte  레코드에 대한 기본적인 정보
 타입 길이 (type length) 1byte 데이터 타입의 길이
 페이로드 길이 (payload length) 1byte 혹은 4byte 페이로드의 길이
 ID 길이 (id length) 1byte ID의 길이
 타입 (type) '타입 길이' byte 레코드가 담고 있는 페이로드의 타입
 ID 'ID 길이' byte 페이로드 ID
 페이로드 (payload) '페이로드 길이' byte 레코드가 담고 있는 페이로드

-표 출처 : http://blog.startnfc.com/entry/NDEF



레코드 헤더(header)의 구성


  헤더 항목 길이  설명
 MB (Message Begin) 1bit NDEF 메시지의 첫 레코드는 이 비트가 1 입니다.
 ME (Message End) 1bit NDEF 메시지의 마지막 레코드는 이 비트가 1입니다. 
 CF (Chunk Flag) 1bit 하나의 페이로드를 여러 개의 레코드로 나누어 전송하는 경우가 있는데, 이때 사용합니다.
 SR (Short Record) 1bit 이 비트가 1이면 '페이로드 길이'의 크기는 1byte이고, 0이면 4byte입니다.
 IL (ID Length) 1bit 레코드 ID가 존재하는 경우 이 비트가 1입니다.
 TNF (Type Name Format) 3bit (별도로 설명)

-표 출처 : http://blog.startnfc.com/entry/NDEF



NDEF Record - 타입(type)과 TNF


인터넷에 존재하는 대부분의 콘텐츠는 MIME 타입으로 구분이 가능하다.


하지만 NFC에서는 MIME 타입 이외에 다른 타입도 포함한다.


TNF는 위와 같은 타입이 어떤 형태로 되어 있는지를 나타낸다.


Android 에서 사용되는 TNF의 종류는 아래와 같다.


TNF_ABSOLUTE_URI

TNF_EMPTY

TNF_EXTERNAL_TYPE
(자세한 사항은 클릭)

3비트 TNF의 구성


 TNF (Type Name Format)  설명
 Empty 0x00 

 비어있는 레코드. 즉, 페이로드가 없음.

 WKT (NFC Forum well-known type)

 0x01

 NFC 포럼에서 정의한 타입 형식. (예: URI, Text, Smart Poster)

 MIME (MIME Media type)

 0x02

 MIME 타입 형식. (예: plain/text, image/jpeg)

 AURI (Absolute URI type)

 0x03

 예를 들어 XML의 경우 URI 형식의 DTD나 XML Schema를 타입으로 사용함. (예: http://www.w3.org/TR/html4/strict.dtd, http://www.w3.org/2000/svg)

 EXT (NFC Forum external type)

 0x04

 NFC 포럼에서 정의한 규칙대로, 임의의 타입 형식을 만들어 사용할 수 있음. (예: startnfc.com:U)

 Unknown 0x05

 알 수 없는 형식의 페이로드. 그냥 byte 덩어리로 취급됨.

 Unchanged

 0x06

 데이터를 여러 조각으로 나누어 전송하는 경우 (chunked record) 이전 레코드의 타입과 같은 타입이라는 것을 나타내기 위해 사용.

 Reserved 0x07

 사용하지 않음.


-표 출처 : http://blog.startnfc.com/entry/NDEF




지금까지 NFC와 핵심 내용에 대한 이론을 알아보았고, 실제 Android에서 NFC를 어떻게 사용하는지 


다음 포스팅에 기술하겠다.




'Android > NFC' 카테고리의 다른 글

NFC 태그 쓰기(Write)  (0) 2014.09.26
NFC 태그 읽기(Read)  (0) 2014.09.26
NFC란 ?  (0) 2014.09.25

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


시작하기 전 주의점 : 빌드타겟 ~16 에서는 정상적으로 작동,

타겟 17이상부터는 호출되는 메소드에 @JavascriptInterface 어노테이션을 반드시 추가 해 주어야함


WebView로 띄운 페이지와 App간에 메시지를 주고 받는 방법에 대해 알아보자.


우선 웹뷰를 생성한다.

WebView mWebView ;

mWebView = (WebView) findViewById(R.id.webview);


그리고  웹뷰의 세팅을 자바스크립트를 사용가능하도록 선언한다 (default : false)

mWebView.getSettings().setJavaScriptEnabled(true);


그리고 자바스크립트로부터 데이터를 전달받을 클래스를 생성 해 준다.


private class AndroidBridge {

    public void setMessage(final String arg) {

    handler.post(new Runnable() {

    public void run() {

    mTextView.setText("받은 메시지 : \n" + arg);

    }

    });

    }

    }


자바스크립트에서 AndroidBridge라는 클래스로 메시지를 보내 줄 수 있게 하기 위해서 다음과 같이 선언한다.

mWebView.addJavascriptInterface(new AndroidBridge(), "android");

이제 자바스크립트에서는 AndroidBridge()에 "android"라는 이름으로 접근할 수 있게 되었다.


그리고 웹뷰에 표시할 url을 셋팅 해 준다.

mWebView.loadUrl("file:///android_asset/javapage.html");


자바스크립트 파일 : 

본인은 프로젝트의 assets 폴더javapage.html 이라는 로컬파일을 만들어서 넣고 해당 경로를 선언했다.

첨부 : 

javapage.html

파일 안의 내용은

<html>

<head>

<script language="JavaScript">

function setMessage(arg) {

 document.getElementById('textMessageFromApp').innerHTML = arg;

function sendMessage(msg){

window.android.setMessage(msg);

}

</script>

<style>

input {

position:absolute; top:100%; margin-top:-80px;

}

</style>

</head>

<body>

<hr/>

<h2>WebView와의 통신</h2>

<hr/>

<br/>

받은 메시지 :

<p id="textMessageFromApp" style="height:200px; overflow-y:auto;"> 

</p>

<hr/>

<input type="text" id="textMessageToApp"  value="App으로 전송"/>

<input type="button" value="Send Message" onclick="sendMessage(document.getElementById('textMessageToApp').value)" style="left:50%;"/>

</body>

</html>


중요한부분은 녹색으로 표시 했고,

자세한건 나머지 소스를 보면서 설명하겠다.


App - > 자바스크립트로 메시지 전달 :


아래 소스코드는 에디트텍스트에 적은 내용을 웹뷰로 날려주는것인데, 버튼클릭리스너 등에서 사용한다.

mWebView.loadUrl("javascript:setMessage('" + mEditText.getText() + "')");


이렇게 메시지를(mEditText.getText() 를 javascript:setMessage( ); 에 날려주게되면,

javapage.html 파일의 setMessage 부분에 arg로 값이 전달된다.


html파일에서는 arg로 값을 받아서 textMessageFromApp이라는 텍스트뷰에 표시해 주고 있다.


자바스크립트 - > App으로 메시지 전달 :

페이지의 버튼을 클릭하면 onclick 안의 내용이 실행되면서 textMessageToApp 텍스트뷰의 내용이

sendMessage를 통해 전달된다. sendMessage 부분을 보면


window.android.setMessage(msg);

이렇게 돼 있는데, 아까전에 위에서

mWebView.addJavascriptInterface(new AndroidBridge(), "android");

라고 인터페이스를 추가한 것을 기억해 보면 초록색 소스코드가 이해될것이다.

자바스크립트에서 android라는 이름으로 setMessage를 해 주는 것이다.


이렇게 되면 안드로이드의 AndroidBridge클래스에서 메시지를 받아서 텍스트뷰의 내용을

자바스크립트에서 보낸 msg로 출력된다.



이상으로 안드로이드와 자바스크립트간의 양방향 메시지 전달 방법에 대해 알아보았다.


예제 프로젝트 :

WebView_Javascript.zip


(참조 : http://blog.daum.net/kwh4865/13153880)




펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

퍼미션은 INTERNET



public void DataSend() {

try{

url = new URI("http://192.168.0.20:8080/testWebapp/Receive.jsp");

new Thread() {

public void run() {

try {

HttpClient httpclient = new DefaultHttpClient();

HttpPost httpPost = new HttpPost(url);

ArrayList<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>();

nameValuePairs.add(new BasicNameValuePair("mark_id", sendMarkId));

nameValuePairs.add(new BasicNameValuePair("store_name", sendName));

nameValuePairs.add(new BasicNameValuePair("latitude", sendLat));

nameValuePairs.add(new BasicNameValuePair("longitude", sendLng));

nameValuePairs.add(new BasicNameValuePair("comments", sendTip));

nameValuePairs.add(new BasicNameValuePair("kind", sendKind));

httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "utf-8"));

httpclient.execute(httpPost);

} catch (Exception e) {

e.printStackTrace();

}

}

}.start();

}catch(Exception e){

Log.e("fureun",e.toString());

}

}