'Study 외/Linux' 카테고리의 글 목록 :: Horizontal Grays S2

사실 내가 밖에 나가서 뭐 영상 보고 그럴일은 별로 없긴하다만 그 별로 없을 때를 대비해서 AirVideo를 설치를 시도


기본적으로 Airvideo는 리눅스용 서버 프로그램을 제공하지 않는다.


그래서 다음 링크를 참조해서 설치 (http://titanwing.tistory.com/entry/Airvideo-server-%EC%84%A4%EC%B9%98)


1. ffmpeg 설치


 1) 설치를 위해 필요한 프로그램 우선 설치

sudo apt-get install build-essential yasm libmp3lame-dev libfaad-dev libx264-dev git-core pkg-config



 2) 설치를 위한 폴더 생성 및 이동 그리고  설치프로그램과 ffmpeg 다운

sudo mkdir /opt/airvideoserver/

cd /opt/airvideoserver

sudo wget http://inmethod.com/airvideo/download/linux/alpha6/AirVideoServerLinux.jar

sudo wget http://inmethod.com/airvideo/download/ffmpeg-for-2.4.5-beta7.tar.bz2

( 정확한 이유는 모르겠으나 현재는 참고사이트의 링크로는 안됨, 그리고 ffmpeg-for-2.4.5-beta7 버전으로 해야함, 참고사이트의 beta6로는 컴파일 에러 )


 3) 압축해제 및 컴파일

sudo tar jxvf ffmpeg-for-2.4.5-beta7.tar.bz2

cd ffmpeg

sudo ./configure --enable-pthreads --disable-shared --enable-static --enable-gpl --enable-libx264 --enable-libmp3lame

sudo make

sudo make install 


2. mpeg4ip-server 설치


libvpx0 

sudo wget http://free.nchc.org.tw/ubuntu//pool/main/libv/libvpx/libvpx0_0.9.6-1_amd64.deb


libmpeg4ip 

sudo wget http://free.nchc.org.tw/ubuntu//pool/multiverse/m/mpeg4ip/libmpeg4ip-0_1.6dfsg-0.2ubuntu8_amd64.deb


libavutil51

sudo wget http://free.nchc.org.tw/ubuntu//pool/main/liba/libav/libavutil51_0.8.10-0ubuntu0.13.10.1_amd64.deb


libmp4v2 

sudo wget http://free.nchc.org.tw/ubuntu//pool/multiverse/m/mpeg4ip/libmp4v2-0_1.6dfsg-0.2ubuntu8_amd64.deb


libavcodec53

sudo wget http://free.nchc.org.tw/ubuntu//pool/main/liba/libav/libavcodec53_0.8.10-0ubuntu0.13.10.1_amd64.deb


mpeg4ip-server

sudo wget http://mirror.pnl.gov/ubuntu//pool/multiverse/m/mpeg4ip/mpeg4ip-server_1.6dfsg-0.2ubuntu8_amd64.deb


그리고 다운받은 파일들을 더블클릭해서 설치

중간에 의존성 문제 발생 하면

sudo apt-get -f install 


하지만 mpeg4ip-server는 설치가 안됨 T.T


http://gabrielkim.tistory.com/38   참고해서 어찌저찌 설치 (http://gabrielkim.tistory.com/attachment/cfile5.uf@1264F5474FA386B90BEFCD.deb 다운로드해서 설치)


3. 설치확인


whereis 명령어로 ffmpeg mp4creator faac 확인

하지만 faac는 설치된 경로가 나오지 않음 T.T


http://www.linuxfromscratch.org/blfs/view/svn/multimedia/faac.html 참고해서 faac 설치




여하튼 모두 설치한것 같다. 


4.  air video 설정파일


설정파일 만들고

sudo nano AirVideoServerLinux.properties 


아래의 내용으로 입력

path.ffmpeg = /usr/local/bin/ffmpeg

path.mp4creator = /usr/bin/mp4creator

path.faac = /usr/bin/faac

password =

subtitles.encoding = windows-949

subtitles.font = NanumGothic

folders = Movies:/home/user/media/movies,Drama:/home/user/media/drama   


여기서 각 path와 folder는 자기에게 맞는 걸로 수정


5. 나눔 글꼴 설치


http://hangeul.naver.com/download.nhn#sc_ng 


나눔폰트 모든 OS용으로 다운로드

그리고 다음 명령어로 설치

sudo cp *.ttf /usr/share/fonts/truetype/

sudo fc-cache -v


6. Airvideo AutoStart


nano /etc/init/airvideo.conf


start on runlevel [2345]

stop on shutdown

respawn


exec sudo -H -n -u 사용자계정 LANG=ko_KR.UTF-8 /usr/bin/java -jar /opt/airvideoserver/AirVideoServerLinux.jar /opt/airvideoserver/ffmpeg/AirVideoServerLinux.properties


7. Airvideo Server 수동 실행


sudo start airvideo


(정지는 stop)


8. 공유기 포트포워딩 설정하고 외부에서 DDNS로 접속하니 잘 된다!!! 

하.. 이번거 힘들었다. T.T



내가 유일하게 그리고 정말 유용하게 잘 쓰는 클라우드 서비스는 다음클라우드..

무엇보다 속도도 빠르고 꽤 안정적이다. 게다가 티스토리 이용자 어쩌구 해서 이용가능 용량도 100G이고 :)


여튼 그래서 홈서버에 다음클라우드를 설치하려고 하는데....


기본적으로 다음에서 리눅스 버전도 설치파일을 제공하나 64bit 버전에서는 일련의 작업을 해야한다고 한다.


(참고 : http://ubuntu.or.kr/viewtopic.php?p=90771)


우선 소프트웨어 관리자에서 ia32-libs 를 검색해서 설치 (나는 이미 설치했으므로 설치가 안뜨고 제거가 뜸)





다음에 클라우드 서비스에 들어가면 PC싱크프로그램에서 리눅스용 다운을 받는다. (현재 버전 daumcloud_1.1.0.45_deb)


그리고 다운받은 폴더로 이동한 다음에 아래와 같이 명령


$ mkdir tmp 

$ dpkg-deb -x daumcloud_1.1.0.45.deb tmp 

$ dpkg-deb --control daumcloud_1.1.0.45.deb tmp/DEBIAN 

$ sed -i "s/i386/all/" tmp/DEBIAN/control 

$ dpkg -b tmp daumcloud_1.1.0.45_64.deb


아마 64bit 용 패키지로 만들어 주는 것 같다.

생성된 daumcloud_1.1.0.45_64.deb를 더블클릭해서 설치




그러면 끝! ^-^




이번엔 FTP 설정.. 


이거 해놓고 설마 집에서 일하고 결과물 옮기고 하려는건 아냐?? 


목적은 그런데.. 그렇게 쓰게 되길 없길 ㅋㅋ


감사하게도 같은 환경 (Linux Mint 13 Maya 사용자의 블로그 참조 http://chulhankim.github.io/blog/2014/02/26/linux-mint-13.html


리눅스에서 FTP 서비스로 vsftpd를 많이 쓴다고 한다.


그런데 최신버전의 vsftpd를 apt-get install로는 설치가 불가능 하여 직접 다운로드 하여 설치하는 방법을  사용한다.


디렉토리 이동

cd /home/jslee-server/Downloads


vsftpd 3.0.2 설치파일 다운로드

sudo wget http://us.archive.ubuntu.com/ubuntu/pool/main/v/vsftpd/vsftpd_3.0.2-1ubuntu2_i386.deb

(64bit 버전 사용자는 wget http://us.archive.ubuntu.com/ubuntu/pool/main/v/vsftpd/vsftpd_3.0.2-1ubuntu2_amd64.deb)


설치 (X window 상에서는 더블클릭하면 deb 설치관리자가 뜨고 설치누르면 될꺼임)

sudo dpkg -i vsftpd_3.0.2-1ubuntu2_i386.deb





새로운 사용자를 등록하려면 adduser 명령어 써서 등록하고

난 그냥 혼자 쓸거이므로 따로 안한다.


vsfptd.conf 파일 편집

sudo nano /etc/vsfptd.conf



anonymous_enable=NO

local_enable=YES

write_enable=YES

local_umask=022

chroot_local_user=YES


------------------------------ 여기까지는 코멘트 해제


allow_writeable_chroot=YES

user_config_dir=/etc/vsftpd_user_conf


----------------------------- 여기까지는 마지막 줄에 새로 입력



그리고 /etc/vsftpd_user_conf 생성

nano /etc/vsftpd_user_conf


local_root = /disk/www


하고 저장


나는 루트권한으로로 /disk를 읽을 생각이었는데 이렇게 하면 루트 폴더까지 접근이 되어버린다. 당연한건가? 모르겠슴 ^^;



그리고 윈도우7 컴퓨터에서 파일질라로 접속 시도






잘 된다!! 다만 포트가 22번임에 주의



삼바 설정은 홈서버에서 한번 해봤던걸 기준으로 한다.


그런데 홈서버에서 설정할 때는 smbfs가 안깔리더니 이번에는 또 깔린다.


아마 Linux Mint 버전의 차이인듯.. 


sudo apt-get install samba smbfs 로 samba와 smbfs를 아래와 같이 설치완료





아래와 같이 계정 등록하는 것도 문제 없었슴



자.. 문제는 이제부터

X window가 없으므로 GUI환경이 아닌 콘솔환경에서 삼바 설정을 해야한다..


http://forum.falinux.com/zbxe/index.php?document_srl=405792&mid=lecture_tip  여기서 참조하여 해본다.


smb.conf 편집

sudo nano /etc/samba/smb.conf



security = user 활성

####### Authentication #######

   security = user


계정에 땨르 설정을 다음과 같이

[jslee-server]

comment = jslee-server samba

path = /disk

writeable = yes

public = no

create mask = 0644

directory mode = 0755



지난번 포스팅에 하드디스크 세개를 루트 디렉토리에 각각 /disk150G /disk160G1 /disk160G2 로 마운트했던걸

/disk 밑으로 모두 옮겼슴



그리고 삼바 데몬 리스타트


sudo service smbd restasrt


그리고 윈도우 탐색기에서 \\jslee-server로 접속

더블클릭하면 삼바 유저 아이디 및 패스워드 입력


 

그림처럼 잘 된다!!! ^^


자 그럼 속도는 얼마나 나오나?




45.5MB/S !!! 훌륭하다.. 기존에 Etrayz로 옮길때 10MB/S 정도 였고 자체 하드디스크 내에서 움직여도 45MB/S 정도인데.. (물론 SSD로 옮기면 훨씬 빠르지만)


여튼 충붕히 훌륭하다!!!


이걸로 삼바 설정 끝!!


아.. X window가 뜨면 하드디스크들은 자동으로 마운트 되더만..


Putty로 접속하여 df-a로 확인해보니 부팅 하드만 마운트되어있다.. T.T





자 이제 콘솔모드에서 하드디스크들을 마운트해보자 


일단 하드디스크들이 있긴 한거냐? fdisk -l 해봤다.




보면 sdb가 80G 리눅스가 깔린 디스크이고

sda 250G, sdc 160G, sdd 160G 모두 잘 살아있다. (잘 안쓰이던 하드디스크를 모아서 서버를 만들었더니 갯수만 많다 ㅋ)



구체적인 방법은 여기를 참조했다. (http://koreaubuntu.wordpress.com/2011/12/18/%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%8C%8C%EC%9D%BC-%EC%8B%9C%EC%8A%A4%ED%85%9C%EA%B3%BC-%ED%95%98%EB%93%9C-%EB%A7%88%EC%9A%B4%ED%8A%B8%ED%95%98%EA%B8%B0/)




삽질이 조금 있었... ㅋ

여하튼


 1) ls -l /dev/disk/by-uuid 로 하드디스크의 uuid를 표시하고 복사해두고

 2) 마운트 하고자 하는 하드디스크들이 마운트 될 디렉토리를 만들자 

   나의 경우는 단순 무식하게 일단 /disk250G , /disk160G1 , /disk160G2 로 만들어 두었다.


 3) /etc/fstab 을 편집한다.



정말 이러면 되는 걸까?? 리부팅



그리고 다시 df -a 로 확인!




sda1, sdc1, sdd1 모두 내가 원했던대로 잘 마운트 되었슴!!!

자.. 이제 삼바 설정 해야지 ~

정말 오랜만에 리눅스에 다시 재미붙인듯 ㅋㅋㅋ


뭐 쓸데없이 깨작되는건 아니고


이번엔 회사에서 서버로 쓸 요량이다.


내 프로젝트 파일, 도큐멘트 파일 등을 저장하고 동기화 할 수 있도록 준비하고.


SVN 서버로도 구성하고


뭐 이래저래~


여러 컴퓨터에 여러 파일들이 흩어져 있다보니 가끔 내가 작업은 했는데 어느 컴퓨터에서 했는지 기억도 안나고 T.T 


여튼 그래서 시작!!


1. 우선 Ubuntu 12.04 Server 버전을 설치시도

 -> 실패.. 이유는 모르겠다. grub 설치에 문제가 자꾸 생긴다.


2. 그래서 Linux Mint 13 Maya Mate 32bit 버전 설치하고 Console 모드로 사용

 Linux Mint 설치는 역시 패스.. 윈도우만큼 쉬우니까~!

사실 컴퓨터 사양이 괜찮다면 Xwindow를 버릴 이유는 없는데.. 서버로 쓰려는 컴퓨터가 워낙 구형이다.


Pentium D3.0 (3.0 Ghz)

RAM 1.5G

내장그래픽


* 저 CPU가  어느정도 성능인가 궁금해서 찾아봄 (http://www.cpubenchmark.net/cpu_list.php)


CPU                                    Benchmark Rank         비고

Atom N270 1.6Ghz                 283         1757     구형넷북

Pentium D 3.0Ghz                 648         1404     전에 쓰던 개인 데스크탑

Core 2 Duo E6300 1.86Ghz      1121 1169     회사 데스크탑

1007u 1.5Ghz                         1441 1006         홈서버용

T8300 2.4Ghz                         1481 985         XP전용 랩탑

2030M 2.5Ghz                         2648 616         개인 랩탑

i3-3240 3.4Ghz                        4323 323         현재 개인 데스크탑

i5-4670K 3.4Ghz                      7806 114         회사 개발용 데스크탑



현재 사용하고 있는 컴퓨터들인데.. 역시 Atom이 독보적인 저성능 ㅋㅋ
서버로 쓰고자하는 컴퓨터 역시 안습 T.T


여튼 그래서 과감히 X window는 쓰지 않고 콘솔로만 사용하고자 함!!



3. Linux Mint Console Mode 부팅법

 - 검색해보면 Ubuntu 에 관한것은 상당히 많이 나옴.. Linux Mint가 Ubuntu에서 파생되긴 하였지만 뭐 하려고 하면 다 다르냐 --;;;


 - 다음 링크를 참고하여 겨우 설정했다. (http://forums.linuxmint.com/viewtopic.php?f=42&t=113700)


 1) Mate의 데스크탑인 mdm을 제거

 sudo apt-get purge mdm mint-mdm-themes

 sudo rm -fr /usr/share/mdm


 2) 부트스플래쉬 plymouth 제거

 sudo apt-get purge plymouth-label plymouth-theme-ubuntu-text


 3) /etc/default/grub 파일 수정

GRUB_CMDLINE_LINUX_DEFAULT = "text" 또는 #붙여서 comment 처리

GRUB_GFXMODE = 해상도

#GRUB_HIDDEN_TIMEOUT = 0  comment 처리


 4) grub 업데이트

sudo update-grub2



 이걸로 console 모드 부팅은 완료!!!


그런데 Xwindow 안쓰고 잘 쓸 수 있을까?



아 그리고 서버인 만큼 Puutty로 SSH를 이용해서 원격접속으로 설정을 할 예정




Ubuntu 12.04 에서 잘 동작하던 qbittorrent가 Mint 16 Petra Mate 에서 설치는 잘 되지만 동작을 하지 않는다.


정확히는 실행은 되지만 파일이 다운로드 되지 않는다.. --;;;


OS에 기본으로 설치되어 있는 transmission의 경우 잘 동작하는데 qbittorrent는 동작되질 않는다.


뭐가 문제인지 검색해 보았으나 별로 해결책이 안보인다. T.T


결국 utorrent를 설치하기로


www.utorrent.com 접속



ubuntu12.04 64bit 버전 다운로드



본인이 원하는 폴더에 압축을 풀고


utserver파일 우클릭해서 utserver 파일을 실행가능하도록 설정


그리고 

utserver 파일 더블클릭하면 아무것도 동작하지 않는데 리눅스용 utorrent의 경우 GUI를 지원하지 않고 Web GUI만 지원한다


그러므로


인터넷 브라우저에서 http://localhost:8080/gui 로 접속하면

아래와 같이 실행도 잘 되고 속도도 만족스럽다 ^-^










우씨.. Mint가 Ubuntu의 파생 배포본이라 별로 할일이 없을것 같았는데


x11vnc 서버 설정도 다르고


samba도 우분투와 좀 달랐다. --;;


기본적으로


sudo apt-get install samba 


는 정상적으로 설치되었으나


sudo apt-get install smbfs


는 cifs-utils가 있어서 어쩌구 저쩌구 하면서 설치 안됨
cifs가 smbfs를 대치하나 봄


여튼 samba를 설치하고


일전의 포스팅과 같이


smbpasswd -a 계정


계정 만들고 암호 만드는것도 무리 없었슴


하지만!


노틸러스에서 공유 옵션으로 설정하는 것으론 안되었다.


그래서 뒤적인게


sudo apt-get install system-config-samba

로 system-config-samba를 설치하면 GUI 환경에서 samba 설정이 가능하다


여기서 설정해도 잘 안되더니


reboot 하고 잘 됨!


에잉~


다음은 system-config-samba 실행화면



여기서 설정하면 되니까 쉽긴하다 ^^

x11vnc server setting on Mint Linux 16 Petra Mate 64bit


install 은 ubuntu 12.04와 동일 


sudo apt-get install x11vnc


하지만 autostart를 위한 스크립트가 다르다.


이유는 ubuntu의 경우 lightdm을 사용하지만 Mint Linux는 mdm을 사용하기 때문이다.


여하튼 그래서 스크립트는 다음과 같이 바꿨다. (위치는 /etc/init/x11vnc.conf 로 ubuntu와 동일)


(참고는 http://forums.linuxmint.com/viewtopic.php?f=42&t=141766)


#x11vnc.conf

start on (login-session-start or desktop-session-start)

stop on desktop-shutdown


respawn


emits vnc-server-start


script

x11vnc -xkb -noxrecord -noxfixes -noxdamage -display :0 -auth /var/lib/mdm/:0.Xauth -rfbauth /etc/x11vnc.passwd -forever -bg -o /var/log/x11vnc.log

initctl emit vnc-server-start

end script


하나 또 바뀐건 이번엔 비밀번호 걸어 놨다. 회사에서 접속할 때 비번이 없이도 접속이 되어버리니 괜히 찜찜해서 ㅋ


x11vnc -storepasswd /etc/x11vnc.passwd


이렇게 설정



접속하면 잘 실행이 되었고 


주의할 점은 한영전환


기존에 ubuntu 12.04에서는 한글입력이 기본으로 설정되어 있었고 VNC접속 시 Ctrl + Space 였는데

Mint linux 16 petra Mate에서는 입력기로 nabi로 설정하였고 Shift + Space 임



우분투 12.04를 설치하고 프로그램 설치라던지 설정이라던지는 크게 문제 없었고 또 해결했는데


결정적으로 전원이 켜지고 콘솔모드로 들어가버릴 때가 은근 많고 안꺼지는 문제도 여전히 있었다.


이 두가지 문제는 아무리 해결책을 찾아도 해결이 되질 않았다.


홈서버다 보니 주로 켜놓고 있을 때가 많겠다만 그래도 내가 주구장창 쓰는 것도 아니고 필요할 때만 켜고 끄고 하려고


공유기의 WOL도 설정해 놓았건만..



회사에서 WOL을 이용하여 전원을 켜고 작업하고 다음에 켜려면 회사에서 접속 불가한 상황 (콘솔모드 부팅이 되어버려서)이 많아지다 보니


도저히 짜증나서 안되겠다.


일단 리눅스 배포판을 민트리눅스로 바꿔보기로 결정!


www.linuxmint.com


우분투에서 파생된 배포판인데 가벼운 배포판으로 유명하고 최근에 우분투 다음으로 많은 사용자를 가진  배포판

(UI가 윈도우의 그것과 비슷하여 손쉽게 사용가능)


우분투 12.04 LTS에서 파생된 Mint 13 Maya Mate 을 설치하고자 하였는데 HDMI에서 화면 깨짐.. 화면이 깨지니 뭘 더 어찌 할수 없어서

우분투 13.10에서 파생된 Mint 16 Petra 설치 완료


설치는 별거 없고


설치시 화면이 이상하게 길게 나와서 다음 버튼을 누를수 없는 상황이 나오는데

Alt + 좌클릭으로 이동해서 사용하면 됨 (우분투에서도 있는 문제임)


그리고 다른 문제 하나는

한글입력


16버전에서는 IBUS 설치에 문제가 있어 nabi를 입력기로 사용하는것이 좋다. (http://linuxmint.kr/999)


sudo apt-get update

sudo apt-get upgrade

sudo apt-get install nabi


그놈제어판 - Language Support - 언어 업데이트 및 한글 설치

그놈제어판 - 입력기 - hangul 로 설정


reboot



지금까지 별문제 없이 잘 되었고

끄고 켜는데 아직은 문제없슴

지금 하고 있는 프로그램은 크게 3가지 일을 동시에 해야한다. (엄밀히 말해서는 동시에 하는 건 아니고 ㅋ)


1. Camera로 부터 영상획득 - 처리 

2. Bluetooth를 통하여 들어오는 명령 프로토콜 분석

3. Socket을 통하여 영상 전송


이를 동시적으로 처리를 해아하는데 

늘 하던 펌웨어라면 Timer Interrupt 이용해서 이놈했다 저놈했다 하는거 별 어려운일 도 아니겠지만 이쪽 프로그래밍을 하던 사람은 아니라서 검색 ㅋ

당연히 같은 개념인 Thread라는게 존재했다.


이놈을 어떻게 쓰는지 자세한 설명은 아래 링크 참조

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

http://knight76.tistory.com/entry/20010117546


여러 예제와 다양한 기능들이 있다만 내가 하고자 하는 일엔 그다지 복잡한게 필요치 않다.


위의 1,2,3의 일을 동시적으로 처리하기만 하면 된다.


아래는 작성한 예제소스


//============================================================================

// Name        : MultiThreadTest.cpp

// Author      : 

// Version     :

// Copyright   : Your copyright notice

// Description : Hello World in C++, Ansi-style

//============================================================================


#include <iostream>

#include <stdio.h>

#include <sys/time.h>

#include <pthread.h>



using namespace std;



int ncount = 0;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;


void* thread1(void* arg);

void* thread2(void* arg);



int main() {

pthread_t thread_id;

pthread_t p_thread1,p_thread2;

int status;


int i = 1;



printf("init main\n");


if((thread_id=pthread_create(&p_thread1,NULL,thread1,NULL)))

{

printf("Thread1[%d] Create Failed!\n",thread_id);

}else printf("Thread1[%d] Create Success!\n",thread_id);



sleep(1);


if((thread_id=pthread_create(&p_thread2,NULL,thread2,NULL)))

{

printf("Thread2[%d] Create Failed!\n",thread_id);

}else printf("Thread2[%d] Create Success!\n",thread_id);


sleep(1);





while(1)

{

pthread_mutex_lock(&mutex);

// thread_id = pthread_self();

printf("main = %d\n",i);

pthread_mutex_unlock(&mutex);

i++;

sleep(1);


if(i>2) break;


}


printf("thread1 cancel\n");


if(pthread_cancel(p_thread1)) printf("pthread_cancel 1 failed\n");

usleep(100);


printf("thread2 cancel\n");


if(pthread_cancel(p_thread2)) printf("pthread_cancel 2 failed\n");

usleep(100);


status = pthread_mutex_destroy(&mutex);

printf("status %d\n",status);

printf("End!!!\n");


return 0;

}


void* thread1(void* arg)

{


int i,j;

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);

pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);


printf("init thread1");

i = 1;

j = 2;

printf("i = %d, j = %d\n",i,j);


while(1)

{

pthread_mutex_lock(&mutex);

printf("thread1 \n");

pthread_mutex_unlock(&mutex);

pthread_testcancel();

usleep(100000);

}

}


void* thread2(void* arg)

{


int i,j;

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);

pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);


printf("init thread2");

i = 3;

j = 4;

printf("i = %d, j = %d\n",i,j);


while(1)

{

pthread_mutex_lock(&mutex);

printf("thread2 \n");

pthread_mutex_unlock(&mutex);

pthread_testcancel();

usleep(100000);

}

}



예제는 별것 없다.


main함수가 시작되면

Thread1과 Thread2를 만듦과 동시에 Thread1, Thread2 구동


main에서는  1초에 한번씩 i 변수 증가하고 출력

thread1은 100ms 마다 한번씩, thread2도 100ms마다 한번씩 각각 난 thread1이요, 난 thread2요 하고 출력


main이 2초가 넘어가면 각 thread cancel 시키고 종료한다.


결과는 아래와 같다.


init main

Thread1[0] Create Success!

init thread1i = 1, j = 2

thread1 

thread1 

thread1 

thread1 

thread1 

thread1 

thread1 

thread1 

thread1 

thread1 

Thread2[0] Create Success!

init thread2i = 3, j = 4

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

main = 1

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

main = 2

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread2 

thread1 

thread1 cancel

thread2 cancel

status 0

End!!!


잘 된다! ^^


여기서 주의해야 할 사항!!


처음에 #include <pthread.h>를 정확히 하였슴에도

pthread관련 함수들이 모두 컴파일 에러

예를 들어 다음과 같은 에러였다.


undefined reference to 'prhread_create'와 같은..


이를 해결하려면 컴파일 옵션을 손봐야 하는데

gcc 사용자라면 -lpthread 옵션을 추가해주면 되고


나처럼 Eclipse에서 개발환경이라면


properties -> C/C++ Build -> Settings  -> C++ Linker -> Libraries 에 pthread를 추가해주면 된다.






가장 유명한 리눅스 클라이언트 프로그램으로는 역시 Transmission 이다.

그리고 윈도우에서 많이 사용하는 것은 utorrent일테고


그런데 둘다 모드 리눅스에서는 GUI 환경을 Web방식만 지원하고 또 뒤적여 보니 qBittorrent의 평도 좋아서


qBittorrent를 설치하기로


설치는 어렵지 않다 그냥 우분투 소프트웨어센터에서 qBittorrent 검색하면 나오고 설치하면 끝




설치하고 실행하면 아래의 그림과 같이 실행 된다.



언어를 한글로 설정해두었기에 한글로 나오는데 번역된것 보다 안된게 많아서 별 의미 없다.


언어는 Option에 들어가면 아래의 그림이 나오는데 언어에서 한글로 바꿔주면 끝



다운로드에는 다운로드 폴더 및 여러가지 항목들을 설정할 수 있다.


utorrent에도 이 기능이 있었는지는 모르겠는데


아래에 Automatically add torrent from: 항목을 설정하고 설정한 폴더에 torrent파일 던져두면 알아서 Add 된다.


나의 경우 홈서버의 저 디렉토리를 공유설정해두고 윈도우 PC에서 토런트 파일을 저쪽으로 다운받아두니 알아서 잘 추가되어 다운로드를 시작했다.


하드디스크의 내용들이 조금 더 정리되면


movie, music 등 나누어서 설정해두면 나중에 복사하고 정리할 필요없이 알아서 들어갈 것 같아서 좋다.




속도 항목은 아래가 기본설정 안건드림




qBittorrent로 Web GUI를 지원한다.

일단 지금은 설정 안해두었지만 설정해두면 나중에 원격지에서 Web으로 연결할 수 있다.



결론

뭐 딱히 문제될것 없이 잘 된다.

두번째 그림처럼 여러개의 토렌트를 다운받는데 다운되거나 하는 일없이 잘 받긴한데 속도가 너무 안나온다.


그 이유를 두개정도로 압축시킬 수 있을 것 같은데.


1. 현재 사용하고 있는 Belkin 공유기의 발열 문제

 - 다운로드를 많이 하다보면 발열 때문에 속도가 느려지나? 원래 저 벨킨 공유기가 발열에 취약하고 실제로 나도 몇번 문제가 발생해서 구멍을 뚫어둔 상태긴 하다.


2. http://www.ubuntu.or.kr/viewtopic.php?p=71957 링크를 보면 중간에 이런 답글이 있다

 - 한국 토런트 사이트에서 운영하는 Tracker는 클라이언트 제한이 걸려있어 utorrent 외에 클라이언트에서 속도가 안나온다는

- 2010년 게시물이라 지금은 다를지 모르겠지만 일단 이것도 속도가 느린 이유 중 하나가 아닐까?



다음날 공유기 껐다가 켜고 5개 정도 토렌트 걸고 다운로드 받아봤는데 7MB 정도로 속도 나쁘지 않게 나옴 ㅋ

결국 공유기 문제가 컸나봄


   






아.. ZBOX에 광출력이 기본적으로 달려있어서 얼씨구나 했는데... 리시버에 기껏 연결했건만 이놈이 소리를 안낸다.


혹시나 해서 기존에 사용하던 USB-DAC를 물려보았더니 윈도우7에서는 안나오던 광출력이 여기선 또 소리를 잘 낸다.


여튼 기본적으로 달려있는 놈을 어떻게든 활성화 시켜보자.


일단 현재 달려 있는 오디오 장치를 확인해보자.


aplay --list-devices



보아하니 0카드 : PCH [HDA Intel PCH], 1 장치 : ALC892 Digital [ALC892 Digital] 요놈이 문제의 광출력인듯하다.


문제해결은 구글신과 ㅋ


여러방법을 써보았지만 되질 않았고


심플하게 alsamixer에서 s/pdif mute 조절로 해걸

(참고 : http://shellrunner.com/fix-digital-optical-spdif-output-in-ubuntu-raring-ringtail/ )



자 이제 XBMC 설정


문제는 XBMC에서는 처음에 메뉴 넘기는 소리는 잘 나다가 동영상을 재생함과 동시에 어떠한 설정을 해도 오디오 입력장치 초기화 실패 라는 메시지가 뜨면서 소리 안나옴 T.T


우선 alsa와 pulse를 모두 제거하고 다시 설치해보기로


sudo apt-get remove --purge alsa-base

sudo apt-get remove --purge pulseaudio

sudo apt-get install alsa-base

sudo apt-get install pulseaudio


하고 /etc/pulse/daemon.conf 파일 편집

default-sample-channels = 6

lfe mixing 관련은 6


그리고 

sudo speaker-test -c6


우분투 자체에서는 5.1채널로 소리 잘남


그래도 여전히 문제 발생



내가 뭘 알겠어.. 구글검색해서 


이것저것 다 해봐도 안됨 


그러다가 http://ubuntuforums.org/archive/index.php/t-1644394.html


Working now

This is what I did:

Use synaptics to load “linux-backports-modules-als-2.6.32-25-generic”. 
Once installed and system re-booted, load “alsamixer” in a terminal window, press F6 to change to Nvidia sound, then unmute the channels. It will not display channels unless the backport is loaded.

At that point, I was able to get VLC and other stuff to do 5.1.

I had to continue searching because XBMC is my main reason for this box. XBMC kept giving me "cannot initialize" error. I found that if I changed the Ubuntu sound preference to use analog (any type) then XBMC worked perfect.



이사람의 말이 정확하게 들어맞음


우분투의 기본 사운드 설정을 Digital이 아닌 Analog로 설정하고 XBMC를 실행하면 


광출력 패스스루로 잘 동작한다!!!


하지만 아쉽다. Analog로 설정한 이상 다시 사운드 설정을 디지탈로 바꿔줘야 XBMC를 제외한 나머지 모든 Ubuntu에서의 사운드가 나오니


이것도 여간 불편한 것이 아니다.


그리고 USB-DAC는 뒀다 뭐할건가..


결국 수많은 삽질 끝에 다시 USB-DAC를 사용하기로 ^^;;;


하지만 USB-DAC에서도 

리눅스 기본 사운드 설정에서 USB-DAC Digital로 선택을 하고 XBMC를 실행하고 파일을 재생하면 역시 에러


아무래도 리눅스 기본 사운드와 XBMC의 패스쓰루 장치와의 리소스 공유를 할 수 없는 구조인 듯하다.


그래서 설정한 방법이




리눅스의 기본 사운드 장치는 HDMI로


그리고 XBMC의 패스스루 장치를 USB-DAC Digital로 선택하니


리눅스의 기본 소리는 HDMI를 통해 TV로 사운드가 나오고


XBMC로 재생시에는 리시버를 통해 소리가 나온다.


* 이상하게도 XBMC 스크린샷 캡춰한거에서 오디오 세팅은 표시가 되질 않아서 글로만 씀 


여튼 편법이지만 어쩔수 없이 이렇게 셋팅완료!






라즈베리파이를 모니터 없이 x11vnc를 이용하여 원격접속으로 사용하기


요거 하려고 뒤적이다보니 모니터 없이 사용하는 것을 Headless Mode 라고들 하더군 ㅋ 그래서 제목을 저따위로 달아봄


라즈베리파이에 모니터 + 키보드 + 마우스 따로 할당에서 쓸 공간도 없고, 또 추후 내가 하보려고 하는것 역시 라즈베리파이가 본체만으로 동작해야 하므로


x11vnc 설정이 필요했다.


그 설정은 다음과 같음


sudo apt-get install xvfb x11vnc daemon                    //xvfb, x11vnc, daemon 설치

sudo x11vnc -storepasswd /etc/x11vnc.pass            //x11vnc의 비밀번호를 /etc/x11vnc.pass에 저장



lightdm.conf 파일은 아래와 같이 수정 (내려가다보면 SeatDefaults 가 있슴)

sudo nano /etc/lightdm/lightdm.conf                            //lightdm.conf 편집


[SeatDefaults]

xserver-command=/etc/X11/xinit/xserverrc


/etc/X11/xinit/xserverrc 편집

sudo nano /etc/X11/xinit/xserverrc


#!/bin/sh

#exec /usr/bin/X -nolisten tcp "$@"

exec Xvfb :0 -screen 0 1280x768x16


자동시작을 위한 스크립트 생성 및 등록


sudo nano /etc/init.d/vnc_x11


아래내용 복사해서 붙여넣어 자동시작을 위한 스크립트 작성 완료

 #!/bin/sh

#

# /etc/init.d/vnc

#

### BEGIN INIT INFO

# Provides:          x11vnc

# Required-Start:    lightdm

# Should-Start:

# Required-Stop:

# Should-Stop:

# Default-Start:     2 3 4 5

# Default-Stop:      0 1 6

# Short-Description: X11 VNC Server

# Description:       Start or stop vnc server

### END INIT INFO


#INIT SCRIPT VARIABLES

SERVICE=$(basename $0)

PIDFILE="/var/run/${SERVICE}.pid"

BIN="/usr/bin/x11vnc "

#AUTH=`ps wwaux | grep '/X.*-auth' | grep -v grep | sed -e 's/^.*-auth *//' -e 's/ .*$//' | head -n 1`

AUTH="/var/run/lightdm/root/:0"

OPT="-xkb -auth ${AUTH} -rfbauth /etc/x11vnc.pass -forever -rfbport 5900 -o /var/log/x11vnc.log -loop"

CMD=${BIN}${OPT}


. /lib/lsb/init-functions


case "$1" in

    start)

echo -n "Starting ${SERVICE}..."

#/sbin/startproc ${CMD}

daemon -X "${CMD}"

sleep 2s

;;

stop)

echo -n "Stopping ${SERVICE}..."

PID=`ps -ef | grep x11vnc | grep -v grep | awk '{print $2}'`

kill -9 ${PID}

sleep 2s

;;

restart|force-reload)

echo -n "Stopping ${SERVICE}..."

PID=`ps -ef | grep x11vnc | grep -v grep | awk '{print $2}'`

kill -9 ${PID}

sleep 2s

echo -n "Starting ${SERVICE}..."

daemon -X "${CMD}"

sleep 2s

;;

    *)

    echo -e "Usage: ${SERVICE} {start | stop}"

    exit 1

    ;;

esac



vnc_x11의 권한 변경

sudo chmod 755 vnc_x11


부팅할 때 자동으로 시작하도록 등록

sudo update-rc.d -f vnc_x11 defaults 92


reboot


하면 아래 그림과 같이 잘 된다. 다만 모니터를 연결해보면 모니터에 연결된 화면은 아무것도 안나옴 커서만 딸랑 하나 나옴





(참고 : http://www.mls-software.com/rasppi.html)



리눅스에서 윈도우와 파일을 공유하기 위해서는 Samba가 필요하다.


1. 삼바는 다음과 같이 설치한다.


sudo apt-get install samba smbfs


2. 유저 추가

smbpasswd -a 계정


계정은 실제로 리눅스상에 존재하는 USER  만 사용가능하다고 함


3. 공유

난 외장하드에 데이터를 집어넣고 있으므로 

/media/디스크이름 을 통째로 공유하도록 한다.

아래와 같이 노틸러스 (파일브라우저)를 실행시켜서 파일시스템에서 /media/ 에 마운트 된 두개의 하드디스크가 보인다.



공유를 원하는 하드디스크를 클릭 / 우측마우스 버튼을 눌러 메뉴를 보면 공유옵션이 있다.

공유옵션을 눌러 들어가면




원하는대로 옵션 클릭하고 공유만들기 누르면 자동으로 접근권한 더할것이냐 묻고 OK 하면 끝!!



4. 그래서 속도는 만족스럽게 나오는가?



테스트를 위해 홈서버에서 영화파일 하나를 복사해봤다. 위 그림처럼 무려 102MB/Sec 


 매우 만족 :)




1. XBMC 설치


우분투에서 XBMC설치가 어려울 것은 없다.


우분투 소프트웨어센터에서 XBMC로 검색하면 아래 그림과 같이 검색되고 설치하면 된다.


(난 이미 설치 되어 있으므로 설치버튼이 아니고 제거버튼으로 뜬다.




2. 한글 설정

 1) 우선 폰트를 바꿔야 한다. 폰트 먼저 안바꾸면 글씨가 깨져서 못알아보게된다.

 시스템/설정/모양새/스킨 에서 변경


 2) 시스템/설정/모양새/국제에서 언어를 Korean으로 변경




그 외에 자세한 사용방법은  참고 : http://xbmc.tistory.com/5


그리고 Apple Store 에서 XBMC Remote 다운 받은 후에 이를 이용해서 리모컨으로 사용가능

* 여기서 자동으로 XBMC Server를 찾지 못해서 수동으로 설정했다.

 



서버는 아니었지만 기존 Etrayz + Xtreamer 구성은 NAS + Divx Player로 별 무리 없이 잘 사용해왔다..


하지만 세월이 문제였을까? 제품의 안정성이 문제였을까?


Etrayz는 어느날 갑자기 모든 데이터를 초기화시켜버리고 복구 불가 상태가되어버리고

Xtreamer는 못돌리는 동영상 속출, 종종 다운되어 버리는 문제가 발생하곤했다.


그래서 


1. 현재 사용하는 데스크탑에 7개의 하드를 모두 설치해놓고 

   PC ->  모니터 + TV + 프로젝터 연결

   PC -> USB-DAC 광출력 -> 리시버 연결


하여 영화도 보고 토렌트도 쓰고 하였지만.. 전력소모가 크기에 쓸때만 켜고 안쓸 때는 바로 꺼야 했고

중국산 저렴한 USB-DAC는 광출력이 안나오고 

뭐 그런 문제를 안고 대충 쓰다가

최근에 저렴하게 Zotac ZBOX ID18 이라는 베어본 PC가 나와서 홈서버 구성을 목적으로 구매했다.


ZOTAC ZBOX ID18 사양

CPU : 1007U (1.5G)

Chipset : NM70

RAM : 4G

SSD : 64G

1Gbps LAN

HDMI

DVI

Card Reader

USB3.0


대충 이정도 CPU가 매우 저전력으로 켜두고 있어도 기존 i3 데스크탑에 비하면 전력소모량이 훨씬 적을 것으로 보인다.



 위 사진의 제품이다.



1. 우선 OS 선정으로 고민했다.

windows7 이 편할것 같긴 했다만 오래 켜두어도 안정적이고 USB로 외장하드를 연결해두고 다른 PC에서 접속했을 때도 빠른 파일 이동속도를 보장하고

여러 서버로서의 서비스를 사용하기에는 리눅스 계열이 좋을것 같았다. 게다가 최근에 Ubuntu 12.04 를 이용해서 이것저것 하기도 했고.

그래서 일단 Ubuntu 12.04 를 설치하기로 한다.


2. Ubuntu 12.04 설치

  이건 뭐 별로 어려울것도 없고.. SSD에 설치하니 빠르고 쾌적하게 잘 돌아간다.


다만 몇가지 문제점 발견


 1) 전원을 켤 때 가끔 콘솔모드로 부팅이 된다. 여러 문건을 검색해보았지만 딱히 해결책은 없어보인다.

   http://askubuntu.com/questions/228809/low-graphics-error 에보면 SSD와 우분투의 lightdm에서 발생하는 문제점 같다는 소리가 있다.


 2) 이것 저것 설치 후 전원이 안꺼지는 문제 발생, 아래의 조치로 해결

sudo nano /etc/default/grub    //grub 파일 편집


GRUB_CMDLINE_LINUX_DEFAULT를 아래와 같이 편집

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi=force apm=power_off"


sudo update-grub




3. x11vnc 설치

 이전 포스팅 대로 설치하고 별 문제 없슴

 * 참고로 x11vnc를 이용 데스크탑에서 접속했을 때 한영전환은 ctrl + shift 키임




자 이제 기본은 설치가 되었고 아래와 같이 세팅하고 사용할 예정


1. XBMC 설치 HTPC로 활용

2. Samba 설치 파일 공유

3. Torrent Client

4. Air Play Server 설치

5. MPD 설치


지금 생각나는건 여기까지




현재 영상처리 PC는 앞으로는 키보드, 모니터, 마우스 없이 오직 전원(배터리)로 동작해야 한다. 블루투스와 무선인터넷은 동글을 이용해서 사용하기로 하고.


기본적으로는 전원이 켜지면 작성한 프로그램이 동작하고 그 결과값을 블루투스를 이용하여 받아볼 수 있고, 현재 찍고 있는 영상을 와이파이로 받을 수 있도록 되어있으나..


어떤 문제점이 생기면 다시 모니터와 키보드 등을 연결해서 해결해야 하는부분이 불편할 수 밖에 없겠다.


그래서 우분투 원격접속하기로 함


1. 우선 가장 많이 사용하는 XRDP의 경우 Server와 Desktop을 공유하는 방식이 아닌 또 다른 Desktop을 Client에 내주는 방식으로 내가 쓰려는 것과 맞지 않음


2. X11vnc가 사용해보니 속도도 빠르고 기본적으로 Desktop을 공유하는 방식으로 내가 사용하기에 가장 적합한 방식 


그래서 X11vnc로 환경을 설정하기로 함!  (참고 http://renderaid.blogspot.kr/2013/01/x11vnc.html)


x11vnc 설치

sudo apt-get install x11vnc


x11vnc Auto Start를 위한 설정 (재부팅 후 별도의 명령없이 자동으로 x11vnc가 실행되도록


sudo nano /etc/init/x11vnc.conf

위 명령으로 x11vnc.conf 파일 생성 후

아래의 내용을 쓰고 저장

#x11vnc.conf

start on login-session-start

script

x11vnc -xkb -noxrecord -noxfixes -noxdamage -display :0 -auth /var/run/lightdm/root/:0 -forever -bg -o /var/log/x11vnc.log

end script


하고 Rebooting 


원격에서 접속할 Client PC는 윈도우 7이 설치된 노트북 vnc client로는 ultra vnc viewer를 사용해서 접속




위와 같이 윈도우7 위에서 잘 동작하고 있슴 





이전에 사두었던 벨킨 공유기에 DD-WRT, TomatoUSB 핵펌 얹어서 무지 잘 쓰고 있었다.


 - 이거 셋팅하던 것도 기록해두면 좋았을 것을... ^^; 뒤늦게나마 참고했던 사이트 링크하자면

   핵펌하는 방법 : http://www.ppomppu.co.kr/zboard/view.php?id=oversea&no=157652

   외장하드 연결 및 파티션 : http://www.clien.net/cs2/bbs/board.php?bo_table=lecture&wr_id=173414

   Transmission : http://yjpark.tistory.com/146

 -


여튼 회사에서 토렌트 하나 추가할 게 있어서 외부접속을 시도했는데

공유기 접속 포트는 잘 접속이 되는데 Transmission 접속이 안된다. (내부망 즉 집에서는 잘 되는데 T.T)


Telnet 접속을 바로 시도해보았으나 접속 불가.. (공유기 설정을 보니 Telnet 접속은 외부 접속이 안되는듯)

그래서 회사에서 putty를 이용해서 공유기 SSH 접속을 해서 이것저것 함 보기로!!!

(공유기에 기본적으로 ssh를 지원, ssh 관련 메뉴를 보면 remote access enable 있는 걸로 보아서 외부접속이 될 듯!)




1. putty 설치

sudo apt-get install putty


2. putty 실행

 PuTTY SSH Client를 실행하면 됨


실행하면 다음과 같은 화면이 뜸



3. 접속 Host Name (or IP address)에 공유기 Host Name으로 접속



오옷!! 접속 성공!!


자 일단 회사에서 Putty로 집에 있는 공유기 까지는 접속했고.. 이제 왜 Transmission이 안되는지 함 보자.


1. 우선 외장하드가 잘 붙어 있나 확인

ls /mnt/


2. Optware 파티션을 opt로 마운트 시켜놓은게 잘 되어있는지 확인

ls /opt/


3. 외부에서 접속이 가능하도록 포트를 열어두었는지 확인

iptables -L INPUT


자 여기까지 한 결과가


아무것도 문제없이 다 잘 설정되어 있었다.. 근데 왜 접속이 안되는거지??


혹시나 해서 공유기 설정창 torrent에 접속



우씨.. 위에 참고한 링크들을 보면 공유기에서 torrent를 쓰기 위해서 이런저런 것들을 할게 많았는데


그냥 설정창에서 Enable 시키면 끝이었슴 --;;;


외부에서 접속 잘 됨!! 동작 잘 됨!! 

내부망에서는 아직 모르겠지만 안될이유가 없슴!!


여튼 오늘도 삽질



블루투스를 이용해서 Main PC와 통신을 해야해서 시리얼 프로그래밍이 필요하다.


그래서 검색해봤더니 (http://blog.naver.com/PostView.nhn?blogId=buniel1&logNo=60065576523&redirect=Dlog&widgetTypeCall=true)


오.. 뭐 이리 복잡해 --;


여기서 비동기 입력 방식을 처음에 채택..

예제를 보면 signal_handler_IO는 흔히 펌웨어에서의 Interrupt와 같은 개념

프로그래밍 하고 동작은 잘 하는데... 

문제는 signal_handler_IO가 Receive 할 때 뿐 아니고 Send 할 때도 발생한다.


그래서 다시 검색해서 가장 원론적인 문서(http://www.cmrr.umn.edu/~strupp/serial.html) 에 의해 다시 프로그래밍


소스는 캠으로 받은 영상을 모니터에 출력해주면서 블루투스를 통해 날아온 데이터를 읽어 콘솔에 뿌려주고 Echo하는 것..  설명은 생략


* 예제는 별거 없슴 UART Setting 하고 블루투스를 통해 날아오는 수신데이터 ReadSerialPort로 읽고 Write로 Sending 

   수신만 signal_handler_IO를 이용할 수 있었다면 참 좋았을텐데~ 


//============================================================================

// Name        : 140320_UARTTEST.cpp

// Author      : 

// Version     :

// Copyright   : Your copyright notice

// Description : Hello World in C++, Ansi-style

//============================================================================


#include <iostream>

#include <stdio.h>

#include <sys/time.h>


#include <termios.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/signal.h>

#include <sys/types.h>


#include <stdlib.h>




#include "opencv2/opencv.hpp"



#define BAUDRATE B115200


#define MODEMDEVICE "/dev/rfcomm0"

#define _POSIX_SOURCE 1

#define FALSE 0

#define TRUE 1


volatile int STOP=FALSE;



using namespace std;


int fd,c, res;

struct termios oldtio,newtio;

struct termios oldkey,newkey;

char rbuff[255];


int ReadSeralPort(void)

{

int retval;

res = read(fd,rbuff,255);

retval = res;

return retval;

}

int main() {


struct timeval start_time;

struct timeval end_time;

double elapsed_time;

float fps;

double total_fps = 0.0,average_fps = 0.0;

int cnt=1;

int key;

int i;

int ReadPort;

char buffer[25];

IplImage* img;

CvFont font;

cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.5,0.5);

string Sstring;

pid_t pid;


long DATABITS, STOPBITS, PARITYON, PARITY;

DATABITS = CS8;

STOPBITS = 0;

PARITYON = 0;

PARITY = 0;


//Shell command

//Change permission


int ret = system("sudo chmod a+rw /dev/rfcomm0");

if(ret == -1) printf("chmod Fail %d\n",ret);

else printf("chmod OK %d\n",ret);


fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NDELAY);

if (fd <0) { perror(MODEMDEVICE); exit(-1); }


fcntl(fd, F_SETFL, 0);


tcgetattr(fd,&oldtio); // save current port settings


// canonical 입력처리를 위한 포트 세팅 */

newtio.c_cflag = BAUDRATE | CRTSCTS | DATABITS | STOPBITS | PARITYON | PARITY |  CLOCAL | CREAD;

newtio.c_iflag = IGNPAR | IGNCR ; //IGNPAR | ICRNL;

newtio.c_iflag &= ~(IXON | IXOFF | IXANY);

newtio.c_oflag &= ~OPOST;

newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //ICANON;

newtio.c_cc[VMIN]=0;

newtio.c_cc[VTIME]=0;

tcflush(fd, TCIFLUSH);

tcsetattr(fd,TCSANOW,&newtio);


write( fd, "Test String from jslee", 22);



CvCapture* capture = cvCaptureFromCAM(0);

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 640);

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 480);

cvSetCaptureProperty( capture, CV_CAP_PROP_FPS, 65);


while(1)

{

gettimeofday(&start_time,NULL);

sprintf(rbuff,"");

ReadPort = ReadSeralPort();

if(ReadPort)

{


printf("Receive String = ");


for(i=0;i<ReadPort;i++)

{

printf("%c",rbuff[i]);

//printf("%c",buffer[i]);


}

printf(" [res = %d]\n",ReadPort);

write( fd, rbuff, ReadPort);


}




cvGrabFrame(capture);

img = cvRetrieveFrame(capture);

cvPutText(img,rbuff,cvPoint(20,20),&font,CV_RGB(255,255,255));



cvNamedWindow( "PreviewImage", 1 );

cvShowImage( "PreviewImage", img );

cvMoveWindow("PreviewImage",200,400);




key = cvWaitKey(1);

if(key > 10) break;


gettimeofday(&end_time, NULL);



elapsed_time = (double)(end_time.tv_sec) + (double)(end_time.tv_usec)/1000000.0 - (double)(start_time.tv_sec) - (double)(start_time.tv_usec)/1000000.0;

fps = 1.0 / elapsed_time;

total_fps += fps;

average_fps = total_fps / (double)(cnt);

cnt++;

if(cnt == 100)

{

cnt = 1;

total_fps = 0.0;

}

elapsed_time *= 1000.0;


//printf("Elapsed T = %2.3f ms, Frame = %2.3f (fps), Avrg Frame Rate = %2.3f\n",elapsed_time,fps,average_fps);


}

cvReleaseImage(&img);

cvReleaseCapture( &capture );

// restore old port settings

tcsetattr(fd,TCSANOW,&oldtio);

printf("Close and Quit\n");

close(fd);

// cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!



return 0;

}



전에 C 프로그램에서 쉘 명령어를 사용하여 블루투스 연결하는 것은 일단 실패한것이고


다음 방법으로 생각한 것이 우분투가 시작될 때 터미널을 실행하고 블루투스를 연결하는 것이다.


어차피 부팅이 되면 내가 짠 프로그램도 자동으로 시작되어야 하니 


우분투 시작프로그램 등록 방법을 알아둘 필요가 있다.


터미널을 열고 



gnome-session-properties 를 실행하면



이와 같이 시작프로그램 관리 창이 뜬다.



일단 나는 xterminal 을 실행 시켜보고자 한다.




이와같이 추가가 완료되고.. 그럼 리부팅!



위와같이 xterminal 이 일단 실행되는 것은 성공!!!


어.. 그럼 자동으로 여기다 명령어를 쓰는건 어떻게 하지??? 


자동으로 쓰는 건 -e 옵션이다. (http://kldp.org/node/112797)


여러 명령 쓰는건 대충 감과 삽질로 알아내고 ^^;;;


그래서 위의 gnome-session-properties 다시 실행 해서 명령을 다음과 같이 변경


xterm -e "sudo rfcomm release rfcomm0 ; sudo rfcomm connect 0; read"


전에 연결한 기억 때문인지 rfcomm0 가 기본적으로 mount 되어 있어서 

rfcomm release rfcomm0 로 release 

그리고 

rfcomm connect 0 로 connect


자 다시 부팅해보자!




오오 원하던 대로 부팅을 하고 xterm이 실행되고 블루투스로 지정한 PC연결 완료!!


그리고 C프로그램에서는 Shell명령으로 퍼미션 수정하고 실행하니 잘 된다!!!






현재 하고 있는 작업 중

Server PC(Windows 7) 에서 명령을 보내면 Client PC(Linux) 에서 명령을 받아 해석하고 수행 그리고 결과를 넘겨주어야 하는데 이를 블루투스를 통해서 한다.

이를 위하여 Server PC와 Client PC는 블루투스 시리얼포트를 이용하여 통신을 하게 된다.


일단 Server는 윈도우 환경에서 BlueSoleil을 이용하니까 별문제가 없다. 

리눅스 PC에 NEXT-BT104라는 블루투스 동글을 설치하였는데 

이게 윈도우 상에서는 Serial Port Service가 보이는 걸로보아  (아마 SPP Protocol 아니면 RFCOMM protocol 이겠지) 시리얼 포트를 지원하는 것 같은데

리눅스에 꽂아두면 Server PC에서 사용가능한 서비스에 Serial Port가 나타나지 않는다.


 우분투/설정/블루투스 에서도 Serial Port 해당 서비스 안보임 T.T

이를 해결하기 위해 역시 검색 

http://robotbaram.tistory.com/entry/%EB%B8%94%EB%A3%A8%ED%88%AC%EC%8A%A4-%EC%8B%9C%EB%A6%AC%EC%96%BC-%ED%8F%AC%ED%8A%B8-%EC%84%A4%EC%A0%95 

위 링크에 가장 쉬운 방법이 있었다.


* Blueman 설치

$sudo apt-get install blueman



으로 설치하고 프로그램(이름이 "블루투스 관라지", 참고로 우분투/설정/블루투스는 이름이 "블루투스")을 실행하면



메뉴의 설정을 누르면 서비스에 Serial Port가 보임 이를 이용하여 연결하면 나의 경우 /dev/rfcomm0 로 연결됨 


자.. 이건 GUI환경에서이고 Terminal 환경에서 접속을 시도해 보자.

(이유는 C 프로그램 안에서 위의 작업들이 수행되어야 해서 T.T)


참고한 사이트는 아래와 같다.

http://stackoverflow.com/questions/15464475/how-to-setup-serial-communication-in-processing-to-dev-rfcomm0


위와 같이 터미널에서 hcitool scan 하면 주변의 블루투스 장치들이 검색된다.


연결은 rfcomm 을 이용한다.


$sudo nano /etc/bluetooth/rfcomm.conf

우선 위 명령어를 이용하여 rfcomm.conf 파일을 수정해주자.


# RFCOMM configuration file.

#


rfcomm0 {

#       # Automatically bind the device at startup

        bind yes;

#

#       # Bluetooth address of the device

        device 00:15:83:6B:FA:C1;

#

#       # RFCOMM channel for the connection

       channel 1;

#

#       # Description of the connection

        comment "Jslee-laptop-bluetooth";

}



기본적으로는 모두 #으로 주석처리 되어있는데 필요한 부분은 #을 지워 활성화 시켜준다.

bind no -> bind yes

device XX:XX:XX:XX:XX:XX: 연결하고자 하는 PC의 Bluetooth Address 

channel 1

그리고 혹시 몰라 comment도 ^^;



위 그림과 같이

$sudo rfcomm connect 0


를 입력하면


접속 성공!!!


Server PC의 BlueSoreil 에서도 연결이 되었슴이 나타난다.



그리고 작성한 시리얼통신 프로그램 예제를 실행하니

/dev/rfcomm0: Permission denied


메시지가 뜨고 실행이 종료된다.


즉 /dev/rfcomm0에 대한 권한이 없다는 것인데 이는 권한을 부여하면 된다.




위 그림과 같이


$ls -al /dev/rfcomm0 

하면 현재 /dev/rfcomm0 의 권한이 root 에게만 read ,write 가능한 것을 볼 수 있다.

이를

$chmod a+rw /dev/rfcomm0 

해주고 다시

$ls -al /dev/rfcomm0 

확인하면

read, write 권한이 모두에게 주어진 것을 볼 수 있다.



그리고 다시 실행하니 성공!!! 


자 이제 위의 쉘 명령들을 C프로그램 안에서 구현해봐야겠다.


요새 리눅스 환경에서 또 이미지프로세싱 하느라 이것저것 캡춰해서 블로그에 올려두는데

캡쳐프로그램으로 정확히 캡쳐하기 힘든 경우가 있다.

이때 Print Screen을 이용하려고 했는데...

이놈이 도무지 동작을 안한다. --;;;


여튼 그래서 뒤적이니

http://ioriy2k.pe.kr/archives/1221 에 좋은 정보!!


즉 Linux Kernel Option에서 Sys Rq. 가 활성화 되어 있어서 Print Screen을 누르면 Sys Rq. 로 인식한다는 것이다.


이 때의 해결책


sudo sysctl -w kernel.sysrq=0 하면 커널의 Sys Rq 가 비활성화 된다.

근데 그러면 부탕할 때마다 해줘야 하니까.

nano /etc/sysctl.d/10-disable-sysrq.conf 를 만든뒤


kernel.sysrq=0


을 쓰고 저장한뒤

start procps 하면 OK!!



꽤 오래전에 그 당시 기준 나름 싸게, 현 시점 기준 비싸게(ㅋㅋ)주고 산 넷북이 하나 있다.


이름하야 Acer Aspire-one AOA150 (응? AOA?? AOA 좋음 ㅋㅋㅋ)


사양이 

CPU : Intel Atom N270 1.6Ghz (1세대 아톰)

RAM : 1G

HDD : 160G

Monitor : 8.9인치 (1024 * 600) <- 이 세로 600 해상도가 아주 사람 미치게 한다 


여튼 이놈의 넷북이 아는 사람은 알겠지만 그 성능이 참 안타깝고도 안타까워 딱히 활용하기가 지랄같다.

그래서 해본게


1. 윈도우XP에 외장하드 붙여서 네트워크 하드로 써보자

 - 속도 1Mbps 나옴.. 너무 느림


2. Xpenology 설치해서 NAS로 써보자.

 - 다운받을 수 있는 모든 버전별 Xpenology 이미지들 다 적용안됨 T.T

  (일반PC에 설치할 수 있는 무료 NAS 운영체제가 몇가지 있는데 Xpenology , Free4Nas, OpenMediaVault 등이 있다.)

 - 그 와중에 예전에 해외구매 해두었던 Belkin 공유기에 DD-WRT에 Tomato 핵펌 올리는데 성공, 여기에 외장하드 (Ext3 포맷하고) 붙이니 속도 10MBps 가까이 나옴 

 


3. 리눅스 중에 가볍다는 Mint Linux 설치해보자.

  - Linux Mint 16 Petra Mate 32Bit 설치 성공

 - Interface도 괜찮고 나름 나쁘지 않게 돌아가나 저놈의 세로 해상도 600은 웹서핑하기도 지랄맞음 T.T



그렇다면 요놈을 홈시어터용 PC로 만들어보자고 결정하고 XBMC 설치

- XBMC 설치는 잘 되나 1080P  동영상 안돌아감, 720P 동영상도 힘들어함


그래서 대체 이놈을 뭐에 써먹나 고민중에 내린 결론이 뮤직서버로 만들면 어떨까 해서 검삭해보니

리눅스를 뮤직 스트리밍 서버로 사용하는 사람이 좀 있었다!!!


여튼 그래서 Mint Linux 에 MPD(Music Player Daemon) 을 설치하기로 결정!!


1. ALSA 오디오 출력 설치 (기본적으로 깔려있을꺼임!)

 


역시 이미 깔려있슴


2. MPD와 MPD Client 설치 

 MPD Client Program은 뒤적여보니 ncmpc를 많이 쓰나 봄




이렇게 설치


3. MPD 설정

nano /etc/mpd.conf

로 mpd 설정파일 편집한다

(nano 말고 vi를 쓰건 뭘 쓰건 텍스트 편집기 사용은 자기 마음)






bind_to_address 에서 "localhost" -> "0.0.0.0" 으로

밑에 #port "6600" -> port "6600" (#제거)


포트6600이 있는 걸로 봐서 원격에서 접속시 공유기 포트포워딩 mpd포트 6600번 해주면 될것 같음



#metadata_to_use 에서 #제거하고 metadata_to_use 로 metadata 사용 가능하게 만들기




심볼릭링크를 이용해서 음악을 가져오기 위해서

follow_outside_symlinks 와 follow_inside_symlinks 앞에 # 제거

(심볼릭 링크가 뭔진 아직 모르겠슴.. 이럴때 걍 시키는 대로 하는거임 ^^;;)




원격접속시 사용할 비밀번호 설정

사용하고자 한다면 #password 앞에 # 제거 그래고 "password@read,add ..." 에서 password 부분에 원하는 암호 입력



input 비활성화.. 앞에 다 #붙여서 비활성화 시킨다. 

물론 입력기능을 쓰고자 한다면 알아서 쓰시길



오디오 출력관련

첨에 설치확인했던 것처럼 오디오 출력은 alsa를 이용한다. 여기서 type "alsa"를 제외하곤 다 비활성화 되어있음, 그대로 쓰면 됨

하나 확인해야할 것은 device다.

일단 출력이 하나고 기본출력이면 그냥쓰면 될것 같은데 난 일전에 구매한 USB-DAC를 사용하고자 한다. 

아직 그걸 붙인건 아니지만 그걸 붙이면 수정해줘야 할듯


그렇다면 자기 device 확인 방법은 일단 편집기 저장하고 터미널로 돌아가자


터미널에서 aplay -l 해보면 장치목록이 나온다.

여기서 보면 0번 카드 Intel HDA 어쩌구 저쩌구

즉 위에 mpd.conf 파일의 출력 관련 항목에서

device "hw:0,0" 에서 앞의 0이 출력장치 번호이다.


나중에 USB-DAC를 연결하고 장치목록을 확인해보니 1번이더라 그리고 그쪽으로 출력을 하고 싶다면

device "hw:1,0" 이라고 하면 된다.... 될꺼다 ^^;



httpd 출력 설정

보아하니 외부에서 http로 접속할 때 음악의 출력을 내보내주는 부분에 대한 설정인듯하다.

일단 이놈은 사용해야 할 듯해서 #을 지워서 사용가능하게 했다.

encoder 항복에서 vorbis는 ogg포맷 lame은 mp3포맷이라는데 ogg포맷은 문제가 생겼다고 해서 나도 mp3포맷으로 설정

bitrate 192kbps, format 44100:16:1 이면 CD음질 일게다.




Internal Buffer Size 설정

audio_buffer_size의 앞에 #을 제거하여 사용하도록 설정하고 원래 "2048" 이었는데 4배인 "8192"로 설정했다.

(이게 뭐 얼마나 리소스 잡아먹겠어 하는 맘임.. 결과는 아직 모르겠슴 ㅋ)


자 이렇게 일단 설정을 마치고

네트워크 설정을 해야하는데 우선 지금 회사 내부네트워크 이므로 별다른 설정없이 테스트해 볼 생각


ifconfig 로 현재 연결된 무선네트워크의 ip를 보니 192.168.0.15 다


기억해두고 리부팅


4. MPD 동작 확인



sudo /etc/init.d/mpd restart로 확인했는데 266라인에서 뭐가 문제가 생겼단다.. --+


자 그럼 다시 nano /etc/mpd.conf 로 문제의 266라인을 보자.



아.. 이런 #audio_output 에서 #을 안지웠다. 그래서 지우고

sudo /etc/init.d/mpd restart




오.. 이제 문제없이 MPD가 시작되었다.!


5. 음악파일 MPD폴더에 링크

테스트를 위해 다운 받은 음악폴더를 MPD폴더에 링크 시킨다.

여기서 외장하드 등의 다른 장치는 /media/장치/음악폴더 를 이용하여 링크시킨다.


링크는 ln -s 음악이 들어있는 경로 및 폴더 /var/lib/mpd/저장할링크이름 으로 한다.


나는 테스트할 음악을 /home/jslee/music에 넣어두었고 저장할 링크이름은 imusiclink로 했다.



6. ncmpc로 데이터베이스 업데이트

그리고 터미널에서 ncmpc 실행하고 아까 설정한 비밀번호 입력하여 들어간뒤 Ctrl + u 하면 데이터베이스를 업데이트 하는데...



이런 아무것도 안뜬다 ㅠㅜ


아마 음악파일 MDP폴더에 링크시키는 것에 문제가 있지 않았는데 그건 아니고 저건 그냥 playlists 재생한게 없어서 안뜨는거

3번 열람을 누르면 아까 링크한 음악들이 보인다 ㅋ


7. 그런데 ncmpc 가 불편해서 그런지 sonata라는 클라이언트를 쓰나보다. 아마 GUI를 지원해서 그런듯

sudo apt-get install sonata

 위와 같이 sonata 설치


설치가 완료되면  sonata 실행하고 아까 입력한 비밀번호 치면



위와 같이 화면이 뜨고 Library에 아까 링크한 음악들이 표시된다.

재생할 음악을 선택하나 뒤 우측 마우스 버튼 클릭해서 add 하면 Current탭에 음악이 표시되고 이 음악을 재생시킬 수 있다.

이렇게 sonata 실행해서 음악감상하면 끝....

끝???


아.. 내가 원한건 아이폰이나 아이패드등 다른 기기를 클라이언트로 이용하는 것인데...


8. 다른 기기를 클라이언트로 사용

 아이폰 : mpod

 아이패드 : mpad

 안드로이드 : mpdroid

라는 MPD 클라이언트 어플이 있단다.


 우선 아이폰에 mpod 설치하고 실행하고

 Connections/Server에 넷북의 무선 IP 192.168.0.15 입력

 Connections/Password에 아까 비밀번호 입력해서 연결하고

 Select Music/song/playlist 를 누르니

오~ 아까 그 음악들이 보인다.

여기서 재생하면 끝


물론 이것은 내부네트워크니까 그냥 한거고

아까 말한것처럼 외부에서도 사용하기 위해서는 공유기 포트포워딩 하고 DDNS 받아서 설정해야할 것이다.


아래 링크 참고해서 작성 (감사합니다)

http://ko.goldenears.net/board/ST_TipInfo/3155439




+ Recent posts