Skip to main content

Crate cmppprotocol

Crate cmppprotocol 

Source
Expand description

§cmppprotocol

CMPP 2.0 client protocol library,用于将 SP 连接到 CMPP ISMG。

功能特性:

  • Typed Pdu model,支持二进制 encode/decode(pdu),并提供 tokio_util CmppFrameCodec,用于简洁地对 TCP streams 进行 framing。
  • Async CmppConnection,包含 non-blocking CmppConnection::submit (仅在 sliding-window backpressure 时等待)和用于接收所有 response 的 Event stream; 它会执行登录 handshake(含 authenticator 校验)、timeout 后重传、发送 ACTIVE_TEST heartbeat, 并使用 TERMINATE 优雅拆除 link。
  • Charset encoding 和 long-SMS UDH splitting(encoding)。
  • 通过 SubmitOptions 便捷构造 message。

§快速开始

use cmppprotocol::{CmppConnection, CmppConfig, CmppProtocolParams, Event, SubmitOptions};

let config = CmppConfig {
    host: "127.0.0.1".into(),
    port: 7890,
    account: "901234".into(),
    password: "secret".into(),
    version: cmppprotocol::CMPP_VERSION_20,
    protocol_params: CmppProtocolParams::default(),
};

let conn = CmppConnection::connect(config).await?;

// 消费所有 async events(responses、reports、disconnect)。
let mut events = conn.take_events().await.expect("events 首次可用");
tokio::spawn(async move {
    while let Some(event) = events.recv().await {
        match event {
            Event::SubmitResp { sequence_id, msg_id, result } => {
                println!("响应 seq={} msg_id={} result={}", sequence_id, Event::msg_id_hex(&msg_id), result);
            }
            Event::Deliver(deliver) => {
                if let Some(report) = deliver.report() {
                    println!("报告 {} -> {}", report.msg_id_hex(), report.stat);
                }
            }
            Event::SubmitTimeout { sequence_id } => println!("超时 seq={}", sequence_id),
            Event::Disconnected(e) => { println!("连接已断开: {}", e); break; }
        }
    }
});

// submit() 是 non-blocking:它返回各 segment 的 sequence id。
let opts = SubmitOptions::new("SVC", "901234", "10690001", "13800138000");
let seq_ids = conn.submit(&opts, "Hello World", None).await?;
println!("已提交 {} 个分片: {:?}", seq_ids.len(), seq_ids);

conn.close().await;

Re-exports§

pub use encoding::decode_msg_content;
pub use pdu::Connect;
pub use pdu::ConnectResp;
pub use pdu::Deliver;
pub use pdu::DeliverReport;
pub use pdu::DeliverResp;
pub use pdu::Frame;
pub use pdu::Pdu;
pub use pdu::Submit;
pub use pdu::SubmitResp;
pub use pdu::compute_authenticator_ismg;
pub use pdu::compute_authenticator_source;
pub use submit::SubmitOptions;

Modules§

encoding
Character set encoding 和 long SMS(UDH)拆分。
pdu
支持二进制 encode/decode 的 typed CMPP 2.0 PDUs。
submit
便于使用的 Submit PDU 构造。

Structs§

CmppConfig
CMPP connection 配置。
CmppConnection
Async CMPP 2.0 client connection。clone 成本低(通过 Arc 共享 state)。
CmppFrameCodec
CMPP frame codec:处理半包/不完整读取和 length-prefixed framing, 并将每个完整 frame decode 为 Frame(sequence id + Pdu)。
CmppHeader
固定的 12-byte CMPP message header。
CmppProtocolParams
CMPP protocol 参数配置。

Enums§

Error
进行 CMPP 2.0 通信时可能出现的错误。
Event
CmppConnection 产生的 async event。

Constants§

CMPP_ACTIVE_TEST
CMPP_ACTIVE_TEST command id。
CMPP_ACTIVE_TEST_RESP
CMPP_ACTIVE_TEST_RESP command id。
CMPP_CONNECT
CMPP_CONNECT command id。
CMPP_CONNECT_RESP
CMPP_CONNECT_RESP command id。
CMPP_DELIVER
CMPP_DELIVER command id。
CMPP_DELIVER_RESP
CMPP_DELIVER_RESP command id。
CMPP_HEADER_LENGTH
固定 CMPP message header 的长度,单位为 bytes(Total_Length + Command_Id + Sequence_Id)。
CMPP_SUBMIT
CMPP_SUBMIT command id。
CMPP_SUBMIT_RESP
CMPP_SUBMIT_RESP command id。
CMPP_TERMINATE
CMPP_TERMINATE command id。
CMPP_TERMINATE_RESP
CMPP_TERMINATE_RESP command id。
CMPP_VERSION_20
CMPP 2.0 protocol version byte。

Type Aliases§

Result
这个 crate 通用的 result type。