sequenceDiagram
participant React User app
participant Signalling server
participant Hub app
participant Arduino IoT
note right of Hub app: socket on thread (bthread.py)
rect rgb(191, 223, 255)
loop
Arduino IoT ->> Hub app: Bluetooth SPP
end
end
Hub app ->> Signalling server: Hub join with Room code
React User app ->> Signalling server: User join with Room code
Signalling server ->> Hub app: notice user join
Hub app ->> Signalling server: "MY" user OK, sendOffer() (hub_app/static/main.js)
Signalling server ->> React User app: Hub sent offer to you.
React User app ->> Signalling server: OK, sendAnswer() (src/service/socket_service.js)
Signalling server ->> Hub app: User sent answer to you.
Hub app ->> Signalling server: OK, sendCandidate() (hub_app/static/main.js)
Signalling server ->> React User app: Hub sent candidates to you.
React User app ->> Signalling server: sendCandidate() (src/service/socket_service.js)
Signalling server ->> Hub app: User sent candidates to you.
note right of React User app: On RTC data channel
loop
rect rgb(191, 223, 255)
Hub app ->> React User app: Data from Bluetooth SPP
end
end
시그널링 서버를 동작시킵니다. SignallingServer.js에서 HOST와 PORT를 정의하고 있습니다.
Hub와 연결된 블루투스 장치로부터 값을 읽고, 8080 포트로 동작하는 localhost 웹 애플리케이션을 호스팅합니다. 이 애플리케이션은 Hub 장치의 웹브라우저로 열어서 Room code를 설정하는 것으로 사용합니다.
블루투스 SPP는 소켓의 형태로 추상화 되어 있으며, IoT 장비가 보내는 값을 Thread로 읽어 맵에 씁니다. 따라서 공유 변수에 접근하는 메소드는 임계영역이어야 합니다.
@synchronized
def on_data_received(key, d):
print(key, d)
try:
device_info[key] = json.loads(d)
except JSONDecodeError:
pass
sio.emit('devices', {'devices': device_info})User app을 호스팅합니다. Hub의 소유권을 의미하는 Room code를 알고있는 사용자가 그것을 입력하므로서 위 시퀸스 차트의 흐름이 진행됩니다.
