Linux за българи: Форуми

Linux секция за напреднали => Хардуерни и софтуерни проблеми => Темата е започната от: Ipolit в Oct 26, 2015, 13:57



Титла: AT команди към Windows машина
Публикувано от: Ipolit в Oct 26, 2015, 13:57
Здравейте,
имаме една система за контрол на достъпа с RFID чипчета и компютър с Windows, който я управлява. Сега разработваме една друга система (web базирана - php) и трябва да направим малко интеграция между двете. Новата система ще трябва да дава достъп на определен RFID чип до някакво място. Няма никакъв проблем да се добавя запис в базата на системата за контрол на достъпа, но въпросът е, че контролерите не четат базата поснтоянно, а само при старт или влизане в сервизен режим и трябва по някакъв начин да бъдат накарани да я прочетат. Свързах се с фирмата, която е разработила системата и хората ми обясниха, че трябва да се изпрати AT команда до контролера, която казва, че има запис за нов чип за този контролер и съответно ми дадоха АТ командите.
И тук е въпроса, как да се вържем към уиндоуса от уеб базираната си програма и да изпълним АТ командата. Гледах разни възможности за telnet, допълнителни програми и т.н., но някой ако го е правил да дава акъл.
Мерси предварително


Титла: Re: AT команди към Windows машина
Публикувано от: laskov в Oct 26, 2015, 14:16
От това, което обясняваш разбирам, че базата данни е в компютъра (Windows) и когато нещо бъде променено в нея, той уведомява даден четец с АТ команда, с която го кара да си обнови базата.
От това не следва, че трябва да подаваш някакви АТ команди на Windows-а, а че трябва да свържеш четец към компютър чрез RS-232 интерфейс, да настроиш скоростта и формата на данните на интерфейса на компютъра да са като на четеца и като му пратиш на четеца АТ, той да ти отговори с ОК. И от там нататък ...


Титла: Re: AT команди към Windows машина
Публикувано от: Ipolit в Oct 26, 2015, 14:46
Ами не съм сигурен, че разбирам как може да стане това, при положение, че контролерът има един RS-232 вход и той е вързан към компютъра с програмата и уиндоуса, и не ми идва на ума как да вържа втори компютър към този вход. Затова за мен звучи логично комтютърът с уиндоуса да подаде АТ командата, само че не през програмата, ами аз трябва да му я подам по някакъв начин отдалечено и той да я изпълни. Може да не съм те разбрал, тъй че ако може да ми обясниш по-подробно какво имаш предвид.

Иначе базата данни е на компютъра с уиндоуса, но ако нещо се промени в нея не през интерфейса на програмата, а по друг начин, контролерът не си ъпдейтва записите.


Титла: Re: AT команди към Windows машина
Публикувано от: laskov в Oct 26, 2015, 15:10
Най-работещият вариант, който си представям е да сложиш устройство (компютър) с два интерфейса, единият свързан към четеца (четците), а другия към компютъра с Windows. Програмата, която ще работи на това устройство ще трябва да го прави "прозрачно" за командите, които Windows-кото приложение изпраща, т.е. то ще препредава и тях, и отговорите на четците към Windows-кото приложение, а когато ти решиш, ще си "говориш" с четците, а към Windows-кото приложение ще свалиш сигнала за готовност, за да не реши и той в същия момент да си говори с тях.

ПС: Другият вариант е да изхвърлиш Windows-кото приложение, а в новото да пресъздадеш и неговите функционалности.


Титла: Re: AT команди към Windows машина
Публикувано от: Ipolit в Oct 26, 2015, 15:31
Благодаря, laskov. Малко се отнесохме от въпроса, който всъщност беше "Как да дистанционно да накараме Windows да подава АТ команди към определен COM порт" с помощта на php.


Титла: Re: AT команди към Windows машина
Публикувано от: programings в Oct 27, 2015, 00:44
Пишеш си сървър на python примерно, който стои на машината с Windows-а, и слуша в локалната мрежа (ако има такава между машините, и са в един broadcast домейн). Задачата му е да отвори listen сокет, ограничен до локалната мрежа, и да проверява какво идва на него. С PHP от контролната машина отваряш сокет до сървъра, и му говориш. Съответно, може да си измислиш свой протокол, тоест при каква команда какво да прави сървъра на Windows машината, статус кодове, ако искаш да връща такива, и прочие. Разгледай за питонски библиотеки за интеракция с COM порта. Също не би било зле да добавиш и команда за автентикация, за да не тръгне някой умник да се разпорежда. Така би било най-чисто.


Титла: Re: AT команди към Windows машина
Публикувано от: BRADATA в Oct 27, 2015, 06:41
Благодаря, laskov. Малко се отнесохме от въпроса, който всъщност беше "Как да дистанционно да накараме Windows да подава АТ команди към определен COM порт" с помощта на php.
С трици маймуни няма как да ловиш. Еле пък ако има замесен виндовс. Да започнем от това, че въпроса ти е зададен неправилно. Правилният е "Как две приложения да пишат по едно и също време в един сериен порт в Windows". За огромно твое съжаление тази операционна система не позволява две приложения да отворят за писане един сериен порт. Може да бъде отворен за четене, но това на теб не ти трябва. Та решението ти е написал laskov. Ако не можеш сам - вадиш едни пари и все ще се намери някой, който да ти го направи.


Титла: Re: AT команди към Windows машина
Публикувано от: runtime в Oct 27, 2015, 09:49
Това или трябва да си пренапише софтуера за управление/комуникация с четеца или да пробва с прекъсването да прати SendMessage() и да накара софтуера да задейства процедурата по синхронизиране... Щото аз както го разбирам той иска хем старият софтуер да си комуникира с въпросния контролер, хем той да прави и web базиран интерфейс, който също да комуникира през този сериен интерфейс с контролера, което няма как да стане, освен ако софтуера не отваря серийния интерфейс, прави каквото прави и после пак го затваря, което обаче малко ме съмнява да е точно така :)


Титла: Re: AT команди към Windows машина
Публикувано от: laskov в Oct 27, 2015, 09:52
Тая сутрин се сетих и за още един вариант. Има едни автоматични превключватели
(https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcRwJC5RYzk6uLk3gYVRQcLgP0P-OOJgB852bFxj0cU7JU0u0AdYiA)
два компютъра с един принтер. Те са за Centronics. Възможно е да има такива и за RS-232, или ако няма, да се направи.

PS 1: И ето какво ми показа Г като потърсих в Изображения "2 computers 1 rs232 device"
(http://i.stack.imgur.com/H06rO.png) , което е в тази тема ($2).

PS 2: Само дето това нещо НЯМА да работи :) . Предназначението му е друго.

PS 3: От тази тема пък стигнах до друга ($2), където е това:
(http://www.compuphase.com/images/termite_com0com.png)


Титла: Re: AT команди към Windows машина
Публикувано от: laskov в Oct 27, 2015, 10:14
Бря, че ми текна мисълта!!! :)

Още едно предложение: Слагаш Windows-а във виртуална машина и правиш гимнастика със хипервайзора. :)


Титла: Re: AT команди към Windows машина
Публикувано от: BRADATA в Oct 27, 2015, 10:33
Бря, че ми текна мисълта!!! :)

Още едно предложение: Слагаш Windows-а във виртуална машина и правиш гимнастика със хипервайзора. :)
Ма тая мисъл кат тече да не земе да удави някой :) Че това с виртуализатора ще излезе по-лесно да се напише от нулата... Не вярвам да е толкова сложно :)


Титла: Re: AT команди към Windows машина
Публикувано от: laskov в Oct 27, 2015, 10:41
Да, ама виж по-горе. Има PS 3 :)


Титла: Re: AT команди към Windows машина
Публикувано от: Ipolit в Oct 27, 2015, 11:16
Мерси на всички. Трябва да проверя дали е зает COM порта от приложението постоянно, ама мисля, че не е.
Иначе си направих едно perl скриптче дето се логва през телнета на уиндоуса, изпълнява командата и се логаутва.


Титла: Re: AT команди към Windows машина
Публикувано от: laskov в Oct 28, 2015, 09:36
Всъщност, първият въпрос, който трябваше да задам е, дали Windows-кото приложение е постоянно стартирано. Ако не, добре. Лесно е и проблем няма.
Аз предположих, че е постоянно стартирано и че портът е  постоянно зает.


Титла: Re: AT команди към Windows машина
Публикувано от: luda_glawa в Oct 28, 2015, 13:04
С риск да прозвуча като пълен идиот - не разбрах какъв е смисъла на цялото упражнение. Защо просто не се направи локално уиндоуско приложение, което да следи за промяна на някакъв флаг в базата и да изпраща нужните команди? Незнам защо го мразите толкова този уиндоус.


Титла: Re: AT команди към Windows машина
Публикувано от: laskov в Oct 28, 2015, 13:17
С 1 изречение: Защото ако основното приложение е постоянно стартирано (напр. за да чете постоянно информация от четците за това кой кога дошъл на работа и кога си тръгнал) и ако то е заело серийния интерфейс, никоя друга програма не може да го ползва този интерфейс и съответно нищо не може да прати по него.


Титла: Re: AT команди към Windows машина
Публикувано от: runtime в Oct 28, 2015, 15:15
И с един допълнителен отговор - може да се прехване идентификатора на софтуера и да се прати посредством функцията SendMessage в API ($2) на прозореца съобщение да изпълни някой евънт за синхронизация.
Например, ако има бутон "синхронизирай" по този начин може да се изпрати съобщение, което да извиква OnClick най-общо казано :)
Няма гаранция дали може да се случат нещата, но дава такава възможност :)  [_]3 Въпреки, че това е малко хахорска работа :-P

SendMessage(hwndButton, BM_CLICK,0, 0)

Идентификаторите може да се намерят по много начини :) FindWindowEx() например...


Титла: Re: AT команди към Windows машина
Публикувано от: ieti в Oct 28, 2015, 16:32
Начини за синхронизация много - преди време се наложи две приложения да си говорят и като най-лесен вариан използвахме нещо като пайпове - погледни в MSDN за CreateMailslot, GetMailslotInfo и тн. Taкa можеш да си направиш перфектна двупосочна комуникация. Всяко приложение чете своя мейлслот и пеше в чуждия. Реализира се лесно и за прости неща е перфектно.

Варианта на laskov с базата е идеален също. Клиентите инсъртват данни в таблица, а ти на определено време проверяваш има ли нещо постъпило там.


Титла: Re: AT команди към Windows машина
Публикувано от: BRADATA в Oct 28, 2015, 17:18
А пък един мармот завива шоколада в станиол :)
Не, че нещо, ама половината от идеите включват притежание на сорса на виндовското приложение, което ако е така - премахва нуждата от гимнастики.

Да се върнем в началото - имаме виндовс и льоникс. Виндовса държи базата, льоникса пише в нея някакви неща. Задачата е като има ъпдейт на базата виндовса да каже на четците "илати да си вземити новити даннички". Как става това? Много просто - след ъпдейт на базата пхп-то се обръща по тцп/удп към някакъв порт на виндовса и му казава "давай". На тоз порт слуша некво програмче, което изпълнява АТ командата при поискване. Това е всичко :) Няма нужда от повече сложнотии.