Skip to main content

deliver_sm/
deliver_sm.rs

1use smpp_codec::pdus::{DeliverSmRequest, EncodingType, MessageSplitter, SplitMode};
2
3fn main() {
4    println!("=== SMPP Deliver SM Example (Incoming Message) ===");
5
6    // Simulate a long incoming message content
7    let text = "This is a simulated long incoming message that behaves exactly like SubmitSM. The MessageSplitter is used to chunk it, and the DeliverSmRequest struct is used to represent each chunk sent to the ESME.".to_string();
8
9    println!("Incoming Text Length: {}", text.len());
10
11    // 1. Split message
12    let (parts, data_coding) =
13        MessageSplitter::split(text, EncodingType::Gsm7Bit, SplitMode::Udh).unwrap();
14
15    println!("Split into {} parts.", parts.len());
16    let parts_len = parts.len();
17
18    // 2. Create DeliverSm PDUs for each part
19    for (i, part) in parts.into_iter().enumerate() {
20        let sequence_number = (i + 100) as u32;
21        let mut deliver_req = DeliverSmRequest::new(
22            sequence_number,
23            "sender_number".to_string(),
24            "my_shortcode".to_string(),
25            part,
26        );
27        deliver_req.data_coding = data_coding;
28
29        // CRITICAL: Set UDHI bit (0x40) in esm_class if UDH is present (parts > 1)
30        if parts_len > 1 {
31            deliver_req.esm_class |= 0x40;
32        }
33
34        let mut buffer = Vec::new();
35        deliver_req.encode(&mut buffer).unwrap();
36
37        println!(
38            "Part {}: Sequence {}, Encoded {} bytes. UDHI bit set: {}",
39            i + 1,
40            sequence_number,
41            buffer.len(),
42            (deliver_req.esm_class & 0x40) != 0
43        );
44    }
45}