MPC 및 NBI 문제 - Team-HGD/SniffMEET GitHub Wiki

문제 상황

NBI & MPC 연결 문제 -

연결이 불안정하고 disconnected된다.

[GCKSession] Not in connected state, so giving up for participant [1C22D602] on channel [0].

추측

  • 기기가 advertiser, browser 2개의 역할을 수행하고 있다.
  • 초대 과정이 이루어질 때 invite를 보내지 않는다.

수락 제한 시간을 30초로 설정한다.

동시에 invite를 보낸다. 먼저 초대장을 받은 피어가 세션 연결을 수락한다. 이 과정에서 별도의 초대장과 초대 수락 과정이 반대로 이루어져서는 안된다.

  • 그렇다면 초대를 보낸 사람의 peerID와 받은 초대장을 보낸 peeID와 비교해서 같다면 수락하지 않는 방법
  • 초대장을 5초에 한번씩 보낸다.
  • 결과 : 연결 불안정 상태 동일

실험 1. 데이터 송수신을 제외하면 연결 상태가 잘 유지되는지 확인한다.

  • 결과: 실패

Failed to send a DTLS packet with 78 bytes; sendmsg error: No route to host (65).

SSLWrite failed, packet was not sent for participant [616AD9A7] channelID [7] DTLS context [0x10a330a00] pCList [0x10a37ce00]; SSLError = Would Block (-9803): errno = Undefined error: 0 (0).

start advertising
start Browsing
ServiceBrowser found peer: <MCPeerID: 0x3019d1be0 DisplayName = F9274035>
availablePeers: [<MCPeerID: 0x3019d1be0 DisplayName = F9274035>]
ServiceBrowser found peer: <MCPeerID: 0x3019c05a0 DisplayName = 4B2F3169>
availablePeers: [<MCPeerID: 0x3019d1be0 DisplayName = F9274035>, <MCPeerID: 0x3019c05a0 DisplayName = 4B2F3169>]

디버깅해서 알아낸 사실 ( 11/24 12:06)

디버깅 창 창을 보면 disconnected된 session이 각자 만들었던 session이라는 것이다. 독자적인 session이 2개로 이루어져 있는건 맞아보인다.
  • 시뮬레이터
디버깅1 디버깅2
  • 아이패드
디버깅3 디버깅4

☘️ 해결 방식

1️⃣ 핵심 아이디어

  • 중간 중간 연결이 불안정한 상태가 발생함 → 상대 기기가 정보를 받지 못하는 일이 발생할 수도 있음
    • 상대방이 응답을 보내기 전까지 계속 보낸다? →

    • 상대방이 응답을 보내기 전까지 2초 마다 보낸다.

      123
    • 수신하는 쪽에서 이미 전에 받은 데이터와 온 데이터가 일치하다면 무시한다.

현재 flow

mpcSession 생성 - niSession 생성 - mpcSession 연결 - ni Discovery Token mpcSession으로 교환 - niSession 연결

  1. ni 거리/방향 측정 - 조건 부합시 niSession 종료 및 mpcSession으로 프로필 교환 - 교환받는경우 뷰 전환
  2. mpcSession으로 프로필 교환 (3초 간격 지속 교환) - ni 거리/방향 측정 - 조건 부합시 뷰 전환 (계속 전송하던 그 데이터로!)

NIB의 특정 거리와 방향의 조건을 만족하면 NIsession end했는데 상대방이 조건을 만족하기 까지 시간을 주지 않는다.

따라서 조건을 만족하고 세션을 중지시키기 전까지 1초를 멈추고 세션을 중지한다.

another problem

p2p wifi에서 데이터 교환이 제대로 이루어지지 않은 상태

2개의 subject를 쓴다.

하나는 dogProfile, 하나는 화면 전환의 여부

dogprofile이 이미 할당이 되었지만 다른 subject에서 dogprofile을 가져오는데 그 값이 nil이 된다.

send(true) 이벤트가 잘 받지 못한다.

11/25 12:21 문제 발생 again

  • 비동기 문제로 예상됨 combine에서 이벤트가 발생했으나 그 이벤트가 발생한 이후 bind한 클로저가 실행되지 않는다.

2️⃣ 해결 과정

코드상의 문제가 없는 것으로 판단되어 코드 외적인 부분을 점검하였고, 그 결과 권한 문제를 발견할 수 있었다.

p2p 연결을 위해서는 로컬 네크워크 권한이 반드시 필요한데, 초기 부여한 권한이 PR 충돌 해결 과정에서 누락되어 권한 설정이 사라져있던 것이었다. 초기 셋팅을 해두었기에 바로 다시 살펴볼 생각을 못하고 계속 코드상의 문제를 찾고 있었다..

권한 설정 제대로 하고 나니 정말 잘 동작했다.. 권한 설정을 했어도 뭔가 이상하다 싶으면 한번씩 확인해보자..

⚠️ **GitHub.com Fallback** ⚠️