pub struct MessageBuilder { /* private fields */ }Expand description
Builder for constructing SOME/IP messages.
Implementations§
Source§impl MessageBuilder
impl MessageBuilder
Sourcepub fn new(
service_id: ServiceId,
method_id: MethodId,
message_type: MessageType,
) -> Self
pub fn new( service_id: ServiceId, method_id: MethodId, message_type: MessageType, ) -> Self
Create a new message builder.
Sourcepub fn client_id(self, client_id: ClientId) -> Self
pub fn client_id(self, client_id: ClientId) -> Self
Set the client ID.
Examples found in repository?
examples/message_basics.rs (line 19)
13fn main() {
14 println!("=== SOME/IP Message Basics ===\n");
15
16 // Example 1: Create a request message using the builder
17 println!("--- Example 1: Building Messages ---");
18 let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19 .client_id(ClientId(0x0100))
20 .session_id(SessionId(0x0001))
21 .interface_version(2)
22 .payload(b"Hello, World!".as_slice())
23 .build();
24
25 println!("Request message:");
26 print_message(&request);
27
28 // Example 2: Create a response from the request
29 println!("\n--- Example 2: Creating Responses ---");
30 let response = request
31 .create_response()
32 .payload(b"Response data".as_slice())
33 .build();
34
35 println!("Response message:");
36 print_message(&response);
37
38 // Example 3: Create an error response
39 println!("\n--- Example 3: Error Response ---");
40 let error = request
41 .create_error_response(ReturnCode::UnknownMethod)
42 .build();
43
44 println!("Error response:");
45 print_message(&error);
46
47 // Example 4: Serialize and deserialize
48 println!("\n--- Example 4: Serialization ---");
49 let bytes = request.to_bytes();
50 println!("Serialized to {} bytes", bytes.len());
51 println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52 println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54 let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55 println!("\nParsed message matches original: {}", parsed == request);
56
57 // Example 5: Working with headers directly
58 println!("\n--- Example 5: Header Details ---");
59 let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60 println!("Service ID: {}", header.service_id);
61 println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62 println!("Message ID: 0x{:08X}", header.message_id());
63 println!("Request ID: 0x{:08X}", header.request_id());
64
65 // Example 6: Different message types
66 println!("\n--- Example 6: Message Types ---");
67
68 let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69 .payload(b"Event data".as_slice())
70 .build();
71 println!("Notification: type={:?}, method_id={} (is_event: {})",
72 notification.header.message_type,
73 notification.header.method_id,
74 notification.header.method_id.is_event()
75 );
76
77 let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78 .payload(b"Fire and forget".as_slice())
79 .build();
80 println!("Fire-and-forget: type={:?}, expects_response: {}",
81 fire_and_forget.header.message_type,
82 fire_and_forget.expects_response()
83 );
84
85 // Example 7: Return codes
86 println!("\n--- Example 7: Return Codes ---");
87 for code in [
88 ReturnCode::Ok,
89 ReturnCode::NotOk,
90 ReturnCode::UnknownService,
91 ReturnCode::UnknownMethod,
92 ReturnCode::Timeout,
93 ] {
94 println!(" {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95 }
96
97 println!("\n=== Done! ===");
98}Sourcepub fn session_id(self, session_id: SessionId) -> Self
pub fn session_id(self, session_id: SessionId) -> Self
Set the session ID.
Examples found in repository?
examples/message_basics.rs (line 20)
13fn main() {
14 println!("=== SOME/IP Message Basics ===\n");
15
16 // Example 1: Create a request message using the builder
17 println!("--- Example 1: Building Messages ---");
18 let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19 .client_id(ClientId(0x0100))
20 .session_id(SessionId(0x0001))
21 .interface_version(2)
22 .payload(b"Hello, World!".as_slice())
23 .build();
24
25 println!("Request message:");
26 print_message(&request);
27
28 // Example 2: Create a response from the request
29 println!("\n--- Example 2: Creating Responses ---");
30 let response = request
31 .create_response()
32 .payload(b"Response data".as_slice())
33 .build();
34
35 println!("Response message:");
36 print_message(&response);
37
38 // Example 3: Create an error response
39 println!("\n--- Example 3: Error Response ---");
40 let error = request
41 .create_error_response(ReturnCode::UnknownMethod)
42 .build();
43
44 println!("Error response:");
45 print_message(&error);
46
47 // Example 4: Serialize and deserialize
48 println!("\n--- Example 4: Serialization ---");
49 let bytes = request.to_bytes();
50 println!("Serialized to {} bytes", bytes.len());
51 println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52 println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54 let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55 println!("\nParsed message matches original: {}", parsed == request);
56
57 // Example 5: Working with headers directly
58 println!("\n--- Example 5: Header Details ---");
59 let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60 println!("Service ID: {}", header.service_id);
61 println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62 println!("Message ID: 0x{:08X}", header.message_id());
63 println!("Request ID: 0x{:08X}", header.request_id());
64
65 // Example 6: Different message types
66 println!("\n--- Example 6: Message Types ---");
67
68 let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69 .payload(b"Event data".as_slice())
70 .build();
71 println!("Notification: type={:?}, method_id={} (is_event: {})",
72 notification.header.message_type,
73 notification.header.method_id,
74 notification.header.method_id.is_event()
75 );
76
77 let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78 .payload(b"Fire and forget".as_slice())
79 .build();
80 println!("Fire-and-forget: type={:?}, expects_response: {}",
81 fire_and_forget.header.message_type,
82 fire_and_forget.expects_response()
83 );
84
85 // Example 7: Return codes
86 println!("\n--- Example 7: Return Codes ---");
87 for code in [
88 ReturnCode::Ok,
89 ReturnCode::NotOk,
90 ReturnCode::UnknownService,
91 ReturnCode::UnknownMethod,
92 ReturnCode::Timeout,
93 ] {
94 println!(" {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95 }
96
97 println!("\n=== Done! ===");
98}Sourcepub fn interface_version(self, version: u8) -> Self
pub fn interface_version(self, version: u8) -> Self
Set the interface version.
Examples found in repository?
examples/message_basics.rs (line 21)
13fn main() {
14 println!("=== SOME/IP Message Basics ===\n");
15
16 // Example 1: Create a request message using the builder
17 println!("--- Example 1: Building Messages ---");
18 let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19 .client_id(ClientId(0x0100))
20 .session_id(SessionId(0x0001))
21 .interface_version(2)
22 .payload(b"Hello, World!".as_slice())
23 .build();
24
25 println!("Request message:");
26 print_message(&request);
27
28 // Example 2: Create a response from the request
29 println!("\n--- Example 2: Creating Responses ---");
30 let response = request
31 .create_response()
32 .payload(b"Response data".as_slice())
33 .build();
34
35 println!("Response message:");
36 print_message(&response);
37
38 // Example 3: Create an error response
39 println!("\n--- Example 3: Error Response ---");
40 let error = request
41 .create_error_response(ReturnCode::UnknownMethod)
42 .build();
43
44 println!("Error response:");
45 print_message(&error);
46
47 // Example 4: Serialize and deserialize
48 println!("\n--- Example 4: Serialization ---");
49 let bytes = request.to_bytes();
50 println!("Serialized to {} bytes", bytes.len());
51 println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52 println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54 let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55 println!("\nParsed message matches original: {}", parsed == request);
56
57 // Example 5: Working with headers directly
58 println!("\n--- Example 5: Header Details ---");
59 let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60 println!("Service ID: {}", header.service_id);
61 println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62 println!("Message ID: 0x{:08X}", header.message_id());
63 println!("Request ID: 0x{:08X}", header.request_id());
64
65 // Example 6: Different message types
66 println!("\n--- Example 6: Message Types ---");
67
68 let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69 .payload(b"Event data".as_slice())
70 .build();
71 println!("Notification: type={:?}, method_id={} (is_event: {})",
72 notification.header.message_type,
73 notification.header.method_id,
74 notification.header.method_id.is_event()
75 );
76
77 let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78 .payload(b"Fire and forget".as_slice())
79 .build();
80 println!("Fire-and-forget: type={:?}, expects_response: {}",
81 fire_and_forget.header.message_type,
82 fire_and_forget.expects_response()
83 );
84
85 // Example 7: Return codes
86 println!("\n--- Example 7: Return Codes ---");
87 for code in [
88 ReturnCode::Ok,
89 ReturnCode::NotOk,
90 ReturnCode::UnknownService,
91 ReturnCode::UnknownMethod,
92 ReturnCode::Timeout,
93 ] {
94 println!(" {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95 }
96
97 println!("\n=== Done! ===");
98}Sourcepub fn return_code(self, code: ReturnCode) -> Self
pub fn return_code(self, code: ReturnCode) -> Self
Set the return code.
Sourcepub fn payload(self, payload: impl Into<Bytes>) -> Self
pub fn payload(self, payload: impl Into<Bytes>) -> Self
Set the payload from bytes.
Examples found in repository?
examples/udp_client.rs (line 29)
17fn main() -> Result<(), Box<dyn std::error::Error>> {
18 println!("Creating SOME/IP UDP client...");
19
20 let mut client = UdpClient::new()?;
21 client.set_client_id(ClientId(0x0200));
22 client.set_read_timeout(Some(Duration::from_secs(5)))?;
23
24 println!("Client bound to {}", client.local_addr()?);
25
26 // Example 1: Request with call_to (specify address per-request)
27 println!("\n--- Example 1: Request/Response ---");
28 let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_REVERSE))
29 .payload(b"Hello UDP!".as_slice())
30 .build();
31
32 println!(
33 "Sending: {:?}",
34 String::from_utf8_lossy(&request.payload)
35 );
36
37 let response = client.call_to(SERVER_ADDR, request)?;
38 println!(
39 "Received: {:?} (reversed)",
40 String::from_utf8_lossy(&response.payload)
41 );
42
43 // Example 2: Connect and use call()
44 println!("\n--- Example 2: Connected Mode ---");
45 client.connect(SERVER_ADDR)?;
46 println!("Connected to {SERVER_ADDR}");
47
48 for word in ["Rust", "SOME/IP", "Automotive"] {
49 let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_REVERSE))
50 .payload(word.as_bytes().to_vec())
51 .build();
52
53 let response = client.call(request)?;
54 println!(
55 "{} -> {}",
56 word,
57 String::from_utf8_lossy(&response.payload)
58 );
59 }
60
61 // Example 3: Send notification (fire-and-forget)
62 println!("\n--- Example 3: Notification ---");
63 let notification = SomeIpMessage::notification(ServiceId(SERVICE_ID), MethodId(0x8001))
64 .payload(b"Event occurred!".as_slice())
65 .build();
66
67 client.send(notification)?;
68 println!("Notification sent!");
69
70 println!("\nDone!");
71 Ok(())
72}More examples
examples/tcp_client.rs (line 30)
18fn main() -> Result<(), Box<dyn std::error::Error>> {
19 println!("Connecting to SOME/IP server at {SERVER_ADDR}...");
20
21 let mut client = TcpClient::connect(SERVER_ADDR)?;
22 client.set_client_id(ClientId(0x0100));
23 client.set_read_timeout(Some(Duration::from_secs(5)))?;
24
25 println!("Connected!");
26
27 // Example 1: Simple echo request
28 println!("\n--- Example 1: Echo Request ---");
29 let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_ECHO))
30 .payload(b"Hello, SOME/IP!".as_slice())
31 .build();
32
33 println!(
34 "Sending request: service={}, method={}, payload={:?}",
35 request.header.service_id,
36 request.header.method_id,
37 String::from_utf8_lossy(&request.payload)
38 );
39
40 let response = client.call(request)?;
41 println!(
42 "Received response: return_code={:?}, payload={:?}",
43 response.header.return_code,
44 String::from_utf8_lossy(&response.payload)
45 );
46
47 // Example 2: Multiple requests
48 println!("\n--- Example 2: Multiple Requests ---");
49 for i in 1..=3 {
50 let payload = format!("Message #{i}");
51 let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_GREET))
52 .payload(payload.as_bytes().to_vec())
53 .build();
54
55 println!("Request {i}: session_id={}", request.header.session_id);
56 let response = client.call(request)?;
57 println!(
58 "Response {i}: session_id={}, payload={:?}",
59 response.header.session_id,
60 String::from_utf8_lossy(&response.payload)
61 );
62 }
63
64 // Example 3: Fire-and-forget (notification)
65 println!("\n--- Example 3: Fire-and-Forget ---");
66 let notification =
67 SomeIpMessage::request_no_return(ServiceId(SERVICE_ID), MethodId(METHOD_ECHO))
68 .payload(b"This is a notification".as_slice())
69 .build();
70
71 println!("Sending notification (no response expected)...");
72 client.send(notification)?;
73 println!("Notification sent!");
74
75 println!("\nDone!");
76 Ok(())
77}examples/tcp_server.rs (line 56)
16fn main() -> Result<(), Box<dyn std::error::Error>> {
17 println!("Starting SOME/IP TCP server on {BIND_ADDR}...");
18
19 let server = TcpServer::bind(BIND_ADDR)?;
20 println!("Server listening on {}", server.local_addr());
21
22 for connection in server.incoming() {
23 match connection {
24 Ok(mut conn) => {
25 let peer = conn.peer_addr();
26 println!("New connection from {peer}");
27
28 // Handle each connection in a separate thread
29 thread::spawn(move || {
30 loop {
31 match conn.read_message() {
32 Ok(request) => {
33 println!(
34 "Received: service={}, method={}, type={:?}, payload={} bytes",
35 request.header.service_id,
36 request.header.method_id,
37 request.header.message_type,
38 request.payload.len()
39 );
40
41 // Check if it's our service
42 if request.header.service_id != ServiceId(SERVICE_ID) {
43 println!("Unknown service, sending error response");
44 let error = request
45 .create_error_response(ReturnCode::UnknownService)
46 .build();
47 let _ = conn.write_message(&error);
48 continue;
49 }
50
51 // Only respond to requests (not notifications)
52 if request.header.message_type == MessageType::Request {
53 // Echo back the payload
54 let response = request
55 .create_response()
56 .payload(request.payload.clone())
57 .build();
58
59 if let Err(e) = conn.write_message(&response) {
60 eprintln!("Failed to send response: {e}");
61 break;
62 }
63 println!("Sent response");
64 }
65 }
66 Err(e) => {
67 eprintln!("Connection error: {e}");
68 break;
69 }
70 }
71 }
72 println!("Connection closed: {peer}");
73 });
74 }
75 Err(e) => {
76 eprintln!("Accept error: {e}");
77 }
78 }
79 }
80
81 Ok(())
82}examples/message_basics.rs (line 22)
13fn main() {
14 println!("=== SOME/IP Message Basics ===\n");
15
16 // Example 1: Create a request message using the builder
17 println!("--- Example 1: Building Messages ---");
18 let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19 .client_id(ClientId(0x0100))
20 .session_id(SessionId(0x0001))
21 .interface_version(2)
22 .payload(b"Hello, World!".as_slice())
23 .build();
24
25 println!("Request message:");
26 print_message(&request);
27
28 // Example 2: Create a response from the request
29 println!("\n--- Example 2: Creating Responses ---");
30 let response = request
31 .create_response()
32 .payload(b"Response data".as_slice())
33 .build();
34
35 println!("Response message:");
36 print_message(&response);
37
38 // Example 3: Create an error response
39 println!("\n--- Example 3: Error Response ---");
40 let error = request
41 .create_error_response(ReturnCode::UnknownMethod)
42 .build();
43
44 println!("Error response:");
45 print_message(&error);
46
47 // Example 4: Serialize and deserialize
48 println!("\n--- Example 4: Serialization ---");
49 let bytes = request.to_bytes();
50 println!("Serialized to {} bytes", bytes.len());
51 println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52 println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54 let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55 println!("\nParsed message matches original: {}", parsed == request);
56
57 // Example 5: Working with headers directly
58 println!("\n--- Example 5: Header Details ---");
59 let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60 println!("Service ID: {}", header.service_id);
61 println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62 println!("Message ID: 0x{:08X}", header.message_id());
63 println!("Request ID: 0x{:08X}", header.request_id());
64
65 // Example 6: Different message types
66 println!("\n--- Example 6: Message Types ---");
67
68 let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69 .payload(b"Event data".as_slice())
70 .build();
71 println!("Notification: type={:?}, method_id={} (is_event: {})",
72 notification.header.message_type,
73 notification.header.method_id,
74 notification.header.method_id.is_event()
75 );
76
77 let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78 .payload(b"Fire and forget".as_slice())
79 .build();
80 println!("Fire-and-forget: type={:?}, expects_response: {}",
81 fire_and_forget.header.message_type,
82 fire_and_forget.expects_response()
83 );
84
85 // Example 7: Return codes
86 println!("\n--- Example 7: Return Codes ---");
87 for code in [
88 ReturnCode::Ok,
89 ReturnCode::NotOk,
90 ReturnCode::UnknownService,
91 ReturnCode::UnknownMethod,
92 ReturnCode::Timeout,
93 ] {
94 println!(" {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95 }
96
97 println!("\n=== Done! ===");
98}Sourcepub fn payload_vec(self, payload: Vec<u8>) -> Self
pub fn payload_vec(self, payload: Vec<u8>) -> Self
Set the payload from a Vec
Sourcepub fn build(self) -> SomeIpMessage
pub fn build(self) -> SomeIpMessage
Build the message.
Examples found in repository?
examples/udp_client.rs (line 30)
17fn main() -> Result<(), Box<dyn std::error::Error>> {
18 println!("Creating SOME/IP UDP client...");
19
20 let mut client = UdpClient::new()?;
21 client.set_client_id(ClientId(0x0200));
22 client.set_read_timeout(Some(Duration::from_secs(5)))?;
23
24 println!("Client bound to {}", client.local_addr()?);
25
26 // Example 1: Request with call_to (specify address per-request)
27 println!("\n--- Example 1: Request/Response ---");
28 let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_REVERSE))
29 .payload(b"Hello UDP!".as_slice())
30 .build();
31
32 println!(
33 "Sending: {:?}",
34 String::from_utf8_lossy(&request.payload)
35 );
36
37 let response = client.call_to(SERVER_ADDR, request)?;
38 println!(
39 "Received: {:?} (reversed)",
40 String::from_utf8_lossy(&response.payload)
41 );
42
43 // Example 2: Connect and use call()
44 println!("\n--- Example 2: Connected Mode ---");
45 client.connect(SERVER_ADDR)?;
46 println!("Connected to {SERVER_ADDR}");
47
48 for word in ["Rust", "SOME/IP", "Automotive"] {
49 let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_REVERSE))
50 .payload(word.as_bytes().to_vec())
51 .build();
52
53 let response = client.call(request)?;
54 println!(
55 "{} -> {}",
56 word,
57 String::from_utf8_lossy(&response.payload)
58 );
59 }
60
61 // Example 3: Send notification (fire-and-forget)
62 println!("\n--- Example 3: Notification ---");
63 let notification = SomeIpMessage::notification(ServiceId(SERVICE_ID), MethodId(0x8001))
64 .payload(b"Event occurred!".as_slice())
65 .build();
66
67 client.send(notification)?;
68 println!("Notification sent!");
69
70 println!("\nDone!");
71 Ok(())
72}More examples
examples/tcp_client.rs (line 31)
18fn main() -> Result<(), Box<dyn std::error::Error>> {
19 println!("Connecting to SOME/IP server at {SERVER_ADDR}...");
20
21 let mut client = TcpClient::connect(SERVER_ADDR)?;
22 client.set_client_id(ClientId(0x0100));
23 client.set_read_timeout(Some(Duration::from_secs(5)))?;
24
25 println!("Connected!");
26
27 // Example 1: Simple echo request
28 println!("\n--- Example 1: Echo Request ---");
29 let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_ECHO))
30 .payload(b"Hello, SOME/IP!".as_slice())
31 .build();
32
33 println!(
34 "Sending request: service={}, method={}, payload={:?}",
35 request.header.service_id,
36 request.header.method_id,
37 String::from_utf8_lossy(&request.payload)
38 );
39
40 let response = client.call(request)?;
41 println!(
42 "Received response: return_code={:?}, payload={:?}",
43 response.header.return_code,
44 String::from_utf8_lossy(&response.payload)
45 );
46
47 // Example 2: Multiple requests
48 println!("\n--- Example 2: Multiple Requests ---");
49 for i in 1..=3 {
50 let payload = format!("Message #{i}");
51 let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_GREET))
52 .payload(payload.as_bytes().to_vec())
53 .build();
54
55 println!("Request {i}: session_id={}", request.header.session_id);
56 let response = client.call(request)?;
57 println!(
58 "Response {i}: session_id={}, payload={:?}",
59 response.header.session_id,
60 String::from_utf8_lossy(&response.payload)
61 );
62 }
63
64 // Example 3: Fire-and-forget (notification)
65 println!("\n--- Example 3: Fire-and-Forget ---");
66 let notification =
67 SomeIpMessage::request_no_return(ServiceId(SERVICE_ID), MethodId(METHOD_ECHO))
68 .payload(b"This is a notification".as_slice())
69 .build();
70
71 println!("Sending notification (no response expected)...");
72 client.send(notification)?;
73 println!("Notification sent!");
74
75 println!("\nDone!");
76 Ok(())
77}examples/tcp_server.rs (line 46)
16fn main() -> Result<(), Box<dyn std::error::Error>> {
17 println!("Starting SOME/IP TCP server on {BIND_ADDR}...");
18
19 let server = TcpServer::bind(BIND_ADDR)?;
20 println!("Server listening on {}", server.local_addr());
21
22 for connection in server.incoming() {
23 match connection {
24 Ok(mut conn) => {
25 let peer = conn.peer_addr();
26 println!("New connection from {peer}");
27
28 // Handle each connection in a separate thread
29 thread::spawn(move || {
30 loop {
31 match conn.read_message() {
32 Ok(request) => {
33 println!(
34 "Received: service={}, method={}, type={:?}, payload={} bytes",
35 request.header.service_id,
36 request.header.method_id,
37 request.header.message_type,
38 request.payload.len()
39 );
40
41 // Check if it's our service
42 if request.header.service_id != ServiceId(SERVICE_ID) {
43 println!("Unknown service, sending error response");
44 let error = request
45 .create_error_response(ReturnCode::UnknownService)
46 .build();
47 let _ = conn.write_message(&error);
48 continue;
49 }
50
51 // Only respond to requests (not notifications)
52 if request.header.message_type == MessageType::Request {
53 // Echo back the payload
54 let response = request
55 .create_response()
56 .payload(request.payload.clone())
57 .build();
58
59 if let Err(e) = conn.write_message(&response) {
60 eprintln!("Failed to send response: {e}");
61 break;
62 }
63 println!("Sent response");
64 }
65 }
66 Err(e) => {
67 eprintln!("Connection error: {e}");
68 break;
69 }
70 }
71 }
72 println!("Connection closed: {peer}");
73 });
74 }
75 Err(e) => {
76 eprintln!("Accept error: {e}");
77 }
78 }
79 }
80
81 Ok(())
82}examples/message_basics.rs (line 23)
13fn main() {
14 println!("=== SOME/IP Message Basics ===\n");
15
16 // Example 1: Create a request message using the builder
17 println!("--- Example 1: Building Messages ---");
18 let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19 .client_id(ClientId(0x0100))
20 .session_id(SessionId(0x0001))
21 .interface_version(2)
22 .payload(b"Hello, World!".as_slice())
23 .build();
24
25 println!("Request message:");
26 print_message(&request);
27
28 // Example 2: Create a response from the request
29 println!("\n--- Example 2: Creating Responses ---");
30 let response = request
31 .create_response()
32 .payload(b"Response data".as_slice())
33 .build();
34
35 println!("Response message:");
36 print_message(&response);
37
38 // Example 3: Create an error response
39 println!("\n--- Example 3: Error Response ---");
40 let error = request
41 .create_error_response(ReturnCode::UnknownMethod)
42 .build();
43
44 println!("Error response:");
45 print_message(&error);
46
47 // Example 4: Serialize and deserialize
48 println!("\n--- Example 4: Serialization ---");
49 let bytes = request.to_bytes();
50 println!("Serialized to {} bytes", bytes.len());
51 println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52 println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54 let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55 println!("\nParsed message matches original: {}", parsed == request);
56
57 // Example 5: Working with headers directly
58 println!("\n--- Example 5: Header Details ---");
59 let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60 println!("Service ID: {}", header.service_id);
61 println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62 println!("Message ID: 0x{:08X}", header.message_id());
63 println!("Request ID: 0x{:08X}", header.request_id());
64
65 // Example 6: Different message types
66 println!("\n--- Example 6: Message Types ---");
67
68 let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69 .payload(b"Event data".as_slice())
70 .build();
71 println!("Notification: type={:?}, method_id={} (is_event: {})",
72 notification.header.message_type,
73 notification.header.method_id,
74 notification.header.method_id.is_event()
75 );
76
77 let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78 .payload(b"Fire and forget".as_slice())
79 .build();
80 println!("Fire-and-forget: type={:?}, expects_response: {}",
81 fire_and_forget.header.message_type,
82 fire_and_forget.expects_response()
83 );
84
85 // Example 7: Return codes
86 println!("\n--- Example 7: Return Codes ---");
87 for code in [
88 ReturnCode::Ok,
89 ReturnCode::NotOk,
90 ReturnCode::UnknownService,
91 ReturnCode::UnknownMethod,
92 ReturnCode::Timeout,
93 ] {
94 println!(" {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95 }
96
97 println!("\n=== Done! ===");
98}Trait Implementations§
Source§impl Clone for MessageBuilder
impl Clone for MessageBuilder
Source§fn clone(&self) -> MessageBuilder
fn clone(&self) -> MessageBuilder
Returns a duplicate of the value. Read more
1.0.0§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreAuto Trait Implementations§
impl !Freeze for MessageBuilder
impl RefUnwindSafe for MessageBuilder
impl Send for MessageBuilder
impl Sync for MessageBuilder
impl Unpin for MessageBuilder
impl UnwindSafe for MessageBuilder
Blanket Implementations§
§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§unsafe fn clone_to_uninit(&self, dest: *mut u8)
unsafe fn clone_to_uninit(&self, dest: *mut u8)
🔬This is a nightly-only experimental API. (
clone_to_uninit)