You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bidirectional RFCOMM communication with directional control commands
Data Logging
Auto-save received data to local file
Floating Window
Receive data display in draggable system overlay
Network Communication
Feature
Description
UDP Server
Start a UDP multicast server to receive data
UDP Client
Start a UDP multicast client to send data
TCP Server
Start a TCP server to receive data
KCP
KCP (Reliable UDP) protocol for low-latency transmission
Pub/Sub
Subscribe & Publish messages via floating dialog windows; async connection with real-time status feedback
File Transfer
Custom binary protocol with chunked transfer (64KB/chunk) and progress callback
HTTP Server
Embedded HTTP server with HTML directory listing; supports SAF mode (Android 10+)
Message System (C++ ↔ Java)
The app uses a thread-safe message queue (Message.h) to bridge C++ native code with Java UI. Messages are dispatched via the MASSAGER enum:
Type
Direction
Description
MESSAGE
C++ → Java
General toast notifications
TOAST
C++ → Java
Status text update (txt_status)
MSG_HINT
C++ → Java
Hint text update (txt_hint)
SUBSCRIBER
C++ → Java
Subscribe service feedback
PUBLISHER
C++ → Java
Publish service feedback
FILE_PROGRESS
C++ → Java
File transfer progress update
TEXTURE
C++ → Java
Texture rendering callback
UDP_SERVER
C++ → Java
UDP server status
UDP_CLIENT
C++ → Java
UDP client status
KCP_VIEW
C++ → Java
KCP connection status
The SelectActivity UI features a dual-status display: txt_hint (italic, light gray) for supplementary hints and txt_status (bold, dark) for primary status, separated by a divider line.
Multimedia Processing
Feature
Description
GPU Rendering
Image/video rendering via OpenGL ES 2.0 (EGL/GLESv2)
CPU Rendering
Software-based image/video decoding and display
Audio Recording
16kHz PCM recording with real-time waveform visualization
Audio Playback
Play WAV/MP4/OGG/MP3/AAC/AMR files with waveform analysis
Speech to Text
Built-in speech recognition (STT) integration
Sensor Monitor
Real-time accelerometer, gravity, and linear acceleration data display
Intelligent Features
Feature
Description
AI Chat
DeepSeek API integration with Chat / Reasoner (Deep Think) models
Sensor Alert
Automatic warning audio when acceleration exceeds 7.0 m/s² threshold
System Integration
Feature
Description
Event System
Observer-pattern event broadcast for inter-component communication
Time Sync
Native timestamp acquisition and synchronization
Global Toast
Floating toast notification service (3s auto-dismiss)
One-Tap Exit
Global exit manager to terminate all activities and services
Produces debug APK for arm64-v8a, armeabi-v7a, x86_64
Screenshots
License
MIT License
Recent Changes
2026-06
MSG_HINT Message Type: Added MSG_HINT = 9 to MASSAGER enum for displaying auxiliary hint text in SelectActivity. C++ can now send hints via Message::instance().setMessage(msg, MSG_HINT).
UI Layout Improvements: sample_text moved to fixed footer (outside ScrollView). txt_hint added above txt_status with visual differentiation: italic 12sp gray hint vs. bold 14sp dark status, separated by a divider line.
Pub/Sub Async Overhaul (JniMethods.cpp): StartSubscribe now returns immediately (non-blocking), connection results sent asynchronously via Message system. Publish moved to detached thread to prevent UI thread blocking (ANR). Added real-time feedback (Toast) for both Subscribe and Publish operations.
Publish/Subscribe Topic Isolation (PubSubSetting.java): Separate topic (subscribe) and pubTopic (publish) fields to prevent cross-contamination between services.
Subscriber Use-After-Free Fix (Subscriber.cpp): Fixed random trailing characters in received messages. Root cause: body buffer was freed immediately after enqueuing callback to thread pool, but the callback's content pointer still referenced freed memory. Fixed by using shared_ptr<vector<char>> to manage buffer lifecycle, ensuring it persists until callback completion.
Port Parsing Protection (SubscribeService.java): Added try-catch around Integer.parseInt() calls for port input, falling back to default port 9999 on invalid input.