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의 수신부라고 생각하면 된다.

 

 

 

 

인증키 만료 구현하려고 뻘짓은 다한 것 같다. 이거 구현하려고 많은 방법을 찾아봤다.

 

 

redis 내에서 분명 해결할 수 있을거라 생각했지만 쉽사리 찾지 못해서 우선 setTimeout으로 했었다. 그리고 몇 시간 뒤 바로 찾아서 해결했다.

 

1. setTimeout

 

setTimeout은 redis에 set 한 후 10초 뒤에 실행되게 설정해놨다. 이런 경우 비동기 처리기 때문에 인증키를 요청한 유저에게는 인증키가 전송될 거라 생각했다. 한 가지 걱정은 해당 요청이 setTimeout 때문에 10초 뒤에 종료가 된다는 점이었다. setTimeout 첫 번째 파라미터에 N초 후에 실행할 내용이다. 물론 해당 함수에 이름만 넣어야 한다. 두 번째 파라미터에는 N초 X 10에 해당하는 시간을 쓰면 된다. 세 번째부터는 첫 번째 함수에서 실행될 파라미터를 써주면 된다. 아래처럼 redis.delete 함수에 파라미터가 1개면 3번째만 써주면 된다.

setTimeout(redis.delete, timeOut, key);

 

2. Redis SET

client.set(key, value)

Redis에서 SET을 사용할 때 보통 위에처럼 만 썼다. 대부분에 블로그를 찾아보니 그랬다. 

Redis 홈페이지를 보니 SET 할 때 끝에 숫자를 쓰는 걸 봤다. 그래서 npm에 찾아보니 딱히 다른 설명은 없었다.

그래서 코드 작성할 때 파라미터 참조를 좀 쳐다봤다. 

자세히 보니 3,4번째 파라미터가 눈에 띄었다. 그중에서 duration... 

더 찾아보니 저 모드는 아래처럼 옵션이었다.

그러니깐 아래처럼 작성하니 정말 됐다.

client.set(key, value,'EX', 10 ,async () => {
            console.log(key + 'redis 저장 완료')
})

 

3. client.expire(key, ) https://redis.io/commands/set

몇몇 블로그를 보니 가끔가다가 req.cache.expire 아니면 session을 expire 하는 사람들을 봤다. 그래서 혹시나 해서 expire를 쳐보니 있긴 있었다. 

client.expire(key, 10)

 

4. redis-expiry

얼마 전까지 개고생 하다가 시간 좀 생겨서 다시 검색해보니 npm에 이런 게 생겨있다. 이거는 내가 좀 연구를 해보고 수정을 해야 할 것 같다.

https://www.npmjs.com/package/redis-expiry

Node.js에서 Redis를 사용하다보니 에러가 발생했다. Redis에서 Key를 보내어 GET 했는데 발생했다.

대충 아래 에러 메세지를 보면 감이 온다.

 

Error: node_redis: The GET command contains a invalid argument type.
Only strings, dates and buffers are accepted. Please update your code to use valid argument types.


GET을 할 때 파라미터를 string 타입으로만 보내야한다. Node.js에서는 계속 JSON 타입을 쓰다 보니 실수로 JSON 객체를 그대로 보내버린 것 같다. 아직 습관이 익숙하지가 않아서 나오는 실수들이다. 혹시나 Key를 콘솔로 찍어보는게 좋을듯하다. 이경우는 역시 다른 함수를 실행했을때도 마찬가지도 DELETE를 했을 때도 나타난다. 

 

그렇기 때문에 Key를 꼭 string 타입으로 그리고 단일 변수만 보냈는지 체크하자

 

 

 

Node.js 개발을 하다가 Redis 부분에서 에러가 났다. 

 

Error: node_redis: The SET command contains a invalid argument type.
Only strings, dates and buffers are accepted. Please update your code to use valid argument types.

 

 

대충 해석을 해보면 SET 명령을 할 때 인수가 잘못된 듯 하다.

파라미터가 무조건 String 타입만 가능하다. 

혹시 넘길 때 콘솔로 찍어보고 다시 확인해보면 될것 같다.

서버에 도커를 설치해야할 일이 생겨서 설치하다가 에러가 발생했다.

Reading package lists... Done
Building dependency tree
Reading state information... Done
ca-certificates is already the newest version (20210119~20.04.1).
ca-certificates set to manually installed.
curl is already the newest version (7.68.0-1ubuntu2.4).
curl set to manually installed.
The following additional packages will be installed:
  dirmngr gnupg gnupg-l10n gnupg-utils gpg gpg-agent gpg-wks-client
  gpg-wks-server gpgconf gpgsm gpgv python3-software-properties
Suggested packages:
  pinentry-gnome3 tor parcimonie xloadimage scdaemon
The following NEW packages will be installed:
  apt-transport-https gnupg-agent
The following packages will be upgraded:
  dirmngr gnupg gnupg-l10n gnupg-utils gpg gpg-agent gpg-wks-client
  gpg-wks-server gpgconf gpgsm gpgv python3-software-properties
  software-properties-common
13 upgraded, 2 newly installed, 0 to remove and 106 not upgraded.
Need to get 1,704 B/2,606 kB of archives.
After this operation, 207 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Err:1 http://kr.archive.ubuntu.com/ubuntu focal-updates/universe amd64 apt-transport-https all 2.0.4
  404  Not Found [IP: 91.189.91.38 80]
E: Failed to fetch http://kr.archive.ubuntu.com/ubuntu/pool/universe/a/apt/apt-transport-https_2.0.4_all.deb  404  Not Found [IP: 91.189.91.38 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-mis                                                                                                                                                             sing?

 

대충 검색해보니 어떤 사람은 '유지보수가 끝났다.' , '어떤사람은 우분투 한국서버가 불안정하다' 등등 많은 글들이 있었다. 근데 해결방법이 대부분 같았다. source list 미러사이트 링크를 변경해주는거 였다.

사실 맞는 방법 같긴했다. 근데 구글에 검색해보면 미러사이트 아래 처럼 나오는데 서버 우분투 미러 사이트랑 같았다.

다른 사람들 링크를 보니 물론 다르게 생겼다.  (http://old-releases.ubuntu.com , http://01.archive.ubuntu.com/ubuntu/)

 

물론 맞는지 틀린지는 안해봤으니 모른다.

 

결과적으론 나는 upgrade 하면 될 것 같은데...? 하니깐 정말 해결됐다...

 

 

docker repository를 통해 설치하는 방법으로 설치를 할 예정이다. 이 방법 말고도 2가지가 더 있다고 한다.

(수동으로 deb 파일을 다운로드하여 설치하는 방법, 별도의 설치 스크립트를 이용하는 방법)

 

 

 

당연히 apt 설치를 하기 때문에 update를 한번 해준다.

 

1. 필수 패키지를 설치합니다.

$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

 

2. Docker GPG key 

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK

3. Docker Repository 등록

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

4. Docker 설치

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

5. 정상 설치 확인

$ sudo docker run hello-world

리눅스를 하다보니 서버를 종료 했을 때 다시 켜야하는 번거로움이 있었다.

사실 생각해보면 PC를 껏다 켰을 때를 생각했어야했다. 그래서 윈도우의 시작프로그램이 리눅스에도 있었다.

 

서비스 시작

systemctl start 서비스명

서비스 재시작

systemctl restart 서비스명

서비스 중지

systemctl stop 서비스명

서비스 상태 확인

systemctl status 서비스명

서비스 실행 확인

systemctl is-enable 서비스명

부팅 시 서비스 자동 시작

systemctl enable 서비스명

부팅 시 서비스 자동 시작 해제

systemctl disable 서비스명

+ Recent posts