9.1 KiB
OrionTV Native HTTP Server Implementation Documentation
Overview
OrionTV implements a sophisticated native HTTP server solution that enables remote control functionality for the TV application. This implementation uses TCP sockets to create a custom HTTP server directly within the React Native application, providing a web-based remote control interface accessible from mobile devices.
Architecture
Core Components
1. TCPHttpServer (/services/tcpHttpServer.ts)
A custom HTTP server implementation built on top of react-native-tcp-socket that handles raw TCP connections and implements HTTP protocol parsing and response formatting.
Key Features:
- Custom HTTP request/response parsing
- Fixed port configuration (12346)
- Automatic IP address detection via
@react-native-community/netinfo - Support for GET and POST methods
- Error handling and connection management
Class Structure:
class TCPHttpServer {
private server: TcpSocket.Server | null = null;
private isRunning = boolean;
private requestHandler: RequestHandler | null = null;
}
Core Methods:
start(): Initializes server and binds to0.0.0.0:12346stop(): Gracefully shuts down the serversetRequestHandler(): Sets the request handling logicparseHttpRequest(): Parses raw HTTP request dataformatHttpResponse(): Formats HTTP responses
2. RemoteControlService (/services/remoteControlService.ts)
A service layer that wraps the TCPHttpServer and provides the remote control functionality with predefined routes and HTML interface.
API Endpoints:
GET /- Serves HTML remote control interfacePOST /message- Receives messages from mobile devicesPOST /handshake- Connection handshake for mobile clients
Features:
- Built-in HTML interface generation
- JSON message parsing
- Callback-based event handling
- Error handling and validation
3. RemoteControlStore (/stores/remoteControlStore.ts)
Zustand store that manages the remote control server state and provides React component integration.
State Management:
interface RemoteControlState {
isServerRunning: boolean;
serverUrl: string | null;
error: string | null;
isModalVisible: boolean;
lastMessage: string | null;
startServer: () => Promise<void>;
stopServer: () => void;
showModal: () => void;
hideModal: () => void;
setMessage: (message: string) => void;
}
Technical Implementation Details
HTTP Protocol Implementation
Request Parsing
The server implements custom HTTP request parsing that handles:
- HTTP method and URL extraction
- Header parsing with case-insensitive keys
- Body content extraction
- Malformed request detection
Response Formatting
Responses are formatted according to HTTP/1.1 specification:
- Status line with appropriate status codes (200, 400, 404, 500)
- Content-Length header calculation
- Connection: close header for stateless operation
- Proper CRLF line endings
Network Configuration
IP Address Detection
The server automatically detects the device's IP address using @react-native-community/netinfo:
- Supports WiFi and Ethernet connections
- Validates network connectivity before starting
- Provides clear error messages for network issues
Server Binding
- Binds to
0.0.0.0:12346for universal access - Fixed port configuration for consistency
- Supports all network interfaces on the device
Security Considerations
Current Implementation
- No authentication mechanism
- Open access on local network
- Basic request validation
- Error handling prevents information disclosure
Limitations
- Suitable only for local network use
- No HTTPS/TLS encryption
- No rate limiting or DDoS protection
- Assumes trusted network environment
Web Interface
HTML Template
The service provides a responsive web interface optimized for mobile devices:
- Dark theme design matching TV app aesthetics
- Touch-friendly controls with large buttons
- Real-time message sending capability
- Automatic handshake on page load
JavaScript Functionality
- Automatic handshake POST request on page load
- Message submission via JSON POST requests
- Input field clearing after submission
- Error handling for network issues
Integration with React Native App
App Initialization
The server is automatically started when the app launches (/app/_layout.tsx):
useEffect(() => {
const { setMessage, hideModal } = useRemoteControlStore.getState();
remoteControlService.init({
onMessage: setMessage,
onHandshake: hideModal,
});
useRemoteControlStore.getState().startServer();
return () => {
useRemoteControlStore.getState().stopServer();
};
}, []);
Message Handling
Messages received from mobile devices are processed and displayed as Toast notifications in the TV app, providing visual feedback for remote interactions.
QR Code Integration
The app generates QR codes containing the server URL (http://{device_ip}:12346) for easy mobile device connection via RemoteControlModal.tsx.
Dependencies
Required Packages
react-native-tcp-socket@^6.0.6- TCP socket implementation@react-native-community/netinfo@^11.3.2- Network interface informationreact-native-qrcode-svg@^6.3.1- QR code generation for UI
Platform Compatibility
- iOS (Apple TV)
- Android (Android TV)
- Requires network connectivity (WiFi or Ethernet)
Performance Characteristics
Connection Handling
- Single-threaded event-driven architecture
- Stateless HTTP connections with immediate closure
- Memory-efficient request buffering
- Graceful error recovery
Resource Usage
- Minimal CPU overhead for HTTP parsing
- Low memory footprint
- Network I/O bound operations
- Automatic connection cleanup
Error Handling
Server Level
- Network binding failures with descriptive messages
- Socket error handling and logging
- Graceful server shutdown procedures
- IP address detection error handling
Request Level
- Malformed HTTP request detection
- JSON parsing error handling
- 400/404/500 status code responses
- Request timeout and connection cleanup
Debugging and Monitoring
Logging
Comprehensive logging throughout the system:
- Server startup/shutdown events
- Client connection/disconnection
- Request processing details
- Error conditions and stack traces
Console Output Format
[TCPHttpServer] Server listening on 192.168.1.100:12346
[RemoteControl] Received request: POST /message
[RemoteControlStore] Server started, URL: http://192.168.1.100:12346
Usage Example
Starting the Server
// Automatic startup via store
const { startServer } = useRemoteControlStore();
await startServer();
// Manual service usage
await remoteControlService.startServer();
Stopping the Server
// Via store
const { stopServer } = useRemoteControlStore();
stopServer();
// Direct service call
remoteControlService.stopServer();
Mobile Device Access
- Ensure mobile device is on the same network as TV
- Scan QR code displayed in TV app
- Access web interface at
http://{tv_ip}:12346 - Send messages that appear as notifications on TV
Comparison with Alternatives
vs react-native-http-bridge
- Advantages: More control over HTTP implementation, custom error handling
- Disadvantages: More complex implementation, requires manual HTTP parsing
vs External Backend Server
- Advantages: No additional infrastructure, embedded in app
- Disadvantages: Limited scalability, single device constraint
Future Enhancement Opportunities
Security
- Authentication token implementation
- HTTPS/TLS encryption support
- Request rate limiting
- CORS configuration
Functionality
- Multi-device support
- WebSocket integration for real-time communication
- File upload/download capabilities
- Advanced remote control commands
Performance
- Connection pooling
- Request caching
- Compression support
- IPv6 compatibility
Troubleshooting
Common Issues
"Unable to get IP address" Error
- Verify WiFi/Ethernet connection
- Check network interface availability
- Restart network services
Server Won't Start
- Check if port 12346 is already in use
- Verify network permissions
- Restart the application
Mobile Device Can't Connect
- Confirm both devices on same network
- Verify firewall settings
- Check IP address in QR code
Diagnostic Commands
# Check network connectivity
yarn react-native log-ios # View iOS logs
yarn react-native log-android # View Android logs
# Network debugging
netstat -an | grep 12346 # Check port binding (debugging environment)
Conclusion
The OrionTV native HTTP server implementation provides a robust, embedded solution for remote control functionality without requiring external infrastructure. The custom TCP-based approach offers flexibility and control while maintaining simplicity and performance suitable for TV applications.
The implementation demonstrates sophisticated understanding of HTTP protocol handling, React Native integration, and TV-specific user experience requirements, making it an effective solution for cross-device interaction in smart TV environments.