본문 바로가기
컴퓨터|인터넷/라즈베리파이

Node-red: WebSocket In/out

by 즐거운 지니 2024. 10. 3.
반응형

Node-RED에서 WebSocket InWebSocket Out 노드는 WebSocket 프로토콜을 사용하여 실시간 데이터 전송을 처리하는 노드들입니다. WebSocket은 HTTP 기반의 양방향 통신 프로토콜로, 클라이언트와 서버가 지속적으로 연결된 상태를 유지하면서 실시간으로 데이터를 주고받을 수 있습니다.

WebSocket In 노드

WebSocket In 노드WebSocket 클라이언트 또는 서버로부터 메시지를 수신하는 역할을 합니다. 이를 통해 Node-RED 플로우가 WebSocket 연결로 들어오는 데이터를 받아 처리할 수 있습니다.

주요 기능:

  • 서버 모드: WebSocket In 노드를 서버 모드로 설정하면, Node-RED는 WebSocket 서버 역할을 하여 클라이언트들이 연결을 맺고 데이터를 전송할 수 있습니다.
  • 클라이언트 모드: WebSocket In 노드를 클라이언트 모드로 설정하면, Node-RED는 외부 WebSocket 서버에 연결하여 해당 서버로부터 데이터를 수신합니다.
  • 메시지 수신: WebSocket 연결로 들어오는 메시지를 Node-RED 플로우에서 처리할 수 있습니다.

설정 옵션:

  1. Type:
    • Listen on: Node-RED가 WebSocket 서버로 동작하며, 클라이언트들이 연결할 수 있도록 합니다.
    • Connect to: Node-RED가 WebSocket 클라이언트로 동작하며, 외부 WebSocket 서버에 연결합니다.
  2. URL: WebSocket 연결을 수신할 서버 주소 또는 연결할 서버 주소를 설정합니다. 예를 들어, ws://localhost:1880/ws/chat.
  3. Name: 노드의 이름을 지정할 수 있습니다.

WebSocket Out 노드

WebSocket Out 노드WebSocket 연결을 통해 데이터를 전송하는 역할을 합니다. WebSocket Out 노드는 WebSocket In 노드에서 연결된 클라이언트나 서버로 데이터를 전송할 수 있습니다.

주요 기능:

  • 서버 모드에서 전송: WebSocket Out 노드는 WebSocket 서버 역할을 하는 Node-RED 인스턴스에서 연결된 클라이언트들에게 데이터를 보낼 수 있습니다.
  • 클라이언트 모드에서 전송: WebSocket Out 노드는 WebSocket 클라이언트로 설정되어 외부 WebSocket 서버에 데이터를 전송할 수 있습니다.
  • 실시간 데이터 송신: WebSocket Out 노드를 사용하여 실시간 데이터를 송신할 수 있습니다. 예를 들어, 센서 데이터, 상태 업데이트, 채팅 메시지 등을 클라이언트에게 전송할 수 있습니다.

설정 옵션:

  1. Type:
    • Listen on: WebSocket Out 노드가 WebSocket 서버로 동작하여 연결된 클라이언트들에게 메시지를 전송합니다.
    • Connect to: WebSocket Out 노드가 외부 WebSocket 서버에 연결되어 메시지를 전송합니다.
  2. URL: WebSocket 연결을 통해 데이터를 전송할 서버 주소 또는 연결된 클라이언트들에게 데이터를 보낼 수 있는 주소를 설정합니다.
  3. Name: 노드의 이름을 지정할 수 있습니다.

다음은 Node-RED를 사용하여 간단한 실시간 채팅 애플리케이션을 구현하는 예제입니다. 이 예제에서는 WebSocket InWebSocket Out 노드를 사용하여 실시간 메시지를 주고받을 수 있습니다. Node-RED 대시보드에서 메시지를 입력하고, 다른 사용자가 메시지를 실시간으로 볼 수 있는 형태로 만들겠습니다.

Node-RED 플로우 구성

  1. WebSocket In 노드: 클라이언트가 WebSocket을 통해 보내는 메시지를 수신합니다.
  2. Function 노드: 메시지를 처리합니다(예: 사용자 이름을 추가하거나 메시지를 형식화).
  3. WebSocket Out 노드: 수신된 메시지를 연결된 다른 클라이언트들에게 실시간으로 전송합니다.
  4. Dashboard 노드: 대시보드에서 채팅 메시지를 표시하고 새로운 메시지를 입력할 수 있습니다.

플로우 구성

플로우 JSON

[
    {
        "id": "websocket_in",
        "type": "websocket in",
        "z": "2afd894e488b653d",
        "name": "WebSocket In",
        "server": "a9168a310b0c75ac",
        "client": "",
        "x": 170,
        "y": 100,
        "wires": [
            [
                "function_format_message",
                "10e2f22f799c357d"
            ]
        ]
    },
    {
        "id": "function_format_message",
        "type": "function",
        "z": "2afd894e488b653d",
        "name": "Format Message",
        "func": "try {\n    // msg.payload가 JSON 형식의 문자열로 들어오므로 객체로 변환\n    var data = JSON.parse(msg.payload);\n\n    // 사용자 이름과 메시지 가져오기\n    var user = data.user || 'Anonymous';\n    var text = data.text || '';\n\n    // 메시지를 형식화하여 msg.payload에 저장\n    msg.payload = user + ': ' + text;\n} catch (error) {\n    // JSON 파싱에 실패하면 기본 메시지 출력\n    msg.payload = 'Invalid data format';\n}\n\nreturn msg;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 470,
        "y": 100,
        "wires": [
            [
                "websocket_out",
                "ui_text_area"
            ]
        ]
    },
    {
        "id": "websocket_out",
        "type": "websocket out",
        "z": "2afd894e488b653d",
        "name": "WebSocket Out",
        "server": "",
        "client": "2959a1da26fd8b99",
        "x": 900,
        "y": 100,
        "wires": []
    },
    {
        "id": "ui_form",
        "type": "ui_form",
        "z": "2afd894e488b653d",
        "name": "Message Input",
        "label": "Chat Form",
        "group": "da6fcc7da8733bcb",
        "order": 2,
        "width": "6",
        "height": "1",
        "options": [
            {
                "label": "User",
                "value": "user",
                "type": "text",
                "required": true,
                "rows": null
            },
            {
                "label": "Message",
                "value": "text",
                "type": "text",
                "required": true,
                "rows": null
            }
        ],
        "formValue": {
            "user": "",
            "text": ""
        },
        "payload": "",
        "submit": "보냄",
        "cancel": "취소",
        "topic": "",
        "topicType": "str",
        "splitLayout": true,
        "className": "",
        "x": 680,
        "y": 340,
        "wires": [
            [
                "websocket_out"
            ]
        ]
    },
    {
        "id": "ui_text_area",
        "type": "ui_text",
        "z": "2afd894e488b653d",
        "group": "da6fcc7da8733bcb",
        "order": 1,
        "width": "6",
        "height": "4",
        "name": "Chat Display",
        "label": "Chat",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "style": false,
        "font": "",
        "fontSize": "",
        "color": "#000000",
        "x": 670,
        "y": 240,
        "wires": []
    },
    {
        "id": "10e2f22f799c357d",
        "type": "debug",
        "z": "2afd894e488b653d",
        "name": "debug 1",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 360,
        "y": 180,
        "wires": []
    },
    {
        "id": "a9168a310b0c75ac",
        "type": "websocket-listener",
        "path": "/ws/chat",
        "wholemsg": "false"
    },
    {
        "id": "2959a1da26fd8b99",
        "type": "websocket-client",
        "path": "ws://localhost:1880/ws/chat",
        "tls": "",
        "wholemsg": "false",
        "hb": "0",
        "subprotocol": ""
    },
    {
        "id": "da6fcc7da8733bcb",
        "type": "ui_group",
        "name": "Default",
        "tab": "129055a93ab84abe",
        "order": 1,
        "disp": true,
        "width": "6",
        "collapse": false,
        "className": ""
    },
    {
        "id": "129055a93ab84abe",
        "type": "ui_tab",
        "name": "Home",
        "icon": "dashboard",
        "disabled": false,
        "hidden": false
    }
]

 

 

반응형

'컴퓨터|인터넷 > 라즈베리파이' 카테고리의 다른 글

Node-red: Chart in dashboard  (2) 2024.10.03
Node-red: Gauge in Dashboard (노드래드 대시보드 게이지의 활용)  (0) 2024.10.03
Node-red: http in  (2) 2024.10.03
MQTT Python client  (0) 2024.09.22
Node-red 설치  (0) 2024.09.22

댓글