처음 Node.js 개발을 하다가 갑자기 함수의 실행 순서가 이상했다. 난 당연히 내가 뭔가를 잘못 짰다는 생각만 하고 에러를 찾아봤다. 그렇지만 10분 뒤 내게는 이해할 수 없는 일이 일어났다. 잘못 짠게 하나도 없었다. 지금까지 계속 순차적인 함수 실행 방식만을 생각하고 코딩을 했기 때문이다. 지금까진 계속 안드로이드 자바 위주로 코딩을 하다보니 비동기는 생각을 하지 못했다. 우연하게 콘솔을 찍어보고 실행 순서가 이상하다는 걸 발견하고 Node.js는 비동기로 처리를 하는지 찾아봤다. 

 

Syncronous 동기 - 요청을 보낸 후 해당 요청의 응답을 받아야 다음 동작을 실행하는 방식

Asynchronous 비동기 - 요청을 보낸 후 응답과 관계없이 다음 동작을 실행하는 방식

 

그러니깐 비동기는 요청을 보내면 서버에서 오래 걸리면 먼저 응답을 하고 그 후에 처리를 하고 있었다. DB에서 데이터를 받아오는 등의 작업을 해야한다면 우선적으로 그에 대한 응답을 해버리고 다른 작업들도 실행한다.

 

가끔 동기식 처리를 해야할 경우가 생긴다. 그에 대한 해결 방안도 있다.

 

Node.js 에서 많이 찾아봤다. 보통 웹에선 callback을 사용했을 것이다. 물론 난 자바스크립트를 모르기 때문에 callback의 개념을 아예 몰랐다. 나중에 callback을 썼는데 문장이 계속 길어지며 한 눈에 보기도 불편했다.

그래서 Promise를 적용했다. 

function fooPromise(data) {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log("fooPromise");
			if(data === 1000)
				reject(new Error("err"));
			else
				resolve(data);
		}, data);
	})
}

솔직히 Promise가 callback보단 낫지만 그렇다고 가독성 또한 좋은건 아니다. 그리고 또 다른 문제들도 있었다. return 뒤에 생성자를 통해서 인스턴스화를 하였는데 결국은 return 과는 조금 다른 성질이다.  보통의 return은 함수 종료가 되서 아래의 내용이 있더라도 실행하지 않는데 resolve가 있더라도 아래 내용을 실행한다. 이 부분은 코드 개발을 하다보니 발견하였다. 난 return의 개념을 적용되는 거라고 생각했지만 그게 아니었다. 물론 비동기이기 때문일수도 있다고 생각한다.  위에 코드에서 IF문 안에 조건문을 통해서 else로 내려와 resolve에 오면 함수가 종료되지 않고 함수가 끝까지 실행된다. 이 부분에 대해서 내부 구조를 다시 살펴보고 수정하겠다. 

 

물론 이 방법만 있는건 아니다 그보다 더 좋은 문법이 있긴하다. node.js 8 LTS 버전에서 정식 지원하는 문법인 asyncawait이다. async와 await의 최고의 장점은 node.js의 장점인 비동기를 유지하면서 동기적인 모습의 코드 스타일을 적용할 수 있고, 실행시 코드를 비동기적으로 동작하면서 코드를 동기적으로 실행한다. 사용방법 또한 어렵지도 길지도 않다.

 

사용법은 function 앞에 async 붙여주고 그 함수 안에서 실행하려는 함수 앞에 await를 붙여 사용한다. 시스템에서 코드를 실행하다가 await 함수 실행을 만나면 바로 실행된다. await는 async가 붙은 함수 안에서만 작동한다.

async function foo(data) {
	var result1 = await fooPromise(data);	
	var result2 = await fooPromise(result1);
	var result3 = await fooPromise(result2);
}

 

물론 async와 await가 만능은 아니었다. async function은 결국엔 promise를 반환하게 된다. 그렇기 때문에 위에 Promise와 연결 된다. 그리고 다중 함수 구조에서는 async와 await가 제대로 작동하지 않는다. 그렇기 때문에 어느순간부터는 비동기화 되어 함수 순서가 바뀔 수 있다. 나도 정확한 이유를 파악하지 못했다. 그렇기 때문에 foo 함수 안에서 fooPromise를 호출하고 fooPromise 함수 안에서 다른 함수 A를 호출하게 된다면 async/await가 깨지는 걸 발견했다. 그래서 나는 아래의 코드처럼 다른 함수 A 안에서는 return new Promise를 사용하여 처리한다. 그렇게 되면 제대로 순서대로 작동하는 걸 발견했다.

async function foo(data) {
	var result1 = await fooPromise(data);	
	var result2 = await fooPromise(result1);
	var result3 = await fooPromise(result2);
}

async function fooPromise(data){
	var result1 = await A();
}

async function A(){
	return new Promise((resolve, reject)=>{
    	...
    })
}

나처럼 자바나 C 계열을 자주 했다면 return을 자주하는 형식이 편했기 때문에 자주 화가 날 것이다...

 

그리고 이거는 아마 다른 모듈을 많이 사용하게 되면 발견하게 될 것인데...

단편적으로 지금 당장 생각나는건 MySQL 쿼리시 콜백에서 다른 함수를 호출해야할 경우... 아래처럼 사용하면 된다

conn.query(sql, async function(err, results, fields){
        if(err){
            console.log(err)
        }
        else
            await A()
    })

 

요즘 계속 가상화폐 거리길래 집에 남는 PC랑 그래픽카드를 사용해서 해보려고 한다.

 

사실 그래픽카드가 너무 비싸져서 좀 빡치는 감이 없지않아서 뭐길래 궁금해서 해봤다.

 

우선 나도 블록체인 개발에 관여가 되어있기 때문에 기본적으로 1개를 채굴하기 위해선 엄청난 경쟁이다. 

 

그렇기 때문에 일반 사람들은 엄두도 못냈었는데 알아보니 마이닝 풀이란 개념이 있어서 여러 대의 PC를 연결하여 하나의 슈퍼 컴퓨터 처럼 사용하여 채굴하는 방식인데 이 개념을 이용하여 채굴하여 자신의 PC가 기여한 만큼 보상을 준다.

 

아무튼 구글에 마이닝 풀 검색하면 여러개가 나온다.

 

나는 마이닝풀허브를 사용해봤다.

 

사이트에 들어가면 아래의 그림처럼 나온다.

회원가입 절차도 간단하다. 회원가입을 하면 옆에 간단한 채굴 방법이라고 나온다. 사실 1,2번까지는 이해하겠지만 3번부터는 뭔지 모르겠다.

 

우선 회원 가입을 하면 자동 환전을 설정을 한다.

자동환전이란 내가 비트코인을 채굴하면 자동으로 왼쪽에 있는 코인 자동환전에 설정한 코인으로 자동 환전이 되는 구조다.

그럼 오른쪽에 거래소 현황 및 코인별 환전 설정은 지금 비트코인이랑 이더리움은 OFF가 되어있는데 이거는 비트코인을 채굴하면 자동 환전을 하지 않겠다는 뜻 인것 같다. 각자 자신이 환전하고 싶은 코인으로 세팅하고 밑에 업데이트 버튼이 눌러 세팅을 하면된다.

 

이제 원하는 풀에서 채굴 프로그램을 받아 사용하면 된다. 나는 이더리움을 해봤다. 딱히 다른거 해볼 생각은 없고 들리는 얘기로는 이더리움을 많이해서...

이더리움을 클릭하면 아래처럼 나오고 밑으로 스크롤을 쭉 내리면 AMD/NVIDIA 프로그램이 나온다.

나는 피닉스 마이너를 사용했다. 클릭해서 다운로드 받으러 들어가면 처음 화면에서 아래로 스크롤을 내리다보면 Quick start가 있다. 물론 클릭해서 다운을 받는데 크롬에서는 보안성 때문에 다운이 안된다. 그래서 나는 MS edge를 사용했다. 윈도우 사용자라면 기본적으로 설치 되어있으니 참고만...

다운 받아 압축을 풀면 아래 폴더 구성이 되어있다. 그러면 strat_miner.bat 이란 파일을 우클릭해서 편집을 누른다.

그러면 메모장이 하나 켜지는데 안에 있는 내용을 다 지우고 피닉스 마이너를 받을 때 마이닝풀허브 페이지에서 설정예시가 있다. 거기서 username을 자신의 계정 ID로 변경하고 workername은 채굴기를 많이 돌리니 채굴기 이름의 느낌으로 생각하면된다. 그래서 home1뭐 이런식으로 해도되고 아니면 그냥 무작위로 작성해도 된다. 저장 후 실행을 하면

실행을 하면 아래처럼 명령프롬프트 창이 하나 켜지면서 쫙 스크롤이 내려간다. 그러면 끝났다고 봐도 무방하다.

'IT > general' 카테고리의 다른 글

[VSCode] 원격 SSH 접속  (0) 2021.10.08
[IDE] 이클립스 설치  (0) 2021.06.03
[통신 프로토콜] MQTT  (0) 2021.05.21
성능 테스트 도구 JMeter 설치 및 간단 사용  (0) 2020.11.17
비주얼 스튜디오 코드 한글 사용  (0) 2020.09.21

MQTT 통신 때문에 생긴 문제였다. MQTT는 message 통신 즉 문자열을 넘기기 때문에 여러개의 데이터를 보낼 수가 없다. 그렇기 때문에 데이터를 구분하려고 문자열에 특수문자로 구분하였다. 

그런데 HASH화를 한 데이터는 구분하려고 넣은 특수문자가 포함되는 일이 생겼다. 우선 데이터를 구분하여 배열로 넣었다. 구분 특수문자로는 '/' 를 사용하였다. 의문은 HASH 알고리즘에서 다른 특수문자는 안생기나? 라는 의문이다. 그런데 한편으론 뭐가 됐던 만들어 놓으면 어떤 문자든 상관이 없겠다는 생각이 들어서 만들었다.

client.on('message', async function (topic, message) {
    var _message = message.toString().split('/');

 

그 후 HASH 데이터는 배열의 끝 번째에 배치를 했기 때문에 특수문자가 없다면 4번째에 배치된다고 가정하면 4번째부터 배열의 끝까지 합치는 개념이었다. 그래서 급하게 N번째부터 끝까지 합치는 함수를 만들었다.

 

함수의 파라미터는 해당 배열과 HASH 데이터의 배열의 위치를 보내주면 된다. 위에서 말했던 것처럼 HASH 데이터가 배열의 4번째의 위치해있다면 4를 넘겨주면된다.

async function _combineData(data, num) {
    var _data = data[num]

    for (var i = num + 1; i <= data.length - 1; i++) {
        _data += '/' + data[i]
    }
    return _data
}

우선 구분할 때 split 함수를 사용했기 때문에 특수문자가 빠진다. 그렇기 때문에 합칠 경우 특수문자가 없으므로 주의해야한다. 그렇기 때문에 데이터를 합칠 때에는 특수문자를 같이 넣어줘야한다. 그리고 끝까지가 아니라 N번째에서 M번째까지 합치려고 하면 for문 조건식에 i<= M 으로 변경해주면 된다.

보통 통신에서는 송/수신으로 나뉜다. MQTT에서는 발행인/구독자로 나뉜다.

 

MQTT 모듈 설치

# npm install mqtt -save

MQTT 모듈 세팅

var mqtt = require('mqtt');
const options = {
      host: '127.0.0.1',
      port: 1883

};
const client = mqtt.connect(options);

기본 예제

var mqtt = require('mqtt')
var client  = mqtt.connect('mqtt://test.mosquitto.org')
 
client.on('connect', function () {
  client.subscribe('presence', function (err) {
    if (!err) {
      client.publish('presence', 'Hello mqtt')
    }
  })
})
 
client.on('message', function (topic, message) {
  // message is Buffer
  console.log(message.toString())
  client.end()
})

mqtt.connect 브로커 연결 세팅

기본 세팅은 아래와 같다. 단순하게 옵션 없이 url만 입력이 가능하다.

const client = mqtt.connect(url, options);

옵션부도 필수는 아니다. 옵션은 브로커와 연결할 때 설정될 속성들이다. broker에 따라 username, password를 요구하는 브로커가 있다면 자바스크립트 객체를 생성해 옵션을 작성하고 넣어주면 된다.

const options = {
  host: '127.0.0.1',
  port: 8883,
  protocol: 'mqtt',
  username:"saii42",
  password:"password",
};

const client = mqtt.connect(options);

 

connect - 브로커 연결 부 

브로커와 연결됐을 때 실행되는 메소드다.

client.on("connect", function () => {	
  console.log("connected");
}

subscribe 구독

브로커에 구독을 하려면 client.subscribe 메소드를 사용하면 된다. 물론 토픽이 배열이나 객체도 가능하다. 나도 자주 사용하지 않을 것 같아서 맨 아래 npm 링크를 참조하면 된다. 보통은 connect 할 시 구독을 한다.

client.subscribe(topic/topic array/topic object, [options], [callback])

message - 메세지 수신부

구독을 했다면 메시지가 왔을 때 message 이벤트로 리스너를 만들어 처리한다. 보통 문자열이 전송되기 때문에 구분 문자(/, \...)를 두어 구분하여 사용하면 된다. 구분 문자를 사용하여 여러개의 데이터를 문자열로 전송할 때 주의할 점은 해당 메시지 안에 구분 문자를 사용하면 안된다. 예를 들어 해당 데이터가 암호화가 되면 특수문자도 포함된다. 그렇기 때문에 여러개로 인식되니 주의 하자. 

client.on('message', async function (topic, message) {
    var _message = message.toString().split('/');
    })

publist - 메시지 전송

기본 예제는 아래와 같다. 보통 옵션이 없다면 topic과 message만 보내면 된다. 

client.publish(topic, message, [options], [callback])

옵션과 콜백은 선택사항이다. 옵션은 retain message flag나 qos 등을 설정할 수 있다.

var options = {
  retain:true,
  qos:1
};
client.publish(topic, message, options)

 

https://www.npmjs.com/package/mqtt#client

MQTT는 Message Queue Telemetry Transport의 축약으로, IoT나 메시지 전송 서버 등에 사용하기 적합한 통신 프로토콜 중 하나다.

 

MQTT는 HTTP와는 다르게 중심 서버의 역할을 하는 중개자(broker)가 있고, 토픽을 발행하는 발행인(publisher)이 있으며, 구독자(subscriber)는 발행된 토픽을 통해 중개자로부터 메시지를 받아온다. 그리고 이러한 발행과 구독은 브로커가 관리하게 된다.

 

브로커는 서버에 개념과는 조금 다릅니다. 그렇기 때문에 Client를 개발할 때 따로 브로커를 개발할 필요가 없습니다. 예를 들면 Client1, Client2가 있는데 Client1이 Client2에게 메시지를 보내려고 하면 Client들이 동일한 토픽을 구독을 한 후 Client1이 브로커에게 해당 토픽을 통해 메시지를 보내면 브로커는 해당 토픽을 구독하는 Client들에게 메시지를 전달합니다. 그렇기 때문에 정확하게 1:1 통신은 아닙니다. 브로커 중 하나인 모스키토를 설치해보고 직접 Client에서 test 모스키토가 아닌 로컬 브로커를 사용해보는 게 좋을 것 같다.

https://mosquitto.org/download/

 

QoS - MQTT 에서는 3단계의 QoS를 제공한다. - IBM 참조

 

0 레벨은메시지는 최대 한 번 전달되거나 전혀 전달되지 않습니다. 이 네트워크 간 전달은 수신 확인되지 않습니다. 메시지는 저장되지 않습니다. 클라이언트 연결이 끊어지거나 서버가 실패하는 경우 메시지는 손실될 수 있습니다. QoS=0은 가장 빠른 전송 모드입니다. 이 모드는 "실행 후 삭제"라고도 합니다. MQTT에서는 서버가 QoS=0의 발행물을 클라이언트에 전달하지 않아도 됩니다. 서버가 발행물을 수신할 때 클라이언트 연결이 끊어지는 경우 서버에 따라 발행물을 제거할 수 있습니다. 텔레메트리(MQXR) 서비스에서는 QoS=0으로 송신된 메시지를 제거하지 않습니다. 해당 메시지는 비지속 메시지로 저장되고 큐 관리자가 중지되는 경우에만 제거됩니다.

 

1 레벨은 기본 전송 모드입니다. 메시지는 항상 최소 한 번 전달됩니다. 송신자가 수신확인을 수신하지 않는 경우, 메시지는 수신확인이 수신될 때까지 DUP 플래그가 설정되어 다시 송신됩니다. 따라서 수신자에게 동일한 메시지가 여러 번 전송되고 이를 여러 번 처리할 수도 있습니다. 메시지가 처리될 때까지 송신자와 수신자는 메시지를 로컬에 저장해야 합니다. 메시지는 처리된 후에 수신자로부터 삭제됩니다. 수신자가 브로커인 경우, 메시지는 구독자에게 발행됩니다. 수신자가 클라이언트인 경우 메시지는 구독자 애플리케이션에게로 전달됩니다. 메시지가 삭제된 후 수신자는 송신자에게 수신확인을 송신합니다. 수신자로부터 수신확인을 받고 나면 송신자로부터 메시지가 삭제됩니다.

 

2 레벨은 메시지는 항상 정확히 한 번만 전송됩니다. 메시지가 처리될 때까지 송신자와 수신자는 메시지를 로컬에 저장해야 합니다. QoS=2는 가장 안전하지만 가장 느린 전송 모드입니다. 메시지가 송신자에서 삭제되기 전에 송신자와 수신자 사이에 최소 두 쌍의 전송이 발생합니다. 메시지는 첫 번째 전송 후에 수신자 측에서 처리될 수 있습니다. 첫 번째 전송 쌍에서 송신자는 메시지를 전송하고 수신자에게서 메시지를 저장했다는 수신확인을 받습니다. 송신자가 수신확인을 수신하지 않는 경우, 메시지는 수신확인이 수신될 때까지 DUP 플래그가 설정되어 다시 송신됩니다. 두 번째 전송 쌍에서 송신자는 수신자에게 메시지 PUBREL의 처리를 완료할 수 있다고 전달합니다. 송신자가 PUBREL 메시지의 수신확인을 수신하지 않은 경우 수신확인이 수신될 때까지 PUBREL 메시지가 다시 송신됩니다. 송신자는 PUBREL 메시지에 대한 수신확인을 수신하면 저장했던 메시지를 삭제합니다. 메시지를 다시 처리하지 않는다는 가정 하에 수신자가 첫 번째 또는 두 번째 단계에서 메시지를 처리할 수 있습니다. 수신자가 브로커인 경우 이는 메시지를 구독자에게 발행합니다. 수신자가 클라이언트인 경우 메시지는 구독자 애플리케이션으로 전달됩니다. 수신자는 송신자에게 메시지 처리가 완료되었다는 완료 메시지를 송신합니다.

 

 

굳이 개념을 정리한다면 기존의 Hypervisor 가상화와는 달리 Container 가상화 방식이다. 사실 어려운 개념이었다. 기존의 VMWare 같은 Hypervisor 방식을 잘 모르기 때문에 사실 구분하기도 어렵다. 이 부분은 VMWare를 한 번이라도 써본 사람은 이해가 조금 빠를 것 같다. 우선 양쪽의 내부 구조를 보면 조금 더 이해가 쉬울 것 같다.

 

 

도커 공식문서에 따르면 VM 시스템은 가상 머신 (VM)은 하나의 서버를 여러 서버로 전환하는 물리적 하드웨어의 추상화입니다. 하이퍼 바이저를 사용하면 단일 시스템에서 여러 VM을 실행할 수 있습니다. 각 VM에는 운영 체제, 애플리케이션, 필요한 바이너리 및 라이브러리의 전체 사본이 포함되며 수십 GB를 차지합니다. VM은 부팅 속도가 느릴 수도 있습니다. 요약을 해보면 Hypervisor 가상화의 장점은 CPU를 idle 상태로 두지 않기 때문에 효율적이지만 단점으로는 각기 다른 OS를 사용하기에 무겁다. 

 

Container 시스템은 컨테이너는 코드와 종속성을 함께 패키징하는 앱 계층의 추상화입니다. 여러 컨테이너가 동일한 컴퓨터에서 실행되고 OS 커널을 다른 컨테이너와 공유할 수 있으며, 각 컨테이너는 사용자 공간에서 격리된 프로세스로 실행됩니다. 컨테이너는 VM보다 공간을 덜 차지하고 (컨테이너 이미지는 일반적으로 수십 MB 크기) 더 많은 애플리케이션을 처리할 수 ​​있으며 더 적은 수의 VM과 운영 체제를 필요로 합니다. 요약을 해보면 장점은 같은 OS를 공유하기 때문에 상대적으로 공간을 덜 차지하고 더 많은 어플리케이션을 처리할 수 있으면 속도 또한 더 빠르다.

 

이렇게 정리할 수 있을 것 같다. 

 

그럼 우린 왜 Docker Container를 사용해아하나? 안 써본 입장에선 잘 이해가가지 않을 것이다.

컨테이너는 환경에 구애 받지 않고 어플리케이션을 실행하는 기술이다. 아마 많은 OS를 사용해본 개발자들은 알 것 이다. 센트OS, 우분투, 리눅스 등등의 OS를 사용하다보면 같은 명령인데 명령어가 다르다. 심지어 설치 명령 또한 다르며 깃허브, Node.js 등의 설치 프로그램 또한 설치하는 방법이 다르다. 그러나 Docker가 설치되어 있다면 어느 환경이든 상관 없이 일관된 명령어로 실행할 수 있다. (그저 운영체제별로 존재하는 복잡한 설치 과정을 겪지 않는다는 점만 기억하면 된다.)

 

CoAP Server listen 부분은 HTTP랑 똑같다고 보면 된다.

 

HTTP CoAP Listen

그렇지만 Router 부분이 다르다. HTTP Express에선 아래처럼 router 에서 method를 설정하며 경로를 설정할 수 있지만 CoAP은 조금 다르다.

HTTP Router

CoAP은 createServer()를 한 후 coap.on을 하면 서버의 수신부가 된다. 이후부터는 HTTP랑 동일하며 method 및 다른 설정을 할 수가 없었다. 나도 왠만한 방법을 다 해봤지만 궁금해지기 시작했다. 그래서 현재는 req.payload를 사용하여 데이터를 주고받고 있다. 현재 상태에서 해볼만 한건 다 해본것 같다. 혹시 Node.js 에서 CoAP 프로토콜을 잘 사용하시는 분 댓글로 남겨주세요...

CoAP 수신부

 

CoAP이란?

CoAP은 무선 센서 네트워크 노드처럼 자원에 제약이 있는 장치들에서 사용할 목적으로 고안된 서비스 계층 프로토콜이다. CoAP은 단순한 웹 연동을 위해 HTTP로 쉽게 변환되도록 설계되어 있으며 멀티캐스트 지원과 같은 특수한 요건을 충족하면서도 부하가 매우 낮으며 단순한 편이다. 멀티캐스트, 낮은 부하, 단순성은 심도 있게 임베디드 되는 경향이 있고 전통적인 인터넷 장치보다 훨씬 더 적은 메모리와 전력 공급을 지니는 경향이 있는 사물인터넷(IoT) 및 사물통신(M2M) 장치에 매우 중요하다. 즉, 효율성이 매우 중요하다. CoAP은 UDP 또는 UDP 유사 프로토콜을 지원하는 대부분의 장치에서 구동할 수 있다. - 위키백과

즉 IoT 등의 저전력을 요구하는 장치에서 사용되는 듯 하다. 

 

CoAP은 HTTP의 간소화라고 하는데 아직까지 Node.js에선 제대로 풀이가 되지 않은 것 같다.

 

우선 npm이랑 깃을 며칠동안 봤다. method 설정이 안 된다. 기본값인 GET으로만 된다. 물론 Listener, Clinet 다 마찬가지다. CoAP은 HTTP의 간소화 버전이라 대부분의 Header가 빠진다. 기본적인 내용을 읽어봤지만 굳이 내가 기억할 필요는 없는 것 같아 기억하진 않는다... CoAP은 Body가 아닌 Payload를 사용한다. 물론 Buffer를 사용해야 한다는데 내가 사용하는 CoAP은 Buffer 사용시 전송이 되지 않았다. 그래서 JSON 타입으로 데이터를 보냈다.

패킷 방식도 있는데 아직 해보진 않았다. 

 

npm에 CoAP이 있고 CoAP Client가 있었는데 둘 다 해본 결과 별 다르지 않다. CoAP은 Listener와 함께 Client에서 사용할  request가 같이 있다. 그래서 멋모르고 그냥 복붙 하면 이해하기 어려울 수 있다.

coap
    .request(
        resource /* string */,
        method /* "get" | "post" | "put" | "delete" */,
        [payload /* Buffer */,
        [options /* RequestOptions */]]
    )
    .then(response => { /* handle response */})
    .catch(err => { /* handle error */ })
    ;

이게 npm에 있는 CoAP Client에 있는 request이다. http와 사실 별 다를바는 없다고 하는데 아직까지는 확실하진 않다. 물론 Node.js 한정 일지는 모르겠다. HTTP 대로 해봤지만 method도 변경이 되지 않았고 payload 또한 전송이 안됐다. 아래의 그림처럼 보내도 GET으로 간다.

 

그래서 아래 코드처럼 세팅을 했다.

const coap = require("coap"),
      req = coap.request('coap://127.0.0.1:5683')

req.write(JSON.stringify(body))
req.on("response", function (res) {
  res.pipe(process.stdout)
})
req.end()

req.write 안에 객체를 JSON 타입으로 변환하여 넣어주면 된다.

그럼 Client는 끝이고 req.on 부터는 자신이 보낸 request의 respone의 수신부라고 생각하면 된다.

 

 

 

 

+ Recent posts