소개
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
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社는 다양한 프로토콜을 쉽게 구현할 수 있는 플랫폼을 개발하고 있는 중이다. 그리고 이 라이브러리는 해당 플랫폼에서 사용하기 위해 개발되었다.
'Maker Movement' 카테고리의 다른 글
DDNS(Google Domains), 집에 있는 라즈베리파이 설정 (0) | 2018.12.15 |
---|---|
자바유료화 대책 (0) | 2018.09.25 |
구글 클라우드 프린트(4) - 프린터 등록 (0) | 2018.02.07 |
구글 클라우드 프린트(3) - 프린터인식 (0) | 2017.12.23 |
구글 클라우드 프린트(2) - mDNS 구현 (0) | 2017.11.30 |