Використання стельових годин в якості інформаційного табло

Преамбула
В кінці 2013 року наша компанія переїхала в новий офіс в одну з веж комплексу Москва-Сіті. У спадок від минулого орендаря приміщення нам дісталися стельові годинник, призначені для відображення часу в різних часових поясах. Судячи з усього, орендар був зав'язаний з фінансовою або банківським сектором.
Спочатку ми намагалися змінити годинник (підправити час і змінити відображаються міста), але не змогли цього зробити – на стелі висіла монолітна алюмінієва коробка без будь-яких органів управління. В наслідок години були знеструмлені і залишилися висіти без ознак життя. Через два роки загорілися ідеєю воскресити годинник і використовувати їх як щось більше.
Стельові годинник
Ідентифікація пристрою
Першою проблемою на шляху була необхідність ідентифікації пристрою — ні моделі годин, ні їх виробника ми не знали. Жодних розпізнавальних знаків, етикеток і гравіювань на корпусі пристрою знайти не вдалося. Документація до пристрою також була відсутня.
У цей момент ми прийшли до висновку, що для ідентифікації пристрою необхідно розтин коробки, починаючи з боків. Головки болтів були пошкоджені ще при першій спробі розтину два роки тому. Один з болтів так і не вдалося викрутити – довелося ламати куточок панелі. Благо вона виконана з м'якого алюмінію, так що вдалося завдати мінімальний візуальний і структурний шкоди конструкції.
Отломанный куточок годин
Отломанный куточок
Всередині виявилася павутина з проводів і розсип керуючих плат. На одній з них ми змогли вивідати назва виробника годинників Wharton, на сайті якого за візуальними ознаками був визначений наш екземпляр.
Нутрощі годин
Нутрощі годин
На сайті виробника розділ підтримки споживачів обмежена контактними даними організації, штаб-квартира якої розташована у Великобританії. Після десяти хвилин розмов по телефону з другої лінією підтримки нам вислали інструкції до годинників, де в подробицях описана процедура налаштування годинника за допомогою пульта дистанційного керування. Пульт ДУ орендарі нам не залишили.
Після чергових десяти хвилин розмови зі службою підтримки нам надіслали фірмову утиліту, призначену для налаштування годин, виставлення часових поясів, установки підпису над секціями, а також для синхронізації часу. Програма зв'язується з годинником через звичайний COM-порт, який був люб'язно захований монтажниками під фальш-стелею над годинником. Для нашого екземпляра програма відпрацювала «на ура».
Wharton ZoneControl 1.7
У процесі вивчення нутрощів годин був помічений набір джамперів на керуючій платі кожній секції. Погравшись з утилітою і джамперами, ми з'ясували, що вони керують внутрішнім номером секції, що дозволяє відображати одну і ту ж інформацію і час на різних секціях. Ця можливість є актуальною для нашого двостороннього зразка – час і текст дублюються з обох сторін.
Програма управління годинами
Пора перейти до практичної частини вправи: розбору алгоритму роботи настроювальної програми з метою написати власної керуючої програми. До цієї задачі можна підійти кількома способами. Спочатку ми розглядали варіант дизассемблирования офіційної утиліти. Після декількох спроб зрозуміти асемблерний код вирішили піти шляхом реверс-інжинірингу протоколу передачі даних: вивчити і зрозуміти дані, які передаються по COM-кабелю.
Wharton ZoneControl: HABR test 1
Wharton ZoneControl: HABR test 2
Для вивчення команд, що передаються COM-порту, ми використовували програму HDD Device Software Monitoring Studio. Програма чіпляється до встановленого в системі COM-порту, не порушуючи режиму його роботи, знімає передаються на порту дані та автоматично розбиває на пакети даних на підставі затримок між передачами. Із запущеною студією ми зняли трафік від програми налаштування на годинник:
Трафік на COM-порт
Для цілей проекту зміна тимчасової зони не потрібно, бо була детально вивчена тільки перша частина запиту. Методом проб і помилок вдалося розібрати структуру першої частини запиту більш детально:
Розбивка пакету даних
Початок і кінець команди – постійні значення для всіх команд. У таблиці ASCII коди відповідають символам «початок тексту» і «кінець тексту». Код табло має сенс, якщо кілька табло підключені ланцюжком між собою. У нашому випадку табло всього одна, тому для нас за змістом значення є константою. Кодів команд існує кілька («встановити текст», «встановити часовий пояс», «синхронізувати час»), для нашого проекту використовується тільки «
0x83
– встановити текст». Для номера секції використовується значення за формулою:
0x80 + номер_секции – 1
.
Для тексту секції використовується правило перекодування
0x80 | ord(символ)
. Годинник підтримують невеликий набір символів для відображення: цифри, символи латиниці рядкові і великі літери, пробіл, спеціальні символи і знаки пунктуації. Кирилиця в систему не зашита. Довжина тексту обмежена десятьма символами і є постійною. Якщо довжина рядка відображається менше десяти символів, то необхідно «добити» рядок до повної довжини пробілами. При відображенні тексту на годиннику пробіли на початку і в кінці рядка ігноруються, а сам текст при візуалізації центрується. Якщо код символу не підтримується, то на дисплеї відображається символ «!».
Контрольний розряд присутня в кінці кожної команди. Для цієї команди формула розрахунку контрольного розряду: посимвольный XOR для тексту і номери секції (вже закодованого). Для отриманого значення старший і молодший октеты записуються в окремі байти контрольного розряду повідомлення. Візуальний приклад:
формування контрольного розряду
Перевірка коректності алгоритму виконували через proof-of-concept скрипт, написаний на PHP, який пише безпосередньо в COM-порт відповідні команди. За допомогою цього скрипта ми уточнили мінімально допустимі затримки між командами, зокрема вдалося мінімізувати затримку між командами з однієї секунди (стандарт у програмі від постачальника) до 300 мсек, а також перевірили підтримуваний годинами алфавіт.
Доступ до годинників по мережі
Взаємодія з програмою годин була тільки однією частиною проблеми, хоча і найбільш складною. Для забезпечення успішності проекту вимагалося мати можливість посилати на годинник керуючі команди через мережу. Зрештою, ми не могли залишити тестовий ноутбук підключеним до годинників 24x7.
Для реалізації мережевого підключення було вирішено скласти просту програму на C#, яка відкриває TCP-порт і чекає підключення ззовні. При отриманні команди по мережі програма виконує наступні операції:
  1. встановлює блокування (для виключення паралельної роботи з годинником);
  2. відкриває локальний COM-порт, на якому «висить» годинник;
  3. відсилає команду;
  4. закриває порт;
  5. чекає попередньо налаштоване час (як встановлено вище – 300 мсек);
  6. знімає блокування;
  7. відсилає підтвердження виконання команди.
Спочатку була думка надати пряме підключення до COM-порту по мережі (тобто реалізувати tcp2com-рішення). Такий підхід міг дозволити надсилати будь-які команди на годинник і експериментувати з пристроєм. Але в підсумку від цієї ідеї відмовилися на користь реалізації сервісної програми, яка реалізує в собі всю логіку кодування і управління годинами.
самописні програма управління
Складена програма реалізує інтерфейс XML, приймає запити через стандартний для C#
HttpListener
. Формат повідомлень по мережі припускає вказівку секції для налаштування і текст:
<setTextXML>
<section>[section number]</section>
<text>[section text]</text>
</setTextXML>

Написана програма була встановлена на Windows-сервер, замкнений в технічному приміщенні офісу. Так як сервер знаходиться на деякому видаленні, ми протягли 10 метрів CAT5-дроти під фальш-стелею від годин до підсобного приміщення. Кабель CAT5 використовувався в якості сигнального COM-кабелю (використовувалося всього дві жили). Були переживання, що десять метрів дроту для годин – це занадто багато, але, на щастя, зв'язок відпрацювала без проблем. Сам Windows-сервер, підключений до внутрішньої мережі компанії і має статичну адресу. Просте тестування з браузера у внутрішній мережі підтвердило наявність зв'язку і коректної роботи як програми, так і зв'язки з годинником.
Відображення корисної інформації
Годинник підключені і тепер доступні по мережі в якості вебсервиса. Настав час виводити корисну інформацію!
Для інтеграції з зовнішніми джерелами даних взяли розгорнуту в нашому офісі корпоративну шину SAP Process Integration 7.4. На момент запуску проекту в експлуатацію ми взяли три джерела даних:
  1. Центробанк Росії;
  2. Гідрометцентр Росії;
  3. Яндекс.Пробки.
Система SAP PI займається опитуванням за розкладом зовнішніх джерел, перетворенням даних і подальшою передачею результату на годинник.
Для Центробанку ми забираємо раз в годину останні опубліковані дані про курс євро і доларів США. Для Гідрометцентру раз в 15 хвилин ми забираємо інформацію з метеостанції, розташованої в районі станції метро «Київська» – найближча метеостанція у відкритому доступі до нашого офісу. З числа доступних атрибутів ми відображаємо тільки температуру і відносну вологість повітря. Для сервісу Яндекс.Пробки відбувається оновлення кожні 15 хвилин і відображається поточний стан завантаженості доріг для Москви в цілому.
А тепер – фотофініш!
інформаційне табло
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.