\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}