Skip to content

Repository files navigation

Build StatusCodacy Badge

Device2Device

A feature-rich Android application for peer-to-peer communication and multimedia processing between devices.

Core capabilities:

  • 🔵 Bluetooth RFCOMM serial communication with device discovery and data logging
  • 🌐 Multi-protocol networking: TCP, UDP (multicast), KCP (reliable UDP)
  • 📨 Pub/Sub messaging via scadup message queue library
  • 🎨 GPU (OpenGL ES) and CPU image/video rendering
  • 🎤 Audio recording (16kHz PCM) with real-time waveform visualization and speech recognition
  • 📊 Real-time sensor monitoring (accelerometer, gravity, linear acceleration)
  • 🤖 AI chat powered by DeepSeek API (Chat + Deep Think models)
  • 📁 Embedded HTTP file server with directory browsing

Architecture

Architecture


Technology Stack

CategoryTechnologies
PlatformAndroid (API 21+, target 31)
LanguageJava, C++ (C++11)
NativeJNI, CMake 2.8+, OpenGL ES 2.0, OpenSL ES, NDK 23
NetworkUDP (Multicast), TCP, KCP (Reliable UDP), HTTP, Bluetooth
MediaAudioRecord, AudioTrack, MediaExtractor, OpenGL ES, YUV↔RGB, PCM↔WAV
UIMaterial Design, ConstraintLayout, Custom Views, System Overlay
BuildGradle 7.x, CMake, NDK (ARM NEON optimizations)

Project Structure

app/src/main/
├── java/com/tsymiar/device2device/
│ ├── activity/ # Activities (12)
│ │ ├── MainActivity # Splash screen → auto-navigate
│ │ ├── SelectActivity # Main dashboard (network, sensor, chat, files, Bluetooth)
│ │ ├── TextureActivity # Image/Video GPU & CPU rendering
│ │ ├── WaveActivity # Audio recording & real-time waveform + speech recognition
│ │ ├── GraphActivity # Sensor real-time data display
│ │ ├── SensorActivity # List all device sensors
│ │ ├── CommitActivity # Bluetooth serial communication (RFCOMM)
│ │ ├── ConnectActivity # Bluetooth discoverability & device scanning
│ │ ├── DevicesActivity # Paired & discovered Bluetooth devices list
│ │ ├── BuggerActivity # Bug report / email feedback
│ │ ├── MyGitActivity # Open project GitHub page
│ │ └── ThanksActivity # Acknowledgements page
│ ├── service/ # Background services (7)
│ │ ├── SubscribeService # Pub/Sub subscribe floating window
│ │ ├── PublishService # Pub/Sub publish floating window
│ │ ├── HttpFileService # Embedded HTTP file server (File & SAF modes)
│ │ ├── ToastNotificationService # Global floating toast notifications
│ │ ├── ReceiverService # Bluetooth data receive floating window
│ │ ├── WindowService # Generic text overlay floating window
│ │ ├── SaveDataService # Persist Bluetooth received data to file
│ │ └── Voice # Audio alert playback service
│ ├── acceleration/ # Sensor & Voice modules
│ │ ├── SensorFragment # Real-time accelerometer chart (Bézier-smoothed)
│ │ ├── DefaultFragment # Basic sensor chart variant
│ │ └── Voice # Over-acceleration warning (threshold: 7.0 m/s²)
│ ├── dialog/ # UI dialogs
│ │ ├── ChatBoxDialog # DeepSeek AI chat (Chat / Reasoner models)
│ │ └── FileMsgDialog # File transfer with progress & SAF file picker
│ ├── entity/ # Data entities (PubSubSetting, Receiver)
│ ├── event/ # Observer-pattern event system (EventHandle, EventNotify)
│ ├── utils/ # Utilities (Atom, MP4Header, WAVHeader, SoundRecord, WaveCanvas, HttpsRequest, Utils, etc.)
│ ├── view/ # Custom views (WaveSurface, WaveformsView)
│ └── wrapper/ # JNI native bridge (Callback, Network, View, Media, Time)
├── cpp/ # Native C++ code
│ ├── JniMethods.cpp/h # All JNI entry points
│ ├── bitmap/ # BMP image processing
│ ├── callback/ # Java↔C++ bidirectional callbacks
│ ├── convert/ # PCM↔WAV, YUV↔RGB format conversion
│ ├── display/ # GPU (EGL/GLES2) & CPU rendering
│ ├── message/ # Thread-safe message queue
│ ├── socket/ # UDP / TCP / KCP / FileMsg protocol
│ ├── scadup/ # Message queue library (tsymiar/scadup)
│ ├── test/ # Unit tests (FileMsgSocket)
│ ├── time/ # Timestamp utilities
│ └── utils/ # File utilities, logging, constants

Features

Bluetooth Communication

FeatureDescription
Device ScanningScan for nearby Bluetooth devices
PairingList paired devices and discover new ones
Serial CommBidirectional RFCOMM communication with directional control commands
Data LoggingAuto-save received data to local file
Floating WindowReceive data display in draggable system overlay

Network Communication

FeatureDescription
UDP ServerStart a UDP multicast server to receive data
UDP ClientStart a UDP multicast client to send data
TCP ServerStart a TCP server to receive data
KCPKCP (Reliable UDP) protocol for low-latency transmission
Pub/SubSubscribe & Publish messages via floating dialog windows; async connection with real-time status feedback
File TransferCustom binary protocol with chunked transfer (64KB/chunk) and progress callback
HTTP ServerEmbedded 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:

TypeDirectionDescription
MESSAGEC++ → JavaGeneral toast notifications
TOASTC++ → JavaStatus text update (txt_status)
MSG_HINTC++ → JavaHint text update (txt_hint)
SUBSCRIBERC++ → JavaSubscribe service feedback
PUBLISHERC++ → JavaPublish service feedback
FILE_PROGRESSC++ → JavaFile transfer progress update
TEXTUREC++ → JavaTexture rendering callback
UDP_SERVERC++ → JavaUDP server status
UDP_CLIENTC++ → JavaUDP client status
KCP_VIEWC++ → JavaKCP 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

FeatureDescription
GPU RenderingImage/video rendering via OpenGL ES 2.0 (EGL/GLESv2)
CPU RenderingSoftware-based image/video decoding and display
Audio Recording16kHz PCM recording with real-time waveform visualization
Audio PlaybackPlay WAV/MP4/OGG/MP3/AAC/AMR files with waveform analysis
Speech to TextBuilt-in speech recognition (STT) integration
Sensor MonitorReal-time accelerometer, gravity, and linear acceleration data display

Intelligent Features

FeatureDescription
AI ChatDeepSeek API integration with Chat / Reasoner (Deep Think) models
Sensor AlertAutomatic warning audio when acceleration exceeds 7.0 m/s² threshold

System Integration

FeatureDescription
Event SystemObserver-pattern event broadcast for inter-component communication
Time SyncNative timestamp acquisition and synchronization
Global ToastFloating toast notification service (3s auto-dismiss)
One-Tap ExitGlobal exit manager to terminate all activities and services

Build Requirements

ComponentVersion
Android SDK31 (compileSdk) / 21+ (minSdk)
Android NDK23.0.7599858
Build Tools30.0.3
Gradle7.x
CMake2.8+
JDK8 or 11
ABIsarm64-v8a, armeabi-v7a, x86_64
C++ StandardC++11 (ARM NEON optimized)

Permissions

<uses-permissionandroid:name="android.permission.BLUETOOTH" />
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permissionandroid:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permissionandroid:name="android.permission.BLUETOOTH_SCAN" />
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permissionandroid:name="android.permission.RECORD_AUDIO" />
<uses-permissionandroid:name="android.permission.INTERNET" />
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permissionandroid:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE" />
<uses-permissionandroid:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" />

Building

# Local build
./build.sh
# CI build (Azure Pipelines)# See azure-pipelines.yml

CI/CD

This project uses Azure Pipelines for continuous integration on macos-latest. The pipeline:

  • Checks out the main repo and tsymiar/scadup submodule
  • Copies scadup native library to app/src/main/cpp/scadup/
  • Installs Android SDK components (NDK 23, build-tools 30.0.3, platform 31)
  • Sets up JDK 11 and builds with Gradle 7.0.2
  • 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.

About

An Android test app

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages