Files
BTA_utils/jsonbta/manual.tex
2016-04-18 11:29:48 +03:00

280 lines
11 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
\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}