본문 바로가기

Maker Movement

Skein, node.js 통신 버퍼 관리 라이브러리

소개

Skein ZCUBE社 배포한 node.js 라이브러리로, 개발자가 데이터 통신등에 사용되는 버퍼를 효과적으로 사용할 있게 해준다. 라이브러리는 자바 객체 java.nio.ByteBuffer 본따서 만들어졌다.


자바의 nio 패키지는 Nonblocking-IO 필요한 객체들로 구성되어 있다. 그중에 ByteBuffer 객체는 개발자가 바이트  배열등을 효과적으로 다루는데 도움이 된다


일반적으로 데이터 통신 모듈을 구현할 바이트 배열을 자주 생성해서 사용하게 되는데, 메번 배열을 메모리에 할당하고 해제하는 것은 비효율적인 작업으로 모듈의 성능을 저하시킨다또한 데이터를 송수신할 , 바이트 배열에서 데이터를 쓰거나 읽기 위해 복잡하게 인덱스를 처리하는 경우가 많다.


Skein 버퍼를 쉽게 재사용할 있게 해주며, 인덱스에 대한 처리를 간단하게 해준다. 아래 관련 사이트가 있다.


NPM : https://www.npmjs.com/package/zzz.skein

GIT : https://github.com/z3guru/zzz.skein


예제코드

아래는 Skein 사용법을 알려주는 간단한 예제 코드이다. MODBUS 프로토콜을 이용 송수신하는 기능을 구현한다고 가정했다. 코드는 Skein 소개하는 코드로, 실재 동작하는 코드는 아니다.


const nio = require(‘zzz.skein');


let req = nio.Skein.allocate(1024);

req.order = nio.Skein.BIG_ENDIAN; // default BIG-Endian


req.put(0x01); // Slave address

req.put(0x04); // function code

req.putShort(0x0009); // start address of registers

req.putShort(0x0001); // counts of being request


let dup = req.duplicate();

dup.flip();


// Calculate CRC-16 with "dup"

// ...


let crc = 0x1234;

req.putShort(crc);


//

req.flip();

console.log(req.toHexString());



// Output

01 04 00 09 00 01 12 34                         .......4


  • put() : 한 바이트 데이터를 버퍼에 넣는다

  • putShort() : 함수는 두 바이트 데이터를 넣는데, 설정된 바이트 배치 순서에 따라 버퍼에 입력 된다. 밖에도 “putInteger”, “putLong”, “putFloat”, “putDouble” 등 있다.

  • duplicate() : Skein 복사한다. 그러나 바이트 배열은 복사되지 않고 원본과 사본이 공유한다. 다만  인덱스처리를 따로 한다. 이러한 점은 복잡한 인덱스 처리를 간단히 하는데 도움이 된다.

  • flip() : 위의 예제를 따르면 현재까지 값을 처음부터 읽을 있게 해준다.


let rsp = nio.Skein.allocate(1024);


let func = function(buf)

{

rsp.putBuffer(buf);

rsp.flip();


if ( rsp.remaining < 4 )

{

rsp.compact();

return;

}


let addr = rsp.get();

let func = rsp.get();

let qty = rsp.getShort();


// other works …

}


  • remaining : 읽을 있는 바이트 혹은 있는 공간 바이트

  • compact() : 현재 데이터를 유지한 뒷부분부터 데이터를 있게 해준다


마치며

아직은 알파버전으로 검증이 좀더 필요한 단계이다. ZCUBE社는 다양한 프로토콜을 쉽게 구현할 수 있는 플랫폼을 개발하고 있는 중이다. 그리고 이 라이브러리는 해당 플랫폼에서 사용하기 위해 개발되었다.