Удаленное управление трансивером: часть 5

Продолжаем извращаться с удаленным управлением радиостанцией под Mac OS X.
Недавно я сменил компьютерный интерфейс, теперь это microHAM.
microHAM-овские интерфесы используют свой протокол для передачи данных в компьютер, который инкапсулирует CAT, PTT и т.д. То есть без специальной программки не обойтись.
Под Mac это uH Router. Одно из приимуществ решения - оно мультиклиентное, т.е. позволяет свободно работать с интерфейсом и станцией сразу нескольким программам. Естественно, в нативной среде требует поддержки API uH Router-а со стороны программ.
Нашей задачей, как обычно, является форвард CAT-интерфейса станции по TCP, чобы на другой стороне можно было воспользоваться Windows и горяче любимым Ham Radio Deluxe (к примеру).
Честно скажу, реализовать API uH Router-а на шеле я не осилил. Ну а поскольку в Mac OS X есть PHP, пишем скрипт на PHP. Я не стал изобретать велосипеда, непосредственным форвардом занимается, как и в прошлый раз, socat.



#!/usr/bin/php -q

  // Constants form RouterCommands.h

  define("ROUTERFUNCTION", 0x80);
  define("KEYERFUNCTION",  0x40);
  define("CLOSEFUNCTION",  0x20);
  define("FUNCTIONMASK",   0x1f);
  define("WRITEONLY",      0x80);

  // Commands sent to the master port

  define("OPENMICROKEYER", ROUTERFUNCTION + 0x01);               //  get a port to the microKEYER router
  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

  // Commands sent to the router ports (numbers are within FUNCTIONMASK)

  define("ROUTERPORT",     KEYERFUNCTION + 0x01);                //  (reserved for router internal use)
  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("CLOSERADIO",     CLOSEFUNCTION + OPENRADIO);           //  close a RADIO port
  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("CLOSEKEYER",     KEYERFUNCTION + FUNCTIONMASK);

  //

  define("LAUNCH_ROUTER",  "osascript -e 'tell application \"µH Router\"' -e 'tell microKEYER' -e 'retain' -e 'end tell' -e 'end tell'");
  define("KILL_ROUTER",    "osascript -e 'tell application \"µH Router\"' -e 'tell microKEYER' -e 'release' -e 'end tell' -e 'quitIfNotInUse' -e 'end tell'");

  define("ROUTER_PIPES",   "/tmp/microHamRouter");

  class uHRouterConnection
  {
    private $input;
    private $output;

    public function __construct($name = ROUTER_PIPES)
    {
      $this->input = @fopen($name."Read", "r");
      $this->output = @fopen($name."Write", "w");
    }

    public function __destruct()
    {
      @fclose($this->input);
      @fclose($this->output);
    }

    public function Connected()
    {
      return (($this->input !== FALSE) && ($this->output !== FALSE));
    }

    public function Execute($command, $read = TRUE)
    {
      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);
      }
    }

  }
  
  //

  function Stop()
  {
    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);

  print("Openning uH Router connecion...\n");
  $router = new uHRouterConnection();
  if (!$router->Connected())
  {
    print("Can not open uH Router connection.\n");
    Stop();
  }

  print("Requesting Keyer conection...\n");
  $name = $router->Execute(OPENMICROKEYER);
  if (($name == FALSE) || (strlen($name) == 0))
  {
    print("Requested keyer not found.\n");
    Stop();
  }

  print("Openning Keyer conection ($name)...\n");
  $keyer = new uHRouterConnection($name);
  if (!$keyer->Connected())
  {
    print("Can not open connection for Keyer.\n");
    Stop();
  }

  print("Requesting radio connection...\n");
  $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");
  }

  Stop();
?>


Похожие статьи

  • Удаленное управление трансивером: часть 3
  • Антикризисное управление))
  • Управление «К» МВД предупреждает !
  • Трансерфинг Управление реальностью. Выпуск N 196. Артефакт намерения
  • Не поооооонял… Вроде работает… Субъективно ежель
  • Февраль 20, 2011 | Категория: Без рубрики

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

    close window

    Service Times & Directions

    Weekend Masses in English

    Saturday Morning: 8:00 am

    Saturday Vigil: 4:30 pm

    Sunday: 7:30 am, 9:00 am, 10:45 am,
    12:30 pm, 5:30 pm

    Weekend Masses In Español

    Saturday Vigil: 6:15pm

    Sunday: 9:00am, 7:15pm

    Weekday Morning Masses

    Monday, Tuesday, Thursday & Friday: 8:30 am

    map
    6654 Main Street
    Wonderland, AK 45202
    (513) 555-7856