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
ServerSocketlắng nghe trên port 9999. Mỗi khi có máy kết nối, nó sẽ tạo mộtConnectedClientchạy trong một thread riêng biệt. - ConnectedClient:
- Quản lý
DataInputStreamvàDataOutputStreamcủ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_CLOSEtới tất cả các máy đang kết nối để giải phóng tài nguyên.