modbus_iiot/tcp/
streamtelegram.rs

1
2
3use std::io::{Write, Read};
4use std::net::TcpStream;
5use core::modbustelegram::ModbusTelegram;
6
7//	===============================================================================================
8
9fn read_telegram_from_stream ( stream : &mut TcpStream, expected_bytes : u8 ) -> Result< ModbusTelegram, String >
10{
11	let mut reply : Result< ModbusTelegram, String > = Err( "Tcp Read Failed".to_string () );
12
13	let mut data : Vec< u8 > = vec![ 0; expected_bytes as usize ];
14	let response = stream.read ( &mut data );
15
16	if response.is_ok ()
17	{
18        if let Some( telegram ) = ModbusTelegram::new_from_bytes ( &data )
19        {
20            reply = Ok( telegram );
21        }
22	}
23
24	return reply;
25}
26
27//	===============================================================================================
28
29fn write_telegram_to_stream ( stream : &mut TcpStream, telegram : &ModbusTelegram ) -> Result< bool, String >
30{
31	let mut reply : Result< bool, String > = Err( "Tcp Write Failed".to_string () );
32
33	if let Some( bytes ) = telegram.get_bytes ()
34	{
35		let response = stream.write_all ( &bytes );
36		
37		if response.is_ok ()
38		{
39			reply = Ok( true );
40		}
41	}
42
43	return reply;
44}
45
46//	===============================================================================================
47
48pub fn process_modbus_telegram ( stream : &mut TcpStream, telegram : &Option< ModbusTelegram > ) -> Option< ModbusTelegram >
49{
50	let mut reply : Option< ModbusTelegram > = None;
51
52	if telegram.is_some ()
53	{
54		let write_telegram : &ModbusTelegram = telegram.as_ref ().unwrap ();
55		let write_response : Result< bool, String > = write_telegram_to_stream ( stream, 
56																				  write_telegram );
57		if write_response.is_ok ()
58		{
59			let expected_bytes : Option< u8 > = write_telegram.get_expected_byte_count ();
60			let read_response : Result< ModbusTelegram, String > = read_telegram_from_stream ( stream, 
61																							   expected_bytes.unwrap () );
62			if read_response.is_ok ()
63			{
64				reply = Some( read_response.unwrap ( ) );
65			}
66		}
67	}
68	
69	return reply;
70}