make it work
This commit is contained in:
		
							parent
							
								
									e927202fc0
								
							
						
					
					
						commit
						feab5967b2
					
				
					 5 changed files with 57 additions and 20 deletions
				
			
		
							
								
								
									
										35
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										35
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							| 
						 | 
					@ -360,6 +360,7 @@ dependencies = [
 | 
				
			||||||
 "rumqttc",
 | 
					 "rumqttc",
 | 
				
			||||||
 "serde",
 | 
					 "serde",
 | 
				
			||||||
 "serde_json",
 | 
					 "serde_json",
 | 
				
			||||||
 | 
					 "socket2 0.4.10",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
| 
						 | 
					@ -559,6 +560,16 @@ version = "0.4.10"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d"
 | 
					checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "socket2"
 | 
				
			||||||
 | 
					version = "0.4.10"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "libc",
 | 
				
			||||||
 | 
					 "winapi",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "socket2"
 | 
					name = "socket2"
 | 
				
			||||||
version = "0.5.10"
 | 
					version = "0.5.10"
 | 
				
			||||||
| 
						 | 
					@ -628,7 +639,7 @@ dependencies = [
 | 
				
			||||||
 "mio",
 | 
					 "mio",
 | 
				
			||||||
 "pin-project-lite",
 | 
					 "pin-project-lite",
 | 
				
			||||||
 "slab",
 | 
					 "slab",
 | 
				
			||||||
 "socket2",
 | 
					 "socket2 0.5.10",
 | 
				
			||||||
 "tokio-macros",
 | 
					 "tokio-macros",
 | 
				
			||||||
 "windows-sys 0.52.0",
 | 
					 "windows-sys 0.52.0",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
| 
						 | 
					@ -678,6 +689,28 @@ version = "0.11.1+wasi-snapshot-preview1"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
 | 
					checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "winapi"
 | 
				
			||||||
 | 
					version = "0.3.9"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "winapi-i686-pc-windows-gnu",
 | 
				
			||||||
 | 
					 "winapi-x86_64-pc-windows-gnu",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "winapi-i686-pc-windows-gnu"
 | 
				
			||||||
 | 
					version = "0.4.0"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "winapi-x86_64-pc-windows-gnu"
 | 
				
			||||||
 | 
					version = "0.4.0"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "windows-sys"
 | 
					name = "windows-sys"
 | 
				
			||||||
version = "0.52.0"
 | 
					version = "0.52.0"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,3 +8,4 @@ rumqttc = "0.23"
 | 
				
			||||||
serde = { version = "1.0", features = ["derive"] }
 | 
					serde = { version = "1.0", features = ["derive"] }
 | 
				
			||||||
serde_json = "1.0"
 | 
					serde_json = "1.0"
 | 
				
			||||||
clap = { version = "4.4", features = ["derive"] }
 | 
					clap = { version = "4.4", features = ["derive"] }
 | 
				
			||||||
 | 
					socket2 = "0.4.7"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										12
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					# Position client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Example client to get Positon data from the bornhack pixelflut touch screen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					./run.sh network_interface_name
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The positon data is a UDP packet of 4 bytes containing 2 usigned 16bit ints for x and y on multicast group 239.1.1.1 port 1234
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										3
									
								
								run.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								run.sh
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					sudo ip addr add 239.1.1.1/32 dev $1 autojoin
 | 
				
			||||||
 | 
					cargo run
 | 
				
			||||||
							
								
								
									
										26
									
								
								src/main.rs
									
										
									
									
									
								
							
							
						
						
									
										26
									
								
								src/main.rs
									
										
									
									
									
								
							| 
						 | 
					@ -2,6 +2,8 @@ use std::net::UdpSocket;
 | 
				
			||||||
use std::env;
 | 
					use std::env;
 | 
				
			||||||
use std::process;
 | 
					use std::process;
 | 
				
			||||||
use std::convert::TryInto;
 | 
					use std::convert::TryInto;
 | 
				
			||||||
 | 
					use socket2::{Domain, Socket, Type};
 | 
				
			||||||
 | 
					use std::net::{Ipv4Addr, SocketAddr};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Unpacks a 4-byte slice into two u16 values (little-endian).
 | 
					/// Unpacks a 4-byte slice into two u16 values (little-endian).
 | 
				
			||||||
fn unpack_coordinates(buffer: &[u8]) -> Option<(u16, u16)> {
 | 
					fn unpack_coordinates(buffer: &[u8]) -> Option<(u16, u16)> {
 | 
				
			||||||
| 
						 | 
					@ -21,28 +23,14 @@ fn unpack_coordinates(buffer: &[u8]) -> Option<(u16, u16)> {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn main() {
 | 
					fn main() {
 | 
				
			||||||
    let args: Vec<String> = env::args().collect();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if args.len() != 3 {
 | 
					    let socket = Socket::new(Domain::IPV4, Type::DGRAM, None).unwrap();
 | 
				
			||||||
        eprintln!("Usage: {} <listen_ip> <listen_port>", args[0]);
 | 
					    socket.set_reuse_address(true).unwrap();
 | 
				
			||||||
        eprintln!("Example: {} 127.0.0.1 12345", args[0]);
 | 
					 | 
				
			||||||
        process::exit(1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let listen_addr = &args[1];
 | 
					    socket.join_multicast_v4(&Ipv4Addr::new(239, 1, 1, 1), &Ipv4Addr::new(0, 0, 0, 0)).unwrap();
 | 
				
			||||||
    let listen_port = &args[2];
 | 
					    socket.bind(&"0.0.0.0:1234".parse::<SocketAddr>().unwrap().into()).unwrap();
 | 
				
			||||||
    let bind_address = format!("{}:{}", listen_addr, listen_port);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Bind the UDP socket to the specified address and port.
 | 
					    let socket: UdpSocket = socket.into();
 | 
				
			||||||
    let socket = match UdpSocket::bind(&bind_address) {
 | 
					 | 
				
			||||||
        Ok(s) => s,
 | 
					 | 
				
			||||||
        Err(e) => {
 | 
					 | 
				
			||||||
            eprintln!("Error: Could not bind to address {}: {}", bind_address, e);
 | 
					 | 
				
			||||||
            process::exit(1);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    println!("Listening for UDP packets on {}", bind_address);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Create a buffer to hold incoming data. 4 bytes for two u16 values.
 | 
					    // Create a buffer to hold incoming data. 4 bytes for two u16 values.
 | 
				
			||||||
    let mut buf = [0u8; 4];
 | 
					    let mut buf = [0u8; 4];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue