QT/Embedded와 웹 서버 Qt/Embedded 개요 Qt/Embedded 개발 환경 구축

Slides:



Advertisements
Similar presentations
Term Project Hints Topics Keep-alive CGI Multi-thread Multi-process Event-based.
Advertisements

YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Embedded System Lab. II GUI Programming in Embedded Linux 경희대학교 컴퓨터공학과 조 진 성.
Qt/Embedded & Qtopia. 목 차목 차 1.Embedded Linux GUI Toolkit 2.Qt/Embedded 3.Qtopia 4.Virtual Frame Buffer 5. 개발환경 및 과정 6.Qt/E Application Hello World program.
Qt/Embedded & Qtopia Qt/Embedded & Qtopia 안양대학교 전기전자공학과 서 삼 준.
TCP 서버/클라이언트 동작 원리 - (1) TCP 서버/클라이언트 예 웹 서버 웹 클라이언트 웹 클라이언트
제10장 디바이스 드라이버.
Efl을 이용한 타이젠 네이티브 웨어러블 앱 만들기
제 3 장 변수와 자료형.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
C++ Espresso 제1장 기초 사항.
임베디드 SW 시스템 소개 - 임베디드 운영체제 - 임베디드 리눅스 - 임베디드 인터넷
GTK+ 프로그래밍 (2) SNSLAB 발표 : 문동규.
HTML과 CGI 프로그래밍 PHP 웹 프로그래밍 (PHP Web Programming) 문양세
Understanding of Socket and File I/O
웹 해킹 기초와 실습.
개발 환경 개발 환경 개요 PXA270과 타겟 시스템 툴체인 환경 구축 JTAG 유틸리티 미니컴 Make 유틸리티
제 8 장  파서 생성기 YACC 사용하기.
Department of Computer Engineering
제16장 QT/Embedded.
01. Index StarPlayer API Guide 01. Index 02. 상수값 정의 03. API 정의
Web Server와 DB 연동.
디바이스 드라이버 개요 가상 디바이스드라이버 실습
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
제5장 제어명령
Network Lab. Seoung Hyeon, Lee
QT 프로그래밍 발표: 김래영.
Linux System Programming
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
제  3 장  Lex 사용하기.
FND (Flexible Numeric Display)
10장 메모리 관리.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
Department of Computer Engineering
Embeded 기초 다지기 2015년 10월 26일 intern Sally
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
(ioctl, mmap, fsync&flush)
Department of Computer Engineering
제 3 장 상수와 변수
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
날짜: 팀명: TEAM-SIX 발표자: 이기영
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
BIZSIREN 실명확인서비스 개발 가이드 서울신용평가정보㈜ 신용조회부 (TEL , FAX )
adopted from KNK C Programming : A Modern Approach
HTML.
문자 디바이스 드라이버 임베디드 시스템.
OpenCV 설치 및 구성 OpenCV
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
CGI (Common Gateway Interface)
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
CGI (Common Gateway Interface)
제어문 & 반복문 C스터디 2주차.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
조 병 규 Software Quality Lab. 한국교통대학교
GoAhead Web Server.
자바 5.0 프로그래밍.
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
LOGIN할 때 아이디, 비번 입력 여부 체크하기
C++ Espresso 제13장 입출력과 파일처리.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express Slide 1 (of 28)
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
argc, argv 의 사용방법 #include <stdio.h>
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
C.
PHP 기초문법 PHP를 공부하는데 있어 가장 기초가 되는 PHP기초문법에 대해서 배워 봅니다.
Presentation transcript:

QT/Embedded와 웹 서버 Qt/Embedded 개요 Qt/Embedded 개발 환경 구축 임베디드 웹 서버 임베디드 웹 서버 응용

Qt/Embedded 개요 임베디드 리눅스에서 많이 쓰는 GUI 프로그래밍 도구 Qt/Embedded의 특징 TinyX, GTK, C SDL, C/C++ Qt/Embedded Qt/Embedded의 특징 원시 코드가 공개되어 쉽게 수정해 사용 가능 많은 이미지 형식을 지원하지만 메모리 효율이 좋음 i386, ARM, MIPS, PowerPC 등 다양한 플랫폼 지원 Qt 기반의 코드와 호환성이 양호하고 쉽게 변환 가능 프레임 버퍼를 직접 접근할 수 있고 가속 드라이버를 사용해 성능을 개선 가능 다수의 응용 프로그램을 동시에 실행 가능 다국적 언어 및 유니 코드 지원 풍부한 API 제공 시그널/슬롯 구조 채택

Qt/Embedded 개요 개발 환경 구축을 위해 Qt/Embedded, QVFB, UIC 를 호스트 시스템에 설치 QVFB(Qt Virtual Frame Buffer) X 윈도우에서 프레임 버퍼를 구현해주는 기능 임베디드시스템 환경에서 비디오 카드와는 독립적인 프레임 버퍼를 사용 X 윈도우와 콘솔 상의 화면을 전환할 필요가 없고 화면 갈무리, 화면 확대 및 축소 등도 가능 UIC(User Interface Compiler) Qt 설계자에 의해 XML로 생성된 사용자 인터페이스 정의를 읽어서 C++ 헤더나 소스 파일들을 생성하는 도구

Qt/Embedded 개요 강의 홈페이지에서 다운로드할 파일 Qt/Embedded: qt-embedded-free-3.3.3.tr.bz2 Qt 라이브러리: qt_lib.zip Qt 도구(qvfb, uic): source1.tar

다운로드받은 파일의 압축을 풀고 경로를 재설정, 터치 스크린을 인식하도록 관련 파일을 수정 실습 Qt/Embedded 환경 설정 다운로드받은 파일의 압축을 풀고 경로를 재설정, 터치 스크린을 인식하도록 관련 파일을 수정 ② ③ ④ ⑤ ① ⑥ ⑦ ⑧

실습 Qt/Embedded 환경 설정 ⑥ #gedit ~/.bash_profile ⑧ #gedit src/embedded/qmouselinuxtp_qws.cpp

실습 Qt/Embedded 환경 설정 Makefile 수정. 컴파일 시간이 많이 소요되는 부분 제거 configure 명령을 사용해 ARM용으로 환경을 설정 ① ②

실습 Qt/Embedded 환경 설정 환경 설정을 진행하면서 메시지 출력을 관찰 정상적으로 환경 설정이 끝난 것을 확인 ① ②

라이브러리 압축 파일(qt_lib.zip)을 사용해 libstdc++.so를 심볼릭 링크하고 복사 실습 Qt/Embedded 라이브러리와 도구 설치 라이브러리 압축 파일(qt_lib.zip)을 사용해 libstdc++.so를 심볼릭 링크하고 복사 ② ③ ④ ⑤ ① ⑥

QVFB와 UIC 도구를 사용할 수 있도록 Qt/Embedded의 bin 디렉토리에 설치 ② ③ ④ ⑤ ① ⑥

Qt/Embedded의 홈 디렉토리로 이동한 후 Make 유틸리티를 사용해 컴파일 컴파일 결과

실습 Qt/Embedded 라이브러리와 도구 설치 정상적으로 컴파일되었는지 확인 ② ③ ①

호스트 시스템에서 생성한 Qt/Embedded 자원을 NFS 마운트 디렉토리 /mnt/nfs_host로 복사 실습 NFS를 이용한 Qt/Embedded실행 환경의 타겟 시스템 탑재 호스트 시스템에서 생성한 Qt/Embedded 자원을 NFS 마운트 디렉토리 /mnt/nfs_host로 복사 ② ③ ④ ⑤ ① ⑥

NFS 마운트 디렉토리 공유 설정 파일인 /etc/exports 파일이 다음 내용을 포함하도록 편집 실습 NFS를 이용한 Qt/Embedded실행 환경의 타겟 시스템 탑재 NFS 마운트 디렉토리 공유 설정 파일인 /etc/exports 파일이 다음 내용을 포함하도록 편집 /mnt/nfs_host 192.168.233.200(rw,sync,no_root_squash) 호스트 시스템에 NFS 데몬을 재실행

타겟 시스템에 마운트하고, Qt 라이브러리를 위한 심볼릭 링크를 생성 실습 NFS를 이용한 Qt/Embedded실행 환경의 타겟 시스템 탑재 타겟 시스템에 마운트하고, Qt 라이브러리를 위한 심볼릭 링크를 생성 ② ③ ④ ⑤ ① ⑥

Qt/Embedded 응용 프로그램(main.cpp) 11 #include "hello.h" 12 #include <qapplication.h> …… 20 int main( int argc, char **argv ) 21 { 22 QApplication a(argc,argv); 23 QString s; 24 for ( int i=1; i<argc; i++ ) { 25 s += argv[i]; 26 if ( i<argc-1 ) 27 s += " "; 28 } 29 if ( s.isEmpty() ) 30 s = "Hello, World"; 31 Hello h( s ); 35 QObject::connect( &h, SIGNAL(clicked()), &a, SLOT(quit()) ); 36 h.setFont( QFont("times",32,QFont::Bold) ); // default font 37 h.setBackgroundColor( Qt::white ); // default bg color 38 a.setMainWidget( &h ); 39 h.show(); 40 return a.exec(); 41 }

Qt/Embedded 응용 프로그램(hello.cpp) 10 #include "hello.h" …… 20 Hello::Hello( const char *text, QWidget *parent, const char *name ) 21 : QWidget(parent,name), t(text), b(0) 22 { 23 QTimer *timer = new QTimer(this); 24 connect( timer, SIGNAL(timeout()), SLOT(animate()) ); 25 timer->start( 40 ); 26 27 resize( 260, 130 ); 28 } 35 void Hello::animate() 36 { 37 b = (b + 1) & 15; 38 repaint( FALSE ); 39 } 48 void Hello::mouseReleaseEvent( QMouseEvent *e ) 49 { 50 if ( rect().contains( e->pos() ) ) 51 emit clicked(); 52 } 61 void Hello::paintEvent( QPaintEvent * ) 62 { 63 static int sin_tbl[16] = { 64 0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38}; 65 66 if ( t.isEmpty() ) 67 return; 68

Qt/Embedded 응용 프로그램(hello.cpp) 69 // 1: Compute some sizes, positions etc. 70 QFontMetrics fm = fontMetrics(); 71 int w = fm.width(t) + 20; 72 int h = fm.height() * 2; 73 int pmx = width()/2 - w/2; 74 int pmy = height()/2 - h/2; 75 76 // 2: Create the pixmap and fill it with the widget's background 77 QPixmap pm( w, h ); 78 pm.fill( this, pmx, pmy ); 79 80 // 3: Paint the pixmap. Cool wave effect 81 QPainter p; 82 int x = 10; 83 int y = h/2 + fm.descent(); 84 int i = 0; 85 p.begin( &pm ); 86 p.setFont( font() ); 87 while ( !t[i].isNull() ) { 88 int i16 = (b+i) & 15; 89 p.setPen( QColor((15-i16)*16,255,255,QColor::Hsv) ); 90 p.drawText( x, y-sin_tbl[i16]*h/800, t.mid(i,1), 1 ); 91 x += fm.width( t[i] ); 92 i++; 93 } 94 p.end(); 95 96 // 4: Copy the pixmap to the Hello widget 97 bitBlt( this, pmx, pmy, &pm ); 98 }

실습 Hello 응용 프로그램의 컴파일 호스트 시스템에서 Hello 프로그램을 컴파일하고 NFS 마운트 디렉토리로 복사 ① ② ③ ④ ⑤ ① ⑥ ⑧ ⑦

실습 Hello 응용 프로그램의 컴파일 ⑤ #gedit Makefile

실습 타겟 시스템에서 Hello 응용 프로그램 실행 타겟 시스템에서 실행 중인 X-Server를 종료 타겟 시스템의 Qt/Embedded와 관련된 환경 변수를 설정하고 hello 파일을 실행 ② ③ ④ ① ② ①

Qt/Embedded 웹서버 임베디드시스템용 웹 서버의 특징 웹 서버 수행 파일의 크기가 매우 작아야 함(수십~수백 KB) 시스템의 성능을 저하를 막기 위해 힙 메모리의 사용을 최소화 정적 웹 페이지는 압축되어 저장되어 있다가 클라이언트의 요구가 있을 때 압축을 풀어서 제공 표준화된 인터페이스로 쉬운 이식성 인터넷을 통해 시스템을 관리할 수 있는 기능

Qt/Embedded 웹서버 GoAhead 웹 서버 크기가 적으면서도 다양한 기능을 제공 컴파일하기 쉽고, 사용이 단순 실행 파일의 용량이 적어 임베디드시스템에 적합 사건 타이머(event timer)와 TCP/IP 스택 필요 ASP, CGI, 임베디드 자바 스크립트를 지원 HTTP 1.0 프로토콜을 사용 보안을 위해서 SSL(Secure Socket Layer) v3.0, DAA(Digest Access Authentication)를 지원 리눅스, 윈도우 CE, VxWorks, QNX, eCOS 등 다양한 운영체제에서 동작 무료

다운로드받은 파일의 압축을 풀고 경로를 재설정. 관련 파일을 수정 실습 GoAhead 웹 서버 컴파일 및 설치 다운로드받은 파일의 압축을 풀고 경로를 재설정. 관련 파일을 수정 ② ③ ④ ⑤ ① ⑥ ⑦ ⑧

실습 GoAhead 웹 서버 컴파일 및 설치 ⑦ #gedit Makefile

web 디렉토리를 tar 명령을 사용해 하나의 파일로 압축 실습 GoAhead 웹 서버 컴파일 및 설치 컴파일 결과 확인 web 디렉토리를 tar 명령을 사용해 하나의 파일로 압축 ② ①

컴파일된 웹 서버 webs와 web.tgz를 타겟 시스템으로 전송 실습 GoAhead 웹 서버 컴파일 및 설치 컴파일된 웹 서버 webs와 web.tgz를 타겟 시스템으로 전송 타겟 시스템에서 web.tgz 파일의 압축을 풀고 웹 서버를 실행 ② ③ ④ ⑤ ① ⑥

실습 GoAhead 웹 서버 컴파일 및 설치 호스트 시스템의 Firefox 웹 브라우저를 사용해 타겟 시스템의 웹 서버에 접속.→ http://192.168.233.200/home.asp를 입력해 웹 서버가 작동되는지 확인

Qt/Embedded 웹서버 응용 웹 브라우저를 사용해 임베디드시스템 내의 각종 디바이스 제어 가능 웹을 이용하여 타겟 시스템의 FND 디바이스에 숫자를 표시 하기 위해 필요한 프로그램 11장에서 작성한 FND 디바이스 드라이버 웹 페이지를 표시하기 위한 HTML 문서 동적 웹 문서 전달을 위한 CGI(Common Gateway Interface) 프로그램.

실습 FND 제어용 HTML 문서 작성(fnd.htm) 02 <head><title>Web Server Application</title></head> 03 <body> 04 <H1>Web Server Application</H1> 05 06 <form method="GET" action="cgi-bin/fnd"> 07 Enter a 8-digit number: 08 <input name="send_number" maxlength="8" type="text" size="20"> 09 <input type="submit" value="SEND"> 10 </form> 11 <br> 12 Then see the FND device on the taget system. 13 <br> 14 </body> 15 </html>

실습 FND 디바이스 제어용 CGI 프로그램 작성(fnd.c) 016 #include <stdio.h> …… 025 static char fndDev[] = "/dev/FND"; 026 static int fndFd = (-1); 027 028 asc2fnd(char *s, long n) 029 { 030 char c; 031 int l; 032 while (n > 0) { 033 l = n % 10; 034 switch (l) { 035 case 0: c = 0x3f; break; 046 } 047 *s++ = c; 048 n = n/10; 049 } 050 } 051 052 int send_number_FND(long av) 053 { 054 int n; 055 char buf[MAXFND+1]; 056 057 fndFd = open( fndDev, O_RDWR); 058 if (fndFd < 0) { 059 fprintf(stderr, "cannot open FND (%d)", fndFd); 060 exit(2); 061 } 062 memset(buf, 0, sizeof(buf)); 063 064 asc2fnd(buf, av); 065 write(fndFd, buf, MAXFND); 066 return 0; 067 }

실습 FND 디바이스 제어용 CGI 프로그램 작성(fnd.c) 073 int main(int argc, char *argv[]) 074 { 075 char *cgiinput ; 076 long send_number; …… 082 printf("Content-type:text/html;charset=iso-8859-1%c%c\n\n",13,10) ; 086 printf("<html>\n"); 087 printf("<head><title>Web Server Application</title></head>\n"); 088 printf("<body>\n"); 089 printf("<H1>Web Server Application</H1>\n"); 090 091 cgiinput= getenv("QUERY_STRING"); 092 if(cgiinput == NULL) 093 printf("<P>Error in passing data from form to script."); 094 else if(sscanf(cgiinput, "send_number=%ld", &send_number)!=1) 095 printf("<P>Invalid data. Data must be numeric."); 096 else 097 send_number_FND(send_number); 098 099 printf("<center> Check the FND, [%ld] is displayed</center>\n", send_number); 100 printf("</body>\n"); 101 printf("</html>\n"); 102 103 return 0; 104 }

fnd.htm 문서와 fnd 파일을 타겟 시스템으로 전송 실습 웹 페이지 및 CGI 프로그램 작성 작성한 프로그램을 ARM용으로 컴파일 fnd.htm 문서와 fnd 파일을 타겟 시스템으로 전송 11장에서 빌드한 FND 디바이스 드라이버 fnd.ko를 타겟 시스템으로 전송

다운로드받은 파일의 재배치, 디바이스 드라이버의 재적재, 웹 서버 실행 등을 수행 실습 웹 페이지 및 CGI 프로그램 작성 다운로드받은 파일의 재배치, 디바이스 드라이버의 재적재, 웹 서버 실행 등을 수행 ② ③ ④ ⑤ ① ⑥ ⑦ ⑧ ⑨ ⑩

실습 웹 페이지 및 CGI 프로그램 작성 Firefox를 가동→ http://192.168.233.200/cgi.htm으로 접속→ FND로 출력할 숫자를 입력 후 <SEND> 버튼 클릭 타겟 시스템의 FND에서 입력한 숫자를 관찰. 호스트 시스템의 웹 브라우저에서 FND에 입력한 숫자 확인