Smart Product App 과정 PASCal A Team / Bitacademy Java22기
description
Transcript of Smart Product App 과정 PASCal A Team / Bitacademy Java22기
![Page 1: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/1.jpg)
1
Smart Product App 과정
PASCal A Team / Bitacademy Java22기
![Page 2: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/2.jpg)
2
0. 배경
스마트 프로덕트란 ?
스마트 디바이스 + 애플리케이션 스마트 폰 , 스마트 TV 와 같은 스마트 디바이스와 애플리케이션 ( 응용프로그램 ) 의 연결을 통해 소비자에게 제품과 앱 기반 서비스를 동시에 제공하는 융합 제품이다 .글로벌 시장이 형성 중인 신 성장 산업이기도 하다 .
Withings
![Page 3: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/3.jpg)
3
0. 배경
Context Aware Service
사용자 중심 지능화된 서비스기기 주변의 사람 혹은 사물의 변화 (Context) 인지한다 .
그에 따라 사용자에게 최적화된 서비스를 제공한다 .
This way!
Wow!
![Page 4: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/4.jpg)
4
0. 배경
Context Aware Smart Products?
일정 입력 따로 , 기기 설정 따로캘린더 서비스 상의 일정 정보에는 사용자의 상황 정보 (Context) 가 포함 되어 있다일정과는 별도로 휴대폰이나 주변의 스마트 프로덕트 설정을 변경 시켜줘야 한다
![Page 5: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/5.jpg)
5
0. 배경
SmartTags
한번의 탭으로 특정 상황에 최적화 사용자의 변화하는 상황 , 위치 , 욕구에 맞춰 최적화된 기능을 제공하는 App 이다 .
사소하지만 중요한 서비스들을 번거롭게 신경을 쓰지 않고 자동으로 Phone 상태 관리가 가능하다 .
![Page 6: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/6.jpg)
6
0. 배경
Locale
GPS 설정에 따라 활성화사용자가 설정을 원하는 Phone 환경으로 셋팅하여 저장한다 .
설정된 태그의 위치를 지도에서 선택하고 그 지역에 들어가면 설정된 환경으로 Phone 상태를 적용한다 .
![Page 7: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/7.jpg)
7
오늘은 이런 이야기를 합니다0. 배경1. 제안 시스템2. 데모 및 시나리오3.PASCal 구현4. 제안 가능한 비지니스 모델5. 정리
![Page 8: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/8.jpg)
8
1. 제안 시스템
시스템 전개도
![Page 9: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/9.jpg)
9
1. 제안 시스템
설계 방침 및 기술적 과제
구글 캘린더 연동Android 에서 OAuth2.0 통과
Hybrid AppLocal HTML 파일간 데이터 전송
Context Aware ServiceSQLite and Multiple Threads
플랫폼의 확장App 간 메시지 전달
![Page 10: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/10.jpg)
10
2. 데모 및 시나리오
![Page 11: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/11.jpg)
11
3. 구현
시스템 전개도
![Page 12: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/12.jpg)
12
3. 구현
Block Diagram
Android
Linux Kernel / Driver / HW
Java API
Native C / C++ Library DVM
Bluetooth
Activity
Telephony
Location
View
Widget
Graphics
HTTP
PASCal NXT remote
GoogleAdapter
PASCalEngine
Handler
EventImportor
UI
DAO
UI
NXTTalker
Choreography
![Page 13: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/13.jpg)
13
일정 정보 획득 기존 인증 방식OAuth2.0Android 에서의 문제점Solution
![Page 14: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/14.jpg)
14
3.1. 일정 정보 획득
기존 인증 방식
지나치게 많은 권한Client 에 사용자의 ID/PW 가 저장된다 .
Client 는 서버 상의 모든 사용자의 리소스에 접근이 가능하다 .
User
ID/ PW
Account Information
Client Server
![Page 15: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/15.jpg)
15
3.1. 일정 정보 획득
OAuth2.0
제한된 권한ID/PW 대신 Access Token 을 사용한다 .
사용자는 Login 시 Client 가 Server 에서 접근 가능한 리소스 확인 가능하다 .
User
Token Reques
t
Code
OAuth2.0 Server ServerClient
Login & Consent
Exchange Code for
TokenToken
Call API w/ Token
![Page 16: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/16.jpg)
16
3.1. 일정 정보 획득
Android 에서 Google OAuth2.0 사용시 문제점
Code 를 받을 수 없다 !!Google 의 경우 Code 를 사전에 정의된 Redirect URL 로 전달한다 .Redirect URL 에는 구글 상의 주소인 urn:ietf:wg:oauth:2.0:oob 과 Android 기기상의 http://localhost 만 등록 가능하다 .urn:ietf:wg:oauth:2.0:oob 사용시 , 브라우져가 기동되며 App 을 빠져 나가게 된다 .
User
Token Reques
t
Code
OAuth2.0 Server
Google Server
Android
Login & Consent
Exchange Code for
TokenToken
Call API w/ Token
Android 는 http://localhost 가 없다 .
![Page 17: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/17.jpg)
17
3.1. 일정 정보 획득
Solution
URL 에서 code 추출 하기구글에 redirect url 로 http://localhost 를 등록한다 .
사용자 로그인후 , http://localhost?code=xxxxx 의 형태로 code 가 전달된다 .
Android webview client 에서 code 를 추출하여 저장한다 .
public void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);if(url.indexOf("code=")!=-1){
code = url.substring(url.indexOf("code=")+5);try {// Save code…..} catch (IOException e) {
e.printStackTrace();}
}}
![Page 18: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/18.jpg)
18
Hybrid AppHybrid App 이란Local HTML 간의 이동Solution
![Page 19: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/19.jpg)
19
네이티브 앱과 모바일 웹의 장점을 동시에 !겉으로는 네이티브 앱의 모습을 가지고 앱스토어를 통해 배포한다 .
실제 주요 컨텐츠는 브라우저를 기반으로 하는 웹 형태로 서버로부터 정보를 전송한다 .
단말 고유기능 접근 + 유지보수용이 , 비용 절감된다 .
3.2. Hybrid App
Hybrid App 이란
![Page 20: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/20.jpg)
20
JAVA
Local HTML 간의 데이터 전송HTML 은 화면 상의 정보 표시 및 정보 연결의 목적을 지닌다 .
server 를 경유하지 않고 스스로 데이터를 저장하거나 얻을 수 없다 .
server 가 없는 경우 HTML 과 연결된 JavaScript 에서 데이터를 주고 받아야 한다 .
a.html b.html
… Data …
<a href=“b.html”>
JavaScript
3.2. Hybrid App
Local HTML 간의 이동
![Page 21: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/21.jpg)
21
3.2. Hybrid App
location.href.substr보내는 페이지 : window.location.href = 받는 url? 파라미터 = 값의 형태로 전달한다 .(get 방식 )
받는 페이지 : substring 으로 ? 뒤의 파마리터 및 값을 넘겨 받을 수 있다 .
Solution
a.html
b.html
link.js
… Data … <a href=“#”>
Data = location.href.substr
(location.href.lastIndexOf('=') +
1)
window.location.href
=“b.html?Data=”+Data
![Page 22: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/22.jpg)
22
Context Aware ServiceThread 1. EventImportorStatus DiagramThread 2. PascalEngine잘못된 일정 정보Solution
![Page 23: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/23.jpg)
23
3.3.Context Aware Service
Thread 1. EventImportor
calendarlist
Trigger start
go
Clear calendarli
stN
Y
Get schedules
from Google
Parsing schedules
Save schedules
Trigger end
Stop
EventImportor’s cyclecalendarlist 가 존재하면 지운다 .구글에서 Tag 가 있는 일정을 가져와 calendarlist 에
저장한다 .
Exist calendarlist ?
![Page 24: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/24.jpg)
24
PASCalEngine 의 상태 변화
① 일정을 적용하는 상황② 일정이 적용되어 있는 상황③ 평상시로 되돌아가는 상황④ 평상시 핸드폰 상황
3.3.Context Aware Service
Status Diagram
Normal
Activity
① 현 시각 일치 OStatus = Normal
② 현 시각 일치 OStatus = Activity
③ 현 시각 일치 XStatus = Activity
④ 현 시각 일치 XStatus = Normal
![Page 25: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/25.jpg)
25
3.3.Context Aware Service
Thread 2. PascalEngine
Start time< NOW &&NOW < end time?
Status = Activity?
Status = Normal?
Schedule’s Tag ==
Profile Name?
Get schedules
YN
YN
Back again Setting
go
YN
Get Profiles
YN
Fetch Trigger end
Stop
Profile
calendarlist
PascalEngine’s cycleCalenderlist 에서 일정을 가져온다 .
현재시간이 일정의 시작 시간과 끝 시간 사이에 있는지 비교한다 .Status 로 현재 이벤트가 적용중인지 아닌지를 판단한다 .
일정의 태그와 저장한 프로필의 이름이 같은지 확인을 한다 .프로필에 설정된값에 따라 기능을 수행한다 .
![Page 26: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/26.jpg)
26
3.3.Context Aware Service
잘못된 일정 정보
calendarlist
Trigger start
go
Clear calendarli
stN
Y
Get schedules
from Google
Parsing schedules
Save schedules
Trigger end
Stop
Exist calendarlist ?
Start time< NOW &&NOW < end time?
Status = Activity?
Status = Normal?
Schedule’s Tag ==
Profile Name?
YN
YN
Back again Setting
Get schedules
go
YN
Get Profiles
YN
Fetch Trigger end
Stop
Profile
![Page 27: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/27.jpg)
27
3.3.Context Aware Service
Solution
workingFLag 라는 boolean 을 하나 생성하여 두 thread 간의 의사소통이 가능하게 하였다 .workingFlag 가 false 면 EventImporter 가 작업을 시작하였다는 것이고 이때는 PascalEngine 은 일정을 가져오지 않는다 .대신 PascalEngine 은 잠시 후에 다시금 작업을 시도하게끔 하였다 .
public class EventImportor extends Thread {
public void run() {workingFlag =
false;// delete calendarlist// insert calendarlistworkingFlag =
true;SystemClock.sleep();
}}
public class PascalEngine extends Thread {
public void run() {if(workingFlag) {
// ……}
}}
Flag 를 통한 Thread 제어
![Page 28: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/28.jpg)
28
플랫폼의 확장독립된 프로세스Binder 공유BindService 생명주기App 간 상호작용 AIDL
![Page 29: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/29.jpg)
29
3.4. 플랫폼의 확장
독립된 프로세스
PASCal SandboxLinux user ID : 12345
PASCalLinux user ID : 12345
ResourcesLinux user ID : 12345
Network File SMS
Logs DB …
NXT SandboxLinux user ID : 54321
NXTLinux user ID : 54321
ResourcesLinux user ID : 54321
Network File SMS
Logs DB …
SandBox 로 관리되는 AndroidSandBox 란 지원하는 보호된 영역 안에서 프로그램을 실행하는 보안 소프트웨어다 . 프로세스 레벨 보안 , 사용자 및 애플리케이션과 연관되는 그룹 ID 와 같은 Linux 기능과 권한을 사용한다 .Android 애플리케이션은 고유 Linux 프로세스에서 실행되며 고유 사용자 ID 가 지정된다 .
Application 간 분리와 파일 및 디렉토리 , 디바이스 자원에 대한 권한 등을 관리한다 .
![Page 30: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/30.jpg)
30
Binder 공유
Binder 를 통해서 관리리눅서 커널에 있는 Binder 를 통해서 관리된다 .
서비스에 바인딩되면 실행 중에 메서드를 호출할 수 있도록 해 준다 .
바인딩은 원격 제어할 수 있도록 서비스에 연결 하는 것이다 .
PASCal NXT
Android libutil.so
/dev/binder
Service Manager
메모리
User space
Kernel
3.4. 플랫폼의 확장
![Page 31: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/31.jpg)
31
BindService 생명주기
공유 공간 확보 – 바인딩
Linux
Binder
서비스에 바인딩되면 실행 중에 메서드를 호출할 수 있도록 해 준다 .
Binder 는 리눅서 커널에 있는 Binder 를 통해서 관리된다 .
(3)Listener 호출
PASCal
BindService
serviceConnection()
NXT
onBind(…)
3.4. 플랫폼의 확장
(1) 서비스 호출
(2)IBinder 타입 객체 리턴
BindService()->onCreate()->onBind()-> 서비스와 상호작용 ->unBind()->onDestroy()
![Page 32: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/32.jpg)
32
NXT
PlayService
IPlayService.Stub
Binder
BBinder
execTransact()
dance()
dance()
BpBinder
PASCal
PlayManager
IPlayService.Stub.Proxy
BinderProxy
getSystemService()
dance()
dance()
Transact()
(5)dance() 함수 호출
서비스 매니저
ServiceManager
ServiceManagerProxy
BinderProxy
App 간 상호작용
BpBinder
JavaBBinderJNI 네이티브 함수
(1)PlayService 서비스 등록요청
(2) 서비스 등록(4) 서비스 검색
addService()
getService()
ContextManager
(3)PlayService 서비스 검색 요청
Transact()
3.4. 플랫폼의 확장
![Page 33: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/33.jpg)
33
Proxy method Stub method
onTransact()(gen/NXT.java)
NXT.Java
AIDL
더 간편하게데이터를 주고 받기위해서는 Proxy method, onTrnsact(), Stub method 를 구현해야 한다 .
클라이언트에서 서버의 메서드를 호출하게 되면 프록시 메서드에서 onTransact() 에 요청하고 stub 메서드를 통해 함수를 실행시킨다 .
AIDL 컴파일러는 서비스 인터페이스 , 프록시 , 스텁 소스 코드를 자동으로 생성해준다 .
PASCal NXT
AIDL(src/nxt.aidl)
트랜잭션 코드를 통해Stub 메서드 호출
compile
3.4. 플랫폼의 확장
![Page 34: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/34.jpg)
34
AIDL
AIDLAIDL 은 클라이언트에서 사용 가능한 메서드와 필드를 정의하는 인터페이스를 정의AIDL 을 컴파일을 한 java 파일은 gen 폴더 안에 자동 생성된다 . AIDL 서비스가 던진 예외는 서비스 사용자에게 돌아가지 않기 때문에 예외처리를 해주는 것이 좋다 .
package org.jfedor.nxtremotecontrol;
interface NXT{ String dance();}
/* * This file is auto-generated. DO NOT MODIFY.……public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException{ switch (code){ case INTERFACE_TRANSACTION:{ reply.writeString(DESCRIPTOR); return true; } case TRANSACTION_dance:{ data.enforceInterface(DESCRIPTOR); java.lang.String _result = this.dance(); reply.writeNoException(); reply.writeString(_result); return true; }…
NXT.aidlNXT.java
컴파일
동기적인 호출임으로 클라이언트측은 서비스가 결과값을 반환 할 때까지는 동작을 멈추게 된다 .
3.4. 플랫폼의 확장
![Page 35: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/35.jpg)
35
Part 0: ???
비즈니스 모델
Business Model5. 확장성
![Page 36: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/36.jpg)
36
5. 확장성
Home networking service 와의 연계
PASCal
Skifta
iMediaShare
Multimedia sharing
Ezville Smart Home
Samsung Smart Home
Home automation
Home networking service
or@ 기상
@귀가
![Page 37: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/37.jpg)
37
6. 정리
오늘 이야기의 요점은
구글 연동 및 Context Aware Service OAuth2.0 and Multiple Threads HTML5 기반 Hybrid App 구현Local HTML 간 메시지 전송
다양한 서비스와 연계 가능AIDL 을 통한 App 간 메시지 전달
![Page 38: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/38.jpg)
38
![Page 39: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/39.jpg)
39
7.One more thing
Google code
http://code.google.com/p/p-a-s-cal/SVN 을 통한 source code distribution
UML 등 관련 문서가 있으며 ,
Wiki, Issues 등 피드백이 가능하다 .
![Page 40: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/40.jpg)
40
![Page 41: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/41.jpg)
41
![Page 42: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/42.jpg)
42
추가 자료
![Page 43: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/43.jpg)
43
좋은 점들만 합쳐놓을 수는 없을까 ? 불편한 게 한두가지가 아니군 !
특허정보검색서비스 http://portal.kipris.or.kr
0. 배경
특허
![Page 44: Smart Product App 과정 PASCal A Team / Bitacademy Java22기](https://reader036.fdocuments.net/reader036/viewer/2022062305/568150a1550346895dbe9ea6/html5/thumbnails/44.jpg)
44
0. 배경
평가
일정에 따른 상태 자동 변경
확장 가능성
SmartTags
Locale휴대용 통신 단말기를 이용한 일정 관리 방법
이동통신 단말기의 알람 정보 설정 방법 및 장치
일정관리기능이 구비된 이동통신단말기와 그 제어 방법
유지보수 용이
PASCal
X
X
X X X O O
X X X X X O
X X X X O