강좌 & 팁
글 수 2,412
2014.07.30 19:51:45 (*.134.169.166)
45610
시스템 프로그램을 node.js 로 사용하다 보면
USB 나 MMC 인터페이스를 통해서 장치가 추가 되거나 삭제 되는 것을
검출할 필요가 있습니다.
리눅스에서는 이런 처리른 udev 라는 것을 이용하는데요.
이와 관련된 강좌는 포럼에 이미 강좌를 진행했기 때문에
자세한 설명을 생략하고
node.js 에서 어떤 식으로 이 방식을 이용하는지 알아 보겠습니다.
node.js 에는 udev 란 모듈이 있습니다.
이 모듈은 다음 위치에서 제공되고 있습니다.
https://www.npmjs.org/package/udev
기트허브의 레포지트리는 다음과 같습니다.
https://github.com/cheery/node-udev
우선 모듈 설치를 하기 전에 작업 디렉토리를 구성해 봅시다.
저는 다음과 같은 위치에서 작성하기로 했습니다.
/home/frog/udev
우선 udev 모듈을 설치해 봅시다. 이 모듈은 udev 라는 패키지 설치에 의존적이므로
다음과 같은 순서대로 하시면 됩니다.
이미 udev 패키지가 설치되어 있다면 첫번째
과정은 무시하셔도 됩니다.
$ cd ~/udev/
$ sudo apt-get install libudev-dev
$ npm install udev --save
가장 먼저 리눅스 시스템에 존재하는 장치 목록을 얻어 오는 방법을 이 udev 를 이용하여 살표 보죠.
아주 간단하게 전체 시스템의 장치 목록을 얻어 올 수 있습니다.
[test_device_list.js]-------------------------------------------------------------------------
var udev = require("udev");
console.log(udev.list());
-----------------------------------------------------------------------------------------------
다음과 같이 실행합니다.
$ cd ~/udev/
$ node test_device_list.js
실행 결과로 나오는 메세지가 무척 많습니다.
일단 우리는 mmc 에 집중해 봅시다.
다음과 같이 mmc 와 관련된 목록을 봅니다.
$ node test_device_list.js | grep mmc
실험은 4G microSD 로 했습니다. 새로 산 싱싱한 것으로 해 봤습니다.
mmc 에 sd 카드를 삽입하지 않은 상태일때 실행 결과 입니다.
~/udev$ node test_device_list.js | grep mmc
{ DEVPATH: '/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/leds/mmc0::',
syspath: '/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/leds/mmc0::' },
{ DEVPATH: '/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/mmc_host/mmc0',
SUBSYSTEM: 'mmc_host',
syspath: '/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/mmc_host/mmc0' },
$
mmc 에 sd 카드를 삽입한 상태일때 실행 결과 입니다.
~/udev$ node test_device_list.js | grep mmc
{ DEVPATH: '/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/leds/mmc0::',
syspath: '/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/leds/mmc0::' },
{ DEVPATH: '/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/mmc_host/mmc0',
SUBSYSTEM: 'mmc_host',
syspath: '/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/mmc_host/mmc0' },
{ DEVPATH: '/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/mmc_host/mmc0/mmc0:aaaa',
DRIVER: 'mmcblk',
MODALIAS: 'mmc:block',
SUBSYSTEM: 'mmc',
syspath: '/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/mmc_host/mmc0/mmc0:aaaa' },
{ DEVLINKS: '/dev/disk/by-id/mmc-SU04G_0x00cd35f9 /dev/disk/by-path/pci-0000:04:00.0',
DEVNAME: '/dev/mmcblk0',
DEVPATH: '/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0',
syspath: '/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0' },
{ DEVLINKS: '/dev/disk/by-id/mmc-SU04G_0x00cd35f9-part1 /dev/disk/by-path/pci-0000:04:00.0-part1 /dev/disk/by-uuid/3966-3533',
DEVNAME: '/dev/mmcblk0p1',
DEVPATH: '/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1',
UDISKS_PARTITION_SLAVE: '/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0',
syspath: '/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1' },
$
각 속성의 의미는 udev 관련 문서를 참조해 주셨으면 하네요
일일히 설명하기 귀찮아서 ^^;
물론 진행을 위해서 필요한 내용은 설명할 것입니다.
자 이제
SD 카드가 mmc 슬롯에 삽입되었을때 메시지를 어떻게 받아야 할까요?
다음과 같이 소스로 간단하게 어떤 장치가 추가 되거나 생성 또는 변경 되었는지를 검출 할 수 있습니다.
[test_device_event.js]-------------------------------------------------------------------------
var udev = require("udev");
var monitor = udev.monitor();
monitor.on('add', function (device) {
console.log('added %j' , device );
});
monitor.on('remove', function (device) {
console.log('removed %j' , device );
});
monitor.on('change', function (device) {
console.log('changed %j' , device );
});
-----------------------------------------------------------------------------------------------
하지만 이렇게 보면 너무 많은 정보가 표시되고 쓸뎅없는 장치까지 보입니다.
mmc 검출의 목적에 충실하려면 다음과 같이 작성하는 것이 좋습니다.
[test_device_event.js]-------------------------------------------------------------------------
var udev = require("udev");
var monitor = udev.monitor();
monitor.on('add', function (device) {
if( typeof device.DEVNAME !== "undefined" ) {
console.log('added ' + device.DEVNAME );
}
});
monitor.on('remove', function (device) {
if( typeof device.DEVNAME !== "undefined" ) {
console.log('removed ' + device.DEVNAME );
}
});
monitor.on('change', function (device) {
if( typeof device.DEVNAME !== "undefined" ) {
console.log('changed ' + device.DEVNAME );
}
});
-----------------------------------------------------------------------------------------------
여기서는 mmc 에 대해서 삽입과 제거를 했을 경우만 보기 위해서
if( typeof device.DEVNAME !== "undefined" ) {
}
를 체크하여 유효한 장치명만 검출합니다.
이 것을 실행하면 다음과 같이 추가와 제거된 장치를 얻을 수 있습니다.
~/udev$ node test_device_event.js
added /dev/mmcblk0
added /dev/mmcblk0p1
removed /dev/mmcblk0p1
removed /dev/mmcblk0
메세지를 보시면 알겠지만
실제 microSD 카드명은
/dev/mmcblk0
이고
이 카드에 포함된 파티션은
/dev/mmcblk0p1
입니다.
쉽죠?