그렇지만 Router 부분이 다르다. HTTP Express에선 아래처럼 router 에서 method를 설정하며 경로를 설정할 수 있지만 CoAP은 조금 다르다.
CoAP은 createServer()를 한 후 coap.on을 하면 서버의 수신부가 된다. 이후부터는 HTTP랑 동일하며 method 및 다른 설정을 할 수가 없었다. 나도 왠만한 방법을 다 해봤지만 궁금해지기 시작했다. 그래서 현재는 req.payload를 사용하여 데이터를 주고받고 있다. 현재 상태에서 해볼만 한건 다 해본것 같다. 혹시 Node.js 에서 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가 같이 있다. 그래서 멋모르고 그냥 복붙 하면 이해하기 어려울 수 있다.
이게 npm에 있는 CoAP Client에 있는 request이다. http와 사실 별 다를바는 없다고 하는데 아직까지는 확실하진 않다. 물론 Node.js 한정 일지는 모르겠다. HTTP 대로 해봤지만 method도 변경이 되지 않았고 payload 또한 전송이 안됐다. 아래의 그림처럼 보내도 GET으로 간다.
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에 찾아보니 딱히 다른 설명은 없었다.
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를 했을 때도 나타난다.
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.
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 미러사이트 링크를 변경해주는거 였다.
사실 맞는 방법 같긴했다. 근데 구글에 검색해보면 미러사이트 아래 처럼 나오는데 서버 우분투 미러 사이트랑 같았다.