mirror of
https://github.com/eddyem/BTA_utils.git
synced 2026-08-12 09:39:34 +03:00
280 lines
11 KiB
TeX
280 lines
11 KiB
TeX
\documentclass[a4paper,12pt]{extarticle}
|
||
\usepackage{listings}
|
||
\usepackage{hyperref}
|
||
\usepackage{/home/eddy/ed}
|
||
\colorlet{punct}{red}
|
||
\definecolor{delim}{RGB}{20,105,176}
|
||
\colorlet{numb}{red!60!black}
|
||
\lstdefinelanguage{JSON}{
|
||
basicstyle=\small\ttfamily,
|
||
numbers=left,
|
||
numberstyle=\scriptsize,
|
||
stepnumber=2,
|
||
numbersep=8pt,
|
||
showstringspaces=false,
|
||
breaklines=true,
|
||
frame=tbrL,
|
||
literate=
|
||
*{0}{{{\color{numb}0}}}{1}
|
||
{1}{{{\color{numb}1}}}{1}
|
||
{2}{{{\color{numb}2}}}{1}
|
||
{3}{{{\color{numb}3}}}{1}
|
||
{4}{{{\color{numb}4}}}{1}
|
||
{5}{{{\color{numb}5}}}{1}
|
||
{6}{{{\color{numb}6}}}{1}
|
||
{7}{{{\color{numb}7}}}{1}
|
||
{8}{{{\color{numb}8}}}{1}
|
||
{9}{{{\color{numb}9}}}{1}
|
||
{.}{{{\color{numb}.}}}{1}
|
||
{:}{{{\color{punct}{:}}}}{1}
|
||
{,}{{{\color{punct}{,}}}}{1}
|
||
{\{}{{{\color{delim}{\{}}}}{1}
|
||
{\}}{{{\color{delim}{\}}}}}{1}
|
||
{[}{{{\color{delim}{[}}}}{1}
|
||
{]}{{{\color{delim}{]}}}}{1},
|
||
morestring=[b]",
|
||
morestring=[b]',
|
||
extendedchars=true,
|
||
escapechar=`,
|
||
stringstyle=\bfseries\color[rgb]{0.6,0,1},
|
||
keywords={true,false},
|
||
keywordstyle=\bfseries\color[rgb]{0,0.1,0.5},
|
||
frameround=tttt
|
||
}
|
||
\lstset{basicstyle=\small,breaklines=true,
|
||
extendedchars=true,aboveskip=1em,belowcaptionskip=5pt,
|
||
prebreak = \hbox{%
|
||
\normalfont\small\hfill\green{\ensuremath{\hookleftarrow}}},
|
||
postbreak = \hbox to 0pt{%
|
||
\hss\normalfont\small\green{\ensuremath{\hookrightarrow}}\hspace{1ex}},
|
||
commentstyle=\color{blue},showspaces=false,
|
||
showstringspaces=false,stringstyle=\bfseries\color[rgb]{0.6,0,1},
|
||
numbers=left,numberstyle=\tiny,stepnumber=2,
|
||
keywordstyle=\bfseries\color[rgb]{0,0.1,0.5},
|
||
frameround=tttt,frame=trBL,tabsize=4,backgroundcolor=\color[rgb]{.9,.9,1}}
|
||
\lstloadlanguages{JSON,C}
|
||
\def\lstlistingname{Листинг}
|
||
\def\lstref#1{(см.~листинг~\ref{#1})}
|
||
\LTcapwidth=\textwidth
|
||
|
||
\title{Вспомогательный сервис BTA-JSON}
|
||
|
||
\begin{document}
|
||
\nocolon
|
||
\maketitle
|
||
\section{Введение}
|
||
Для осуществления возможности удаленного мониторинга состояния телескопа БТА (в
|
||
т.ч. для заполнения стандартного заголовка FITS-файлов) на основе разработанной
|
||
В.С.~Шергиным программы \verb'bta_print' был создан простой сетевой сервис,
|
||
выдающий по запросу пользователя всю необходимую информацию в формате JSON.
|
||
|
||
Необходимость создания данного сервиса была обоснована тем, что прохождение
|
||
multicast-пакетов из локальной сети БТА в локальную сеть ННП зачастую
|
||
блокируется многочисленым промежуточным сетевым оборудованием.
|
||
|
||
Данный сервис в режиме демона работает на компьютере \verb'tb.sao.ru', отвечая
|
||
на запросы, адресованные ресурсу \verb'/bta_par' на порту \verb'12345'.
|
||
Демон принимает запросы как от веб-клиентов, так и от непосредственно
|
||
подключенных клиентских сокетов. Полный адрес запроса для веб-клиента выглядит
|
||
так:
|
||
$$
|
||
\verb'http://tb.sao.ru:12345/bta_par'
|
||
$$
|
||
|
||
По полному запросу сервер возвращает объект JSON с переменными, аналогичными
|
||
выводу программы \verb'bta_print'.
|
||
\begin{lstlisting}[language=JSON]
|
||
{
|
||
"ACS_BTA": true,
|
||
"M_time": "11:19:02.65",
|
||
"JDate": 2457496.846559,
|
||
"S_time": "00:52:20.42",
|
||
"Tel_Mode": "Stopping",
|
||
"Tel_Focus": "Nasmyth2",
|
||
"ValFoc": 141.67,
|
||
"Tel_Taget": "Nest",
|
||
"P2_Mode": "Stop",
|
||
"CurAlpha": "17:00:46.09",
|
||
"CurDelta": "+25:23:19.3",
|
||
"SrcAlpha": "20:03:06.61",
|
||
"SrcDelta": "+30:07:03.6",
|
||
"InpAlpha": "20:03:06.61",
|
||
"InpDelta": "+30:07:03.6",
|
||
"TelAlpha": "20:06:48.56",
|
||
"TelDelta": "+25:26:04.6",
|
||
"InpRA2000": "20:02:27.39",
|
||
"InpDec2000": "+30:04:26.0",
|
||
"CurRA2000": "17:00:05.25",
|
||
"CurDec2000": "+25:24:46.6",
|
||
"InpAzim": "+102:24:34.6",
|
||
"InpZenD": "57:30:02.4",
|
||
"CurAzim": "+127:00:42.7",
|
||
"CurZenD": "90:33:43.6",
|
||
"CurPA": "039:45:18.4",
|
||
"SrcPA": "054:46:17.1",
|
||
"InpPA": "054:46:17.1",
|
||
"TelPA": "052:36:08.9",
|
||
"ValAzim": "+097:25:17.8",
|
||
"ValZenD": "59:37:00.4",
|
||
"ValP2": "220:17:30.6",
|
||
"ValDome": "-225:20:43.1",
|
||
"DiffAzim": "+000:00:00.0",
|
||
"DiffZenD": "+00:00:00.0",
|
||
"DiffP2": "+086:31:52.6",
|
||
"DiffDome": "+322:46:01.0",
|
||
"VelAzim": "-00:00:00.0",
|
||
"VelZenD": "+00:00:00.0",
|
||
"VelP2": "+00:00:00.0",
|
||
"VelPA": "+00:00:00.0",
|
||
"VelDome": "+00:00:00.0",
|
||
"CorrAlpha": "+0:00:00.00",
|
||
"CorrDelta": "+0:00:00.0",
|
||
"CorrAzim": "+0:00:00.0",
|
||
"CorrZenD": "+0:00:00.0",
|
||
"ValTout": 007.8,
|
||
"ValTind": 005.7,
|
||
"ValTmir": 005.8,
|
||
"ValPres": 596.6,
|
||
"ValWind": 03.1,
|
||
"Blast10": 2503.7,
|
||
"Blast15": 2566.1,
|
||
"ValHumd": 46.8,
|
||
"Precipt": 2364.3
|
||
}
|
||
\end{lstlisting}
|
||
|
||
Момимо запуска утилиты из веб-браузеров можно использовать клиент командной
|
||
строки. Образцы клиентов находятся в директории \verb'/Users/eddy/BTA_utils'
|
||
компьютера \verb'tb.sao.ru', а также "--- в репозитории \verb'btautils' по
|
||
адресу \url{https://sourceforge.net/projects/btautils/}. Помимо однократных
|
||
запросов клиент может создать постоянное подключение к сокету демона для
|
||
регулярных запросов интересующих его данных (см.~п.~\ref{coding}).
|
||
|
||
\section{Определение полей объекта JSON}
|
||
В таблице~\ref{json_head} приведено описание полей объекта JSON, возвращаемого
|
||
сервером клиенту. Тип данных поля имеет одно из следующих значений:
|
||
\begin{description}
|
||
\item[текст --] строковая величина (например, \verb'"Zenith"');
|
||
\item[время --] строковая величина, характеризующая время, вида
|
||
\verb'HH:MM:SS.SS' (для времени и прямых восхождений);
|
||
\item[угол --] строковая величина вида \verb'[+]D:MM:SS.S' (для угловых
|
||
величин);
|
||
\item[число --] число с плавающей точкой.
|
||
\end{description}
|
||
|
||
|
||
\def\CH#1{\multicolumn{1}{|c|}{#1}}
|
||
\begin{longtable}{|>{\tt}r|p{0.46\textwidth}<{\hfil}|c|>{\tt}c|}
|
||
\caption{Поля объектов}\label{json_head}\\
|
||
\hline\hline
|
||
\multicolumn{1}{|m{2cm}|}{\bf Название\par\hfil поля\hfil}& \CH{\bf
|
||
Описание} & \bf Тип данных &\bf Блок\\
|
||
\hline
|
||
\CH{\bf 1}&\CH{\bf 2}& \bf 3 & \bf 4\\
|
||
\hline\endfirsthead
|
||
\hline
|
||
\multicolumn{4}{r}{\small(продолжение см.~на следующей странице)}\\
|
||
\endfoot
|
||
\hline\hline\endlastfoot
|
||
\caption{Продолжение}\\
|
||
\hline
|
||
\CH{\bf 1}&\CH{\bf 2}& \bf 3& \bf 4\\
|
||
\hline\endhead
|
||
ACS\_BTA& Унаследованное от \texttt{bta\_print} поле, всегда \texttt{true}&
|
||
--- & \bf---\\
|
||
M\_time& Текущее московское время& время & mtime\\
|
||
JDate& Текущая юлианская дата (сут.)& число & sidtime\\
|
||
S\_time& Текущее звездное время& время & sidtime\\
|
||
Tel\_Mode& Режим работы телескопа& строка & telmode\\
|
||
Tel\_Focus& Активный фокус телескопа & строка & telfocus\\
|
||
ValFoc& Отсчет датчика фокуса телескопа, мм& число & telfocus\\
|
||
Tel\_Taget& Текущая цель телескопа& строка & target\\
|
||
P2\_Mode& Режим работы поворотного стола& строка & p2mode\\
|
||
CurAlpha& Текущие координаты предыдущей цели ($\alpha$~-- прямое восхождение) &
|
||
время & eqcoor\\
|
||
CurDelta& Текущие координаты предыдущей цели ($\delta$~-- склонение)& угол &
|
||
eqcoor\\
|
||
SrcAlpha& Текущие координаты цели ($\alpha$)& время & eqcoor\\
|
||
SrcDelta& Текущие координаты цели ($\delta$)& угол & eqcoor\\
|
||
InpAlpha& Введенные пользователем координаты ($\alpha$)& время & eqcoor\\
|
||
InpDelta& Введенные пользователем координаты ($\delta$)& угол & eqcoor\\
|
||
InpRA2000& Обратное преобразование (с использованием библиотеки sla) введенных
|
||
координат на эпоху J2000 & угол & eqcoor\\
|
||
InpDec2000& InpDelta $\Longrightarrow$ J2000& угол & eqcoor\\
|
||
CurRA2000& CurAlpha $\Longrightarrow$ J2000& угол & eqcoor\\
|
||
CurDec2000& CurDelta $\Longrightarrow$ J2000& угол & eqcoor\\
|
||
|
||
TelAlpha& Текущие координаты телескопа ($\alpha$)& время & eqcoor\\
|
||
TelDelta& Текущие координаты телескопа ($\delta$)& угол & eqcoor\\
|
||
InpAzim& Введенные горизонтальные координаты ($A$~-- азимут)& угол & horcoor\\
|
||
InpZenD& Введенные горизонтальные координаты ($Z$~-- зенитное расстояние)&
|
||
угол & horcoor\\
|
||
CurAzim& Текущие горизонтальные координаты предыдущей цели ($A$)& угол &
|
||
horcoor\\
|
||
CurZenD& Текущие горизонтальные координаты предыдущей цели ($Z$)& угол &
|
||
horcoor\\
|
||
CurPA& Текущий позиционный угол предыдущей цели& угол & horcoor\\
|
||
SrcPA& Текущий позиционный угол цели& угол & horcoor\\
|
||
InpPA& Введенный пользователем позиционный угол& угол & horcoor\\
|
||
TelPA& Текущий позиционный угол телескопа& угол & horcoor\\
|
||
ValAzim& Отсчет датчика азимута& угол & valsens\\
|
||
ValZenD& Отсчет датчика зенитного расстояния& угол & valsens\\
|
||
ValP2& Отсчет датчика положения поворотного стола& угол & valsens\\
|
||
ValDome& Отсчет датчика азимута купола& угол & valsens\\
|
||
DiffAzim& Рассогласование по азимуту& угол & diff\\
|
||
DiffZenD& Рассогласование по зенитному расстоянию& угол & diff\\
|
||
DiffP2& Рассогласование по углу вращения поворотного стола& угол & diff\\
|
||
DiffDome& Рассогласование по азимуту купола& угол & diff\\
|
||
VelAzim& Текущая скорость движения телескопа по азимуту& угол & vel\\
|
||
VelZenD& Текущая скорость движения телескопа по зенитному расстоянию& угол &
|
||
vel\\
|
||
VelP2& Текущая скорость движения поворотного стола & угол & vel\\
|
||
VelPA& Текущая скорость <<вращения неба>>& угол & vel\\
|
||
VelDome& Текущая скорость движения купола& угол & vel\\
|
||
CorrAlpha& Введенная поправка по прямому восхождению& угол & corr\\
|
||
CorrDelta& Введенная поправка по склонению& угол & corr\\
|
||
CorrAzim& Введенная поправка по азимуту& угол & corr\\
|
||
CorrZenD& Введенная поправка по зенитному расстоянию& угол & corr\\
|
||
ValTind& Температура в подкупольном, $\degr$C& число & meteo\\
|
||
ValTmir& Температура зеркала, $\degr$C& число & meteo\\
|
||
ValPres& Атмосферное давление, мм.рт.ст.& число & meteo\\
|
||
ValWind& Скорость ветра, м/с& число & meteo\\
|
||
Blast10& Время от последнего порыва ветра, превышающего 10\,м/с, секунд& число &
|
||
meteo\\
|
||
Blast15& Время от последнего порыва ветра, превышающего 15\,м/с, секунд& число &
|
||
meteo\\
|
||
ValHumd& Влажность воздуха, \%& число & meteo\\
|
||
Precipt& Время, прошедшее с момента последнего выпадения осадков, секунд&
|
||
число & meteo\\
|
||
\end{longtable}
|
||
|
||
\section{Осуществление постоянного подключения}
|
||
\label{coding}
|
||
Для осуществления постоянного удаленного подключения к демону для
|
||
периодического получения необходимых данных, необходимо создать сокет,
|
||
подключенный к хосту \verb'tb.sao.ru' по порту \verb'12345'.
|
||
|
||
Для запроса конкретного блока данных во время постоянного подключения, в
|
||
качестве запроса необходимо отправлять текст, указанный в строке <<Блок>>
|
||
таблицы~\ref{json_head}.
|
||
|
||
Формирование строки запроса можно сделать одним из следующих способов:
|
||
\begin{itemize}
|
||
\item посредством перечисления названий нужных блоков через разделитель
|
||
(разделителем является пробел, амперсанд, символ табуляции или символ новой
|
||
строки);
|
||
\item посредством формирования запроса вида \verb'GET /bta_par&blocks', где
|
||
\verb'blocks'~-- запрос аналогичный предыдущему пункту;
|
||
\item посредством формирования запроса вида \verb'GET /bta_par', в этом случае
|
||
демон формирует ответ с перечислением всех блоков, а затем отключается.
|
||
\end{itemize}
|
||
|
||
Для обработки JSON--объекта можно использовать библиотеку \verb'libjson', либо
|
||
же обрабатывать его вручную (т.к. структура объекта элементарная и
|
||
однообразная).
|
||
|
||
Учитывая то, что мультикаст-пакеты с данными по БТА распространяются не чаще
|
||
15~раз в~секунду, не стоит делать запросы чаще 10~раз в~секунду.
|
||
|
||
\end{document}
|