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

oiv_1968

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

    163
  • Joined

  • Last visited

Posts 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. Доброго времени суток! И пот, что вышло:

    snapshot3.thumb.png.1fd062d825c3e3ba96454ebbf6c923fc.png

    Вот всё отрисовано на холсте 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. Доброго времени суток!

    Подскажите, если можно! Имеем тестовый проект... отрисовка кнопок и выполнение функций при нажатии на них(смотреть только на черный холст... остальное мусор):

    snapshot2.thumb.png.e04ff613a27b314b1ae76875e01a6caf.png

    вот архив:

    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.  

     

    Конечно печально, что никто не сказал, что функция 16 в "mrtusocket.c" пустая. Сам заметил только, что когда потребовалось начать отработку обращений к ТРМ200(OWEN) и ADAM 4051, ADAM 4068 и ADAM 4150(ADVANTECH). Потому как потребовалось заменить ADAM 6501(с Windows CE) на IA-240-Lx. Виндовс в атоматике без присмотра людей - МАЗАХИЗМ. Печально что раньше я этого не знал :(  теперь испытав на своей шкуре знаю :)

    Доброго времени суток!

    Простите за назойливость... но функция 15 протестирована

    Простите с ошибкой для функции со стороны клиента в mrtusocket.c в следующем посте исправлено.

    и... основные варианты доступа к ADAM 4051, ADAM 4068 и ADAM4150 протестированы. В следующем:

    attachicon.gifadvantech.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. Доброго времени суток!

    Но вот вопрос:

    Почему всё-таки на 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 состояние программы.

    Если можете помогите!

    Спасибо!

  9. Доброго времени суток!

    Возникла проблема... управляющая программа - сервер, на 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:~$ 
    

    Сервер на 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,..)

    С Глубоким Уважением!

    Спасбо!

     

    Простите! Вот глупость сморозил:

    NetCat в мирных целях? :D

    Ухожу на 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  отсаются висеть "пожизненно"

  10. Доброго времени суток!

    Возникла проблема... управляющая программа - сервер, на 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,..)

    С Глубоким Уважением!

    Спасбо!

     

  11.  

    Конечно печально, что никто не сказал, что функция 16 в "mrtusocket.c" пустая. Сам заметил только, что когда потребовалось начать отработку обращений к ТРМ200(OWEN) и ADAM 4051, ADAM 4068 и ADAM 4150(ADVANTECH). Потому как потребовалось заменить ADAM 6501(с Windows CE) на IA-240-Lx. Виндовс в атоматике без присмотра людей - МАЗАХИЗМ. Печально что раньше я этого не знал :(  теперь испытав на своей шкуре знаю :)

    Доброго времени суток!

    Простите за назойливость... но функция 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
    
    

    И... простите за назойливость!

  12. Конечно печально, что никто не сказал, что функция 16 в "mrtusocket.c" пустая. Сам заметил только, что когда потребовалось начать отработку обращений к ТРМ200(OWEN) и ADAM 4051, ADAM 4068 и ADAM 4150(ADVANTECH). Потому как потребовалось заменить ADAM 6501(с Windows CE) на IA-240-Lx. Виндовс в атоматике без присмотра людей - МАЗАХИЗМ. Печально что раньше я этого не знал :(  теперь испытав на своей шкуре знаю :)

    Доброго времени суток!

    Изменения. Пока не проверены функции 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

  13. Конечно печально, что никто не сказал, что функция 16 в "mrtusocket.c" пустая. Сам заметил только, что когда потребовалось начать отработку обращений к ТРМ100(OWEN) и ADAM 4051, ADAM 4068 и ADAM 4150(ADVANTECH). Потому как потребовалось заменить ADAM 6501(с Windows CE) на IA-240-Lx. Виндовс в атоматике без присмотра людей - МАЗАХИЗМ. Печально что раньше я этого не знал :(  теперь испытав на своей шкуре знаю :)

  14.  

    Здравствуйте!

    К сожалению, простого способа переноса нет.

    https://www.moxa.ru/forum/index.php?/topic/6697-uc-7112-plus-pomogite-chajniku/ посмотрите, там обсуждался данный вопрос.

     

    Простите за то, что сую свой нос... но по моему мнению самое простое это на машине (можно и виртуальной) с ОС 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 назад.

     

    ...Ну и не забыть проверить разрешения и принадлежности группам.

     

  15.  

    Если я верно понял задачу, то есть приложение которое надо рестартить через вебку, а вебка это не может сделать т.к. процес автораном от рута запущен. Если все верно то:

     

    "boris@inspiron:/home$ su - elena  -c /home/user" - запуск приложения /home/user от имени пользователя elena

    Проверка:

     

    boris@inspiron:~/Work/Science$ ps axu | grep /home/user
    root     19925  0.0  0.0  88732  2308 pts/28   S+   09:40   0:00 su - elena -c /home/user
    elena    19933  0.0  0.0  12520  1056 ?        Ss   09:40   0:00 /home/user  - профит
    boris    19967  0.0  0.0  17184   944 pts/13   S+   09:42   0:00 grep --color=auto /home/user
    boris@inspiron:~/Work/Science$ 
     
     
    Кстати вопрос про вебку - бэкенд на чем написан  cgi-скрипты?

     

     

    ...отвечаю, через огромный срок. Но вот потребовалось сделать то же самое, только на 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. :)

     

    Спасибо!!!!!!!!!!!

     

     

  16. И вот это (добавить в ранее указанный скрипт):

    #копирование директории на удалённый хост
    function scpdirtoremote()
    {
    	setsid scp -r $_localdir $user@$ip:$_remotedir
    }
    
    #копирование директории на локальный хост
    function scpdirtolocal()
    {
    	setsid scp -r $user@$ip:$_remotedir $_localdir
    }
    
    

    для работы с каталогами как на локалке, та и на удалёнке... таким образом можно автоматом заливать иходники, компилировать и забирать исполняемый файл. вот только как быть с SETSID?

  17. А вот это:

    #!/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

  18. Доброго времени суток! С Новым Годом!!! Удачи во всём и крепкого здоровья!!!

    Имеется вот такой скрипт:

    #!/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"

    Заранее спасибо.

  19. Ого! :rolleyes:

    В смысле спасибо!

     

    Доброго времени суток! Простите, если что не так сказал... но вот:

    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>
    
    

    Взято из "коробки" и только указал путь к странице. Но ведь настроить можно по всякому... и это совсем не конфиг. файл

  20.  

    Кстати кроме сетевых соединений там настраивать-то и нечего, а для этого:

    1) входим в устройство по SSH;

    2) если вошли от пользователя (в консоли символ $) то переходите в сессию root(в консоли символ #) и правьте файл /etc/network/interfaces (там кстати хорошие примеры, если посмотрите).

    Будьте внимательны!

    3) применим конфигурацию без перезагрузки устройства

    /etc/init.d/networking restart  вы должны потерять соединение... это нормально если вы поменяли IP для применяемого соединения.

    Переподключитесь к устройству по SSH по новому IP... ВСЁ!!!

    Мне не айпи адрес нужно поменять. Содержимое директории /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

    Я так понимаю, что там Webmin в этой части используется, думаю его из репозитария скорее всего прям взять можно

    а можно ссылку на репозиторий?

     

    Если это настоящий дебиан, то репозиторий - листинг адресов в /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 все, что указано в нём запускается при старте системы.

  21. Кстати кроме сетевых соединений там настраивать-то и нечего, а для этого:

    1) входим в устройство по SSH;

    2) если вошли от пользователя (в консоли символ $) то переходите в сессию root(в консоли символ #) и правьте файл /etc/network/interfaces (там кстати хорошие примеры, если посмотрите).

    Будьте внимательны!

    3) применим конфигурацию без перезагрузки устройства

    /etc/init.d/networking restart  вы должны потерять соединение... это нормально если вы поменяли IP для применяемого соединения.

    Переподключитесь к устройству по SSH по новому IP... ВСЁ!!!

     

×
×
  • Create New...