-
Posts
163 -
Joined
-
Last visited
Content Type
Profiles
Forums
Calendar
Everything posted by oiv_1968
-
Доброго времени суток! ...ответа не дождался... и ничего умнее сделать не смог как применить самодельный "мютекс" ну и простенькие функции отдельном файле Си: //msem.c #include <stdint.h> #include <unistd.h> #include "msem.h" void wmcreate(uint8_t * fm, uint8_t val) { *fm = val; } //ожидание //содержимое fm > 0 - занят void wmutlock(uint8_t * fm) { while(*fm > 0) { usleep(_t_wmutlock); } *fm = 0xFF; } void wmutunlock(uint8_t * fm) { *fm = 0; } Решено было применить это через ту же разделяемую память, только файлы другие. А вот картинка находится в shared memory - файл и "мютекс" для картинки другой файл. А формирую так: int createSHMbmp(void) { //память - создание if ( (shmBMP = shm_open(&SHCMDfilenameBMP[0], O_CREAT|O_RDWR, S_IRWXO|S_IRWXG|S_IRWXU)) == -1 ) return 1; if ( ftruncate(shmBMP, _BMP_DUMP_SIZE_ + 1) == -1 ) return 2; if ( (addrBMP = mmap(0, _BMP_DUMP_SIZE_+1, PROT_WRITE|PROT_READ, MAP_SHARED, shmBMP, 0)) == (u_int8_t*)-1 ) return 3; // if ( (semBMP = shm_open(&SHSEMfilenameBMP[0], O_CREAT|O_RDWR, S_IRWXO|S_IRWXG|S_IRWXU)) == -1 ) return 4; if ( ftruncate(semBMP, sizeof(pthread_mutex_t) + 1) == -1 ) return 5; if ( (addrsemBMP = mmap(0, sizeof(pthread_mutex_t) + 1, PROT_WRITE|PROT_READ, MAP_SHARED, semBMP, 0)) == (u_int8_t*)-1 ) return 6; wmcreate(addrsemBMP, 0); wmutlock(addrsemBMP); //анализ шаблона BMP BMP_FileAnalise(&filenameBMP[0], addrBMP); wmutunlock(addrsemBMP); return 0; } Ну и работа так: wmutlock(addrsemBMP); test8(); BMP_textout(&testline[0], 50, 140, 255,255,0, 0,0,0, 0); gp_circlesec_ind(220, 340, 50, 45, scnt, 1, 255, 255, 255); gp_circlesec_ind(220, 210, 50, 45, scnt, 2, 255, 255, 255); gp_circlesec_ind(420, 340, 50, 45, scnt, 3, 255, 255, 255); gp_circlesec_ind(420, 210, 50, 45, scnt, 4, 255, 255, 255); sliderCTRL(mX, mY, 0); wmutunlock(addrsemBMP); Проверки wmutlock(addrsemBMP); - захватили, wmutunlock(addrsemBMP); - отпустили. Может надо по другому, но это функционирует.
-
Доброго времени суток! ...собственно опять беспокою Вас по этой теме. И всё бы отлично... но решил разделить тестовую программу на разные процессы (не потоки). Это в теме "LX-7112-LX-Plus... может баловство... а может и нет". Смысл в том, что "websocket - server" это один процесс. Его задача контролировать изменение на картинке в shared memory... и если она отличается от ранее посланной, начать пересылку. Второй его задачей является приём событий от браузера и ложить команды в shared memory (но уже другой файл). Другой процесс собственно занимается анализом этих команд (из shared memory) и изменение картинки в shared memory. И всё бы отлично, но каков вариант синхронизации данных. Проблема в том что "sem_open" не работает на устройстве Есть вариант использовать sem_init, но там не задается имя семафора. А оба процесса запускаются с помощью bash скрипта, где указываются имена файлов картинки, файла команд и семафоров. Компиляция проходит успешно... но вот запуск на устройстве не выходит. Следует отметить, что на других Linux машинах всё работает. А имена файлов и семафоров важны. Заранее спасибо.
-
Доброго времени суток! Всё это работает, но... но происходит утечка памяти со стороны браузера(клиента). Постепенно увеличивается объём занятого пространства ОЗУ. И вот такое (index.html) решает проблему: <!DOCTYPE html> <html><head> <meta content="text/html; charset=utf-8" http-equiv="content-type"> <meta http-equiv='cache-control' content='no-cache'> <meta http-equiv='expires' content='0'> <meta http-equiv='pragma' content='no-cache'> <title>test4</title></head><body style="color: white; background-color: black;" alink="#000099" link="#000099" vlink="#990099"> <div style="text-align: center;"><img id="work" style="width: 640px; height: 480px;" onclick=mouseclick() alt="" src=""></div> <script type="text/javascript"> ns4 = (document.layers)? true:false ie4 = (document.all)? true:false var X; var Y; var wx; var wY; var WX; var WY; //параметры лдля отправки var msend; //строка для отправки var Wx = 0; //координата X курсора var Wy = 0; //координата Y курсора var Wk = 0; //флаг клика function init() { if (ns4) {document.captureEvents(Event.MOUSEMOVE);} document.onmousemove=mousemove; } function mousemove(event) { var mouse_x = y = 0; if (document.attachEvent != null) { mouse_x = window.event.clientX; mouse_y = window.event.clientY; } else if (!document.attachEvent && document.addEventListener) { mouse_x = event.clientX; mouse_y = event.clientY; } var we = document.getElementById("work"); X = we.clientWidth; Y = we.clientHeight; status="x = " + mouse_x + ", y = " + mouse_y; wx = mouse_x - we.getBoundingClientRect().left; wy = we.getBoundingClientRect().top - mouse_y + Y; if((wx > 0) && (wx < X) && (wy > 0) && (wy < Y)) { WX = wx.toFixed(0); WY = wy.toFixed(0); } } var wsApp = (function() { var wsApp = {}; var wsUri = "ws://" + window.location.hostname + ":4321/"; var outputEl; var wscreen; var websocket; // var ta; var blob; wsApp.init = function() { outputEl = document.getElementById("output"); wscreen = document.getElementById("work"); testWebSocket(); ta = document.querySelector("#work"); blob = new Blob([evt.data], {type: "image/bmp"}); }; function testWebSocket(){ websocket = new WebSocket(wsUri); websocket.onopen = onOpen; websocket.onclose = onClose; websocket.onmessage = onMessage; websocket.onerror = onError; } function onOpen(evt){ writeToScreen("CONNECTED"); doSend("WebSocket rocks"); } function onClose(evt){ writeToScreen("DISCONNECTED"); } function onMessage(evt){ ta.src = window.URL.createObjectURL(evt.data); window.URL.revokeObjectURL(ta.src); cache.delete('work.bmp'); cache.clear(); } function onError(evt){ writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data); } function doSend(message){ writeToScreen("SENT: " + message); websocket.send(message); } wsApp.send = function(message) { websocket.send(message); } function writeToScreen(message){ var pre = document.createElement("p"); pre.style.wordWrap = "break-word"; pre.innerHTML = message; outputEl.appendChild(pre); } return wsApp; })(); //клик function mouseclick() { if((WX > 0) && (WX < X) && (WY > 0) && (WY < Y)) { Wx = WX; Wy = WY; Wk = 1; } msend = "mouse_X: " + Wx + "\nmouse_Y: " + Wy + "\n"; wsApp.send(msend); } init(); window.addEventListener("load", wsApp.init, false); </script> </body></html> И ещё изменил код на Си (точнее пока изменяю)... в сторону ускорения работы.
-
Доброго времени суток! И пот, что вышло: Вот всё отрисовано на холсте 640х480 24 бита. отрисовка фигур при нажатии соответствующей кнопки. Координаты и т.п. просто так фиксированной величины... а цвет фигуры задаётся элементами "slider" Тестовая программа представляет собой websocket сервер, который запускается как программа. Доступ к нему через веб страницу, загружаемую с веб сервера устройства. Всё в архиве. В корне запускаемый скрипт create.sh... при запуске компиляция и копирование всего, что надо в директорию work. Все из неё скопировать в рабочую директорию веб сервера (у меня Apache) устройства (у меня UC-7112-Lx-plus) и запустить start.sh. А из браузера надо войти на веб страницу устройства. И у вас указанное на рисунке... программа слушается кнопок и настроек и всё это на холсте. В самом коде HTML+JS нет никаких элементов управления, а только определение координат курсора и посылке их при клике мышкой на холсте. Ну понятное дело в программе testobj анализируются события и координаты, а так же реагирование на элементы "button" и "slider". При изменении содержимого холста... он посылается на веб страницу клиента. Кнопки (в main.c): .... buttonsINIT(); //инициализируем кнопки buttonCREATE(10, 10, 80, 20, "circle\0", 255, 127, 127, 0,0,0, &test1); //создание кнопки (координаты, размер, текст, цвет, адрес функции) buttonCREATE(100, 10, 80, 20, "circlef\0", 127, 255, 127, 0,0,0, &test2); buttonCREATE(190, 10, 80, 20, "rect\0", 127, 127, 255, 0,0,0, &test3); buttonCREATE(280, 10, 80, 20, "reectf\0", 192, 192, 192, 0,0,0, &test4); buttonCREATE(370, 10, 80, 20, "triangle\0", 192, 0, 0, 0,0,0, &test5); buttonCREATE(460, 10, 80, 20, "clear\0", 255, 255, 255, 0,0,0, &test8); slidersINIT(); //инициализируем слайдервы sliderCREATE(10,100,20,100, 0,255, (int16_t*)(&R), 255,255,255, 255,0,0); //создаём слайдер (координаты, размер, цвет, адрес параметра) sliderCREATE(35,100,20,100, 0,255, (int16_t*)(&G), 255,255,255, 0,255,0); sliderCREATE(60,100,20,100, 0,255, (int16_t*)(&B), 255,255,255, 0,0,255); ... while(1) { buttonCTRL(mX, mY, 0); //проверяем состояние кнопок и выполняем и перерисовываем если нажаты sliderCTRL(mX, mY, 0); //проверяем состояние слайдеров и меняем параметр и перерисовываем если клик на них ... } //а это одна из выполняемых функций void test1(void) { BMP_Circle(320, 240, 50, R, G, B); //один из цветов задаётся кликом на одном из слайдеров } При этом приём, отправка, анализ в отдельных потоках программы. Вот архив: wsobj.zip Всё... теперь можно через браузер отображать что угодно... практически в реальном времени, при этом иметь элементы управления.
-
Доброго времени суток! Подскажите, если можно! Имеем тестовый проект... отрисовка кнопок и выполнение функций при нажатии на них(смотреть только на черный холст... остальное мусор): вот архив: wsobj.zip Нажимаем на кнопки на чёрном холсте и происходит отрисовка фигур. Для компиляции изменить Maktfile (makesrc/Makefile) выбрав компилятор: ########################### # Simple Generic Makefile # ########################### #Это для Android (Terminal IDE) ###################### #CC=terminal-gcc ###################### #Это для всех Debian/Raspbian ###################### CC=gcc ###################### #Это для MOXA ###################### #PREFIXPATH=/usr/local/arm-linux/bin #CC=$(PREFIXPATH)/arm-linux-gcc ###################### CFLAGS=-c -Wall LDFLAGS=-lpthread -lcrypto -lm #SOURCES=*.c SOURCES=$(shell ls *.c) OBJECTS=$(SOURCES:.c=.o) EXECUTABLE=../bin/testobj all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .c.o: $(CC) $(CFLAGS) $< -o $@ install: install -m 0755 $(EXECUTABLE) $(HOME)/local/bin clean: rm -rf *o $(EXECUTABLE) После выполнения: ./create.sh Получим в директории work: igor@debian-i:~/coding/GCC/wsobj/work$ ls -al итого 1004 drwxr-xr-x 2 igor igor 4096 Июн 11 12:18 . drwxr-xr-x 11 igor igor 4096 Июн 9 07:30 .. -rw-r--r-- 1 igor igor 7406 Июн 11 12:18 favicon.ico -rw-r--r-- 1 igor igor 6081 Июн 11 12:18 index.html -rwxr-xr-x 1 igor igor 32 Июн 11 12:18 start.sh -rwxr-xr-x 1 igor igor 58106 Июн 11 12:18 testobj -rw-r--r-- 1 igor igor 925101 Июн 11 12:18 work.bmp igor@debian-i:~/coding/GCC/wsobj/work$ Это надо скопировать в рабочую(тестовую) директорию WEB сервера, запустить ./start.sh: igor@debian-i:~/coding/GCC/wsobj/work$ ./start.sh BMP filename: work.bmp Size Struct info 124 dec 7c hex Version "5" --- step x 3 --- step y 1920 --------------------------------------------------------------------------------- Type : 4d42 Size : 921738 bytes Start addr: 8a hex --------------------------------------------------------------------------------- Widht : 640 Haight : 480 Bit in Pixel(color) 24 starting loop redraw..... res = 1 cnt buttons = 7 Холст (work.bmp) определён, а сервер готов принимать WS запросы на порт 4321 и исполнять некие команды с открытой в браузере страницы. А пролема в том, что в JavaScript на странице надо для каждого адреса прописывать var wsApp = (function() { var wsApp = {}; var wsUri = "ws://127.0.0.1:4321/"; //var wsUri = "ws://192.168.0.240:4321/"; var outputEl; var wscreen; var websocket; // wsApp.init = function() { outputEl = document.getElementById("output"); wscreen = document.getElementById("work"); testWebSocket(); }; function testWebSocket(){ websocket = new WebSocket(wsUri); websocket.onopen = onOpen; websocket.onclose = onClose; websocket.onmessage = onMessage; websocket.onerror = onError; websocket.send } function onOpen(evt){ writeToScreen("CONNECTED"); doSend("WebSocket rocks"); } function onClose(evt){ writeToScreen("DISCONNECTED"); } function onMessage(evt){ var ta = document.querySelector("#work"); var blob = new Blob([evt.data], {type: "image/bmp"}); ta.src = URL.createObjectURL(evt.data); } function onError(evt){ writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data); } function doSend(message){ writeToScreen("SENT: " + message); websocket.send(message); } wsApp.send = function(message) { websocket.send(message); } function writeToScreen(message){ var pre = document.createElement("p"); pre.style.wordWrap = "break-word"; pre.innerHTML = message; outputEl.appendChild(pre); } return wsApp; })(); а именно wsUri. Получается адрес страницы одно, а адрес websocket другое. Хотелось бы автоматом. Если разместить страницу с содержимым на другое устройство, то и wsUri надо прописывать для него. Знатоки JavaScript подскажите как победить... или надо через PHP формировать страницу на сервере? Спасибо!
-
IA240-LX ModBus RTU Master
oiv_1968 replied to zahar's topic in Встраиваемые коммуникационные компьютеры
Доброго времени суток! Простите за назойливость... но функция 15 протестирована Простите с ошибкой для функции со стороны клиента в mrtusocket.c в следующем посте исправлено. и... основные варианты доступа к ADAM 4051, ADAM 4068 и ADAM4150 протестированы. В следующем: advantech.h.zip Ну и соответственно в проекте надо применить файлы mrtusocket.h и mtrusocket.c. пример вызова функций следующий: Для чтения входов ADAM 4051: u_int16_t coils; //16-ти битная переменная масеи входов устройства res = ADAM_4051_RCoils(1, &coils); //1 - это адрес устройства Modbus RTU if(res == 0) { //доступ нормален - приступаем к анализу маски входов ... } Для чтения входов устройства ADAM 4150: u_int16_t coils; //переменная маски входов ... res = ADAM_4150_RInCoils(4, &coils); //4 - это адрес устройства Modbus RTU if(res == 0) { //всё нормально - проводим анализ входов ... } Для установки выходов ADAM 4150: u_int8_t coils; //переменная маски выходов ... //устанавливаем нужные биты выходов res = ADAM_4150_WOutCoils(4, &coils); //4 - это адрес устройства Modbus RTU //res - это результат обмена Для установки выходов (реле) устройства ADAM 4068: u_int8_t coils; //переменная маски выходов ... //устанавливаем нужные биты выходов res = ADAM_4068_WrOutCoils(5, &coils); //5 - это адрес устройства Modbus RTU //res - это результат обмена У меня скорость 9600 в условиях больших помех в шкафу. Ну соответственно скрипт запуска собственно сервера Modbus RTU и программ проекта: #!/bin/bash # _mainversion="01.00.01" _maindate="10.02.2018" _mbrtu="./modbusRTUserverS" #сервер Modbus RTU _swc="./swc_moxa" #модуль управления и сервер swc_moxa _swct="./swct_moxa" #модуль работы с термодатчиками swct_moxa # _urlmrtu1="127.0.0.1" #IP адрес Modbus 1 _portmrtu1="8971" #IP порт Modbus 1 _urlmrtu2="127.0.0.1" #IP адрес Modbus 2 _portmrtu2="8972" #IP порт Modbus 2 _lurl="127.0.0.1" #IP адрес для обращения к swc_moxa _lport="8197" #порт прослешивания модуля swc_moxa # _par1="" _par2="" function _help() { echo -e "----------- swc_moxa.sh version:$_mainversion date:$_maindate ------------" echo -e "$0 help - текущая подсказка" echo -e "$0 versions - версии компонентов системы" echo -e "$0 start - обычный запуск" echo -e "$0 start --inf - работа с выводом информации в консоль" echo -e "$0 start --noout - работа без реализации устройств вывода" echo -e "$0 start --inf --noout - для диагностики без реализации только вывода в консоль" echo -e "$0 stop - остановка всех компонентов системы включая modbusRTUserverS" } function _loop() { ((loop = 1)) while( ((loop > 0)) ); do sleep 1 done } case $1 in "start") killall -9 swct_moxa killall -9 swc_moxa killall -9 modbusRTUserverS echo ">>> start ModbusRTU <<<" #сервер связи с блоками управления $_mbrtu -sp 0 -br 9600 -db 8 -sb 1 -p 8971 & #сервер связи с термоизмерителями $_mbrtu -sp 1 -br 9600 -db 8 -sb 1 -p 8972 & sleep 3 echo ">>> start <<<" $_swc --version $_swct --version echo ">>> start SWC <<<" _par1=$2 _par2=$3 $_swc $_par1 $_par2 -mbip $_urlmrtu1 -mbp $_portmrtu1 -sp $_lport & sleep 3 echo ">>> start SWCT <<<" #$_swct $_par1 $_par2 -mbip $_urlmrtu2 -mbp $_portmrtu2 -sip $_lurl -sp $_lport & $_swct -mbip $_urlmrtu2 -mbp $_portmrtu2 -sip $_lurl -sp $_lport & sleep 1 #_loop & ;; "help") _help ;; "versions") echo "Сервер Modbus RTU:" $_mbrtu --version echo "Основной элемент системы управления (уровни, клапаны, насосы...):" $_swc --version echo "Элемент связи с температурными датчиками:" $_swct --version ;; "stop") echo ">>> stop SWCT <<<" killall -9 swct_moxa echo ">>> stop SWC <<<" killall -9 swc_moxa echo ">>> stop Modbus RTU <<<" killall -9 modbusRTUserverS sleep 1 killall -9 $0 ;; *) echo "usage: $0 {start|stop|start --noout|start --inf|help}" ;; esac И... простите за назойливость! modbusRTUserverS.zip -
Сказка про NC... или как его не хватало.
oiv_1968 replied to oiv_1968's topic in Встраиваемые коммуникационные компьютеры
Доброго времени суток! Вот ещё маленький кусочек... Как то довелось применяя NC попробовать сделать "автомат", который сам производит подключение к сайту... даже через прокси. И вез Base 64 не обошлось: base64.zip Для кодирования и декодирования в скрипте BASH. Сделан на Си для IA240(241)/UC-7112-LX-Plus. При запуске без параметров: www-data@pi01:~/ramdisk/nsite3$ ./base64 Необходимы параметры! Первое, что приходит в голову это "help" www-data@pi01:~/ramdisk/nsite3$ ./base64 help не определено! Примените параметрп"--help" для подсказки. www-data@pi01:~/ramdisk/nsite3$ ./base64 --help параметры: --help исходная подсказка --encode <instr> кодирование, где <instr> исходная строка. на выходе будет кодированная строка в Base 64. --decode <instr> декодирование, где <instr> исходная кодированная строка в Base 64. на выходе будет декодированная строка. -e <instr> то же самое, что и --encode -d <instr> то же самое, что и --decode www-data@pi01:~/ramdisk/nsite3$ Не добавляет перевод строки и т.п., потому как применяется для скрипта www-data@pi01:~/ramdisk/nsite3$ ./base64 -e 123 MTIzwww-data@pi01:~/ramdisk/nsite3$ ./base64 -d MTIz 123www-data@pi01:~/ramdisk/nsite3$ ./base64 -e MTIz TVRJeg==www-data@pi01:~/ramdisk/nsite3$ ./base64 -d MTIz 123www-data@pi01:~/ramdisk/nsite3$ ну и теперь получается работать с сайтами через прокси с авторизацией. -
Проблема с удалением сокетов
oiv_1968 replied to oiv_1968's topic in Встраиваемые коммуникационные компьютеры
Простите!!! Я сам виноват с количеством захватов и освобождений мютексов пролетел. Ещё раз простите! -
Проблема с удалением сокетов
oiv_1968 replied to oiv_1968's topic in Встраиваемые коммуникационные компьютеры
Доброго времени суток! Но вот вопрос: Почему всё-таки на UC-7101-Lx (с uCLinux) нормально работает с применением NetCat (аналогично приведённому выше) - прошли сутки # netstat -nlta | grep 8971 tcp 0 0 0.0.0.0:8971 0.0.0.0:* LISTEN tcp 0 0 192.168.0.246:8971 192.168.0.234:36726 ESTABLISHED # , а на IA240-LX и UC7112-LX-Plus как говорил выше. Неужели потму, что UC7101-LX работает от ROOT, а IA240-LX и UC7112-LX-Plus от www-data? Или uCLinux более отработана(обкатана) чем Linux конкретно для указанных устройств? На UC7101-LX контроль ведётся за сервером modbusRTUserverS(знаю, что он кривой - работаю), а на IA240-LX и UC7112-LX-Plus за другим сервером управления. Программы делал аналогично. Или важно что от ROOT? Может какие конфиги в /etc надо доплить? Уж больно удобно проверять по NetCat состояние программы. Если можете помогите! Спасибо! -
Проблема с удалением сокетов
oiv_1968 replied to oiv_1968's topic in Встраиваемые коммуникационные компьютеры
Простите! Вот глупость сморозил: NetCat в мирных целях? Ухожу на PING... Жаль конечно . NC более пригоден. Но как уйти от этого: значения tcp 0 0 192.168.0.232:8197 192.168.0.234:46867 SYN_RECV не беда но вот tcp 1 0 192.168.0.232:8197 192.168.0.234:46726 CLOSE_WAIT отсаются висеть "пожизненно" -
Доброго времени суток! Возникла проблема... управляющая программа - сервер, на IA240-LX не удаляет "мёртвые" соединения. А именно на PC с Debian имеется программа - клиент, которая подключается к этому серверу и считывает данные из программы - сервера на IA240-LX. Тут проблем нет, но вот дополнительный скрипт на Debian контролирует состояние сервера на IA240-LX с помощью nc и при необходимости (разрыве и восстановлении связи) перезапускает локального клиента. Вот скрипт: #!/bin/bash # #адрес утройства swc_moxa _ipaddress_swc_moxa="192.168.0.232" #порт устройства swc_moxa _ipport_swc="8197" # _outdat="../log/start_swc.txt" ./swc.sh stop ((loop = 1)) while( ((loop > 0)) ) do str=$(nc -w1 -vvz $_ipaddress_swc_moxa $_ipport_swc 2>&1) str=$(echo -e "$str" | grep "open") sz=$(echo ${#str}) if ( ((sz > 0)) ); then echo "программа SWC_MOXA запущена - проверяем SWC" str=$(nc -w1 -vvz 0.0.0.0 $_ipport_swc 2>&1) str=$(echo -e "$str" | grep "open") sz=$(echo ${#str}) if ( ((sz > 0)) ); then echo "программа SWC запущена" else echo "запускаем SWC" ./swc.sh stop ServerTime=$(date --date="now" +%d.%m.%Y" "%H:%M:%S) echo -e "Start Sistem Water Ccontrol: $ServerTime" >> $_outdat ./swc.sh start fi else echo "нет доступа к программе SWC_MOXA - остановка SWC" ServerTime=$(date --date="now" +%d.%m.%Y" "%H:%M:%S) echo -e "Start Sistem Water Ccontrol: $ServerTime" >> $_outdat ./swc.sh stop fi sleep 10 done То есть на Debian перезапускает работу своего клиента. На IA240-LX программа-сервер в автозапуске. Собственно в консоли IA240-LX так: www-data@Moxa:~$ netstat -nlta | grep 8197 tcp 0 0 0.0.0.0:8197 0.0.0.0:* LISTEN tcp 0 0 192.168.0.232:8197 192.168.0.234:46867 SYN_RECV tcp 0 0 192.168.0.232:8197 192.168.0.234:46875 SYN_RECV tcp 0 0 192.168.0.232:8197 192.168.0.234:46871 SYN_RECV tcp 0 0 192.168.0.232:8197 192.168.0.234:46863 SYN_RECV tcp 0 0 192.168.0.232:8197 192.168.0.234:46859 SYN_RECV tcp 1 0 192.168.0.232:8197 192.168.0.234:46739 CLOSE_WAIT tcp 1 0 192.168.0.232:8197 192.168.0.234:46747 CLOSE_WAIT tcp 1 0 192.168.0.232:8197 192.168.0.234:46731 CLOSE_WAIT tcp 0 0 127.0.0.1:1027 127.0.0.1:8197 ESTABLISHED tcp 1 0 192.168.0.232:8197 192.168.0.234:46755 CLOSE_WAIT tcp 6664 0 192.168.0.232:8197 192.168.0.234:46729 ESTABLISHED tcp 9840 0 127.0.0.1:8197 127.0.0.1:1027 ESTABLISHED tcp 1 0 192.168.0.232:8197 192.168.0.234:46726 CLOSE_WAIT tcp 1 0 192.168.0.232:8197 192.168.0.234:46743 CLOSE_WAIT tcp 1 0 192.168.0.232:8197 192.168.0.234:46751 CLOSE_WAIT tcp 1 0 192.168.0.232:8197 192.168.0.234:46735 CLOSE_WAIT tcp 1 0 192.168.0.232:8197 192.168.0.234:46759 CLOSE_WAIT www-data@Moxa:~$ значения tcp 0 0 192.168.0.232:8197 192.168.0.234:46867 SYN_RECV не беда но вот tcp 1 0 192.168.0.232:8197 192.168.0.234:46726 CLOSE_WAIT отсаются висеть "пожизненоо" Сервер на IA240 имеет ограничение в 10 клиентов. На устройстве имеется так же клиент для работы с даполнительным Modbus RTU(порт 2) Об устроqстве IA240-LX: www-data@Moxa:~$ uname -a Linux Moxa 2.6.9-uc0 #4 Wed Jun 14 15:40:27 CST 2017 armv4tl unknown www-data@Moxa:~$ Может что не так с устройством - аналогичный метод проверки работоспособности реализован и к UC-7101-LX - там проблем нет: Код Listen сервера (уже добавил излишества... ну понятно почему): void server_listen(void) { int err; fd_set fdss; struct timeval tvs; int count; int csock; u_int8_t work; // pthread_mutex_lock(&ServerMutex); //инициализация данных memset(&cserver.midcl[0], 0, _max_sock); cserver.cntclient = 0; cserver.setcntlive = _stime_life; pthread_mutex_unlock(&ServerMutex); //основной цикл прослушивания while(work) { tvs.tv_sec = _LSOCKET_TIMEOUT_S; tvs.tv_usec = _LSOCKET_TIMEOUT_uS; FD_ZERO(&fdss); FD_SET(listener,&fdss); // err = select(listener + 1,&fdss,&fdss,NULL,&tvs); if(err <= 0) { pthread_mutex_lock(&ServerMutex); work = cserver.work; pthread_mutex_unlock(&ServerMutex); usleep(_listen_sleep); continue; } csock = accept(listener,NULL,NULL); if(!(csock > 0)) { pthread_mutex_lock(&ServerMutex); work = cserver.work; pthread_mutex_unlock(&ServerMutex); shutdown(csock, SHUT_RDWR); close(csock); usleep(_listen_sleep); continue; } //создание потока клиента pthread_mutex_lock(&ServerMutex); count = cserver.cntclient; if(!(count < _max_sock)) { shutdown(csock, SHUT_RDWR); close(csock); goto met2; } count = 0; while(count < _max_sock) { if(cserver.midcl[count] == 0) { #if(_dbg > 0) printf("ServCoon clien %i connecting...\n",count); #endif cserver.csock = csock; cserver.idclient = count; cserver.midcl[count] = 0xFF; // pthread_attr_init(&cserver.tattr[count]); pthread_attr_setdetachstate(&cserver.tattr[count], PTHREAD_CREATE_DETACHED); pthread_create(&cserver.pth[count], &cserver.tattr[count],(void*) server_con, &cserver); // cserver.cntclient++; break; } count++; } // met2: work = cserver.work; pthread_mutex_unlock(&ServerMutex); usleep(_listen_sleep); } pthread_exit(0); } собственно поток работы с соединением( для сокета и shutdown, и close): //поток клиента void server_con(CSERV * cs) { int countlive; int setcntlive; int csock; int idclient; //int rd; //pthread_t pth; u_int8_t midcl; u_int8_t rxbuf[_size_buf]; u_int8_t txbuf[_size_buf]; int txsz; u_int8_t work; int res; #if(_deb_con == 1) printf("ServConn client connected\n"); #endif pthread_mutex_lock(&ServerMutex); countlive = cs->setcntlive; setcntlive = cs->setcntlive; csock = cs->csock; idclient = cs->idclient; midcl = cs->midcl[idclient]; //pth = cs->pth[idclient]; work = cs->work; // #if(_deb_con == 1) printf("swc_moxa server... client:%i connected and starting...\n", idclient); #endif // while(1) { #if(_deb_con > 0) printf("client:%i countlive: %i\n", idclient, countlive); #endif work = cs->work; pthread_mutex_unlock(&ServerMutex); if(work == 0) break; //чтение сокета txsz = 0; memset(&rxbuf[0], 0, _size_buf); res = swcReadSocket(csock, &rxbuf[0]); switch(res) { case 0: //Null goto mexit; case -1: //таймаут #if(_swc_deb_con == 1) printf("swc_moxa server... TCP recv. client:%i timeout..\r\n",idclient); #endif break; case -2: //какая-то ошибка сокета #if(_swc_deb_con == 1) printf("swc_moxa server... TCP resv. client:%i err?..\r\n",idclient); #endif goto mexit; case -3: //ошибка размера пакета //передача сообщения о несоответствии #if(_swc_deb_con == 1) printf("swc_moxa server... TCP recv. client:%i frame no correct..\r\n",idclient); #endif goto mexit; //отмена обработки запроса default: //нормально - данные приняты //countlive = setcntlive; //обработка команд и данных сокета #if(_swc_deb_con == 1) printf("swc_moxa server... TCP recv. client:%i starting mwork..\n",idclient); #endif memset(&txbuf[0], 0, _size_buf); txsz = mwork(&rxbuf[0], &txbuf[0]); break; } //передача данных if(txsz > 0) { res = swcWriteSocket(csock, &txbuf[0], txsz); switch(res) { case 0: #if(_swc_deb_con == 1) printf("swc_moxa server... TCP swnd.:%i null send..\r\n",idclient); #endif break; case -1: //таймаут #if(_swc_deb_con == 1) printf("swc_moxa server... TCP send.:%i timeout..\r\n",idclient); #endif break; case -2: #if(_swc_deb_con == 1) printf("swc_moxa server... TCP send.:%i err?..\r\n",idclient); #endif goto mexit; default: countlive = setcntlive; break; } } //ожидание и новый цикл countlive--; if(!(countlive > 0)) //никому это соединение не нужно break; usleep(_conn_sleep); pthread_mutex_lock(&ServerMutex); } mexit: shutdown(csock, SHUT_RDWR); close(csock); pthread_mutex_lock(&ServerMutex); cs->midcl[idclient] = 0; cs->cntclient--; pthread_mutex_unlock(&ServerMutex); //return 0; pthread_exit(0); } Честно сказать не первый день бьюсь... но не испытал на своём UC7112-Lx-Plus. Он для теста и разработки. И если скрипт контроля не запускать, то всё нормально... вот только на объекте электричество отключают не редко. А восстановить параметры некому. Может что с версией прошивки не то? Поставил в проект из коробки, только SD карту поставил и примонтировал /usr, /home... пердварительно скопировав в них нужные файлы с устройства и даполнив своими (mc, nc,..) С Глубоким Уважением! Спасбо!
-
IA240-LX ModBus RTU Master
oiv_1968 replied to zahar's topic in Встраиваемые коммуникационные компьютеры
Доброго времени суток! Простите за назойливость... но функция 15 протестирована Простите modbusRTUserverS с ошибкой для функции со стороны клиента в mrtusocket.c в следующем посте исправлено... остальное нормально. и... основные варианты доступа к ADAM 4051, ADAM 4068 и ADAM4150 протестированы. В следующем: advantech.h.zip Ну и соответственно в проекте надо применить файлы mrtusocket.h и mtrusocket.c. пример вызова функций следующий: Для чтения входов ADAM 4051: u_int16_t coils; //16-ти битная переменная масеи входов устройства res = ADAM_4051_RCoils(1, &coils); //1 - это адрес устройства Modbus RTU if(res == 0) { //доступ нормален - приступаем к анализу маски входов ... } Для чтения входов устройства ADAM 4150: u_int16_t coils; //переменная маски входов ... res = ADAM_4150_RInCoils(4, &coils); //4 - это адрес устройства Modbus RTU if(res == 0) { //всё нормально - проводим анализ входов ... } Для установки выходов ADAM 4150: u_int8_t coils; //переменная маски выходов ... //устанавливаем нужные биты выходов res = ADAM_4150_WOutCoils(4, &coils); //4 - это адрес устройства Modbus RTU //res - это результат обмена Для установки выходов (реле) устройства ADAM 4068: u_int8_t coils; //переменная маски выходов ... //устанавливаем нужные биты выходов res = ADAM_4068_WrOutCoils(5, &coils); //5 - это адрес устройства Modbus RTU //res - это результат обмена У меня скорость 9600 в условиях больших помех в шкафу. Ну соответственно скрипт запуска собственно сервера Modbus RTU и программ проекта: #!/bin/bash # _mainversion="01.00.01" _maindate="10.02.2018" _mbrtu="./modbusRTUserverS" #сервер Modbus RTU _swc="./swc_moxa" #модуль управления и сервер swc_moxa _swct="./swct_moxa" #модуль работы с термодатчиками swct_moxa # _urlmrtu1="127.0.0.1" #IP адрес Modbus 1 _portmrtu1="8971" #IP порт Modbus 1 _urlmrtu2="127.0.0.1" #IP адрес Modbus 2 _portmrtu2="8972" #IP порт Modbus 2 _lurl="127.0.0.1" #IP адрес для обращения к swc_moxa _lport="8197" #порт прослешивания модуля swc_moxa # _par1="" _par2="" function _help() { echo -e "----------- swc_moxa.sh version:$_mainversion date:$_maindate ------------" echo -e "$0 help - текущая подсказка" echo -e "$0 versions - версии компонентов системы" echo -e "$0 start - обычный запуск" echo -e "$0 start --inf - работа с выводом информации в консоль" echo -e "$0 start --noout - работа без реализации устройств вывода" echo -e "$0 start --inf --noout - для диагностики без реализации только вывода в консоль" echo -e "$0 stop - остановка всех компонентов системы включая modbusRTUserverS" } function _loop() { ((loop = 1)) while( ((loop > 0)) ); do sleep 1 done } case $1 in "start") killall -9 swct_moxa killall -9 swc_moxa killall -9 modbusRTUserverS echo ">>> start ModbusRTU <<<" #сервер связи с блоками управления $_mbrtu -sp 0 -br 9600 -db 8 -sb 1 -p 8971 & #сервер связи с термоизмерителями $_mbrtu -sp 1 -br 9600 -db 8 -sb 1 -p 8972 & sleep 3 echo ">>> start <<<" $_swc --version $_swct --version echo ">>> start SWC <<<" _par1=$2 _par2=$3 $_swc $_par1 $_par2 -mbip $_urlmrtu1 -mbp $_portmrtu1 -sp $_lport & sleep 3 echo ">>> start SWCT <<<" #$_swct $_par1 $_par2 -mbip $_urlmrtu2 -mbp $_portmrtu2 -sip $_lurl -sp $_lport & $_swct -mbip $_urlmrtu2 -mbp $_portmrtu2 -sip $_lurl -sp $_lport & sleep 1 #_loop & ;; "help") _help ;; "versions") echo "Сервер Modbus RTU:" $_mbrtu --version echo "Основной элемент системы управления (уровни, клапаны, насосы...):" $_swc --version echo "Элемент связи с температурными датчиками:" $_swct --version ;; "stop") echo ">>> stop SWCT <<<" killall -9 swct_moxa echo ">>> stop SWC <<<" killall -9 swc_moxa echo ">>> stop Modbus RTU <<<" killall -9 modbusRTUserverS sleep 1 killall -9 $0 ;; *) echo "usage: $0 {start|stop|start --noout|start --inf|help}" ;; esac И... простите за назойливость! -
IA240-LX ModBus RTU Master
oiv_1968 replied to zahar's topic in Встраиваемые коммуникационные компьютеры
Доброго времени суток! Изменения. Пока не проверены функции 15 и 16(16 ранее "удалена" случайно). Всё касается только mrtusocket.c в применении со стороны клиента. Поддержка 5-ти "кадров" обмена для каждого устройства. ...следующий пост содержит уже испытанный сервер с доступом по функции 15 и работа к устройствам ADAM Так же вариант применения для обмена с ТРМ200 (ОВЕН). Прилагаемый вариант для применения с mrtusocket.c в конфигурации клиента. Применена функция 3. Кадр (его номер) указывать не надо, а только структуру из owenmrtu.h Вот эту: #define _owenversion "01.02.01" #define _owendate "07.02.2018" #include "mrtusocket.h" /***************************** ТРМ200 *****************************/ #define _TRM200_STAT 0x1008 //регистр статуса #define _TRM200_PV1 0x1009 //измеренная величина на входе 1 Float32 #define _TRM200_PV2 0x100D //измеренная величина на входе 2 Float32 #define _TRM200_rdframe1 0 #define _TRM200_rdframe2 1 #define _TRM200_TimeWait 2000000 #define _TRM200_TimeLive 500 #define _TRM200_TwSleep 1000000 // #define _TRM200_stat_err_pv1 0x0001 //ошибка входа 1 #define _TRM200_stat_err_pv2 0x0002 //ошибка входа 2 typedef struct _mTRM200 { u_int16_t stat; float pv1; float pv2; } mTRM200; #define _mTRM200_regs1 4 //количество регистров для структуры mTRM200 //чтение данных измерений extern int rdTRM200( u_int8_t mAddr, mTRM200 *trm200, u_int8_t Flag ); #endif Вот так объявить и применить: //объявить.. в моём случае в файле main.c ... mTRM200 dtrm200; TRM200 trm200; ... //так делаем соединение с сервером modbusRTUserverS //запуск клиента связи с Modbus RTU чтения термодатчиков res = mrtusocketConnect(); switch(res) { case 0: workloop = 1; //запуск потока чтения температуры по Modbus RTRU pthread_create(&hlopptMRTU,NULL,(void*) lopptMRTU,NULL); break; default: printf("Не удалось подключение к серверу чтения термодатчиков по Modbus RTU:%i\n", res); return -3; } ... //и применить в функции так... она у меня отдельным потоком (нитью) void lopptMRTU(void) { int res; mTRM200 dtrm200; //наша структура из файла owenmrtu.h while(workloop) { res = rdTRM200(6, (mTRM200*)(&dtrm200), 1); switch(res) { case 0: pthread_mutex_lock(&MainMutex); trm200.trm200.t_out = dtrm200.pv2; trm200.trm200.t_in = dtrm200.pv1; trm200.trm200.stat = dtrm200.stat; trm200.conn = 0xFF; //наличие связи с прибором pthread_mutex_unlock(&MainMutex); break; default: pthread_mutex_lock(&MainMutex); trm200.conn = 0x00; //отсутствие связи с прибором pthread_mutex_unlock(&MainMutex); break; } usleep(_loopMRTUsleep); } pthread_exit(0); } ... Понятное дело, что кусок данной программы передаёт данные основной программе... которая собственно и является тоже сервером для клиентов. Почему так? Да потому, что данный ТРМ200 имеет привычку "зависать" и вешать целый Modbus. Потому на такую программу вместе с экземпляром сервера modbusRTUserverS внимание не критично. Если и повиснет, то всё равно другой Modbus (modbusRTUservrerS) для управления продолжит работать ка ни в чём не бывало на этом же устройство. Потихоньку переношу всё из ADAM6501 на IA240-LX. Работа такова, что после удаления ADAM6501 у меня будет только одна 8-ми часовая смена для запуска... и возможно потребуется остаться на сутки. Потому и готовлюсь основательно - все элементы системы надо приготовить сразу. После этого будут предоставлен код ля работы с устройствами ввода и вывода ADAM4051, ADAM4068 и ADAM4150... для которых и будет другой Modbus RTU. Кстати... а что с применением новых устройств подобного класса? Именно контроллеры на Linux. modbusRTUserverS.zip owenmrtu.zip -
IA240-LX ModBus RTU Master
oiv_1968 replied to zahar's topic in Встраиваемые коммуникационные компьютеры
Конечно печально, что никто не сказал, что функция 16 в "mrtusocket.c" пустая. Сам заметил только, что когда потребовалось начать отработку обращений к ТРМ100(OWEN) и ADAM 4051, ADAM 4068 и ADAM 4150(ADVANTECH). Потому как потребовалось заменить ADAM 6501(с Windows CE) на IA-240-Lx. Виндовс в атоматике без присмотра людей - МАЗАХИЗМ. Печально что раньше я этого не знал теперь испытав на своей шкуре знаю -
Автозапуск от пользователя в IA240
oiv_1968 replied to oiv_1968's topic in Встраиваемые коммуникационные компьютеры
Вот только... при закрытии сессии SSH запущенный процесс "умирает". Скорее всего поможет если запускать самим сервером APACHE... через ВЕБ страницу. -
Перенести конфигурацию с IA240-lx
oiv_1968 replied to AlexAES's topic in Встраиваемые коммуникационные компьютеры
Простите за то, что сую свой нос... но по моему мнению самое простое это на машине (можно и виртуальной) с ОС Linux применяя "mc" на одной панели подключиться от ползователя ROOT по FTP к одному устройству, а на другой панели к другому устройству и тоже с правами ROOT. После чего произвести выборочное копирование с исходного устройства на новое. Хотя может имеет смысл использовать в том же "mc" не FTP соединение, а Shell соединение... возможностей больше. После чего проверить атрибуты и принадлежность пользователям в новом устройстве... при необходимостит поправить (я про Shell не просто так сказал). Конечно если надо что-то устанавливать(допустим Apache) это другое дело. А если работать только с /etc и /home, то вполне пригодно. И не забудьте про пользователей в /home их надо создать/добавить в новое устройство. И ещё: ряд прцессов не позволят доступ к файлам с которыми(от которых). Так, что их надо остановить... я имею ввиду тот софт который надо перенести. Остановите его выполнение на устройстве источнике. Если устройство приёмник работает с Ethernen и требует IP для взаимодействия(сетевой комплекс), то конфигурируйте его до перезапуска... при этом устройство источник надо убрать из сети. Вот и самому потребовалось это... А именно подготовить IA240-LX к работе. Понятное дело проект будет совсем другой, но ряд элементов нужны прошлые. Имеем UC-7112-LX-Plus с SD картой: Директория /home и /usr на SD карте и примонтированы на на место указанных. 1) готовим SD карту: -форматируем: root@debian-i:/home/igor# fdisk -l Disk /dev/sda: 320 GB, 320070320640 bytes 255 heads, 63 sectors/track, 38913 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 1 1977 15880221 27 (null) Warning: Partition 1 does not end on cylinder boundary. /dev/sda2 * 1977 38449 292961340 83 Linux Warning: Partition 2 does not end on cylinder boundary. /dev/sda3 38449 38914 3735112 82 Linux swap Warning: Partition 3 does not end on cylinder boundary. Disk /dev/sdb: 20 GB, 20012106240 bytes 255 heads, 63 sectors/track, 2433 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 2434 19551073 84 OS/2 hidden C: Warning: Partition 1 does not end on cylinder boundary. Disk /dev/sdc: 15 GB, 15924142080 bytes 255 heads, 63 sectors/track, 1936 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdc1 1 1937 15558921 c FAT32 LBA Warning: Partition 1 does not end on cylinder boundary. root@debian-i:/home/igor# Наша карта /dev/sdc а файловую систему надо для Linux... и не Fat вовсе: с помощью fdisk в интерактивном режиме делаем что бы было так: Disk /dev/sdc: 15 GB, 15924142080 bytes 255 heads, 63 sectors/track, 1936 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdc1 1 1936 15550888 83 Linux root@debian-i:/home/igor# после этого применив mke2fs собственно форматируем файловую систему: root@debian-i:/home/igor# mke2fs /dev/sdc1 mke2fs 1.42.5 (29-Jul-2012) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 972944 inodes, 3887722 blocks 194386 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=3984588800 119 block groups 32768 blocks per group, 32768 fragments per group 8176 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208 Allocating group tables: done Writing inode tables: done Writing superblocks and filesystem accounting information: done root@debian-i:/home/igor# ну и монтируем в /mnt: root@debian-i:/home/igor# mount /dev/sdc1 /mnt root@debian-i:/home/igor# 2) Итак SD-карта примонтирована... теперь копируем с UC-7112-LX-Plus на нашу карту по сети... Воспользуемся "mc" причём значения не имеет как мы делаем наша карта на PC(с Linux) или в другом устройстве ну IA240-Lx в mc одна панель это примонтированная карта другая это корень нашего UC-7112-LX-Plus(с которого копируем). Я копирую для себя... и мне надо /usr... а /home (сам я там и держу комплект рабочих элементов) сделаю позже но создам на карте. Тем же mc. В итоге на SD(примонтирована в /mnt): root@debian-i:/mnt# ls -al итого 32 drwxr-xr-x 5 root root 4096 Фев 9 13:28 . drwxrwxrwx 28 root root 4096 Фев 7 11:50 .. drwxr-xr-x 2 root root 4096 Фев 9 13:28 home drwx------ 2 root root 16384 Фев 9 13:08 lost+found drwxr-xr-x 6 root root 4096 Июн 2 2009 usr root@debian-i:/mnt# теперь смотрим наш /etc/rc.d/rc.local(обратите внимание это мОй rc.local и там мОй мусор): # !/bin/bash #ram disk /etc/init.d/ramdisk mount /mnt/sd/home /home mount /mnt/sd/root /root mount /mnt/defdisk /home/httpd/ramdisk chmod 777 /home/httpd/ramdisk #halt reboot chmod u+s /etc/init.d/reboot chmoh u+s /etc/init.d/halt #mount /usr/bin mount /mnt/sd/usr /usr mount /mnt/sd/lib /lib #share devices /etc/init.d/sharedev & export TERM=xterm export TERMINFO=/usr/lib/mc/lib/terminfo # Add you want to run daemon #httpd directory inuit /home/httpd/http_init.sh #apache /etc/init.d/apache start #netctl.sh #/etc/init.d/netctl.sh & #test Как видно тут у меня RAM диск (etc/init.d/ramdisk), настройка для mc(он есть на устройстве...кстати тут на форуме и повзаимствовал)... и соответственно в этом же файле и ссылка на то что должно запуститься при включении. Мне нужен etc/init.d/ramdisk... и я собираюсь его тоже забрать из UC-7112-LX-Plus и положить в IA240-LX. Вот он(это не мной сделано): #!/bin/bash # ramdisk.sh # "электронный диск" -- это область в ОЗУ компьютера #+ с которой система взаимодействует как с файловой системой. # Основное преимущество -- очень высокая скорость чтения/записи. # Недостатки -- энергозависимость, уменьшение объема ОЗУ, доступного системе, # относительно небольшой размер. # # Чем хорош электронный диск? # При хранении наборов данных, таких как таблиц баз данных или словарей, на электронном диске #+ вы получаете высокую скорость работы с этими наборами, поскольку время доступа к ОЗУ # неизмеримо меньше времени доступа к жесткому диску. E_NON_ROOT_USER=70 # Сценарий должен запускаться с правами root. ROOTUSER_NAME=root MOUNTPT=/mnt/defdisk SIZE=2000 # 2K блоков (измените, если это необходимо) BLOCKSIZE=1024 # размер блока -- 1K (1024 байт) DEVICE=/dev/ram1 # Первое устройство ram username=`id -nu` if [ "$username" != "$ROOTUSER_NAME" ] then echo "Сценарий должен запускаться с правами root." exit $E_NON_ROOT_USER fi if [ ! -d "$MOUNTPT" ] # Проверка наличия точки монтирования, then #+ благодаря этой проверке, при повторных запусках сценария mkdir $MOUNTPT #+ ошибки возникать не будет. fi dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE # Очистить электронный диск. mke2fs $DEVICE # Создать файловую систему ext2. mount $DEVICE $MOUNTPT # Смонтировать. chmod 777 $MOUNTPT # Сделать электронный диск доступным для обычных пользователей. # Но при этом, только root сможет его отмонтировать. echo "Электронный диск \"$MOUNTPT\" готов к работе." # Теперь электронный диск доступен для любого пользователя в системе. # Внимание! Электронный диск -- это энергозависимое устройство! Все данные, хранящиеся на нем, #+ будут утеряны при остановке или перезагрузке системы. # Если эти данные представляют для вас интерес, то сохраняйте их копии в обычном каталоге. # После перезагрузки, чтобы вновь создать электронный диск, запустите этот сценарий. # Простое монтирование /mnt/ramdisk, без выполнения подготовительных действий, не будет работать. exit 0 Эти файлы копирую на ту же SD... временно конечно, но можно и сразу в /etc. Если сразу, то предельно внимательно (иначе надо будет делать всё с начала). 3) И соответственно в rc.local всё, что должно запускаться при включении и скопировать всё что надо используя указанные пути. 4) Если всё организовано аналогично, то есть всё через SD карту, то можно и воспользоваться утилитой "dd", но /etc придётся копировать "вручную" 5) Если делается всё на PC то карту после всех операций надо отмонтировать: root@debian-i:/home/igor# umount /dev/sdc1 root@debian-i:/home/igor# Ну вот и всё. Всё, что делал - делал для нового контроллера... нового проекта. Для переноса конфигураций всё не сложно, но кропотливо. И делается из под ROOT. Сразу говорю в моём rc.local много мусора - старые результаты моего процесса обучения работы с устройством... ну и с Linux конечно. Было лет 8 назад. ...Ну и не забыть проверить разрешения и принадлежности группам. -
Автозапуск от пользователя в IA240
oiv_1968 replied to oiv_1968's topic in Встраиваемые коммуникационные компьютеры
...отвечаю, через огромный срок. Но вот потребовалось сделать то же самое, только на Raspberry Pi 3. TELNET ставить не стал, а как Вы показали так: 1) в /etc/rc.local сделал так(добавил): su www-data -c /home/httpd/bash/wwstart & 2) сам скрипт в директории /home/httpd/bash/wwstart: #!/bin/bash # #рабочая директория _workdir="/home/httpd/ramdisk" #директория скриптов bash _bashdir="/home/httpd/bash" # _pid=$(ps aux | pgrep lwork.sh) echo "p:$_pid" #проверка, копирование, переход и запуск if [ "$_pid" == "" ]; then cp $_bashdir/lwork.sh $_workdir/lwork.sh cd $_workdir ./lwork.sh start & fi # exit 0 потому как работаем из RAMDISK, то и запуск оттуда. Теперь наш "процесс" можно перезапускать от имени www-data. Спасибо!!!!!!!!!!! -
...как подобрать альтернативу
oiv_1968 replied to oiv_1968's topic in Встраиваемые коммуникационные компьютеры
Так есть ли решение? -
...как подобрать альтернативу
oiv_1968 replied to oiv_1968's topic in Встраиваемые коммуникационные компьютеры
Ну вот!!! С НОВЫМ ГОДОМ!!! Вот беда... как водки попью, так на подвиги тянет. Раньше на другие, а сейчас на эти -
...как подобрать альтернативу
oiv_1968 replied to oiv_1968's topic in Встраиваемые коммуникационные компьютеры
И вот это (добавить в ранее указанный скрипт): #копирование директории на удалённый хост function scpdirtoremote() { setsid scp -r $_localdir $user@$ip:$_remotedir } #копирование директории на локальный хост function scpdirtolocal() { setsid scp -r $user@$ip:$_remotedir $_localdir } для работы с каталогами как на локалке, та и на удалёнке... таким образом можно автоматом заливать иходники, компилировать и забирать исполняемый файл. вот только как быть с SETSID? -
...как подобрать альтернативу
oiv_1968 replied to oiv_1968's topic in Встраиваемые коммуникационные компьютеры
А вот это: #!/bin/bash # user="www-data" ip="192.168.0.240" _sshcmd="" str="" export SSH_ASKPASS=./askpass.sh function sshcmdwork() { str=$( setsid ssh -o StrictHostKeyChecking=no -T $user@$ip << EOF $_sshcmd EOF ) } _sshcmd="ls" sshcmdwork echo ":$str" _sshcmd="df" sshcmdwork echo ":$str" _sshcmd="free" sshcmdwork echo ":$str" тест, который предположительно станет заготовкой. Испытано на PC с Debian. Поучает доступ к UC-7112-LX-plus, выполняет команды на нём и выводит результат в переменную "str".на PC -
Доброго времени суток! С Новым Годом!!! Удачи во всём и крепкого здоровья!!! Имеется вот такой скрипт: #!/bin/bash # user="www-data" ip="192.168.0.240" export DISPLAY=:0; export SSH_ASKPASS=./askpass.sh; #export DISPLAY=:0; export SSH_ASKPASS="www-data"; setsid ssh -o StrictHostKeyChecking=no -T $user@$ip << EOF 2>&1 #ssh -o StrictHostKeyChecking=no -T $user@$ip << EOF 2>&1 ls df EOF Это доступ из одного устройства (UC-7112-Lx-plus/IA240) по SSH к другому. Тут после регистрации одно устройство выполняет команды "ls" и "df' на другом устройстве как пример... и отключается. Предполагается заставить устройство компилировать исходник для самого себя на обычной машине и скачивать себе исполняемый файл... ведь я так и не смог установить GCC на устройство... НО: на MOXA нет возможности выполнить "setsid"... он это не умеет. Прошу помощи... как обойти сие ограничение? Либо поставить на устройство GCC, либо реализовать на нём "setsid" Заранее спасибо.
-
Проблема с web-интерфейсом UC-8112-lx
oiv_1968 replied to Kirill1's topic in Встраиваемые коммуникационные компьютеры
Доброго времени суток! Простите, если что не так сказал... но вот: https://192.168.3.127:10000 Как раз из прилагаемой ссылки... ведь порт 10000. Это явно не привычный 80 для HTTP или 443 для HTTPS. Либо в настройках apache есть что-то и сформирована где-то страница со всем остальным... либо некий софт запущен и слушает этот порт, принимает соединения и работает с ним. В том или ином случае все правила в /etc. Жаль что не могу позволить себе подобное устройство. кстати вот так настроил рабочие директории в своём apache2 (привёл только для порта 80, потому как меньше написано - /etc/apache2/sites-available/default) <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /home/httpd <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /home/httpd/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> Взято из "коробки" и только указал путь к странице. Но ведь настроить можно по всякому... и это совсем не конфиг. файл -
Проблема с web-интерфейсом UC-8112-lx
oiv_1968 replied to Kirill1's topic in Встраиваемые коммуникационные компьютеры
Мне не айпи адрес нужно поменять. Содержимое директории /etc/init.d: apache2 checkfs.sh dbus killprocs mountall.sh mountnfs.sh nfs-common pppd-dns rcS rpcbind single sudo umountfs watchdog bootlogs checkroot-bootclean.sh halt kmod mountdevsubfs.sh mtab.sh nfs-kernel-server procps README rsync skeleton trousers umountnfs.sh wd_keepalive bootmisc.sh checkroot.sh hostname.sh motd mountkernfs.sh mx_uc8100 opencryptoki rc reboot rsyslog snmpd udev umountroot boot_scripts.sh cron hwclock.sh mountall-bootclean.sh mountnfs-bootclean.sh networking openvpn rc.local rmnologin sendsigs ssh udev-mtab urandom а можно ссылку на репозиторий? Если это настоящий дебиан, то репозиторий - листинг адресов в /etc/apt/sources.list и соответственно по root можно поставить то что доступно в репозитории с помощью консольных команд "apt-get" и "aptitude" вот так: apt-get install <название программы(пакета)> ну например: apt-get install webmin А судя по тому, что в данном Вами списке файлов присутствует apache2, то значит WEB сервер присутствует, и скорее всего остановлен. А Вами упомянутая "Webmin" это только WEB-страница с набором скриптов я думаю. Посмотрите открытые порты: netstat -nlta вот пример моего отчёта: kto@debian:/etc/apt$ netstat -nlta Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:60305 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 57 0 192.168.0.237:37366 192.168.0.240:21 CLOSE_WAIT tcp 0 0 192.168.0.237:56120 192.168.0.3:8080 TIME_WAIT tcp 0 0 192.168.0.237:46679 192.168.0.240:22 ESTABLISHED tcp 0 0 192.168.0.237:35918 192.168.0.240:80 ESTABLISHED tcp 0 0 192.168.0.237:35904 192.168.0.240:80 ESTABLISHED tcp 0 0 192.168.0.237:35903 192.168.0.240:80 ESTABLISHED tcp 0 0 192.168.0.237:46678 192.168.0.240:22 ESTABLISHED tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:8118 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN tcp6 0 0 :::445 :::* LISTEN tcp6 0 0 :::139 :::* LISTEN tcp6 0 0 :::45611 :::* LISTEN tcp6 0 0 :::111 :::* LISTEN tcp6 0 0 :::80 :::* LISTEN tcp6 1 0 ::1:58105 ::1:631 CLOSE_WAIT kto@debian:/etc/apt$ Видите в локальных адресах есть (третий столбец слева) порт 80... мой apache работает. В вашем случае, как я читал данную Вами инструкцию, там применяется порт 10000. Но сначала посмотрите свои порты. перезапустить apache2 можно выполнив: /etc/init.d/apache2 restart (в дебиане встроена автозамена "service" на "/etc/init.d/" так что при этом работает и вот такое выражение "service apache2 restart" вместо "/etc/init.d/apache2 restart"). И если он остановлен каким-нибудь скриптом при запуске... то можно его прописать для автозапуска в /etc/rc.local все, что указано в нём запускается при старте системы. -
Проблема с web-интерфейсом UC-8112-lx
oiv_1968 replied to Kirill1's topic in Встраиваемые коммуникационные компьютеры
Кстати кроме сетевых соединений там настраивать-то и нечего, а для этого: 1) входим в устройство по SSH; 2) если вошли от пользователя (в консоли символ $) то переходите в сессию root(в консоли символ #) и правьте файл /etc/network/interfaces (там кстати хорошие примеры, если посмотрите). Будьте внимательны! 3) применим конфигурацию без перезагрузки устройства /etc/init.d/networking restart вы должны потерять соединение... это нормально если вы поменяли IP для применяемого соединения. Переподключитесь к устройству по SSH по новому IP... ВСЁ!!!