Напоследък се нагледах на противоположността на “How to …..” .
Или как заради не дотам добро проектиране се стига до изгъзицата да се пише програма обработваща MAC фреймофе на JavaScript . От която задача аз изпаднах в потрес, който още ме държи.
Та имаме система за автоматизация, която в общи линии използва за преносна среда захранването (powerline) , стъпила е на един архаичен стандарт – KNX/EHS и е развита (според мен) в неправилна посока.
Всички знаем, че една система за автоматизация се състои от управляваща част , изпълнителна част и датчици. И общо взето е централизирана – цялата управляваща логика е на едно място, съответно с добър процесор/контролер , а останалата част е максимално проста – на изпълнителната част и датчиците не им трябва мозък – трябва им само адрес и евентуално да потвърждават изпълнена команда.
Да , обаче в нашия случай не е баш така. “Интелигентно” е дори това, което не трябва – например прост ключ за пускане/спиране . А управляващата част (централната) просто липсва. Т.е. имаме някакъв вид разпределена система, при която всяко устройство може да си говори с всички останали.
Освен, че не виждам смисъл даден ключ да може да си говори с друг ключ, това може да докара сериозни проблеми за достъпа до медията на MAC ниво, комуникацията е в килохерцовия обхват и скоростите са килобити в секунда.
Направен е опит функционалността на централния контролер (който както казах липсва) да се направи в интерфейсните модули. Такива има няколко – IR , GSM , bluetooth (сериен) и сериен – RS232 . Все още не знам каква управляваща логика има там (освен в серийните интерфейси – там няма никаква).
Сегашната задача е да се направи IP интерфейс (дистанционното има wireless , JavaScript и socket в JavaScript-a) . И как е направен интерфейса ? Ами чудно – IP to RS232 -> RS323 to powerline , напълно неинтелигентен . В допълнение трябва етернет мрежа и безжичен AP .
Как бих го направил аз ? Хм , по възможно най-лесния начин (и най скалируемия) – един Alix (имаме етернет, имаме minipci за безжична карта, имаме и сериен порт) , Alix-a струва малко по скъпо от IP to RS323 адаптера. Щях да сложа един линукс на Аликс-а , да пусна безжичната карта и да наблъскам там целия необходим код за управление. Дистанционното щеше да си говори с него на приложно ниво, с команди от вида “SET” , “GET”. И един RS232 to powerline .
Е предпочитам да парсвам МАК фреймове със С и под линукс, отколкото на JavaScript и под непозната ОС, без никакви средства за дебъгване. Да не говорим, че второ дистанционно (и десето ако трябва) ще се добави без никакви проблеми. Хе, ще ми се да питам (и ще питам) разработчика на настоящата система КАК ПО ДЯВОЛИТЕ ЩЕ ДОБАВИ ВТОРО ДИСТАНЦИОННО ? Разбира се той ще измисли workaround , работещ и неефективен workaround , вместо да вземе да проектира както трябва.
Като говорехме за проектиране, някой виждал ли е комуникационен протокол, при който адресите са някъде към края на фрейма , при това не на фиксирано място, а зависещо от нещо си. Е аз видях вече :)
Би трябвали всеки, който седне да проектира такъв протокол да погледне етернет спецификацията и да си набие в главата : ИЗТОЧНИК , ПОЛУЧАТЕЛ, ДЪЛЖИНА , ДАННИ ! При това адресите да са с ФИКСИРАНА , а не с променлива дължина (щото и това го има хе,хе).
Мани,мани, мога да изпиша страници.
За капак на всичко, дистанционното TSU9400 (което струва между другото около 1000 лв) прави един номер, който скапва иначе добре написания (от Филипс) TCP клиент.
Та , сокета при него има callback функция .onConnect и променлива .connected. Интересната част е, че лежащия от долу ОС сетва .connected = true, но извиква .onConnect фунцията, когато сметне за добре , ако е натоварен процесора – дори след секунди. През това време всичко що работи със сокета си мисли, че сокета е конектнат и пише и маже смело в него. Писането минава, с изключение на първото писане, щото пък TCP клиента по ред причини го слага във .onConnect функцията. И настава едно мазало – немам думи.
Та идеята на целия тоя дълъг пост е, че когато нещо е проектирано добре (например ПИКОИП), са необходими само 10-на реда код, за да го интерфейсне всеки с минимална грамотност, към каквото и да е, докато в обратния случай са необходими поне 300 реда код (и то на JavaScript) , да не говорим пък, че хората, които могат да го направят се броят на пръстите на едната ръка.