Jump to content
Форум по продукции MOXA

oiv_1968

Пользователи
  • Posts

    163
  • Joined

  • Last visited

Everything posted by oiv_1968

  1. Доброго времени суток! ...ответа не дождался... и ничего умнее сделать не смог как применить самодельный "мютекс" ну и простенькие функции отдельном файле Си: //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); - отпустили. Может надо по другому, но это функционирует.
  2. Доброго времени суток! ...собственно опять беспокою Вас по этой теме. И всё бы отлично... но решил разделить тестовую программу на разные процессы (не потоки). Это в теме "LX-7112-LX-Plus... может баловство... а может и нет". Смысл в том, что "websocket - server" это один процесс. Его задача контролировать изменение на картинке в shared memory... и если она отличается от ранее посланной, начать пересылку. Второй его задачей является приём событий от браузера и ложить команды в shared memory (но уже другой файл). Другой процесс собственно занимается анализом этих команд (из shared memory) и изменение картинки в shared memory. И всё бы отлично, но каков вариант синхронизации данных. Проблема в том что "sem_open" не работает на устройстве Есть вариант использовать sem_init, но там не задается имя семафора. А оба процесса запускаются с помощью bash скрипта, где указываются имена файлов картинки, файла команд и семафоров. Компиляция проходит успешно... но вот запуск на устройстве не выходит. Следует отметить, что на других Linux машинах всё работает. А имена файлов и семафоров важны. Заранее спасибо.
  3. Доброго времени суток! Всё это работает, но... но происходит утечка памяти со стороны браузера(клиента). Постепенно увеличивается объём занятого пространства ОЗУ. И вот такое (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> И ещё изменил код на Си (точнее пока изменяю)... в сторону ускорения работы.
  4. Доброго времени суток! И пот, что вышло: Вот всё отрисовано на холсте 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 Всё... теперь можно через браузер отображать что угодно... практически в реальном времени, при этом иметь элементы управления.
  5. Доброго времени суток! Подскажите, если можно! Имеем тестовый проект... отрисовка кнопок и выполнение функций при нажатии на них(смотреть только на черный холст... остальное мусор): вот архив: 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 формировать страницу на сервере? Спасибо!
  6. Доброго времени суток! Простите за назойливость... но функция 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
  7. Доброго времени суток! Вот ещё маленький кусочек... Как то довелось применяя 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$ ну и теперь получается работать с сайтами через прокси с авторизацией.
  8. Простите!!! Я сам виноват с количеством захватов и освобождений мютексов пролетел. Ещё раз простите!
  9. Доброго времени суток! Но вот вопрос: Почему всё-таки на 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 состояние программы. Если можете помогите! Спасибо!
  10. Простите! Вот глупость сморозил: 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 отсаются висеть "пожизненно"
  11. Доброго времени суток! Возникла проблема... управляющая программа - сервер, на 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,..) С Глубоким Уважением! Спасбо!
  12. Доброго времени суток! Простите за назойливость... но функция 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 И... простите за назойливость!
  13. Доброго времени суток! Изменения. Пока не проверены функции 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
  14. Конечно печально, что никто не сказал, что функция 16 в "mrtusocket.c" пустая. Сам заметил только, что когда потребовалось начать отработку обращений к ТРМ100(OWEN) и ADAM 4051, ADAM 4068 и ADAM 4150(ADVANTECH). Потому как потребовалось заменить ADAM 6501(с Windows CE) на IA-240-Lx. Виндовс в атоматике без присмотра людей - МАЗАХИЗМ. Печально что раньше я этого не знал теперь испытав на своей шкуре знаю
  15. Вот только... при закрытии сессии SSH запущенный процесс "умирает". Скорее всего поможет если запускать самим сервером APACHE... через ВЕБ страницу.
  16. Простите за то, что сую свой нос... но по моему мнению самое простое это на машине (можно и виртуальной) с ОС 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 назад. ...Ну и не забыть проверить разрешения и принадлежности группам.
  17. ...отвечаю, через огромный срок. Но вот потребовалось сделать то же самое, только на 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. Спасибо!!!!!!!!!!!
  18. Ну вот!!! С НОВЫМ ГОДОМ!!! Вот беда... как водки попью, так на подвиги тянет. Раньше на другие, а сейчас на эти
  19. И вот это (добавить в ранее указанный скрипт): #копирование директории на удалённый хост function scpdirtoremote() { setsid scp -r $_localdir $user@$ip:$_remotedir } #копирование директории на локальный хост function scpdirtolocal() { setsid scp -r $user@$ip:$_remotedir $_localdir } для работы с каталогами как на локалке, та и на удалёнке... таким образом можно автоматом заливать иходники, компилировать и забирать исполняемый файл. вот только как быть с SETSID?
  20. А вот это: #!/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
  21. Доброго времени суток! С Новым Годом!!! Удачи во всём и крепкого здоровья!!! Имеется вот такой скрипт: #!/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" Заранее спасибо.
  22. Доброго времени суток! Простите, если что не так сказал... но вот: 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> Взято из "коробки" и только указал путь к странице. Но ведь настроить можно по всякому... и это совсем не конфиг. файл
  23. Мне не айпи адрес нужно поменять. Содержимое директории /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 все, что указано в нём запускается при старте системы.
  24. Кстати кроме сетевых соединений там настраивать-то и нечего, а для этого: 1) входим в устройство по SSH; 2) если вошли от пользователя (в консоли символ $) то переходите в сессию root(в консоли символ #) и правьте файл /etc/network/interfaces (там кстати хорошие примеры, если посмотрите). Будьте внимательны! 3) применим конфигурацию без перезагрузки устройства /etc/init.d/networking restart вы должны потерять соединение... это нормально если вы поменяли IP для применяемого соединения. Переподключитесь к устройству по SSH по новому IP... ВСЁ!!!
×
×
  • Create New...