{"id":50798086,"url":"https://github.com/iannil/open-remote-id-parser","last_synced_at":"2026-06-12T16:04:11.742Z","repository":{"id":333281264,"uuid":"1136758404","full_name":"iannil/open-remote-id-parser","owner":"iannil","description":"Open Remote ID Parser is a lightweight C++ library for decoding drone Remote ID broadcasts. It supports multiple protocols (ASTM F3411, ASD-STAN) and transport layers (Bluetooth Legacy/Extended, WiFi Beacon/NAN), making it ideal for building drone detection applications on mobile devices, embedded systems, or desktop platforms.","archived":false,"fork":false,"pushed_at":"2026-02-02T06:59:24.000Z","size":408,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-02-02T18:50:02.094Z","etag":null,"topics":["drone","parser","remote-id"],"latest_commit_sha":null,"homepage":"https://zhurongshuo.com/products/open-remote-id-parser/","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iannil.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-18T09:52:49.000Z","updated_at":"2026-02-02T06:59:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/iannil/open-remote-id-parser","commit_stats":null,"previous_names":["iannil/open-remote-id-parser"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/iannil/open-remote-id-parser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iannil%2Fopen-remote-id-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iannil%2Fopen-remote-id-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iannil%2Fopen-remote-id-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iannil%2Fopen-remote-id-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iannil","download_url":"https://codeload.github.com/iannil/open-remote-id-parser/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iannil%2Fopen-remote-id-parser/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34251782,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["drone","parser","remote-id"],"created_at":"2026-06-12T16:04:10.976Z","updated_at":"2026-06-12T16:04:11.719Z","avatar_url":"https://github.com/iannil.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Open Remote ID Parser (ORIP)\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eA high-performance, cross-platform library for parsing drone Remote ID signals\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e •\n  \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e •\n  \u003ca href=\"#quick-start\"\u003eQuick Start\u003c/a\u003e •\n  \u003ca href=\"#api-reference\"\u003eAPI\u003c/a\u003e •\n  \u003ca href=\"#building\"\u003eBuilding\u003c/a\u003e •\n  \u003ca href=\"#contributing\"\u003eContributing\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eEnglish\u003c/b\u003e | \u003ca href=\"README_zh-CN.md\"\u003e中文\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n**Open Remote ID Parser** is a lightweight C++ library for decoding drone Remote ID broadcasts. It supports multiple protocols (ASTM F3411, ASD-STAN) and transport layers (Bluetooth Legacy/Extended, WiFi Beacon/NAN), making it ideal for building drone detection applications on mobile devices, embedded systems, or desktop platforms.\n\n\u003e Remote ID is the \"digital license plate\" for drones, mandated by regulations worldwide (FAA in the US, EASA in Europe). This library enables anyone to build drone detection solutions using commodity hardware like smartphones or Raspberry Pi.\n\n## Features\n\n- **Multi-Protocol Support**\n  - ASTM F3411-22a (USA/International)\n  - ASD-STAN EN 4709-002 (European Union)\n  - GB/T (China) - Interface reserved\n\n- **Multi-Transport Support**\n  - Bluetooth 4.x Legacy Advertising\n  - Bluetooth 5.x Extended Advertising / Long Range (Coded PHY)\n  - WiFi Beacon (802.11 Vendor Specific IE)\n  - WiFi NAN (Neighbor Awareness Networking)\n\n- **Advanced Analysis**\n  - Anomaly Detection (spoofing, replay attacks, impossible speeds)\n  - Trajectory Analysis (smoothing, prediction, pattern classification)\n  - Session Management (deduplication, timeout handling)\n\n- **Cross-Platform Bindings**\n  - C++ (core library)\n  - C API (for FFI integration)\n  - Android/Kotlin (via JNI)\n  - Python (via ctypes)\n\n- **Performance**\n  - Zero-copy parsing with bit fields\n  - Minimal memory allocations\n  - Suitable for real-time processing on mobile devices\n\n## Supported Message Types\n\n| Message Type | Description |\n| -------------- | ------------- |\n| Basic ID (0x0) | Drone serial number, registration ID |\n| Location (0x1) | Latitude, longitude, altitude, speed, heading |\n| Authentication (0x2) | Cryptographic authentication data |\n| Self-ID (0x3) | Operator-defined description text |\n| System (0x4) | Operator location, area of operation |\n| Operator ID (0x5) | Operator registration number |\n| Message Pack (0xF) | Multiple messages in one broadcast |\n\n## Installation\n\n### C++ (CMake)\n\n```cmake\ninclude(FetchContent)\nFetchContent_Declare(\n    orip\n    GIT_REPOSITORY https://github.com/iannil/open-remote-id-parser.git\n    GIT_TAG v0.1.0\n)\nFetchContent_MakeAvailable(orip)\n\ntarget_link_libraries(your_target PRIVATE orip)\n```\n\n### Python\n\n```bash\ncd python\npip install .\n\n# Or for development\npip install -e \".[dev]\"\n```\n\n### Android (Gradle)\n\n```kotlin\n// settings.gradle.kts\ninclude(\":orip\")\nproject(\":orip\").projectDir = file(\"path/to/open-remote-id-parser/android/orip\")\n\n// app/build.gradle.kts\ndependencies {\n    implementation(project(\":orip\"))\n}\n```\n\n## Quick Start\n\n### C++\n\n```cpp\n#include \u003corip/orip.h\u003e\n\nint main() {\n    orip::RemoteIDParser parser;\n    parser.init();\n\n    // Set up callbacks\n    parser.setOnNewUAV([](const orip::UAVObject\u0026 uav) {\n        std::cout \u003c\u003c \"New drone: \" \u003c\u003c uav.id \u003c\u003c std::endl;\n    });\n\n    // Parse incoming BLE advertisement\n    std::vector\u003cuint8_t\u003e ble_data = /* from scanner */;\n    auto result = parser.parse(ble_data, rssi, orip::TransportType::BT_LEGACY);\n\n    if (result.success) {\n        std::cout \u003c\u003c \"Drone ID: \" \u003c\u003c result.uav.id \u003c\u003c std::endl;\n        std::cout \u003c\u003c \"Location: \" \u003c\u003c result.uav.location.latitude\n                  \u003c\u003c \", \" \u003c\u003c result.uav.location.longitude \u003c\u003c std::endl;\n    }\n\n    return 0;\n}\n```\n\n### Python\n\n```python\nfrom orip import RemoteIDParser, TransportType\n\nwith RemoteIDParser() as parser:\n    parser.set_on_new_uav(lambda uav: print(f\"New drone: {uav.id}\"))\n\n    # Parse BLE advertisement data\n    result = parser.parse(ble_data, rssi=-70, transport=TransportType.BT_LEGACY)\n\n    if result.success:\n        print(f\"Drone: {result.uav.id}\")\n        print(f\"Location: {result.uav.location.latitude}, {result.uav.location.longitude}\")\n```\n\n### Kotlin (Android)\n\n```kotlin\nimport com.orip.RemoteIDParser\nimport com.orip.TransportType\n\nclass DroneScanner {\n    private val parser = RemoteIDParser()\n\n    init {\n        parser.setOnNewUAV { uav -\u003e\n            Log.d(\"DroneScanner\", \"New drone: ${uav.id}\")\n        }\n    }\n\n    // In BLE scan callback\n    fun onScanResult(result: ScanResult) {\n        val scanRecord = result.scanRecord ?: return\n\n        val parseResult = parser.parse(\n            scanRecord.bytes,\n            result.rssi,\n            TransportType.BT_LEGACY\n        )\n\n        if (parseResult.success) {\n            updateMap(parseResult.uav)\n        }\n    }\n\n    fun cleanup() {\n        parser.close()\n    }\n}\n```\n\n### C API\n\n```c\n#include \u003corip/orip_c.h\u003e\n\nint main() {\n    orip_parser_t* parser = orip_create();\n    orip_result_t result;\n\n    uint8_t payload[] = { /* BLE data */ };\n\n    orip_parse(parser, payload, sizeof(payload), -70,\n               ORIP_TRANSPORT_BT_LEGACY, \u0026result);\n\n    if (result.success) {\n        printf(\"Drone: %s\\n\", result.uav.id);\n        printf(\"Lat: %f, Lon: %f\\n\",\n               result.uav.location.latitude,\n               result.uav.location.longitude);\n    }\n\n    orip_destroy(parser);\n    return 0;\n}\n```\n\n## Advanced Features\n\n### Anomaly Detection\n\nDetect spoofing attempts and impossible flight patterns:\n\n```cpp\n#include \u003corip/anomaly_detector.h\u003e\n\norip::analysis::AnomalyDetector detector;\n\n// Analyze each UAV update\nauto anomalies = detector.analyze(uav, rssi);\n\nfor (const auto\u0026 anomaly : anomalies) {\n    switch (anomaly.type) {\n        case AnomalyType::REPLAY_ATTACK:\n            std::cerr \u003c\u003c \"Warning: Possible replay attack detected!\" \u003c\u003c std::endl;\n            break;\n        case AnomalyType::SPEED_IMPOSSIBLE:\n            std::cerr \u003c\u003c \"Warning: Impossible speed detected!\" \u003c\u003c std::endl;\n            break;\n        // ...\n    }\n}\n```\n\n### Trajectory Analysis\n\nTrack flight paths and predict future positions:\n\n```cpp\n#include \u003corip/trajectory_analyzer.h\u003e\n\norip::analysis::TrajectoryAnalyzer analyzer;\n\n// Add position updates\nanalyzer.addPosition(uav.id, uav.location);\n\n// Get flight pattern\nauto pattern = analyzer.classifyPattern(uav.id);\n// Returns: LINEAR, CIRCULAR, PATROL, STATIONARY, etc.\n\n// Predict position 5 seconds ahead\nauto prediction = analyzer.predictPosition(uav.id, 5000);\nstd::cout \u003c\u003c \"Predicted location: \" \u003c\u003c prediction.latitude\n          \u003c\u003c \", \" \u003c\u003c prediction.longitude \u003c\u003c std::endl;\n\n// Get trajectory statistics\nauto stats = analyzer.getStats(uav.id);\nstd::cout \u003c\u003c \"Total distance: \" \u003c\u003c stats.total_distance_m \u003c\u003c \" m\" \u003c\u003c std::endl;\nstd::cout \u003c\u003c \"Max speed: \" \u003c\u003c stats.max_speed_mps \u003c\u003c \" m/s\" \u003c\u003c std::endl;\n```\n\n## API Reference\n\n### Core Classes\n\n| Class | Description |\n| ------- | ------------- |\n| `RemoteIDParser` | Main parser class, handles all protocols |\n| `UAVObject` | Complete drone data (ID, location, operator info) |\n| `ParseResult` | Result of parsing operation |\n| `LocationVector` | Position, altitude, speed, heading |\n| `SystemInfo` | Operator location, area of operation |\n\n### Analysis Classes\n\n| Class | Description |\n| ------- | ------------- |\n| `AnomalyDetector` | Detects spoofing and impossible patterns |\n| `TrajectoryAnalyzer` | Tracks flight paths, predicts positions |\n\n### Protocol Decoders\n\n| Class | Description |\n| ------- | ------------- |\n| `ASTM_F3411_Decoder` | ASTM F3411-22a (USA/International) |\n| `ASD_STAN_Decoder` | ASD-STAN EN 4709-002 (EU) |\n| `WiFiDecoder` | WiFi Beacon and NAN frames |\n| `CN_RID_Decoder` | GB/T Chinese standard (placeholder) |\n\n## Building from Source\n\n### Requirements\n\n- CMake 3.16+\n- C++17 compatible compiler (GCC 8+, Clang 7+, MSVC 2019+)\n- (Optional) Android NDK for Android builds\n- (Optional) Python 3.8+ for Python bindings\n\n### Build Steps\n\n```bash\n# Clone the repository\ngit clone https://github.com/iannil/open-remote-id-parser.git\ncd open-remote-id-parser\n\n# Create build directory\nmkdir build \u0026\u0026 cd build\n\n# Configure\ncmake .. -DCMAKE_BUILD_TYPE=Release\n\n# Build\ncmake --build . --parallel\n\n# Run tests\nctest --output-on-failure\n\n# Install (optional)\nsudo cmake --install .\n```\n\n### Build Options\n\n| Option | Default | Description |\n| -------- | --------- | ------------- |\n| `ORIP_BUILD_TESTS` | ON | Build unit tests |\n| `ORIP_BUILD_EXAMPLES` | ON | Build example programs |\n| `ORIP_BUILD_SHARED` | OFF | Build shared library (.so/.dll) |\n\n### Android Build\n\n```bash\ncd android\n./gradlew :orip:assembleRelease\n```\n\nThe AAR will be generated at `android/orip/build/outputs/aar/`.\n\n### Python Build\n\n```bash\ncd python\npip install build\npython -m build\n```\n\n## Project Structure\n\n```\nopen-remote-id-parser/\n├── include/orip/           # Public C++ headers\n│   ├── orip.h              # Main include file\n│   ├── parser.h            # RemoteIDParser class\n│   ├── types.h             # Data structures\n│   ├── astm_f3411.h        # ASTM decoder\n│   ├── asd_stan.h          # ASD-STAN decoder\n│   ├── wifi_decoder.h      # WiFi decoder\n│   ├── anomaly_detector.h  # Anomaly detection\n│   ├── trajectory_analyzer.h # Trajectory analysis\n│   └── orip_c.h            # C API\n├── src/\n│   ├── core/               # Core implementation\n│   ├── protocols/          # Protocol decoders\n│   ├── analysis/           # Analysis modules\n│   └── utils/              # Utilities\n├── tests/                  # Unit tests\n├── examples/               # Example programs\n├── android/                # Android library\n│   └── orip/\n│       ├── src/main/java/  # Kotlin classes\n│       └── src/main/cpp/   # JNI wrapper\n├── python/                 # Python bindings\n│   ├── orip/               # Python package\n│   ├── tests/              # Python tests\n│   └── examples/           # Python examples\n└── docs/                   # Documentation\n```\n\n## Hardware Recommendations\n\n### Entry Level (Mobile Detection)\n\n- Any Android phone with Bluetooth 5.0+\n- Detection range: 300-800m (depending on conditions)\n\n### Professional (Fixed Station)\n\n- Raspberry Pi 4 + ESP32-C3 (BLE sniffer)\n- External high-gain antenna\n- Detection range: 2-5km\n\n### Enterprise\n\n- Software Defined Radio (SDR) setup\n- Multiple receivers for triangulation\n- Integration with existing security systems\n\n## Contributing\n\nContributions are welcome! Please read our contributing guidelines before submitting PRs.\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n### Development Setup\n\n```bash\n# Install development dependencies\npip install -e \"python/.[dev]\"\n\n# Run C++ tests\ncd build \u0026\u0026 ctest\n\n# Run Python tests\ncd python \u0026\u0026 pytest\n\n# Code formatting (if clang-format is installed)\nfind src include -name \"*.cpp\" -o -name \"*.h\" | xargs clang-format -i\n```\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Roadmap\n\n### Completed\n\n- [x] **Core Engine**: C++ parsing library with zero-copy design (~2,500 lines)\n- [x] **ASTM F3411**: Full support for all 7 message types (Basic ID, Location, Authentication, Self-ID, System, Operator ID, Message Pack)\n- [x] **ASD-STAN EN 4709-002**: European standard with EU Operator ID validation\n- [x] **GB/T Interface**: Placeholder for Chinese standard (awaiting specification)\n- [x] **Multi-Transport**: BT 4.x Legacy, BT 5.x Extended/Long Range, WiFi Beacon, WiFi NAN\n- [x] **C API**: Complete FFI interface with callback support\n- [x] **Android Bindings**: Kotlin/JNI wrapper with AAR packaging\n- [x] **Python Bindings**: ctypes-based with context manager support\n- [x] **Session Manager**: Deduplication, timeout handling, event callbacks\n- [x] **Anomaly Detection**: 8 detection types (speed, position, replay attack, signal, etc.)\n- [x] **Trajectory Analysis**: Smoothing, prediction, pattern classification\n- [x] **Unit Tests**: 70+ test cases covering all modules\n- [x] **Documentation**: README (EN/CN), CONTRIBUTING, CHANGELOG\n- [x] **Release Artifacts**: `/release/v0.1.0` with headers and platform-specific libs (Android, Linux, macOS, Windows, Python)\n- [x] **Android Sample App**: Complete demo with MainActivity, ViewModel, UAV list, and detail dialog\n- [x] **Performance Benchmarks**: Google Benchmark framework integration for parsing latency tests\n\n### In Progress\n\n- [ ] **CI/CD Enhancement**: GitHub Actions build verification and automated releases\n- [ ] **Real Device Testing**: Validation with captured packets from actual drones\n\n### Planned\n\n- [ ] **v0.1.0 Release**: Tag and publish first official release to GitHub\n- [ ] **API Documentation**: Auto-generated reference docs (Doxygen)\n- [ ] **iOS Bindings**: Swift wrapper via C API\n- [ ] **GB/T Implementation**: Chinese standard decoder (pending specification clarity)\n\n## Acknowledgments\n\n- [ASTM F3411](https://www.astm.org/f3411-22a.html) - Standard Specification for Remote ID\n- [ASD-STAN EN 4709-002](https://asd-stan.org/) - European Standard for Remote ID\n- [OpenDroneID](https://github.com/opendroneid) - Reference implementations\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiannil%2Fopen-remote-id-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiannil%2Fopen-remote-id-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiannil%2Fopen-remote-id-parser/lists"}