Удаленное управление трансивером: часть 5
Продолжаем извращаться с удаленным управлением радиостанцией под Mac OS X.
Недавно я сменил компьютерный интерфейс, теперь это .
microHAM-овские интерфесы используют свой протокол для передачи данных в компьютер, который инкапсулирует CAT, PTT и т.д. То есть без специальной программки не обойтись.
Под Mac это . Одно из приимуществ решения - оно мультиклиентное, т.е. позволяет свободно работать с интерфейсом и станцией сразу нескольким программам. Естественно, в нативной среде требует поддержки API uH Router-а со стороны программ.
Нашей задачей, как обычно, является форвард CAT-интерфейса станции по TCP, чобы на другой стороне можно было воспользоваться Windows и горяче любимым Ham Radio Deluxe (к примеру).
Честно скажу, реализовать API uH Router-а на шеле я не осилил. Ну а поскольку в Mac OS X есть PHP, пишем скрипт на PHP. Я не стал изобретать велосипеда, непосредственным форвардом занимается, как и в прошлый раз, socat.
// Constants form RouterCommands.h define("ROUTERFUNCTION", 0x80); // Commands sent to the master port define("OPENMICROKEYER", ROUTERFUNCTION + 0x01); // get a port to the microKEYER router // Commands sent to the router ports (numbers are within FUNCTIONMASK) define("ROUTERPORT", KEYERFUNCTION + 0x01); // (reserved for router internal use) define("CLOSERADIO", CLOSEFUNCTION + OPENRADIO); // close a RADIO port define("CLOSEKEYER", KEYERFUNCTION + FUNCTIONMASK); // define("LAUNCH_ROUTER", "osascript -e 'tell application \"µH Router\"' -e 'tell microKEYER' -e 'retain' -e 'end tell' -e 'end tell'"); define("ROUTER_PIPES", "/tmp/microHamRouter"); class uHRouterConnection public function __construct($name = ROUTER_PIPES) public function __destruct() public function Connected() public function Execute($command, $read = TRUE) } function Stop() print("Openning uH Router connecion...\n"); print("Requesting Keyer conection...\n"); print("Openning Keyer conection ($name)...\n"); print("Requesting radio connection...\n"); Stop();
#!/usr/bin/php -q
define("KEYERFUNCTION", 0x40);
define("CLOSEFUNCTION", 0x20);
define("FUNCTIONMASK", 0x1f);
define("WRITEONLY", 0x80);
define("OPENCWKEYER", ROUTERFUNCTION + 0x02); // get a port to the CW KEYER router
define("OPENDIGIKEYER", ROUTERFUNCTION + 0x03); // get a port to the DIGI KEYER router
define("OPENKEYER", ROUTERFUNCTION + 0x08); // get a port to keyer from following keyerID (char*)
define("KEYERID", ROUTERFUNCTION + 0x09); // get Keyer ID (null terminated string) of the nth keyer (next byte after command)
define("QUITIFNOKEYER", ROUTERFUNCTION + 0x1f); // quit if there are no keyers
define("QUITIFNOTINUSE", ROUTERFUNCTION + 0x1e); // quit if not connected
define("QUITALWAYS", ROUTERFUNCTION + 0x1d); // quit
define("ROUTERVERSION", ROUTERFUNCTION + 0x1c); // router version <1><80> = v1.80
define("WATCHDOG", 0x08); // keep UDP port alive
define("OPENRADIO", KEYERFUNCTION + 0x02); // get a RADIO port
define("OPENCONTROL", KEYERFUNCTION + 0x03); // get a CONTROL port
define("OPENPTT", KEYERFUNCTION + 0x04); // get a port to the PTT flag bit
define("OPENCW", KEYERFUNCTION + 0x05); // get a port to the serial CW flag bit
define("OPENRTS", KEYERFUNCTION + 0x06); // get a port to the RTS flag bit
define("OPENFSK", KEYERFUNCTION + 0x07); // get an FSK port
define("OPENWINKEY", KEYERFUNCTION + 0x08); // get the WinKey port
define("OPENFLAGS", KEYERFUNCTION + 0x09); // get the FLAGS port
define("OPENEMULATOR", KEYERFUNCTION + 0x0a); // get the WinKey Emulator port (only in µH Router; not in microHAM keyers
define("WINDOWSIZE", KEYERFUNCTION + 0x0b); // used by UDP to change window size
define("CLOSECONTROL", CLOSEFUNCTION + OPENCONTROL); // close a CONTROL port
define("CLOSEPTT", CLOSEFUNCTION + OPENPTT); // close a port to the PTT flag bit
define("CLOSECW", CLOSEFUNCTION + OPENCW); // close a port to the serial CW flag bit
define("CLOSERTS", CLOSEFUNCTION + OPENRTS); // close a port to the RTS flag bit
define("CLOSEFSK", CLOSEFUNCTION + OPENFSK); // close an FSK port
define("CLOSEWINKEY", CLOSEFUNCTION + OPENWINKEY); // close the WinKey port
define("CLOSEFLAGS", CLOSEFUNCTION + OPENFLAGS); // close the FLAGS port
define("CLOSEEMULATOR", CLOSEFUNCTION + OPENEMULATOR); // close the WinKey Emulator port
define("KILL_ROUTER", "osascript -e 'tell application \"µH Router\"' -e 'tell microKEYER' -e 'release' -e 'end tell' -e 'quitIfNotInUse' -e 'end tell'");
{
private $input;
private $output;
{
$this->input = @fopen($name."Read", "r");
$this->output = @fopen($name."Write", "w");
}
{
@fclose($this->input);
@fclose($this->output);
}
{
return (($this->input !== FALSE) && ($this->output !== FALSE));
}
{
if (is_numeric($command))
$command = chr($command);
@fwrite($this->output, $command);
if ($read)
{
stream_set_timeout($this->input, 10);
$value = @fread($this->input, 20);
return trim($value);
}
}
//
{
global $router, $keyer;
if (isset($keyer) && $keyer->Connected())
$keyer->Execute(CLOSEKEYER, FALSE);
unset($keyer);
unset($router);
exec(KILL_ROUTER);
exit();
}
// set_time_limit(0);
print("Starting uH Router...\n");
exec(LAUNCH_ROUTER);
$router = new uHRouterConnection();
if (!$router->Connected())
{
print("Can not open uH Router connection.\n");
Stop();
}
$name = $router->Execute(OPENMICROKEYER);
if (($name == FALSE) || (strlen($name) == 0))
{
print("Requested keyer not found.\n");
Stop();
}
$keyer = new uHRouterConnection($name);
if (!$keyer->Connected())
{
print("Can not open connection for Keyer.\n");
Stop();
}
$name = $keyer->Execute(OPENRADIO);
if (($name !== FALSE) || (strlen($name) == 0))
{
print("Forwarding connection for radio ($name)...\n");
print("Press Ctrl+C to stop forwarding.\n");
$redirector = "sh -i -c 'socat -d TCP-LISTEN:7001,rcvbuf=1,sndbuf=1 PIPE:${name}Read!!PIPE:${name}Write'";
system($redirector);
print("\n");
print("Stopping...\n");
}
?>





Добавить комментарий