[MQTT / Mosca] Mqtt Packet 에 Command Type 추가하기 (for authentication) #1

[MQTT / Mosca] Mqtt Packet 에 Command Type 추가하기 (for authentication) #2

[MQTT / Mosca] Mqtt Packet 에 Command Type 추가하기 (for authentication) #3

[MQTT / Mosca] Mqtt Packet 에 Command Type 추가하기 (for authentication) #4


경축축 이제 진짜 드디어 마지막 글이다!!


이제 Command Type 을 추가하는 게 끝났다.


하지만 거기까지 해서는


Authentication 을 위한 Packet 흐름


1. Connect Packet (Device -> Server)

2. Authenticate Packet (Server -> Device)

3. Authenticate Packet (Device -> Server)

4. Connect ACK Packet (Server -> Device)

에서의 네번째 단계가 아마 안 될 거다...





#Connect ACK Packet 받기


세번째 글에서 stream.pipe 란 애를 요주의라고 했었다.


그니까!! 

3단계까지 무사히 마쳤으니

Server 에서 authenticate packet 을 받아서 처리할 수 있는 상태가 되었다.


그래서 처리를 해주고, authentication 이 완료되면 Connect ACK Packet 을 device 에 보내줘야한다.

그래야 비로소 connection 이 완료되니까!


근데!!!!!! 지금 상태에선 Device 가 그놈의 Connect ACK Packet 을 못 받는다!!!!!


대체 왜인지 알기 위해 진짜 디버깅을 엄청 했다

Wire shark 도 켜서 막 패킷 캡쳐해보고... 별짓을 다했는데

확실해진 건 Server -> Device 로 가는 Connect ACK Packet 이 확실히 보내졌다는 거다.


그럼 문제가 뭘까?

Device 쪽 코드에서 받아서 뭔가 처리를 하는데 생긴 문제일텐데,

stream 에서 데이터를 아예 못받나? 싶어서

client 코드 들어가서 

this.stream.on('data', function(data) {
  console.log(data);
});


해봤더니 넘나 잘 나옴!!

심지어 Wire shark 에서 캡쳐한 Packet 이랑 byte array 도 일치한다 ㅠㅠ


그럼 뭐가 문제일까...

하다보니 문득 위의 this.stream 이 readable stream 이란 것과,

실제로 받은 packet 의 처리는 stream.pipe 에 destination 으로 설정됐던 writable stream 에서 한다는 생각이 스쳐갔다.



그럼 왜인지는 몰라도 저 pipe 가 한번만 동작하고 있는 건 아닐까?

싶어서 코드를 수정해봤다

/*
writable._write = function (buf, enc, done) {
  completeParse = done;
  parser.parse(buf);
  process();
};

this.stream.pipe(writable);
*/

this.stream.on('data', function(buf) {
  completeParse = function(err) {
    if (err) {
      console.log(err);
      return;
    }
  };
  parser.parse(buf);
  process();
});


원래 있던 pipe 관련 코드들을 다 주석처리하고

저렇게 직접 readable stream 에서 읽은 data buffer 를 처리하도록 해줬더니.............

세상에 넘나 잘 된다


대체 왜 pipe 가 한번만 동작하고 막힌 건지는 모르겠다.

어딘가에서 막힌 것 같은데 그것까지 찾아볼 생각도 없고...

기나긴 삽질에 지쳐 그럴 자신도 없다 ㅠㅠ




그래도 이제 authentication 을 위한 모든 준비가 끝났다!

암호화만 하면 된다. ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ



나말고 읽을 사람이 있을지 의문이지만

혹시 이 대장정을 다 읽으셨다면


수고하셨습니다!!

+ Recent posts