슬라이드 1 One M2M Application Android Sample User Guide V2.5

oneM2M-Application-AndroidSample_User_Guide_v2.5

oneM2M-Application-AndroidSample_User_Guide_v2.5

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 81

Open IoT Platform: Mobius, &Cube [IoT 오픈소스 플랫폼 이론 및 실전]
전자부품연구원
박동하 책임
(araha@keti.re.kr)
- Mobius 기반 사물인터넷 응용서비스 개발 방법 -
1
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Agenda
1Android 소개 ……………….. 2
2Android Studio 개발 환경 구성 ……………….. 29
3Web View App 실습 ……………….. 43
4개방형 IoT Platform 연동 App Review ……………….. 50
5App Code Review ……………….. 57
6Generate APK ……………….. 77
2
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
1Android 소개
2Android Studio 개발 환경 구성
3Web View App 실습
4개방형 IoT Platform 연동 App Review
5App Code Review
6Generate APK
3
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android 4대 컴포넌트
1. Activity
모든 화면이 있는 어플리케이션이라면 Activity가 존재하며 Activity가 존재해야만 화면 구성을 할 수 있음.
화면 UI구성하는 View담을 있는 테이블이라고 보면 .
2. Service
서비스는 백그라운드 서비스를 의미. (: 카카오톡 알림)
3. Broadcast Receiver
Android OS 자체와 설치된 App에서 수많은 이벤트가 발생됨.
(Wifi 켜짐, 꺼짐 등 여러 이벤트를 받을 수 있는 역할 수행)
4. Content Provider
Android 데이터 공유 인터페이스.
Android 시스템의 각종 설정 , SD카드 내의 미디어 등에 접근 및 타 어플 접근.
(단 타 어플 접근시 해당 App에서 정의한 수준만 가능)
1 Android 소개
4
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
View
Activity만으로 화면을 보여줄 수 없음
View실질적인 화면임.
Java에는 최상위에는 Object Class 있고 하위 View들로 파생됨.
안드로이드는 계층 구조로 구성되어 있음.
(: ButtonText가 표시될 수 있으므로 TextView 상속받고 있다.
ButtonText관련 기능은 TextView를 상속받아서 구현한다고 보면 됨)
1 Android 소개
5
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
ViewGroup
Activity가 이 모든 것들을 얻을 있는 테이블이라면
ViewGroup 은 일부분의 View들을 담는 그릇.
ViewGroupLayout이라고 부름.
ViewGroup은 또 다른 ViewGroup 담을 수 있음.
ViewGroup안에 여러 ViewGroup을 이중,삼중으로 ViewGroup을 포함할 수 있음.
1 Android 소개
6
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Linear Layout(리니어 레이아웃)
Linear LayoutChild View 일렬로 배치하는 Layout.
안에 배치되는 ViewChild View가 됨.
Layout중에 Relative Layout 함께 가장 많이 사용하는 레이아웃.
Linear Layout 핵심 속성은 orientation.
속성명
layout_width
,
layout_height
fill_parent,
match_parent
fill_parent
match_parent현재 뷰의 크기를 부모의 크기와 맞춘다는 .
fill_parent
는 안드로이드에서 권장하지 않음.
따라서
match_parent를 사용하면 됨.
wrap_content
는 내부 요소에 따라서 크기를 조절함.
wrap_content
orientation
vertical
Child
View를 위에서 아래로 배치
horizontal
Child
View왼쪽에서 오른쪽으로 배치
gravity
center
Child
View를 정 중앙에 배치
center_horizontal
Child
View를 수평 중앙배치
center_vertical
Child
View를 수직 중앙배치
layout_weight
number
화면을
비율로 나눔
1 Android 소개
7
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Linear Layout(리니어 레이아웃)
최상위 xmlns:android="http://schemas.android.com/apk/res/android"
해당 View Group에서 android: 같은 android 속성을 사용하겠다고 정의한 스키마.
1. LinearLayout으로 전체 선언.
2. android:orientation="vertical" 로 하위 Child View를 수직배치.
3. LinearLayoutLinearLayout 두개를 수직배치.
4. LinearLayout Child View수평배치.
5. 두번째 LinearLayout Child View 수직배치.
1 Android 소개
8
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Relative Layout(렐러티브 레이아웃)
LinearLayout 더불어 가장 많이 사용하는 Layout.
LinearLayout 으로 구현할 수도 있지만 Relative Layout이용하면 더욱 쉽게 구현 가능함.
아래와 같이 양쪽에 버튼이 있고 가운데 TextView가 있는 형태에서 양쪽의 버튼은 고정사이즈이면
가운데 Text View는 유동적으로 너비를 줄 경우 필요함.
(이유? : 다양한 사이즈의 Android 환경이 있기에 이런 식으로 Layout 배치해야 깔끔한 UI를 볼 수 있기 때문임)
1 Android 소개
9
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Relative Layout(렐러티브 레이아웃)
[Relative Layout에서 사전 고려 사항]
보통 Layout코드상 먼저 작성한 View먼저 배치된다. 하지만 Relative Layout상대적인 배치를 하기 때문에 순서가 중요함.
View의 입장에서 검은색 배경이 부모 레이아웃인 Relative Layout .
1. 버튼 1을 부모의 왼쪽에 배치
2. 버튼 2를 부모의 오른쪽에 배치
3. Text View를 버튼1의 왼쪽과 버튼2의 오른쪽 부모의 중앙에 배치
이런 순서로 선언해야 하는 이유는?
xml은 순서대로 코드를 파싱되기 때문에
2번과 3번의 순서를 변경하면 Text View를 정렬할 때 버튼2찾을 수 없다고 오류가 발생함.
1 Android 소개
10
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Relative Layout(렐러티브 레이아웃)
버튼 두개에 각각 아이디를 주고 각각 부모의 왼쪽과 오른쪽에 배치.
각 속성은 layout_alignParentLeftlayout_alignParentRight.
Text View는 버튼1의 오른쪽 버튼2 왼쪽에 배치.
(layout_toRightOf, layout_toLeftOf)
Text View 경우 widthmatch_parent로 하여 최대로 주면
버튼1의 오른쪽과 버튼2의 왼쪽에 꽉 차는 레이아웃이 완성됨.
반대의 방법도 가능함.
바로 위에 버튼 아래에 버튼 그리고 남는 공간은 TextView채우는 방법
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent
android:layout_height="wrap_content"
android:background="#000000">
<Button android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="BUTTON1" />
<Button android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="BUTTON2" />
<TextView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/btn1"
android:layout_toLeftOf="@id/btn2"
android:layout_centerVertical="true"
android:text="TextView" android:background="#ffffff" />
</RelativeLayout>
1 Android 소개
11
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Relative Layout(렐러티브 레이아웃)
layout_alignParentTop, layout_alignParentBottom이용해
버튼을 위아래로 배치.
TextView는 버튼1의 아래에 배치 (layout_below) 됨과 동시에
버튼2의 위쪽에 배치(above).
RelativeLayoutLinearLayout
두 가지를 사용하시면 웬만한 구성은 가능.
<RelativeLayout
xmlns:android=http://schemas.android.com/apk/res/android
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000" >
<Button android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:text="BUTTON1" />
<Button android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="BUTTON2" />
<TextView android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/btn1"
android:layout_above="@id/btn2"
android:layout_centerVertical="true"
android:text="TextView" android:background="#ffffff" />
</RelativeLayout>
1 Android 소개
12
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Frame Layout(프레임 레이아웃)
Callback Method?
정의된 특정 상황 시점에 자동으로 호출되는 함수.
(전화번호를 알려주고 끊으면 상대편에서 전화를 하는 것과 같다고 하여 붙은 명칭)
Android 개발 중 CallbackonClick Event 발생시 가장 많이 사용됨.
ListenerCallback Method의 차이
대상 뷰에 해당하는 V(View)를 가지는가 아닌가의 차이.
Callback특정 View 클래스 소속이므로 이벤트 발생 대상이 정해져 있음.
Listener여러 위젯에 의해 공유될 수 있으므로 대상 View누구인지 전달 받아야 .
FrameLayout
FrameLayout 은 여러 개의 View를 겹칠 수 있는 Layout.
) 버튼을 두 개 배치한 후 버튼 클릭 시 View들을 교체하는 레이아웃.
1 Android 소개
13
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Frame Layout(프레임 레이아웃)
버튼 클릭 View들을 교체하는 예.
FrameLayoutOnClickListener이용.
1 Android 소개
14
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Frame Layout(프레임 레이아웃)
[앞 예제 설명]
상단 버튼 너비의 비율을 동일하게 주기 위해 weight이용
버튼의 비율을 너비의 50%씩 주기 위해서 layout_weight = 1
weight는 비중이란 뜻으로 1:1의 비율로 나눠가지겠다는 의미임.
weight를 줄 경우 widthheight0dp로 지정해 줘야 함.
weight의 비중의 방향은 LinearLayoutorientation의 영향을 받음.
View의 기본적인 visibility 속성
Visible: 기본속성으로 보임.
Invisible: 자리는 차지하고 화면에서 보이지 않음.
gone: 보이지도 영역도 차지 않고 사라지게 됨.
FrameLayout은 가장 나중에 선언한 view가 위로 오게 됨.
( Red, Blue, Green )
1 Android 소개
15
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Frame Layout(프레임 레이아웃)
onClick Event
View.OnClickListener interfaceimplements하게 되면
반드시 onClick 구현해야 함.
onClick을 구현하기 위한 2가지 과정.
1. Method 구현 (public void onClick(View v)…)
2. Listener 등록 (btnX.setOnClickListener(this);)
Listener를 통해서 onClick Method를 호출함.
클래스 자체에서 인터페이스를 구현했기 때문에
btn1.setOnClickListener(this)Listener 등록이 가능.
onClick Method에서 클릭을 했을 때
들어오는 ID에 따라서 viewvisibility 바꿔주는 코드.
위의 코드와 XML의 조합으로 버튼 클릭 View가 바뀌게 됨.
1 Android 소개
16
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
* Android OnClick
OnClickMethodOnClickListener interface에 정의되어 있는 Method.
Listener 안에 Method구현해 놓으면 특정 이벤트를 계속 듣고 있다가 이벤트가 발생하는 시점에 Method호출해
ViewOnClickListener에 있는 OnClickMethod를 구현하는 방법 4가지
1. OnClickListener interfaceimplements 하여 Method 구현
2. View의 인자에 바로 Listener구현
3. clickListener을 별도의 객체로 생성하여 set하는 방법
4. xml에서 Method를 선언하고 구현하는 방법
4가지 방법으로 Android OnClick Method를 구현할 수 있으나 4번은 거의 사용하지 않음
1 Android 소개
17
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
* Android OnClick
1) OnClickListener interfaceimplements하여 Method 구현
구현한 Listener를 등록.
주로 Event Lister 많이 작성해야 하는 상황에서 사용됨.
1 Android 소개
18
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
* Android OnClick
2) View의 인자에 바로 Listener구현
1번의 방법과 같이 Android 개방방법에서 가장 많이 사용되는 방식.
구현 이벤트의 수가 적을 경우
Listener를 재사용하지 않을 경우
1 Android 소개
19
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
* Android OnClick
3) Listener를 객체로 선언해두고 set하는 방법
Listener를 재 사용해야 되는 상황에서 많이 사용하는 기법.
Android에서 Listener를 재 사용하는 경우는 많이 없음.
1 Android 소개
20
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
* Android OnClick
4) xml에서 Method를 선언하고 구현하는 방법
xml에 onClick:"onClick1“, onClick:"onClick2" 이라는 코드가 들어감.
여기에 들어가는 onClick1 바로 java 소스에서 작성할 Method 명임.
버튼을 객체로 생성하여
Listerner를 등록하는 과정 없이 바로 Method가 호출됨.
코드가 간결.
구현방법은 기능을 작성하는 Code
View를 담당하는 Layout간의 의존성이 강해지기 때문에 잘 사용하지 않음.
1 Android 소개
21
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Grid Layout(그리드 레이아웃)
GridLayoutGrid는 격자 눈금 등을 뜻함. (바둑판 형식의 레이아웃)
GridLayoutTableLayout과 비슷하나 API14레벨부터 추가된 Layout.
LinearLayout, RelativeLayout, TableLayout 단점을 보완하여 만든 Layout.
메모리 효율이 좋음.
단 계산기 같이 표로 구성되어야 하는 경우 외에는 잘 사용하지 않음.
1 Android 소개
22
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Grid Layout(그리드 레이아웃)
GridLayout 은 간단함.
GridLayout 속성
columnCount = 가로()
rowCount = 세로()
columnSpan = "2" 컬럼합치기
rowSpan = "2" 로우합치기
layout_gravity ="fill_horizontal"
가로가 4개인데 columnSpan="2" 속성을 가진 View를 지정하면
가로 2개의 영역을 할당 받고, 나머지 공간은 2개만 남음.
코드를 보면 다른 버튼은 4개씩 배치되어 있지만 columnSpan="2"인것3개의 라인 코드만 있음.
1 Android 소개
23
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Table Layout(테이블 레이아웃)
GridLayoutTableLayout의 단점을 보완해서 만든 Layout.
TableRow라는 것을 통해서 한 줄 한 줄 구현 해야 .
stretchColumns 옵션으로 특정 컬럼을 자동으로 늘려주는 역할을 수행.
Table를 사용할 일이 있으면 GridLayout 사용하는 것이 더욱 간단하게 구현 가능함.
1 Android 소개
24
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Absolute Layout(앱솔루트 레이아웃)
초기 기기가 적었던 시절은 이 Layout을 사용했지만
다양한 기기들이 나오면서 절대적인 좌표로 구성되는 Absolute Layout사용하지 않음.
Absolute Layoutdeprecated (더 이상 중요도가 떨어져 사용하지 않을 것이며 앞으로 사라지게 될 거라는 뜻)
버튼을 생성하여 특정 좌표로 위치를 지정하는 방식.
1 Android 소개
25
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android TextView and string.xml
View중에서 가장 기본이 되는 ViewTextView
TextViewButtonEditText의 부모 클래스로
Android에서 Text를 표현해주는 기본 View.
TextViewText는 보통 res/strings.xml 선언하여 사용함.
1 Android 소개
26
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android TextView and strings.xml
일반적으로 개발을 할 때는 View영역과 Business Logic영역으로 구분하여 개발함.
View 영역은 틀인 LayoutLayout사용될 Resources 세분화됨.
strings.xml 문자열 resource를 나열해 놓은 xml.
문자열을 resource를 따로 처리하는 이유 ?
관리의 용이성.
재 사용성.
언어별 문자열 표기 기능
부가 설명) xml에 문자열이 고정되어 있다면
언어가 다른 두 개의 국가를 지원해야 할 경우 layout 별도로 생성해 줘야 하지만
문자열을 strings.xml로 관리를 하면 해당 언어별 strings.xml 하나 더 만들면 됨.
1 Android 소개
27
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android TextView and strings.xml
TextView를 만들고 버튼 클릭 시 해당 TextView의 텍스트 속성 변경.
[사용법]
strings.xml 있는 resource를 사용하고자 하면
text부분을 @string/xxxx 로 표현.
dimens.xmltextSize
color.xmltextColor
1 Android 소개
28
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android TextView and strings.xml
- setText : textView의 텍스트를 변경
resource접근 Context통해서 접근
- setTextColor : textView의 색상을 변경
Color.BLACK (Android 기본적인 resource)
- setTextSize : 텍스트 크기를 변경
일부 문자열 속성 변경 (setSpan Method 사용) 통해서 Color변경하고,텍스트 Size변경함
- SpannableStringBuilder 생성
- setSpan Method를 이용하여 문자열의 시작과 끝 인덱스를 이용해 범위를 지정하고, 속성(Color, Size)를 지정함
- textViewsetText를 해주면 텍스트뷰 4번째와 같이 특정 영역만 바뀌게 됨.
많이 사용되는 ) 검색결과에 검색어 색상만 다르게 보여줄 경우.
1 Android 소개
29
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
1Android 소개
2Android Studio 개발 환경 구성
3Web View App 실습
4개방형 IoT Platform 연동 App Review
5App Code Review
6Generate APK
30
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
JDK 설치 및 환경 설정 (이전 방식)
1. Download
http://www.oracle.com/index.html접속하여 Download
2. Java 환경 구성
[내 컴퓨터]-[속성]-[고급]-[환경변수]를 클릭
-환경 변수: 변수 이름/변수 값 : JAVA_HOME / Java 설치 경로
- Java 경로: 변수 이름/수값: Path / Java bin 경로 추가
3. 실행 환경 확인
- WindowsKey+R, cmd 입력 후 확인
- Javac version
- Javac
2 Android Studio 개발 환경 구성
31
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
https://developer.android.com/sdk/index.html ( Android Studio Install …, Java Development Kit 7u79 Install )
Android Studio Install
2 Android Studio 개발 환경 구성
32
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
https://developer.android.com/sdk/index.html ( Android Studio Install …, Java Development Kit 7u79 Install )
Android Studio Install
2 Android Studio 개발 환경 구성
33
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android Studio Install
2 Android Studio 개발 환경 구성
https://developer.android.com/sdk/index.html ( Android Studio Install )
34
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
https://developer.android.com/sdk/index.html ( Android Studio Install )
Android Studio Install
2 Android Studio 개발 환경 구성
35
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android Studio Start
Android Studio 실행
Start a new Android Studio project클릭.
Application nameCompany Domain 입력하면 packge name는 자동으로 생성됨.
2 Android Studio 개발 환경 구성
36
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android Studio Start
Target Android Devices
Phone and Tablet선택하고 Minimun SDKMashmallowAPI 23설정
(해당 어플리케이션은 API 23이상의 모바일만 지원하겠다는 것임)
기본 Activity는 지정. (: Blank Activity를 선택)
2 Android Studio 개발 환경 구성
37
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android Studio Start
Customize the Activity
Activity기타 관련 정보를 입력 후 Finish클릭.
옆의 project를 클릭하면 프로젝트 네비게이션이 나타남.
Project에 보면 Gradle가 있는데 Android StudioGradle BuildTool을 사용함.
2 Android Studio 개발 환경 구성
38
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android Studio Emulator
-상단 메뉴에서 AVD Manager 아이콘 클릭
-기본적으로 Nexus 5 Virtual Device가 생성되어 있음
[신규 Virtual Device 생성 방법]
- Create Virtual Device를 클릭.
- Category Phone선택하여 특정 해상도를 지정 및 선택.
2 Android Studio 개발 환경 구성
39
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android Studio Emulator
시스템 이미지를 선택. Android Virtual Device(AVD) Configuration
AVD 이름과 기타 옵션을 선택함.
AVD 생성 중…
2 Android Studio 개발 환경 구성
40
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android Studio Emulator
AVD 생성 후 우측의 실행 버튼을 클릭
진행 상태 바가 나타나며 Emulator실행됨
Wait… Wait… Wait
2 Android Studio 개발 환경 구성
41
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android Studio Emulator
Android Emulator가 뜨고 Android 가 로딩됨.
Wait… Wait… Wait
로딩 완료
2 Android Studio 개발 환경 구성
42
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Tip: Android Studio Theme Change
2 Android Studio 개발 환경 구성
43
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
1Android 소개
2Android Studio 개발 환경 구성
3Web View App 실습
4개방형 IoT Platform 연동 App Review
5App Code Review
6Generate APK
44
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
New Project
Application Name -> Company Domain -> Project location
3 Web View App 실습
Minimum SDK ( Android 구동 Version )
45
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Activity 화면 선택 및 이름 명명
Empty Activity Activity Name, Layout Name
3 Web View App 실습
46
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Basic Default Code
Activity_main.xml
AndroidManifest.xml
MainActivity.java
AndroidManifest ?
응용 프로그램에 대한 여러 가지 속성정보와
응용 프로그램에 포함 되어있는 각종 컴포넌트를 정의한
명세서 파일
-주로 권한 관련된 지정 가능
-액티비티, 서비스, 리시버 등을 지정함
3 Web View App 실습
47
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
WebView Layout
2
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin
android:paddingBottom="@dimen/activity_vertical_margintools:context=".MainActivity">
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/webView"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"/>
</RelativeLayout>
3 Web View App 실습
48
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
WebView 구성 설정
MainActivity.java
3 Web View App 실습
package com.example.araha.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView = new WebView(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
webView.getSettings().setBuiltInZoomControls(true);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("http://www.naver.com");
setContentView(webView);
}
}
package com.example.araha.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
WebView 설정
-Javascript 사용
-Zoom 기능 사용
-기본 URL 지정
-ContentViewWebView 활성화
49
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Internet Permission 설정
AndroidManifest.xml
3 Web View App 실습
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.araha.myapplication" >
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
50
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
1Android 소개
2Android Studio 개발 환경 구성
3Web View App 실습
4개방형 IoT Platform 연동 App Review
5App Code Review
6Generate APK
51
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Project Import
Android Project Import
4개방형 IoT Platform 연동 App Review
* OCEAN Developers 배포 ( )
[ MobiusTYSampleApp-v2.5 , 2018.5.11]
52
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Project Import
Android/ app/ manifest ( AndroidManifest.xml )
4개방형 IoT Platform 연동 App Review
Android/ app/ res/ layout/ activity_main.xml ( Design )
53
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android USB Driver Install
Samsung USB 통합 Driver Install ( http://local.sec.samsung.com/comLocal/support/down/kies_main.do?kind=usb )
4개방형 IoT Platform 연동 App Review
54
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
USB Debugging Mode on Android
Common Debugging Mode
4개방형 IoT Platform 연동 App Review
55
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
App Running
Android Phone Device Debugging Mode Connect
4개방형 IoT Platform 연동 App Review
56
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
App Running
4개방형 IoT Platform 연동 App Review
초기 화면 Gree LED OnCO2 조회 Blue LED On Green LED Off
Blue LED Off
MQTT Co2 조회
57
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
1Android 소개
2Android Studio 개발 환경 구성
3Web View App 실습
4개방형 IoT Platform 연동 App Review
5App Code Review
6Generate APK
58
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Internet Permission 설정 [ MQTT ]
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="keti.com.mobiusytsampleapp" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="org.eclipse.paho.android.service.MqttService" />
</application>
</manifest>
5 App Code Review
59
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Code Structure Review
5 App Code Review
60
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Code Structure Review [ AE Create or AE Retrieve … Get AE-ID ]
5 App Code Review
※ oneM2M 표준에서는 Android Application 자체도 Application Entity(AE)로 간주하기에
신규로 AE를 생성하거나 생성된 AE를 통해 얻어진 AE-ID를 이용하여 Orginator로 이용해야 함.
실제 AE-ID(aei) 는 서버에 AE 생성 요청시 임의로 생성되어 정의됨.
<?xml version="1.0" encoding="utf-16" standalone="yes"?>
<m2m:ae xmlns:m2m="http://www.onem2m.org/xml/protocols"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
rn="ncubeapp">
<pi>/mobius-yt</pi>
<ty>2</ty>
<ct>20160928T161212</ct>
<ri>/mobius-yt/ncubeapp</ri>
<lt>20160928T161212</lt>
<api>0.2.481.2.0001.001.0001114</api>
<aei>xxxxxx</aei>
<rr>true</rr>
</m2m:ae>
61
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Code Structure Review [ Co2 Retrieve, LED Control ]
5 App Code Review
<?xml version="1.0" encoding="utf-16" standalone="yes"?><m2m:cin
xmlns:m2m="http://www.onem2m.org/xml/protocols"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" rn="4-
20160925130205542urps"><pi>/mobius-yt/ae-edu0/cnt-
co2</pi><ty>4</ty><ct>20160925T130205</ct><ri>/mobius-yt/ae-edu0/cnt-co2/4-
20160925130205542urps</ri><lt>20160925T130205</lt><st>3756</st><mni>9007
199254740991</mni><cs>3</cs><con>719</con></m2m:cin>
<?xml version="1.0" encoding="utf-16" standalone="yes"?><m2m:cin
xmlns:m2m="http://www.onem2m.org/xml/protocols"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" rn="4-
20160925121654339wkyn"><pi>/mobius-yt/ae-edu0/cnt-
led</pi><ty>4</ty><ct>20160925T121654</ct><ri>/mobius-yt/ae-edu0/cnt-
led/4-
20160925121654339wkyn</ri><lt>20160925T121654</lt><st>18</st><mni>9007
199254740991</mni><cs>1</cs><cnf>text</cnf><con>4</con></m2m:cin>
62
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Code Structure Review [ Subscription Content(cnt-co2) Resource Create for MQTT ]
5 App Code Review
<?xml version="1.0" encoding="utf-16" standalone="yes"?><m2m:sub
xmlns:m2m="http://www.onem2m.org/xml/protocols"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
rn="s201609251054113610oz3_rn"><pi>/mobius-yt/ae-edu0/cnt-
co2</pi><ty>23</ty><ct>20160925T133651</ct><ri>/mobius-yt/ae-edu0/cnt-
co2/s201609251054113610oz3_rn</ri><lt>20160925T133651</lt><st>0</st><enc
><net>3</net></enc><nu>mqtt://192.168.25.47/S201609251054113610oz3_sub</
nu><nct>2</nct><cr>S201609251054113610oz3</cr></m2m:sub>
63
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Code Structure Review [ Button Click Event ]
case R.id.btnControl_Green: {
if (((ToggleButton) v).isChecked()) {
ControlRequest req = new ControlRequest("1");
req.setReceiver(new IReceived() {
@Override
public void getResponseBody(final String msg) {
handler.post(new Runnable() {
@Override
public void run() {
textViewData.setText("************** LED Green 제어(켜짐)..”);
}
});
}
});
req.start();
} else {
ControlRequest req = new ControlRequest("2");
req.setReceiver(new IReceived() {
@Override
public void getResponseBody(final String msg) {
handler.post(new Runnable() {
@Override
public void run() {
textViewData.setText("************** LED Green 제어(꺼짐)..”);
}
});
}
});
req.start();
}
break;
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnRetrieve: {
RetrieveRequest req = new RetrieveRequest();
textViewData.setText("");
req.setReceiver(new IReceived() {
@Override
public void getResponseBody(final String msg) {
handler.post(new Runnable() {
@Override
public void run() {
textViewData.setText("************** CO2 조회 ***;
}
});
}
});
req.start();
break;
}
..
.
5 App Code Review
64
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Code Structure Review [ Switch onCheckChanged Event ]
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
if (isChecked) {
Log.d(TAG, "MQTT Create");
MQTT_Create(true);
} else {
Log.d(TAG, "MQTT Close");
MQTT_Create(false);
}
}
/* MQTT Subscription */
public void MQTT_Create(boolean mtqqStart) {
if (mtqqStart && mqttClient == null) {
/* Subscription Resource Create to Yellow Turtle */
SubscribeResource subcribeResource = new SubscribeResource();
subcribeResource.setReceiver(new IReceived() {
public void getResponseBody(final String msg) {
handler.post(new Runnable() {
public void run() { … }
});
}
});
subcribeResource.start();
/* MQTT Subscribe */
mqttClient = new MqttAndroidClient(this.getApplicationContext(), "tcp://" + csebase.getHost()
+ ":" + csebase.getMQTTPort(), MqttClient.generateClientId());
mqttClient.setCallback(mainMqttCallback);
try {
IMqttToken token = mqttClient.connect();
token.setActionCallback(mainIMqttActionListener);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
/* MQTT unSubscribe or Client Close */
mqttClient.setCallback(null);
mqttClient.close();
mqttClient = null;
}
}
5 App Code Review
65
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
RetrieveRequest POSTMAN Script ( CO2 Sensing Data )
5 App Code Review
66
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
RetrieveRequest Java Code Review
private String ServiceAEName = "ae-edu1";
public void GetAEInfo() {
csebase.setInfo("192.168.0.135","7579",“Mobius”,"1883"); //Sample IP
}
/* Retrieve Co2 Sensor */
class RetrieveRequest extends Thread {
private final Logger LOG = Logger.getLogger(RetrieveRequest.class.getName());
private IReceived receiver;
private String ContainerName = "cnt-co2";
public RetrieveRequest(String containerName) {
this.ContainerName = containerName;
}
public RetrieveRequest() {}
public void setReceiver(IReceived hanlder) { this.receiver = hanlder; }
@Override
public void run() {
try {
String sb = csebase.getServiceUrl() + "/" + ServiceAEName + "/" + ContainerName + "/" + "latest";
URL mUrl = new URL(sb);
HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setDoOutput(false);
conn.setRequestProperty("Accept", "application/xml");
conn.setRequestProperty("X-M2M-RI", "12345");
conn.setRequestProperty("X-M2M-Origin", ae.getAEid() );
conn.setRequestProperty("nmtype", "long");
conn.connect();
String strResp = "";
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String strLine= "";
while ((strLine = in.readLine()) != null) {
strResp += strLine;
}
if ( strResp != "" ) {
receiver.getResponseBody(strResp);
}
conn.disconnect();
} catch (Exception exp) {
LOG.log(Level.WARNING, exp.getMessage());
}
}
}
5 App Code Review
67
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
ControlRequest POSTMAN Script ( LED Control )
5 App Code Review
1: Green LED ON
2: Green LED OFF
3: Blue LED ON
4: Blue LED OFF
68
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
ControlRequest Java Code Review
private String ServiceAEName = "ae-edu1";
public void GetAEInfo() {
csebase.setInfo("192.168.0.135","7579",“Mobius","1883");
}
class ControlRequest extends Thread {
private final Logger LOG = Logger.
getLogger
(ControlRequest.class.getName());
private IReceived receiver;
private String container_name = "cnt-led";
public ContentInstanceObject contentinstance;
public ControlRequest(String comm) {
contentinstance = new ContentInstanceObject();
contentinstance.setContent(comm);
}
public void setReceiver(IReceived hanlder) { this.receiver = hanlder; }
@Override
public void run() {
try {
String sb = csebase.getServiceUrl() +"/" + ServiceAEName + "/" + container_name;
URL mUrl = new URL(sb);
HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setInstanceFollowRedirects(false);
conn.setRequestProperty("Accept", "application/xml");
conn.setRequestProperty("Content-Type", "application/vnd.onem2m-res+xml;ty=4");
conn.setRequestProperty("locale", "ko");
conn.setRequestProperty("X-M2M-RI", "12345");
conn.setRequestProperty("X-M2M-Origin", ae.getAEid() );
String reqContent = contentinstance.makeXML();
conn.setRequestProperty("Content-Length", String.valueOf(reqContent.length()));
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.write(reqContent.getBytes());
dos.flush();
dos.close();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String resp = "";
String strLine="";
while ((strLine = in.readLine()) != null) {
resp += strLine;
}
if (resp != "") {
receiver.getResponseBody(resp);
}
conn.disconnect();
} catch (Exception exp) {
LOG.log(Level.SEVERE, exp.getMessage());
}
}
}
5 App Code Review
69
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
ContentInstanceObject Java Code Review ( nmtype - shot name, long name)
public class ContentInstanceObject {
private String content = "";
public void setContent(String contentValue) {
this.content = contentValue; }
public String makeXML() {
String xml = "";
xml += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
xml += "<m2m:cin ";
xml += "xmlns:m2m=\"http://www.onem2m.org/xml/protocols\" ";
xml += "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">";
xml += "<cnf>text</cnf>";
xml += "<con>" + content + "</con>";
xml += "</m2m:cin>";
return xml;
}
}
5 App Code Review
Short Name Type Recommaned
70
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
AE Create POSTMAN Script [ AE-ID ]
5 App Code Review
71
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
AE Create Java Code Review
private String ServiceAEName = "ae-edu1";
public void GetAEInfo() {
csebase.setInfo("192.168.0.135","7579",“Mobius","1883");
ae.setAppName("ncubeapp");
}
class aeCreateRequest extends Thread {
private final Logger LOG = Logger.
getLogger
(aeCreateRequest.class.getName());
String TAG = aeCreateRequest.class.getName();
private IReceived receiver;
int responseCode=0;
public ApplicationEntityObject applicationEntity;
public void setReceiver(IReceived hanlder) { this.receiver = hanlder; }
public aeCreateRequest(){
applicationEntity = new ApplicationEntityObject();
applicationEntity.setResourceName(ae.getappName());
}
public void run() {
try {
String sb = csebase.getServiceUrl();
URL mUrl = new URL(sb);
HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setInstanceFollowRedirects(false);
conn.setRequestProperty("Content-Type", "application/vnd.onem2m-res+xml;ty=2");
conn.setRequestProperty("Accept", "application/xml");
conn.setRequestProperty("locale", "ko");
conn.setRequestProperty("X-M2M-Origin", "S“+ ae.getappName());
conn.setRequestProperty("X-M2M-RI", "12345");
conn.setRequestProperty("X-M2M-NM", ae.getappName() );
String reqXml = applicationEntity.makeXML();
conn.setRequestProperty("Content-Length", String.valueOf(reqXml.length()));
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.write(reqXml.getBytes());
dos.flush();
dos.close();
responseCode = conn.getResponseCode();
BufferedReader in = null;
String aei = "";
if (responseCode == 201) {
// Get AEID from Response Data
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String resp = "";
String strLine;
while ((strLine = in.readLine()) != null) {
resp += strLine;
}
ParseElementXml pxml = new ParseElementXml();
aei = pxml.GetElementXml(resp, "aei");
ae.setAEid( aei );
Log.d(TAG, "Create Get AEID[" + aei + "]");
in.close();
}
if (responseCode != 0) {
receiver.getResponseBody( Integer.toString(responseCode) ); }
conn.disconnect();
} catch (Exception exp) {
LOG.log(Level.SEVERE, exp.getMessage());
}
5 App Code Review
<?xml version="1.0" encoding="UTF-8"?>
<m2m:ae
xmlns:m2m="http://www.onem2m.org/xml/protocols"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
rn="ncubeapp">
<api>0.2.481.2.0001.001.0001114</api>
<rr>true</rr>
</m2m:ae>
72
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
AE Retrieve POSTMAN Script [ AE-ID ]
5 App Code Review
73
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
AE Retrieve Java Code Review
private String ServiceAEName = "ae-edu1";
public void GetAEInfo() {
csebase.setInfo("192.168.0.135","7579",“Mobius","1883");
ae.setAppName("ncubeapp");
}
/* Retrieve AE-ID */
class aeRetrieveRequest extends Thread {
private final Logger LOG = Logger.getLogger(aeCreateRequest.class.getName());
private IReceived receiver;
int responseCode=0;
public aeRetrieveRequest() {
}
public void setReceiver(IReceived hanlder) {
this.receiver = hanlder;
}
@Override
public void run() {
try {
String sb = csebase.getServiceUrl()+"/"+ ae.getappName();
URL mUrl = new URL(sb);
HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setDoOutput(false);
conn.setRequestProperty("Accept", "application/xml");
conn.setRequestProperty("X-M2M-RI", "12345");
conn.setRequestProperty("X-M2M-Origin", "Sandoroid");
conn.setRequestProperty("nmtype", "short");
conn.connect();
responseCode = conn.getResponseCode();
BufferedReader in = null;
String aei = "";
if (responseCode == 200) {
// Get AEID from Response Data
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String resp = "";
String strLine;
while ((strLine = in.readLine()) != null) {
resp += strLine;
}
ParseElementXml pxml = new ParseElementXml();
aei = pxml.GetElementXml(resp, "aei");
ae.setAEid( aei );
Log.d(TAG, "Retrieve Get AEID[" + aei + "]");
in.close();
}
if (responseCode != 0) {
receiver.getResponseBody( Integer.toString(responseCode) );
}
conn.disconnect();
} catch (Exception exp) {
LOG.log(Level.SEVERE, exp.getMessage());
}
}
5 App Code Review
74
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Subscription Resource Create POSTMAN Script
5 App Code Review
75
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Subscription Resource Create Java Code Review
private String ServiceAEName = "ae-edu1";
public void GetAEInfo() {
csebase.setInfo("192.168.0.135","7579",“Mobius","1883");
ae.setAppName("ncubeapp");
}
/* MQTT Subscription */
public void MQTT_Create(boolean mtqqStart) {
if (mtqqStart && mqttClient == null) {
/* Subscription Resource Create to Yellow Turtle */
SubscribeResource subcribeResource = new SubscribeResource();
subcribeResource.setReceiver(new IReceived() {
public void getResponseBody(final String msg) {
handler.post(new Runnable() {
public void run() {
}
});
}
});
subcribeResource.start();
}
/* Subscribe Co2 Content Resource */
class SubscribeResource extends Thread {
private IReceived receiver;
private String container_name = "cnt-co2"; //change to control container name
public ContentSubscribeObject subscribeInstance;
public SubscribeResource() {
subscribeInstance = new ContentSubscribeObject();
subscribeInstance.setUrl(csebase.getHost());
subscribeInstance.setResourceName(ae.getAEid()+"_rn");
subscribeInstance.setPath(ae.getAEid()+"_sub");
subscribeInstance.setOrigin_id(ae.getAEid());
}
public void setReceiver(IReceived hanlder) { this.receiver = hanlder; }
public void run() {
try {
String sb = csebase.getServiceUrl() + "/" + ServiceAEName + "/" + container_name;
URL mUrl = new URL(sb);
HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setInstanceFollowRedirects(false);
conn.setRequestProperty("Accept", "application/xml");
conn.setRequestProperty("Content-Type", "application/vnd.onem2m-res+xml; ty=23");
conn.setRequestProperty("locale", "ko");
conn.setRequestProperty("X-M2M-RI", "12345");
conn.setRequestProperty("X-M2M-Origin", ae.getAEid());
String reqmqttContent = subscribeInstance.makeXML();
conn.setRequestProperty("Content-Length", String.valueOf(reqmqttContent.length()));
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.write(reqmqttContent.getBytes());
dos.flush();
dos.close();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String resp = "";
String strLine="";
while ((strLine = in.readLine()) != null) {
resp += strLine;
}
if (resp != "") {
receiver.getResponseBody(resp);
}
conn.disconnect();
} catch (Exception exp) {
LOG.log(Level.SEVERE, exp.getMessage());
}
}
}
5 App Code Review
76
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
MQTT Client Subscribe, Listener, Callback , Response Java Code Review
5 App Code Review
private String ServiceAEName = "ae-edu1";
public void GetAEInfo() {
csebase.setInfo("192.168.0.135","7579",“Mobius","1883");
ae.setAppName("ncubeapp");
MQTT_Req_Topic = "/oneM2M/req/mobius-yt/"+ae.getAEid()+"_sub"+"/#";
MQTT_Resp_Topic = "/oneM2M/resp/mobius-yt/"+ae.getAEid()+"_sub"+"/json";
}
/* MQTT Subscription */
public void MQTT_Create(boolean mtqqStart) {
if (mtqqStart && mqttClient == null) {
/* Subscription Resource Create to Yellow Turtle */
SubscribeResource subcribeResource = new SubscribeResource();
subcribeResource.setReceiver(new IReceived() {
subcribeResource.start();
/* MQTT Subscribe */
mqttClient = new MqttAndroidClient(this.getApplicationContext(), "tcp://" +
csebase.getHost() + ":" + csebase.getMQTTPort(), MqttClient.generateClientId());
mqttClient.setCallback(mainMqttCallback);
try {
IMqttToken token = mqttClient.connect();
token.setActionCallback(mainIMqttActionListener);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
/* MQTT unSubscribe or Client Close */
mqttClient.setCallback(null);
mqttClient.close();
mqttClient = null;
}
}
/* MQTT Listener */
private IMqttActionListener mainIMqttActionListener = new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
String payload = "";
int mqttQos = 1; /* 0: NO QoS, 1: No Check , 2: Each Check */
MqttMessage message = new MqttMessage(payload.getBytes());
try {
mqttClient.subscribe(MQTT_Req_Topic, mqttQos);
} catch (MqttException e) {
e.printStackTrace();
}
}
};
/* MQTT Broker Message Received */
private MqttCallback mainMqttCallback = new MqttCallback() {
@Override
public void connectionLost(Throwable cause) { Log.d(TAG, "connectionLost"); }
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
Log.d(TAG, "messageArrived");
textViewData.setText("");
textViewData.setText("**** MQTT CO2 실시간 조회 ****\r\n\r\n" +
message.toString().replaceAll(“,”, “\n"));
/* Json Type Response Parsing */
String retrqi = MqttClientRequestParser.
notificationJsonParse
(message.toString());
String responseMessage = MqttClientRequest.
notificationResponse
(retrqi);
/* Make xml for MQTT Response Message */
MqttMessage resmessage = new MqttMessage(responseMessage.getBytes());
try {
mqttClient.publish(MQTT_Resp_Topic, resmessage);
} catch (MqttException e) { e.printStackTrace(); }
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
Log.d(TAG, "deliveryComplete");
}
};
77
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
1Android 소개
2Android Studio 개발 환경 구성
3Web View App 실습
4개방형 IoT Platform 연동 App Review
5App Code Review
6Generate APK
78
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Android Studio Generate APK
1. 메뉴 Build -> Generate Signed APK...
2.1. Key store가 있다면 Choose existing 선택
2.2. Key store가 없다면 Create new 선택
2.2.1. 저장위치 및 파일명 입력,
비밀번호 입력, Alias, Password, Confirm 입력
2.2.2. 필요하면 Certificate 에 인증 정보를 입력
3. Key store password, alias, key password 입력.
(new로 만들었다면 필요한 정보를 채워줌)
4. 디컴파일 방지가 필요하면 ProGuard 체크 아니면 Finish.
5. Show in Explorer 로 생성된 파일을 확인
6 Generate APK
79
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
탐색기를 이용하여 생성된 APK 파일을 스마트폰에 옮김.
스마트폰에서 파일 App실행하여 옮겨진 APK 파일을 실행
Android Studio Generate APK Install
6 Generate APK
80
[IoT 오픈소스 플랫폼 이론 및 실전]
Open IoT Platform: Mobius, &Cube
Thank you
문 의 : 박동하 책임 araha@keti.re.kr
031-789-7580

Navigation menu