ㄱ. 목적

1. 블루투스 디바이스가 검색 가능하도록 만들기 위한 기초 지식을 공부해보자


ㄴ. 본론 

1. 블루투스가 검색 가능하기 위해서는 SDP 서비스에 등록이 되어 있어야 한다.

SDP는 연결된 블루투스 디바이스에서 어떠한 서비스가 가능하고, 그 가능한 서비스의 특징에 관한 정보를 교환하기 위한 프로토콜이다.

 SDP를 통해 블루투스 디바이스들이 LAN, 핸드폰, 팩스, 프린터 등의 서비스가 가능한지에 대한 정보를 교환하는 것이다.


2. 리눅스 에서 sdp 서비스를 등록하려면 sdp 데몬이 동작하고 있어야 하고 sdp 데몬이 동작하려면 bluetooth 데몬이 동작하고 있어야 합니다.


#ps -al | grep bluetooth 

위 명령으로 bluetooth 데몬이 실행되고 있는지 알 수 있습니다.


ㄷ. 결론

1. 블루투스 디바이스가 검색 가능하기 위해선 SDP 서비스에 등록되어 있어야 한다는 것을 알았습니다.

2. 다음 포스팅은 어떻게 SDP 데몬을 설치하고 동작시키는지 어떻게 등록 시키는지 알아보겠습니다.

Posted by 시크한공돌이
,

1. 목적

ㄱ. 리눅스 상에서 블루투스를 통한 통신을 하기 위하여 rfcomm 방식의 통신의 예를 통해 통신하여 본다.


2. 본론

ㄱ. 먼저 블루투스 통신은 크게 2가지로 나뉜다. 

a. TCP 같은 기능을 하는 RFCOMM : TCP는 65535개의 포트를 지원하지만 RFCOMM은 30개의 포트를 지원함

b. UDP와 같은 기능을 하는 L2CAP


ㄴ. 아래의 소스코드는 RFCOMM 예제이이다. RFCOMM 프로토콜은 더욱 믿을 수 있는 연결을 지원한다(TCP와 유사함)


ㄷ. 다음의 명령어를 통해 서버측 디바이스의 블루투스 address를 알아 볼 수 있다.

$ hcitool dev

Devices:
hci0 00:1F:81:03:11:22


ㄹ. RFCOMM server.c 소스


ㅁ. RFCOMM client.c 소스


3. 결론

ㄱ. 블루투스의 RFCOMM  프로토콜 통신의 예를 통해 학습하여 보았다.

Posted by 시크한공돌이
,

1. 목적

ㄱ. 우분투 상의 블루투스 디바이스의 이름을 변경하여 보자


2. 본론

ㄱ. 우분투의 블루투스 디바이스의 이름을 바꾸기 위해 블루투스 기기의 adress를 먼저 확인

hciconfig

ㄴ. 확인하여 나오는 블루투스의 adress가 XX:XX:XX:XX:XX:XX라 가정하고 다음의 파일을 편집하면 블루투스 기기의 이름을 변경할 수 있다.

/var/lib/bluetooth/XX:XX:XX:XX:XX:XX/config

ㄷ. 그 후 다음 명령어를 실행하여 블루투스를 재시작 해줌

sudo /etc/init.d/bluetooth restart


3. 결론

ㄱ. 블루투스 디바이스의 이름 변경을 하는 법을 알아보았음.

Posted by 시크한공돌이
,

1. 목적

ㄱ. 리눅스 ./configure시에 다음의 에러가 발생할 때 어떻게 해결하는지 알아본다.

 ./configure

checking for a BSD-compatible install... /usr/bin/install -c

checking whether build environment is sane... configure: error: newly created file is older than distributed files!

Check your system clock


2. 본론 

ㄱ. 위의 에러의 마지막을 보면 새로 만들어진 파일이 분산된 파일들보다 오래되었다 라는 말이 있고 시스템 시간을 확인하라고 한다.

ㄴ. 이는 리눅스 시스템의 시간 이상으로 인한 에러임으로 rdate나 ntp같은 시간 관리 소프트웨어를 통해 정상적인 시간을 맞춰주게 되면 해결된다.

sudo apt-get install ntp

ㄷ. 아래와 같이 수동으로 변경도 가능하다.

-------------------------------------------------------------------------------------

[root@falinux ~]$ date -s "052314262012"

Wed May 23 14:26:00 UTC 2012

-------------------------------------------------------------------------------------


3. 결론

ㄱ. ./configure의 에러를 해결하는 법을 알아보았다.

Posted by 시크한공돌이
,

1. 목적

ㄱ. 리눅스 시작시에 NFS 디렉토리를 자동으로 마운트 해보자


2. 본론

ㄱ. 리눅스의 NFS 디렉토리를 시작시에 자동으로 마운트 하기위해 데몬 서비스로 등록해야함

a. 데몬은 리눅스 서버가 부팅할 때 백그라운드 프로세스로 실행되고 있는 프로그램이다.

i. 리눅스는 다양한 기능과 서비스를 제공하기 위해 많은 데몬 프로세스를 실행

ii. 대부분의 데몬 프로세스는 마지막에 d라는 문자를 포함

iii. 리눅스에서는 네트워크 관련 서비스 처리를 데몬이 담당

iv. 데몬은 독립형 데몬과 수퍼데몬으로 구분

ⓐ. 독립형 데몬

- 웹 서버(HTTPD), DB 서버(MYSQLD)와 같잉 시스템에 독자적으로 프로세스가 구동되어 서비스를 제공

- 항상 메모리에 상주하고 대기하여 클라이언트 요청을 기다림

' 자주 호출되는 서비스의 경우 메모리에 상주시켜 독립형 데몬으로 사용하는 것이 적절

- 독립형 데몬의 실행 스크립트 파일은 대부분 /etc/init.d/ 디렉토리에 존재

- 독립형 데몬의 실행 형식

# /etc/init.d/<서비스 이름> {start | restart | stop}

ⓑ. 수퍼 데몬

- 작은 규모의 서비스는 종속형 데몬으로 필요 시에만 수퍼 데몬이 작동시킴

- 평소에는 4개의 데몬 프로세스가 잠자고 있지만, 타겟 시스템이 호스트 시스템에 서비스를 요청하면 수퍼 데몬을 통하여 서비스 제공

- 수퍼 데몬 XINETD는 /etc/xinetd.d/<데몬 프로그램 이름> 이라는 다수의 설정 파일 사용

' 종속형 데몬 관련 설정 파일을 수정하면 수퍼 데몬을 반드시 재실행

' 요청이 종료되면 서비스 데몬도 종료

b. 부팅 시 자동으로 서비스를 실행

i. 부팅 시 자동으로 서비스를 실행하는 절차

ⓐ.  /etc/init.d에 실행 서비스 셀 프로그램 작성

ⓑ. update-rc.d 명령으로 작성된 스크립트를 초기화 스크립트 링크에 등록

# update-rc.d target.sh defaults 99

-> target.sh의 서비스를 부팅 시 마지막 순서(99)로 실행하도록 등록

ii. 타겟 시스템에서 부팅 시 자동으로 네트워크 IP 설정하고, 호스트의 NFS 공유 디렉토리를 마운트 하는 서비스 등록

ⓐ. /etc/init.d/target.sh 셀 스크립트 작성

ⓑ. update-rc.d 실행하여 등록

ⓒ. 재 부팅 후 확인

c. 자동 실행되는 셀 파일 생성하고, 실행권한 부여 후 등록

# vi /etc/init.d/target.sh


# target.sh의 내용

mount -t nfs 192.168.100.5:/home/lee/nfs_host /root/nfs_target 

형식 : mount -t nfs 호스트IP:호스트의 NFS 디렉토리 타깃의 NFS 디렉터리

# chmod +x /etc/init.d/target.sh

update-rc.d target.sh defaults 99

d. 기존 연결했던 NFS 마운트 해제 후 재 부팅 해봄

# umount /root/nfs_target

# ls /root/nfs_target

# reboot

e. 재 부팅 후 마운트 된 것을 알 수 있음.


3. 결론

ㄱ. 리눅스 데몬 등록을 통해 NFS 디렉토리를 자동으로 마운트 해보았다.

Posted by 시크한공돌이
,

1. 목적

ㄱ. apt-get update 시에 fetch to fail 에러가 발생 할 때가 있다.


2. 본론

ㄱ. 보통 다음에 동작에 해결할 수 있다.

apt-get update

apt-get update --fix-missing

apt-get install xxxx

apt-get upgrade

ㄴ. 위의 동작으로 해결이 안되는 경우 아래와 같이 해결한다.

echo "nameserver 8.8.8.8" > /etc/resolv.conf

echo "nameserver 8.8.4.4" > /etc/resolv.conf

ㄷ. 위의 명령어 후에 apt-get update를 하면 해결되게 된다.


3. 결과

ㄱ. apt-get update의 fail to fetch 에러시 해결 방법을 알아본다.



Posted by 시크한공돌이
,

1. 목적

ㄱ. BlueZ의 simplescan 예제를 테스트 한다.

ㄴ. gcc를 통해 blueZ를 포함하여 컴파일 하는 법을 배워본다.


2. 본론

ㄱ. mit 대학의 bluetooth 관련 강의의blueZ 예제를 참고한다.

ㄴ. ㄱ의 소스는 simplescan.c의 소스이다. 컴파일은 다음의 명령어를 통해 하게 된다.

gcc -o scantest simplescan.c -lbluetooth

ㄷ.  컴파일 후 생성되는 scantest 파일일 실행하게 되면 다음과 같은 결과를 볼 수 있다.



3. 결론

ㄱ. BlueZ를 통한 simplescan.c 예제를 실습해보았다.

ㄴ. 블루투스 기기들이 검색되는 것을 볼 수 있다.

Posted by 시크한공돌이
,

1. 목적

ㄱ. 리눅스 베이스에서 블루투스 통신 프로그래밍을 해보자.

ㄴ. 기반을 준비해 보자


2. 준비

ㄱ. BlueZ 라이브러리 소개

리눅스 상에서 블루투스 장비를 프로그래밍 하기위해서는 보통 BlueZ 라이브러리를 이용합니다. (씨리얼 방식으로 통신하기도 하는 듯합니다.)

BlueZ 라이브러리는 리눅스 환경에서 Bluetooth 무선 표준 스펙을 구현한 구현물입니다. 공식적으로 이 프로젝트는 Kernel 2.4, 2.6 을 지원합니다.

http://www.bluez.org/


ㄴ.  BlueZ 라이브러리 설치 및 설정

리눅스 상에서 BlueZ 를 동작하도록 하기 위해서는 우선 라이브러리를 설치해야합니다. 

http://www.bluez.org/download.html

a. 아래 명령어를 통해 BlueZ 라이브러리를 받음

wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.2.tar.xz

tar xf bluez-5.2.xz

cd bluez-5.2

./configure

b. 우분투에서 상기 명령어들을 실행하면 ### ERROR: configure: error: GLib >= 2.28 is required 발생 

이유 : glib가 설치 되어 있지 않기 때문에 -> 아래 명령어로 glib 설치

apt-get install libglib2.0-dev

c. 위 명령어 후 다시 실행하면 ### ERROR: configure: error: D-Bus >= 1.4 is required 발생

apt-get install dbus-*dev

d. 또 실행하면 ### ERROR: configure: error: USB library support is required 발생

apt-get install libusb-dev

e. 다시 실행하면 ### ERROR: configure: error: libudev >= 143 is required 에러 발생

apt-get install libudev-dev

f. 실행하면 ### ERROR: configure: error: libical is required 발생

apt-get install libical-dev

e. ### ERROR: /usr/bin/ld: cannot find -lreadline 나 reading headline 에러가 발생하면 

apt-get install libreadline-dev

f.   위설정들 설치 후에 다시 아래 명령어들 수행

./configure --disable-systemd

make

make install


상기의 페이지에서 BlueZ 라이브러리의 최신버전을 받으시고, 컴파일한뒤 구동 환경으로 복사하시기 바랍니다.

이때, BlueZ 라이브러리를 구동하는 환경이 커널 2.4 시리즈인 경우 커널상에 Bluetooth 스택이 올라가있지 않은 경우가 있습니다. 이 경우 패치 커널에 적용하고 다시 설치해야만 정상적으로 블루투스를 이용할 수 있습니다. 

각 커널 별 블루투스 스택 지원 사항에 대한 설명과 패치 파일 및 패치 과정에 관련된 설명은 아래 사이트를 참고하시기 바랍니다.

http://www.holtmann.org/linux/kernel/

일단 커널 스택과 라이브러리가 정상적으로 설치되었다면 블루투스 동글을 삽입한뒤 다음과 명령어를 통해서 삽입된 블루투스 장비가 있다는 사실을 확인하시기 바랍니다. (제 경우에는 USB 형태의 동글을 이용했습니다.)

hciconfig

만약, 리눅스 커널이 삽입된 동글을 인식했다면 hci0 라는 디바이스가 잡힐 것 입니다.

hciconfig hci0 up 

명령어를 이용해서 해당 디바이스를 활성화시키시면 모든 준비작업이 끝납니다.


3. 결론
ㄱ. 블루투스 프로그래밍을 위해 BlueZ 라이브러리를 설치하고 기반을 준비해보았다.
ㄴ. 블루투스 장비를 리눅스에서 인식시켜 보았다.


Posted by 시크한공돌이
,

1. 목표 

ㄱ. 이전 시간에 고정 IP 설정하는 법을 배웠습니다. 그 고정 IP를 임베디드 보드에 세팅하고 호스트와의 NFS(network file system)을 설정하는 법을 배워보도록 하겠습니다.


2. 준비

ㄱ. 타겟 임베디드 보드에 고정 IP 설정을 해줍니다. (타겟 IP는 192.168.0.5 라고 가정)

ㄴ. 호스트에 고정 IP(호스트의 IP는 192.168.0.6 이라고 가정)와 nfs-kernel-server 패키지를 인스톨 해줍니다.

sudo apt-get install nfs-kernel-server

위의 명령어를 입력하여 설치합니다.


3. 본문

ㄱ. 먼저 NFS에서 사용할 공유 디렉토리를 생성해 주어야 합니다.

mkdir ~/nfs_host

명령어를 통해 nfs_host라는 디렉토리를 홈 및 유저 폴더에 생성해 줍니다.


ㄴ. 위의 설정을 완료 하였다면 NFS 관련 설정 파일인 /etc/exports 파일을 편집 하여야 합니다.

sudo vi /etc/exports

명령어를 통해 파일을 엽니다.

다음과 같은 그림이 뜨는데 색 별로 글씨로 설명하면 

- 호스트(사용자가 쓰는 PC의 개발환경)의 NFS용 공유 디렉토리
- 타겟의 IP 주소
- NFS 공유 방식입니다. (공유 방식 / rw : 읽기 / 쓰기, sync : NFS가 쓰기 작업할 때 마다 디스크 동기화, no_root_squash : NFS 클라이언트가 서버의 루트 권한 접근 허용)

그림 1. /etc/exports 파일의 설정 모습

 위의 그림 1과 같이 규칙에 맞게 설정을 해줍시다.

위와 같은 설정을 한 후에 아래 명령어를 입력하여 nfs-kernel-server를 재구동 시켜줍니다.

sudo /etc/init.d/nfs-kernel-server restart


ㄷ. 이제 호스트 설정이 완료 되었으니 임베디드 타겟 보드에서 NFS를 마운트 해야합니다.

먼저 다음의 명령어로 공유 디렉토리를 마운트 할 디렉토리를 만들어 줍니다.

mkdir /root/nfs_target


그 다음 다음과 같은 명령어를 통해 마운트 하게 됩니다.

mount -t nfs 192.168.0.6:/home/dean/nfs_host \    엔터

> /root/nfs_target    엔터

성공하게 되면 호스트와 디렉토리가 동기화 됨을 볼 수 있습니다.


4. 결론

ㄱ. NFS를 구축하는 법을 배워보았습니다.

ㄴ. 가끔 공유가 안되는 경우가 있는데 그럴경우 ufw 와 같은 방화벽 설정을 해제하거나 허용 IP를 추가하는 것으로 해결 할 수 있습니다.


Posted by 시크한공돌이
,

1. 목적

ㄱ. 우분투에 고정 ip를 설정하는 법을 알아보자(Figure out how to set static IP adress on ubuntu)


2. 준비

ㄱ. vi 에디터 사용법


3. 내용

ㄱ. 우분투에서 DHCP에서 고정 IP로 변경하기 위해 /etc/network/interfaces 의 내용을 변경해 주어야 함.

ㄴ. 설정할 IP 테이블이 다음과 같다고 하면

IP

192.168.0.2 

netmask 

255.255.255.0 

gateway

192.168.0.1 

 DNS server

192.168.64.1 

ㄷ. 먼저 ㄱ 에서 설명한 /etc/network/interfaces를 열어야 합니다.

다음의 명령어를 커멘드 라인에 입력하면 

sudo vi /etc/network/interfaces

아래와 같은 내용이 보입니다.

auto lo

iface lo inet loopbback

이 내용 아래에 다음과 같은 설정 내용을 추가해줍니다.

auto eth0

iface eth0 inet static

address 192.168.0.2

netmask 255.255.255.0

gateway 192.168.0.1

ㄹ. 다음은 DNS 서버를 설정해 주어야 합니다.

sudo vi /etc/resolv.conf

명령어를 입력합니다.

nameserver 192.168.64.1

파일 안에 위와 같이 입력하고 저장을 해줍니다.

ㅁ. 위와 같이 네트워크 세팅 파일을 수정한 후에 네트워크 데몬을 재시작 해주어야 합니다.

sudo /etc/init.d/networking restart

위의 명령어를 입력한 뒤 

ping naver.com

명령어로 핑 테스트를 하여 패킷이 정상적으로 반환된다면 고정 IP 설정이 성공적으로 완료된 것입니다.


4. 결론

ㄱ. 우분투의 고정 ip 설정하는 법을 알아보았습니다.

Posted by 시크한공돌이
,