검색결과 리스트
글
Tizen Mobile Native App Programming - 네이티브 센서 예제 분석
타이젠의 Web 애플리케이션 제작은 개발자가 약간의 직감으로 마치 안드로이드의 XML을 꾸미듯이 작업을 하는 것이 용이합니다만 Native 단계에서 애플리케이션을 제작하려면 무식하게도 C와 C++을 통해 애플리케이션을 설계해야 하지요. 물론 안드로이드에서도 JAVA 소스코드로 UI를 디자인 하는 경우도 있지만 왠만해선 XML를 많이 사용하긴 하죠.
본 포스팅에서는 타이젠의 Native 애플리케이션의 예제 중 하나인 SensorApp Sample을 예를 들어 설명해 나가도록 하겠습니다.
SensorApp 샘플 애플리케이션은 타이젠 기반의 디바이스 내의 센서들의 동작을 확인할 수 있도록 만들어져있습니다. 일단 실행을 해보면 대략 어떠한 방식으로 애플리케이션이 센서값을 받고 있는지 짐작하실 수 있을 것입니다.
타이젠 SensorApp 예제의 소스코드는 다음과 같이 구성되어 있습니다.(버전은 2.3.3 기준)
각 소스의 내용을 살펴보면 다음과 같습니다.
General
main.c
SensorApp의 시작포인트를 제공합니다. 애플리케이션의 instance를 생성한 후 실행합니다.
main-app.c
애플리케이션 life-cycle을 관리합니다. 애플리케이션의 main window, naviframe, 센서 리스트의 view를 생성합니다.
Utils
logger.h
로고 메시지를 작성하기 위한 매크로를 제공합니다.
color-utils.h
integer 값으로 저장된 color값에 대한 매크로를 제공합니다.
Model
sensor-info.h
각각의 센서에 대한 데이터 타입을 정의합니다.
sensor-list.h
SensorApp에서 제공하는 센서 리스트를 정의합니다.
sensor-magnetic.c
마그네틱 센서의 세기값을 계산하는 알고리즘을 정의합니다.
View
window.c
애플리케이션의 main window를 담당합니다.
sensor-list-view.c
센서의 리스트뷰를 제공합니다.
snesor-data-view.c
센서로부터 받은 데이터값과 그 값을 그래픽으로 표현하는 부분을 담당합니다.
sensor-data-chart.c
기본적인 데이터의 그림 기능을 정의합니다.
snesor-data-chart-private.h
벡터나 앵글값을 나타내는 챠트에 대한 센서 데이터값을 정의합니다.
snesor-vector-chart.c
화살표를 사용한 벡터값을 그려주는 일을 수행합니다.
sensor-angle-chart.c
각도값을 활용하여 pie chart를 그리는 역할을 합니다.
다음은 SensorApp 애플리케이션이 구현되는 과정을 나타내 보겠습니다.
1. 먼저 Sensor API의 헤더를 등록합니다.
1 | #include <sensor.h> | cs |
2. 다음으로 센서의 핸들값과 하드웨어의 정보를 검색합니다.
sensor-list.c 코드 내에 있는 sensor_list_init() 함수는 센서의 핸들값과 하드웨어의 정보를 검색한 후 이를 sensor_info 배열에 저장합니다. 검색된 센서의 정보는 이후 센서 데이터를 표현하는데 사용됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | void sensor_list_init() { sensor_info *info = sensors; sensor_info *end = info + sensor_count; for (; info != end; ++info) { float resolution = 1.0; // Retrieve sensor handle using sensor type sensor_get_default_sensor(info->type, &info->sensor); // Retrieve sensor minimal and maximal values sensor_get_min_range(info->sensor, &info->value_min); sensor_get_max_range(info->sensor, &info->value_max); // Retrieve sensor resolution sensor_get_resolution(info->sensor, &resolution); } } | cs |
<sensor-info.h> 헤더파일은 센서의 리스트와 데이터를 표현하는 데에 사용될 센서에 대한 정보를 저장하기 위한 자료구조를 정의합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | struct _sensor_info { sensor_h sensor; // Sensor handle sensor_type_e type; // Sensor type sensor_unit_e units; // Value measurement units const char *name; // Sensor display name const char **value_names; // Value names array of value_count size int value_count; // Values count float value_min; // Minimal value float value_max; // Maximal value }; | cs |
3. 센서의 유효성을 확인합니다.
sensor-list-view.c 파일은 sensor-list.c 파일에 의해 제공되는 센서 리스트들을 사용하는 elm_list 를 생성합니다. 센서의 리스트들이 채워지는 동안, _list_view_fill() 함수는 sensor_is_supported() 함수를 통해 디바이스의 센서 들이 사용가능한지에 대한 여부를 체크합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | static void _list_view_fill(list_view *view) { unsigned count = 0; const sensor_info *item = sensor_list_get(&count); const sensor_info *end = item + count; RETM_IF(!item, "item is NULL"); for (; item != end; ++item) { bool is_supported = false; // Check whether sensor is supported by device sensor_is_supported(item->type, &is_supported); if (is_supported) { elm_list_item_append(view->list, item->name, NULL, NULL, _list_view_sel_cb, item); } } } | cs |
어떤 센서가 선택되었을 때, _list_view_sel_cb() 함수가 선택된 함수 정보를 보내 센서의 데이터를 찾습니다.
1 2 3 4 5 6 | static void _list_view_sel_cb(void *data, Evas_Object *obj, void *event_info) { sensor_info *item = data; sensor_data_view_create(view->navi, item); } | cs |
4. 센서 데이터를 수신합니다.
센서 데이터의 수신을 시작할 때, _data_view_sensor_start() 함수가 센서의 listener를 등록한 후, 센서의 event callback를 설정한 다음, 센서의 동작을 개시합니다.
1 2 3 4 5 6 7 8 | static void _data_view_sensor_start(data_view *view) { sensor_error_e err = SENSOR_ERROR_NONE; err = sensor_create_listener(view->sensor_info->sensor, &view->sensor_listener); RETM_IF(err != SENSOR_ERROR_NONE, "sensor_create_listener() failed(%d)", err); sensor_listener_set_event_cb(view->sensor_listener, SENSOR_INTERVAL, _data_view_sensor_cb, view); sensor_listener_start(view->sensor_listener); } | cs |
_data_view_sensor_cb() 센서 이벤트 callback 함수가 호출되었을 때, _data_view_value_items_update() 함수가 수신된 센서의 데이터값을 chart에 적용합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | static void _data_view_sensor_cb(sensor_h sensor, sensor_event_s *sensor_data, void *user_data) { data_view *view = user_data; _data_view_value_items_update(view, sensor_data->values); _data_view_extra_items_update(view, sensor_data->values); } static void _data_view_value_items_update(data_view *view, float *values) { bool update_chart = false; // Update genlist items with values received from the sensor for (; item != end; ++item, ++value) { if (item->value != *value) { // Chart MUST be updated if any value has changed update_chart = true; item->value = *value; // Update genlist item part that displays value elm_genlist_item_fields_update(item->obj_item, PART_VALUE, ELM_GENLIST_ITEM_FIELD_TEXT); } } // Update chart if necessary if (view->chart && update_chart) { sensor_data_chart_update(view->chart, view->sensor_info->value_range, view->sensor_info->axes, values, data_view_item_colors, view->sensor_info->value_count); } } | cs |
5. 센서의 동작을 중단합니다.
센서 데이터의 view가 destroy 상태가 되었을 때, 센서의 데이터값 수신을 중단하기 위해, _data_view_destroy_cb() 함수가 sensor_listener_stop() 함수를 호출하고 난 후 sensor_destroy_listener() 함수를 사용하여 listener를 중단시킵니다.
1 2 3 4 5 | static void _data_view_destroy_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { sensor_listener_stop(view->sensor_listener); sensor_destroy_listener(view->sensor_listener); } | cs |
Reference : Tizen Help guide
'공대생의 팁' 카테고리의 다른 글
GFDM(Generalized Frequency Domain Multiplexing) (0) | 2015.06.06 |
---|---|
TIZEN Native 단계에서 LOG를 활용해보자! (0) | 2015.06.05 |
공유기에 연결된 Linux(Ubuntu) 컴퓨터를 외부에서 원격 데스크톱 연결을 통해 조작하기 (6) | 2015.05.07 |
TIZEN 소스코드 빌드 gbs가 설치되지 않을 때 수동으로 설치하기 (0) | 2015.05.02 |
컴퓨터가 대기모드 되자마자 바로 풀릴 때 해결방법 (0) | 2015.04.05 |
설정
트랙백
댓글
글
공유기에 연결된 Linux(Ubuntu) 컴퓨터를 외부에서 원격 데스크톱 연결을 통해 조작하기
최근에는 노트북의 성능도 꽤 좋아진 편이라 한 대만 들고다녀도 어지간한 데스크탑 컴퓨터의 기능은 무리없이 수행할 수 있게 되었습니다만 그럼에도 아직까지는 데스크톱의 성능을 따라가지는 못하는 것이 현실이지요. 그렇다고 해서 데스크탑 컴퓨터를 이리저리 들고다닐 수는 없는 노릇이지요.
이러한 경우를 위해 최근의 운영체제에서는 다른 컴퓨터를 통해 원격으로 조작이 가능한 기능이 구현되어 있는데요 이 원격 기능이 서로 다른 운영체제끼리도 호환이 된다는 점이 있습니다. 그렇기에 자신의 노트북 컴퓨터가 Windows라 하더라도 자신의 집에 있는 데스크탑이 Ubuntu라면 원격접속을 통해 데스크탑 PC를 마치 내 노트북에서 사용하는 듯이 원거리에서 조작이 가능합니다!
이번 포스팅에서는 공유기와 연결되어 있는 Ubuntu 운영체제 데스크톱을 야외 등 외부에서 인터넷을 통해 접속하여 데스크톱을 원격조작하는 방식에 대해 알아보고자 합니다. 그럼 시작해보도록 하겠습니다.
1. 먼저 Ubuntu에 다음 명령어를 입력하여 프로그램을 설치합니다.
$ sudo apt-get install vnc4server xrdp
4. 설치한 프로그램을 바로 적용합니다.
$ sudo service xrdp restart
만약 자신의 컴퓨터가 다른 포트가 설정되어 xrdp와 충돌하게 될 경우 설정을 변경해야 되는 경우가 있습니다. 이는 /etc/xrdp/xrdp.ini 와
/etc/xrdp/sesman.ini 파일을 수정해 주시면 되겠습니다.
/etc/xrdp/xrdp.ini
위 화면의 설정을 보았을 때 현재 [globals]에서 포트번호가 기본으로 3389번으로 설정되어 있습니다. 만약 자신의 환경에서 해당 포트를 다른 곳에서 사용하고 있거나 자신이 설정하고자 하는 다른 포트번호가 있으면 해당 부분을 변경해 주시면 되겠습니다.
3. 아래 명령어를 입력하여 포트가 제대로 설정되었는지 확인합니다.
$ netstat -antp
위의 명령어를 통해 화면에 나오는 것처럼 자신이 설정한 포트가 LISTEN으로 설정되어 있다면 외부에서 접속을 받을 준비가 되었다는 의미입니다.
4. 외부의 원격 조정 요청을 처리하는 부분을 설정해줍니다. Windows버튼 (혹은 우분투 왼쪽 상단 버튼)을 누르신후 한글로 '데스크톱'이라고 입력하시면 '데스크톱 공유'라는 이름의 프로그램이 나타납니다. 해당 프로그램을 실행합니다.
5. 실행시 '데스크톱 공유 기본 설정'창이 나타납니다. 해당 설정을 아래와 같이 해줍니다. 다음으로 외부에서 접속하였을 때 입력할 비밀번호를 설정해주신 후 닫기 버튼을 클릭합니다.
여기까지 진행하셨다면 Ubuntu 데스크톱에서 설정은 모두 끝났습니다. 만약 자신의 데스크톱PC가 인터넷선과 직접적으로 연결되어 있다면 자신의 IP 주소만 기억해두시면 바로 원격조정이 가능합니다만 공유기의 경우 포트포워딩을 통해 공유기와 연결된 데스크탑 PC로 연결될 수 있도록 해주어야 합니다. 포트포워딩에 대해 좀 더 자세히 알고 싶신 분께서는 아래 포스팅을 참조해 주시기 바랍니다.
WF2411 공유기를 통한 외부 기기와 소켓 통신 프로그래밍
http://elecs.tistory.com/45
이번에는 자신의 공유기에 포트포워딩을 설정해줍니다. 본 포스팅에서는 Netis사의 WF2411 공유기를 기준으로 설명하겠습니다. 자신의 공유기를 통한 포트포워딩 설정에 대한 자세한 사항은 공유기 제조사 홈페이지를 참조해주시길 바랍니다.
6. 현재 자신의 PC에 설정된 IP 주소를 확인합니다. 이 과정을 통해 확인하게 되는 IP주소는 공유기가 자신과 연결된 기기에 할당한 가상 IP로서 공유기와 연결된 기기 사이에서만 사용될 수 있는 내부 IP 주소입니다.
$ ifconfig
Terminal을 통해 현재 Ubuntu 데스크탑 컴퓨터가 공유기로부터 192.168.1.9 번의 주소를 할당 받고 있음을 확인하실 수 있습니다. 이 주소를 기억하신 후 포트포워딩 설정시 적용하도록 합니다.
7. 자신의 공유기 설정 모드로 로그인합니다. 일반적으로 공유기 설정 모드에 접속하는 주소는 http://192.168.1.1 입니다.
8. 포트포워딩 메뉴에 들어가신 후 자신의 컴퓨터 환경에 맞추어 접속 포트를 설정해줍니다.
이곳에서 입력하셔야 할 내용은 다음과 같습니다.
내부 IP주소(서버 PC) - 자신의 Ubuntu 데스크탑이 공유기로부터 할당받은 주소값을 입력합니다.
포트번호(외부) - 원격 접속을 할 컴퓨터가 공유기에 접속하게 될 때 사용할 포트 번호를 입력합니다.
포트번호(내부) - 공유기가 Ubuntu 데스크탑으로 접속하게 될 때 사용할 포트번호를 입력합니다. Ubuntu xrdp의 경우 내부 포트 설정 기본값이 3389로 설정되어 있습니다.
여기서 외부 포트번호는 원격접속을 하게 될 컴퓨터가 접속하고자 하는 포트 번호를 입력하고 외부에서 해당 포트번호를 입력하게 되면 공유기는 해당 신호를 내부 IP주소가 설정된 컴퓨터로 내부 포트번호를 통해 접속하게 됩니다. 자세한 사항은 아래 그림을 참조해주시면 되겠습니다.
이미지 출저 : http://documentation.commvault.com/hds/v10/article?p=features/firewall/port_forward_gateway.htm
443번과 444번은 외부 포트번호를 나타내고 있으며 해당 포트 번호로 공유기에 연결을 시도하면 공유기는 이를 해당 색깔과 같은 색깔로 내부 IP주소가 설정된 대로 신호를 전송합니다. 이 때 해당 신호는 내부 포트번호가 440으로 설정된 상황입니다.
9. 이제 자신의 공유기가 외부로부터 할당받은 IP 주소를 확인합니다. 이 또한 자신의 공유기 설정 페이지에서 확인이 가능합니다.
위에서 보셨을 때 WAN IP 주소 부분에 적혀있는 것이 바로 자신의 공유기가 외부에서 할당받은 주소입니다. 앞으로 우리는 위 주소를 통해여 원격 데스크톱에 접속할 것입니다.
이번에는 외부의 컴퓨터를 통해 Ubuntu 데스크톱 컴퓨터를 조종해 보도록 하겠습니다. 먼저 시작(윈도) 버튼을 누르신 후 검색창에 '원격 데스크톱' 을 검색합니다.
'원격 데스크톱 연결' 프로그램을 실행하신 후 Ubuntu 데스크탑과 연결된 공유기의 IP 주소를 입럭하신 후 포트포워딩으로 설정해 두었던 포트번호를 입력하신 후 '연결' 버튼을 클릭합니다.
노란 경고 화면이 등장하면서 연결 여부를 확인합니다. '예(Y)'버튼을 클릭합니다.
아래와 같은 화면이 나온다면 Ubuntu 데스크탑에 연결되는 데에 성공한 것입니다. Module을 'console'로 선택하신 후 우분투에서 '데스크톱 공유 기본설정'시 설정한 비밀번호를 입력합니다.
올바른 비밀번호를 입력하시게 되면 아래와 같이 원격으로 접속된 Ubuntu 데스크탑 화면이 등장하게 됩니다. 이제 여러분들께서 하고자 하는 작업을 원격으로 수행해 보시기를 바랍니다~!
'공대생의 팁' 카테고리의 다른 글
TIZEN Native 단계에서 LOG를 활용해보자! (0) | 2015.06.05 |
---|---|
Tizen Mobile Native App Programming - 네이티브 센서 예제 분석 (0) | 2015.05.26 |
TIZEN 소스코드 빌드 gbs가 설치되지 않을 때 수동으로 설치하기 (0) | 2015.05.02 |
컴퓨터가 대기모드 되자마자 바로 풀릴 때 해결방법 (0) | 2015.04.05 |
우분투에서 인터넷창을 통해 윈도 미디어 플레이어 관련 영상 보는 방법 (0) | 2015.04.04 |
설정
트랙백
댓글
글
TIZEN 소스코드 빌드 gbs가 설치되지 않을 때 수동으로 설치하기
Tizen 개발에 입문하기 위해 프로그램들을 설치하는 과정을 진행하던 도중 참으로 이상한 문제가 발생했습니다. 다음과 같이 우분투 apt-get reopsitory에 Tizen 관련 패키지들을 설치할 수 있도록 환경을 구성한 후 gbs 설치를 시도하려 하였으나 더이상 진행이 되지 않는 것이었습니다.
$ sudo vim /etc/apt/sources.list
deb http://download.tizen.org/tools/latest-release/Ubuntu_14.04 /
$ sudo apt-get update
$ sudo apt-get install gbs
위에서와 같이 gbs를 apt-get을 통해 설치를 시도하니 위에 보는 저 3줄만 덩그러니 뜨기만 하고 설치가 더이상 진행이 되지 않는겁니다. 무언가 제 컴퓨터상의 설정이 잘못되어서 그런지는 잘 모르겠으나 일단 gbs를 설치하셔야 TIZEN 개발환경을 사용하실 수 있습니다. 이 경우 본인은 사이트에 직접 접속하여 소스를 다운로드 받았습니다. 그렇다면 그 방법에 대해 자세히 살펴보도록 합시다.
먼저 아래 주소로 이동합니다. 우분투 운영체제가 12.04일 경우를 기준으로 설명해 드리겠습니다.
http://download.tizen.org/tools/latest-release/Ubuntu_14.04
이 사이트에서 우리들이 설치하고자 하는 패키지를 찾아 설치해보도록 하겠습니다. 현재 우리들이 설치하고자 하는 패키지는 gbs로 해당 패키지를 찾아보도록 하겠습니다.
apt-get에서 자신이 설치하고자 하는 패키지를 찾는 방법은 위의 파일목록 중 'Packages'를 클릭하시면 TIZEN과 관계된 패키지 목록들을 살펴보실 수 있습니다.
위의 화면에서 보시는 바와 같이 Package 명이 gbs인 패키지의 정보를 찾으실 수 있습니다. 여기서 해당 패키지의 경로가 'Filename' 부분에 자세히 표기되어 있습니다. 이 위치에 있는 패키지를 다운로드 받으신 후 자신의 컴퓨터에서 실행해줍시다.
처음 패키지를 실행하게 되면 의존성 문제로 인해 설치가 더이상 진행되지 않습니다. 그렇습니다.. apt-get 명령어를 사용하면 관련 의존성 패키지들이 단 한번에 설치되지만 수동으로 설치하게 되는 경우 이러한 의존성 패키지를 일일히 찾아주어야 하는 상당히 번거로운 과정을 거쳐야 하는 것입니다.
위에서 보이시는 부분에서 '패키지 의존관계가 불충분함:gbs-api(=0.23.2)' 부분에서 해당 패키지를 위 Package 파일에서 해당 패키지를 찾는 과정을 한 번 더 거쳐줍니다.
이러한 방식으로 조금은 불편하고 번거롭습니다만 의존성 파일을 지속적으로 찾아주시면서 설치를 진행하시면 gbs 패키지를 모두 설치하실 수 있을 것입니다. 모두들 패키지를 모두 설치하시고 TIZEN 개발자로서의 첫 걸음을 밟아보시기를 바랍니다!
'공대생의 팁' 카테고리의 다른 글
Tizen Mobile Native App Programming - 네이티브 센서 예제 분석 (0) | 2015.05.26 |
---|---|
공유기에 연결된 Linux(Ubuntu) 컴퓨터를 외부에서 원격 데스크톱 연결을 통해 조작하기 (6) | 2015.05.07 |
컴퓨터가 대기모드 되자마자 바로 풀릴 때 해결방법 (0) | 2015.04.05 |
우분투에서 인터넷창을 통해 윈도 미디어 플레이어 관련 영상 보는 방법 (0) | 2015.04.04 |
우분투 사용중 안보이거나 깨진 언어가 나올 때 언어 설치방법 (0) | 2015.03.26 |