Skip to content

Feature: IoT Bridge (TCP/Socket Communication)

BountyHunter-ControlServer đóng vai trò là cầu nối kỹ thuật số giữa phần cứng (máy gắp gấu) và phần mềm (Backend). Tính năng này quản lý các kết nối TCP socket thô và chuyển đổi chúng thành các sự kiện có cấu trúc.

1. Mục tiêu

  • Duy trì kết nối persistent với hàng trăm máy gắp gấu vật lý.
  • Giải mã (Decode) dữ liệu binary từ máy thành các object Java.
  • Mã hóa (Encode) các lệnh điều khiển từ Backend thành các gói tin binary gửi xuống máy.

2. Các thành phần chính

  • WawaServer: Khởi tạo ServerSocket lắng nghe trên port 9999. Mỗi khi có máy kết nối, nó sẽ tạo một ConnectedClient chạy trong một thread riêng biệt.
  • ConnectedClient:
  • Quản lý DataInputStreamDataOutputStream của socket.
  • Vòng lặp readMessages() liên tục đọc dữ liệu từ máy.
  • Phân loại tin nhắn dựa trên header và dữ liệu payload.
  • ClientMessageHandler: Interface định nghĩa cách xử lý từng loại tin nhắn cụ thể (MachineStatusReport, GameStarted, v.v.).

3. Giao tiếp nhị phân (Binary Protocol)

Giao tiếp sử dụng hệ cơ số 16 (Hexadecimal). Ví dụ về cấu trúc một gói tin gửi từ ControlServer tới máy:

Vị trí Byte Giá trị (Hex) Mô tả
0 0xFE Byte khởi đầu (Header)
1-2 gPackgetId ID của gói tin hoặc máy (Little Endian)
3-5 ~Header/ID Bitwise NOT của byte 0, 1, 2 để kiểm tra lỗi truyền dẫn
6 Length Tổng độ dài gói tin
7..N-1 Payload Các mã lệnh (ví dụ: 0x31 để Start Game)
N Checksum sum(bytes[6..N-1]) % 100

4. Quản lý kết nối

  • ConcurrentMap allMachine: Lưu trữ tất cả các máy đang kết nối theo địa chỉ MAC hoặc ID định danh.
  • Keep-alive: Health-check định kỳ giữa máy và ControlServer để đảm bảo kết nối không bị treo (zombie connection).
  • Graceful Shutdown: Khi ControlServer tắt, nó sẽ gửi lệnh MACHINE_SOCKET_CLOSE tới tất cả các máy đang kết nối để giải phóng tài nguyên.