From: Otten, J. E. <joh...@gd...> - 2011-06-28 22:11:23
|
Hello everyone, The past several days I have been working with the testcall command to send specific Layer 3 commands to a mobile phone via a UDP port. Currently, I am able to do various tricks (make the phone ring, send it an SMS, send a disconnect message, etc.) with messages that I have extracted via GSMTAP and Wireshark. However, I am unable to do these tasks consistently. I can usually (90% of the time) make them work if I restart OpenBTS and reboot the phone, but usually it is a one shot deal - sending a second command (either the same or different) will not usually work, unless I shut down/restart OpenBTS and reboot the phone again. I have looked at the testcall code in CallControl.cpp, and stepped through it with a debugger, and the main issue seems to be thread blocking on the Logical Channel send and receive function calls. My assumption is these blocking issues (if that is what the problem actually is) occur with the interthread FIFOs that are used to communicate between the Layers. Obviously, using the debugger is going to introduce timing and synchronization problems, so I imagine that is part of what I am experiencing, but I also get similar behavior when running OpenBTS directly. However, I am wondering if anyone has managed to get something running consistently, such that I can send multiple Layer 3 messages (and read the responses) without having to shutdown after each message? I am using a simple Perl script to send messages through the port, which I am including below (in case someone sees something in it that could be causing the problem). If anyone has any suggestions, or has some code for the UDP port that works for them and doesn't mind sharing, I would appreciate it! Thanks, John The Perl Script I am using: #!/usr/bin/perl use strict; use IO::Socket; use IO::Select; my $socket = IO::Socket::INET->new(Proto => 'udp', PeerAddr => 'localhost', PeerPort => '28670') or die "Error creating socket: $!\n"; my $read_set = new IO::Select(); $read_set->add($socket); $read_set->add(\*STDIN); while (1) { my ($rh_set) = IO::Select->select($read_set, undef, undef, 0); foreach my $rh (@$rh_set) { if ($rh == $socket) { my $buf; $socket->recv($buf, 1024); my $size = length($buf); my $hex = unpack("H*", $buf); print "Received $size bytes [$hex]\n"; } else { my $buf = <$rh>; chomp $buf; my $bin = pack("H*", $buf); $socket->send($bin); my $size = length($bin); print "Sent $size bytes\n"; } } } $socket->close(); |