{"id":45343342,"url":"https://github.com/rusmpp/rusmpp","last_synced_at":"2026-02-21T11:00:57.669Z","repository":{"id":214110012,"uuid":"734741379","full_name":"Rusmpp/Rusmpp","owner":"Rusmpp","description":"Rust implementation of the SMPP v5 protocol","archived":false,"fork":false,"pushed_at":"2026-02-08T11:30:21.000Z","size":3352,"stargazers_count":11,"open_issues_count":17,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-08T17:59:50.076Z","etag":null,"topics":["rust","smpp"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/rusmpp","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Rusmpp.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","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":"2023-12-22T13:41:14.000Z","updated_at":"2026-01-15T00:50:22.000Z","dependencies_parsed_at":"2024-02-16T15:30:30.839Z","dependency_job_id":"72af439c-7321-4338-9c90-68ca03d63e2d","html_url":"https://github.com/Rusmpp/Rusmpp","commit_stats":null,"previous_names":["jadkhaddad/rusmpp","rusmpp/rusmpp"],"tags_count":49,"template":false,"template_full_name":null,"purl":"pkg:github/Rusmpp/Rusmpp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rusmpp%2FRusmpp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rusmpp%2FRusmpp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rusmpp%2FRusmpp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rusmpp%2FRusmpp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Rusmpp","download_url":"https://codeload.github.com/Rusmpp/Rusmpp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rusmpp%2FRusmpp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29679049,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T09:33:50.764Z","status":"ssl_error","status_checked_at":"2026-02-21T09:33:19.949Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["rust","smpp"],"created_at":"2026-02-21T11:00:56.911Z","updated_at":"2026-02-21T11:00:57.658Z","avatar_url":"https://github.com/Rusmpp.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Rusmpp\n\n![Build Status](https://github.com/Rusmpp/Rusmpp/actions/workflows/build-and-test.yml/badge.svg)\n[![crates.io](https://img.shields.io/crates/v/rusmpp.svg)](https://crates.io/crates/rusmpp)\n[![Crates.io (MSRV)](https://img.shields.io/crates/msrv/rusmpp)](https://crates.io/crates/rusmpp)\n[![docs.rs](https://docs.rs/rusmpp/badge.svg)](https://docs.rs/rusmpp)\n[![Crates.io (Downloads)](https://img.shields.io/crates/d/rusmpp)](https://crates.io/crates/rusmpp)\n[![Crates.io (License)](https://img.shields.io/crates/l/rusmpp)](https://crates.io/crates/rusmpp)\n\nRust implementation of the [SMPP v5](https://smpp.org/SMPP_v5.pdf) protocol.\n\nThis is a low level library for implementing clients and servers. If you are looking for a client, check out [rusmppc](https://crates.io/crates/rusmppc).\n\n```rust\nuse core::error::Error;\nuse futures::{SinkExt, StreamExt};\nuse rusmpp::{\n    tokio_codec::{EncodeError, CommandCodec},\n    Command, CommandId, CommandStatus, Pdu,\n};\nuse tokio::io::DuplexStream;\nuse tokio_util::codec::Framed;\nuse tracing::info;\n\n#[tokio::main]\nasync fn main() -\u003e Result\u003c(), Box\u003cdyn Error\u003e\u003e {\n    // Rusmpp produces a lot of logs while decoding and encoding PDUs.\n    // You can filter them out by setting the `rusmpp` target to `off`,\n    // or by disabling the `tracing` feature.\n    tracing_subscriber::fmt()\n        .with_env_filter(\"client=info,server=info,rusmpp=trace\")\n        .init();\n\n    // In-memory duplex stream to simulate a server and client.\n    let (server_stream, client_stream) = tokio::io::duplex(4096);\n\n    launch_server(server_stream).await?;\n\n    // The CommandCodec encodes/decodes SMPP commands into/from bytes.\n    let mut framed = Framed::new(client_stream, CommandCodec::new());\n\n    // Rusmpp takes care of setting the correct command ID.\n    let command = Command::new(CommandStatus::EsmeRok, 1, Pdu::EnquireLink);\n\n    info!(target: \"client\", \"EnquireLink sent\");\n\n    framed.send(command).await?;\n\n    while let Some(Ok(command)) = framed.next().await {\n        if let CommandId::EnquireLinkResp = command.id() {\n            info!(target: \"client\", \"EnquireLink response received\");\n\n            break;\n        }\n    }\n\n    Ok(())\n}\n\nasync fn launch_server(stream: DuplexStream) -\u003e Result\u003c(), Box\u003cdyn Error\u003e\u003e {\n    tokio::spawn(async move {\n        let mut framed = Framed::new(stream, CommandCodec::new());\n\n        while let Some(Ok(command)) = framed.next().await {\n            if let CommandId::EnquireLink = command.id() {\n                info!(target: \"server\", \"EnquireLink received\");\n\n                // We can also use the Command::builder() to create commands.\n                let response = Command::builder()\n                    .status(CommandStatus::EsmeRok)\n                    .sequence_number(command.sequence_number())\n                    .pdu(Pdu::EnquireLinkResp);\n\n                framed.send(response).await?;\n\n                info!(target: \"server\", \"EnquireLink response sent\");\n\n                break;\n            }\n        }\n\n        Ok::\u003c(), EncodeError\u003e(())\n    });\n\n    Ok(())\n}\n```\n\nSee the [examples](https://github.com/Rusmpp/Rusmpp/tree/main/rusmpp/examples) directory for more examples.\n\n## Features\n\n- `tokio-codec`: Implements [`Encoder`](https://docs.rs/tokio-util/latest/tokio_util/codec/trait.Encoder.html) and [`Decoder`](https://docs.rs/tokio-util/latest/tokio_util/codec/trait.Decoder.html) traits.\n- `verbose`: Enables verbose error reports.\n- `extra`: Enables encoding/decoding and concatenation support for `SubmitSm`.\n- `serde`: Implements [`Serialize`](https://docs.rs/serde/latest/serde/trait.Serialize.html) trait for all SMPP types.\n- `serde-deserialize-unchecked`: Implements [`Deserialize`](https://docs.rs/serde/latest/serde/trait.Deserialize.html) trait for all SMPP types, but does not check the validity of the data. Use with caution.\n- `tracing`: Enables logging using [`tracing`](https://docs.rs/tracing/latest/tracing/).\n- `pretty-hex-fmt`: Logs byte slices like `[0x00, 0x00, 0x00, 0x6F]` instead of `[00, 00, 00, 6F]`, if `tracing` feature is enabled.\n- `char-fmt`: Logs byte slices as characters, if `tracing` feature is enabled.\n\n## License\n\nLicensed under either of\n\n- Apache License, Version 2.0. [LICENSE-APACHE](LICENSE-APACHE) or [Apache-2.0 license](http://apache.org/licenses/LICENSE-2.0)\n- MIT license. [LICENSE-MIT](LICENSE-MIT) or [MIT license](http://opensource.org/licenses/MIT)\n\n### Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally submitted\nfor inclusion in the work by you, as defined in the Apache-2.0 license, shall\nbe dual licensed as above, without any additional terms or conditions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frusmpp%2Frusmpp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frusmpp%2Frusmpp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frusmpp%2Frusmpp/lists"}