websocket... на Си... имеет ли кто опыт?

Тема в разделе "Флудилка", создана пользователем Igor68, 5 май 2018.

  1. Igor68

    Igor68 Гуру

    ...простите, но совсем забыл:
    для компиляции измените содержимое Makefile(makesrc/Makefile):
    Код (Text):
    ###########################
    # 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)
    Выбрав компилятор раскомментировав нужный вариант и закомментировав остальные.
    После выполнения:
    Код (Text):
    ./create.sh
    в директории work будут файлы:
    Код (Text):
    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$
    ...где work.bmp шаблонный холст чёрного цвета 640х480 24бита;
    index.html собственно страница с JS;
    start.sh скрипт, который запустит testobj с параметрами.
    Всё должно быть скопировано в одну директорию для ВЕБ сервера.
    Надо запустить:
    Код (Text):
    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
    Видно, что программа определила холст и его параметры
    Подключаемся браузером набрав в адресной строке браузера
    Код (Text):
    http://localhost/test/
    Как видите я испытываю на локальной машине, а "test" это тестовая директория, куда я разместил всё это... и где запустил start.sh.
    Собственно и вопрос в "динамике" адреса.
    Спасибо!
     
  2. Igor68

    Igor68 Гуру

    Как понимаю вот это:
    PHP:
    <?php
            echo $_SERVER['SERVER_ADDR'];
    ?>
     
    Значит надо делать файл index.php с ранее указанным содержимым страницы index.html и соответственно вставлять :
    PHP:
    <?php
    ...
    $wsUri = $_SERVER['SERVER_ADDR'];
    ...
    //тут подготовленное содержимое HTML
    //где вместо " применяем \"
    $str = ".............";
    ...
    $str = $str . "var wsUri = \"ws://$wsUri/\"\;";
    //вместо этого
    //var wsUri = "ws://127.0.0.1:4321/";
    ...
    //ну и потом
    echo $str;

    ...
    ?>
    Или надо иначе?
     
    Последнее редактирование: 12 июн 2018
  3. Igor68

    Igor68 Гуру

    Вот ковырял, ковырял... и наковырял:
    PHP:

    <?php
    $wsUri = $_SERVER['SERVER_ADDR'];
    $str1 = "<!DOCTYPE html>
    <html><head><meta content=\"text/html; charset=utf-8\" http-equiv=\"content-type\"><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=\"work.bmp\"></div>\n\n"
    ;

    $str2_1 = "<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://"
    ;

    $str2_2 = ":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;
    })();

    //клик
    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>"
    ;

    $str = $str1.$str2_1.$wsUri.$str2_2;
    echo $str;
    ?>

     
    Иного выдумать не вышло.
     
  4. DEgorov

    DEgorov Нерд

    Не обязательно использовать PHP, можно и на стороне джаваскрипта использовать window.location.hostname тогда PHP тебе не нужен вообще.

    Код (Javascript):
    var wsUri ="ws://" + window.location.hostname + ":4321/";
    Ну это в том случае, если у тебя сам веб-сервер и сервер веб-сокетов на одном хосте, разумеется, но у тебя вроде так и есть.
     
    Igor68 нравится это.
  5. Igor68

    Igor68 Гуру

    Так и есть! На одном хосте!
    Спасибо!
     
  6. Igor68

    Igor68 Гуру

    Доброго времени суток!
    И вот:
    snapshot5.png

    это результат этого:
    wsobj.zip
    Это в 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);
        BMP_textout("1234567890...ABCDEFGH... Font 881", 10, 35, 255,255,255, 0,0,0, 0);
        //setfont(571);
        //BMP_textout("1234567890...ABCDEFGH... Font 571", 10, 45, 255,255,255, 0,0,0, 0);
        printf("cnt buttons = %i\n", buttons.cntb);
        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);
        printf("cnt sliders = %i\n", sliders.cntslrd);
        while(work)
        {
            BMP_textoutV("RED Color", 25, 210, 255,0,0, 0,0,0, 0);
            BMP_textoutV("GREEN Color", 50, 210, 0,255,0, 0,0,0, 0);
            BMP_textoutV("BLUE Color", 75, 210, 0,0,255, 0,0,0, 0);
            buttonCTRL(mX, mY, 0);
            sliderCTRL(mX, mY, 0);
            if(scnt < 100)
                scnt++;
            else
                scnt = 0;
            usleep(300000);
            ...
        }
    Теперь созданы объекты "кнопка" и "слайдер"... работают как надо. Что для одного объекта, что для другого задаются координаты, размер, цвет... но для кнопки задаётся адрес вызываемой функции, а для слайдера адрес параметра. При нажатии на кнопку вызывается функция, а при клике на слайдер изменяется параметр. Для слайдера так же задаетя минимальное и максимальное значение.
    При выполнении create.sh происходит компиляция и копирование в директорию work. Оттуда надо скопировать всё содержимое в рабочую директорию web сервера. После чего запустить скрипт start.sh. После этого браузером войти на страницу web сервера. Ну и послушная картинка. Если прикрутить OpenCV и отображать данные с камеры на картинку... и поверх рисовать(обновлять) элементы управления то выйдет панель управления в браузере... ну допустим машинкой с камерой и малиной. Можно управлять по wifi с мобильника(смартфона) без какого-нибудь ПО на смартфоне... кроме браузера.
    Один только минус - при меняющейся картинке увеличивается объём занятого озу браузером. Но если картинка не меняется память освобождается. Сделал так, что бы картинка не передавалась клиенту, если она соответствует ранее переданной. по всей видимости что объём картинки 1Мб... и в BMP формате.
     

    Вложения:

    • wsobj.zip
      Размер файла:
      93,2 КБ
      Просмотров:
      369
    ИгорьК нравится это.
  7. Igor68

    Igor68 Гуру

    Доброго времени суток! ...но странное дело... кому-то надо "видео" по HTTP(websocket), управление там же, и много ещё чего. И главное - "ЭТО НИИИИКОМУУУУУУ НЕ НАДО". Но задаются вопросы именно по этой теме.
    --- Но ведь так нельзя!
    Может есть решения?
    Извините! Спасибо!
     
  8. Igor68

    Igor68 Гуру

    Доброго времени суток!
    ...для продолжения работы надо ршить проблему с утечкой памяти со стороны клиента (баузера).
    Пока остановился на такой форме:
    Код (Text):

    <!DOCTYPE html>
    <html><head><meta content="text/html; charset=utf-8" http-equiv="content-type"><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;

       wsApp.init = function() {
        outputEl = document.getElementById("output");
         wscreen = document.getElementById("work");
        testWebSocket();
         ta = document.querySelector("#work");
         var 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 = 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;
    })();

    //клик
    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>
     
    И всё равно в процессе работы объём кэша (занятого озу) растёт. Обновление страницы помогает, но при этом теряется связь (потом конечно возобновляется) по websocket. Есть ли какие-нибудь решения?
    Спасибо!
     
  9. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Вот начало тестирования загрузки браузера...
    img1.png

    Начало тестирования 08:35
    Отчёт о занятой памяти (free):
    Код (Text):
    kto@debian:~$ free
                 total       used       free     shared    buffers     cached
    Mem:       3971052    1693876    2277176      79912     105032     613848
    -/+ buffers/cache:     974996    2996056
    Swap:      4106236          0    4106236
    Код HTML+JS:
    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>


     
    В качестве HTTP/WS сервера MOXA UC-7112-LX-Plus. Количество отображаемых элементов на холсте принципиально не нагружают память клиента (браузера). Передаётся весь холст. Картинка непрерывно подвижная.

    Время 10:59 подряд две проверки
    Код (Text):

    kto@debian:~$ free
      total  used  free  shared  buffers  cached
    Mem:  3971052  2012388  1958664  80704  109300  627724
    -/+ buffers/cache:  1275364  2695688
    Swap:  4106236  0  4106236
    kto@debian:~$ free
      total  used  free  shared  buffers  cached
    Mem:  3971052  1967332  2003720  62712  110040  609728
    -/+ buffers/cache:  1247564  2723488
    Swap:  4106236  0  4106236
     
    Время 12:01 две проверки подряд
    Код (Text):

    kto@debian:~$ free
      total  used  free  shared  buffers  cached
    Mem:  3971052  2197392  1773660  63220  112504  612280
    -/+ buffers/cache:  1472608  2498444
    Swap:  4106236  0  4106236
    kto@debian:~$ free
      total  used  free  shared  buffers  cached
    Mem:  3971052  2197908  1773144  63220  112504  612280
    -/+ buffers/cache:  1473124  2497928
    Swap:  4106236  0  4106236
     
    Время 13:31 lдве проверки подряд:
    Код (Text):
    kto@debian:~$ free
                 total       used       free     shared    buffers     cached
    Mem:       3971052    1899212    2071840      64596     115988     645280
    -/+ buffers/cache:    1137944    2833108
    Swap:      4106236          0    4106236
    kto@debian:~$ free
                 total       used       free     shared    buffers     cached
    Mem:       3971052    1997876    1973176      64596     116296     645280
    -/+ buffers/cache:    1236300    2734752
    Swap:      4106236          0    4106236
    Время 15:27 две проверки подряд:
    Код (Text):
    kto@debian:~$ free
                 total       used       free     shared    buffers     cached
    Mem:       3971052    1952040    2019012      64716     120280     661560
    -/+ buffers/cache:    1170200    2800852
    Swap:      4106236          0    4106236
    kto@debian:~$ free
                 total       used       free     shared    buffers     cached
    Mem:       3971052    1952264    2018788      64716     120280     661560
    -/+ buffers/cache:    1170424    2800628
    Swap:      4106236          0    4106236
     
    Последнее редактирование: 28 июн 2018
    ИгорьК и Mitrandir нравится это.
  10. Igor68

    Igor68 Гуру

    Доброго времени суток!
    кстати ври компиляции именно для малины... новой такое:
    Код (Text):
    www-data@pi02:~/src/wsobj$ ./create.sh
    >>> формирование набора файлов в директории work <<<
    ...очистка work
    копирование исходников в src...
    ...копирование Makefile
    ...копирование из wssrc
    ...копирование из bmpsrc
    ...копирование из obsrc
    ...копирование из gpsrc
    ...копирование из src
    ...компиляция в bin
    gcc -c -Wall bar.c -o bar.o
    gcc -c -Wall base64.c -o base64.o
    gcc -c -Wall bmp.c -o bmp.o
    gcc -c -Wall bmpfunc.c -o bmpfunc.o
    gcc -c -Wall buttons.c -o buttons.o
    gcc -c -Wall gpsect.c -o gpsect.o
    gcc -c -Wall main.c -o main.o
    gcc -c -Wall slider.c -o slider.o
    gcc -c -Wall workfunc.c -o workfunc.o
    gcc -c -Wall wsfunc.c -o wsfunc.o
    wsfunc.c:21:25: fatal error: openssl/sha.h: No such file or directory
    #include <openssl/sha.h>
                             ^
    compilation terminated.
    Makefile:33: recipe for target 'wsfunc.o' failed
    make: *** [wsfunc.o] Error 1
    ...копирование в work
    cp: cannot stat ‘bin/*’: No such file or directory                                                                                                                                          
    Очистка srcw...                                                                                                                                                                              
    ...очистка после комптляции                                                                                                                                                                  
    rm -rf *o ../bin/testobj                                                                                                                                                                    
    ...очистка srcw                                                                                                                                                                              
    ...копирование элементов HTML в work                                                                                                                                                        
    ...копироапние BASH скриптов в work                                                                                                                                                          

    www-data@pi02:~/src/wsobj$
    помогло вот это (apt-get install libssl-dev):
    Код (Text):
    root@pi02:/home/httpd# apt-get install libssl-dev
    Reading package lists... Done
    Building dependency tree    
    Reading state information... Done
    The following extra packages will be installed:
      libssl-doc
    The following NEW packages will be installed:
      libssl-dev libssl-doc
    0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
    Need to get 2,263 kB of archives.
    After this operation, 6,481 kB of additional disk space will be used.
    Do you want to continue? [Y/n] y
    Get:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main libssl-dev armhf 1.0.1t-1+deb8u9 [1,095 kB]
    Get:2 http://mirrordirector.raspbian.org/raspbian/ jessie/main libssl-doc all 1.0.1t-1+deb8u9 [1,167 kB]
    Fetched 2,263 kB in 5s (390 kB/s)  
    Selecting previously unselected package libssl-dev:armhf.
    (Reading database ... 141113 files and directories currently installed.)
    Preparing to unpack .../libssl-dev_1.0.1t-1+deb8u9_armhf.deb ...
    Unpacking libssl-dev:armhf (1.0.1t-1+deb8u9) ...
    Selecting previously unselected package libssl-doc.
    Preparing to unpack .../libssl-doc_1.0.1t-1+deb8u9_all.deb ...
    Unpacking libssl-doc (1.0.1t-1+deb8u9) ...
    Processing triggers for man-db (2.7.5-1~bpo8+1) ...
    Setting up libssl-dev:armhf (1.0.1t-1+deb8u9) ...
    Setting up libssl-doc (1.0.1t-1+deb8u9) ...
    root@pi02:/home/httpd#
     
    И после этого:
    Код (Text):
    www-data@pi02:~/src/wsobj$ ./create.sh
    >>> формирование набора файлов в директории work <<<
    ...очистка work
    копирование исходников в src...
    ...копирование Makefile
    ...копирование из wssrc
    ...копирование из bmpsrc
    ...копирование из obsrc
    ...копирование из gpsrc
    ...копирование из src
    ...компиляция в bin
    gcc -c -Wall bar.c -o bar.o
    gcc -c -Wall base64.c -o base64.o
    gcc -c -Wall bmp.c -o bmp.o
    gcc -c -Wall bmpfunc.c -o bmpfunc.o
    gcc -c -Wall buttons.c -o buttons.o
    gcc -c -Wall gpsect.c -o gpsect.o
    gcc -c -Wall main.c -o main.o
    gcc -c -Wall slider.c -o slider.o
    gcc -c -Wall workfunc.c -o workfunc.o
    gcc -c -Wall wsfunc.c -o wsfunc.o
    gcc -c -Wall wsserver.c -o wsserver.o
    gcc -lpthread -lcrypto -lm bar.o base64.o bmp.o bmpfunc.o buttons.o gpsect.o main.o slider.o workfunc.o wsfunc.o wsserver.o -o ../bin/testobj
    ...копирование в work
    Очистка srcw...
    ...очистка после комптляции
    rm -rf *o ../bin/testobj
    ...очистка srcw
    ...копирование элементов HTML в work
    ...копироапние BASH скриптов в work
    www-data@pi02:~/src/wsobj$
     
    Ну и при установки на малину apache2 + PHP, запустив что надо получаем на экране браузера Firefox:
    snapshot7.png
     
    Последнее редактирование: 18 авг 2018
    sys и ИгорьК нравится это.
  11. Igor68

    Igor68 Гуру

    Простите, но это:
    wsobj3_02_11_2018.zip

    проба по переходу на PNG вместо BMP. Но пока, что в BMP. Оставил специально, для того, что бы продолжить на работе в обед. Облачный диск с работы пока не организовал. Простите! Это временно.

    Тут только начало! Рабочего PNG нет. Не понятен метод сжатия данных картинки. Фактически будет на сервере BMP(тут умеем рисовать) ---> PNG.

    Поделитесь про метод сжатия!
     

    Вложения:

    Последнее редактирование: 2 ноя 2018
  12. Igor68

    Igor68 Гуру

    Доброго времени суток:
    Вот конвертация BMP в PNG:
    tst3.zip
    Тут в Makefile выбран компилятор:
    Код (Text):

    ######################
    PREFIXPATH=/usr/local/arm-linux/bin
    CC=$(PREFIXPATH)/arm-linux-gcc
    ######################
     
    для малины и PC Linux надо:
    Код (Text):
    ######################
    CC=gcc
    ######################
    Вот время исполнения на UC-7112-Lx-Plus:
    Код (Text):
    www-data@Moxa:~/ramdisk$ ./test.sh
    BMP filename:  2.bmp
    Size Struct info 108 dec   6c hex
    Version "4"
    --- step x 3
    --- step y 1920
    ---------------------------------------------------------------------------------
    Type         : 4d42
    Size          : 768122 bytes
    Start addr: 7a hex
    ---------------------------------------------------------------------------------
    Widht :  640
    Haight : 400
    Bit in Pixel(color) 24
    *w:640

    ---stsrt encoding---
    PNG_encode - bKGD

    ---stop encoding---
    time start:1541415973 time stop:1541415981 time:8
    www-data@Moxa:~/ramdisk$
    www-data@Moxa:~/ramdisk$
    www-data@Moxa:~/ramdisk$ ./test.sh
    BMP filename:  2.bmp
    Size Struct info 108 dec   6c hex
    Version "4"
    --- step x 3
    --- step y 1920
    ---------------------------------------------------------------------------------
    Type         : 4d42
    Size          : 768122 bytes
    Start addr: 7a hex
    ---------------------------------------------------------------------------------
    Widht :  640
    Haight : 400
    Bit in Pixel(color) 24
    *w:640

    ---stsrt encoding---

    ---stop encoding---
    time start:1541416038 time stop:1541416049 time:11
    www-data@Moxa:~/ramdisk$
    Тут две попытки!

    На ноутбуке Debian:
    Код (C++):
    igor@debian-i:~/coding/RPi3/wsobj3_02_11_2018/doc/tst3$ ./test.sh
    BMP filename:  2.bmp
    Size Struct info 108 dec   6c hex
    Version "4"
    --- step x 3
    --- step y 1920
    ---------------------------------------------------------------------------------
    Type         : 4d42
    Size          : 768122 bytes
    Start addr: 7a hex
    ---------------------------------------------------------------------------------
    Widht :  640
    Haight : 400
    Bit in Pixel(color) 24
    *w:640

    ---stsrt encoding---

    ---stop encoding---
    time start:1541417333 time stop:1541417333 time:0

    igor@debian-i:~/coding/RPi3/wsobj3_02_11_2018/doc/tst3$ ./test.sh
    BMP filename:  2.bmp
    Size Struct info 108 dec   6c hex
    Version "4"
    --- step x 3
    --- step y 1920
    ---------------------------------------------------------------------------------
    Type         : 4d42
    Size          : 768122 bytes
    Start addr: 7a hex
    ---------------------------------------------------------------------------------
    Widht :  640
    Haight : 400
    Bit in Pixel(color) 24
    *w:640

    ---stsrt encoding---

    ---stop encoding---
    time start:1541417336 time stop:1541417336 time:0
    igor@debian-i:~/coding/RPi3/wsobj3_02_11_2018/doc/tst3$
    Думаю и на малине будет 0 - это секунды. А MOXA и памяти с гулькин нос и тактовая частота до 200МГц. Так, что в сравнении с передачей BMP ощутимо. В браузере по удалёнке к MOXA сравнивал передачу BMP и PNG.
    Кстати тестовая программа имеет много мусора - надо чистить.
     

    Вложения:

    • tst3.zip
      Размер файла:
      286 КБ
      Просмотров:
      331
  13. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Исходя из:
    [​IMG]

    Подобных элементов интерфейса, который применён и в:
    http://forum.amperka.ru/threads/ras...-и-вопрос-в-последнем-сообщении.10001/page-14
    делается рабочий вариант (есть необходимость и на работе) без применения web сервера apache. Его функцию заменит socat - испытано.
    Проблема в том, что создавать интерфейс, вставляя координаты элементов, размеры и т.п. вручную как-то не очень. Это легко реализуется в QtCreator в редакторе форм. На выходе файл *.ui в формате xml.
    Вопрос:
    Есть ли готовое решение для разбора этого файла, для формирования файлов *.c и *.h с цклью облегчения задачи. Сейчас на подходе самодельный скрипт на bash, который должен сформировать файлы mainwidow.c и mainwindow.h с шаблоном параметров исходя из файла mainwindow.ui (файла формы). Может уже есть что-то?
    Спасибо!
     
  14. Igor68

    Igor68 Гуру

    И что совсем ничего?
    И что вариант построения рабочего стола программы в WEB не применялось?
    Что надо делать своё?
    Будет ли ответ?
    Описание: создаём некую форму, она имеет элементы управления... ну там кнопки, слайдеры и т.п. как в QtCreator. А некий скрипт превращает это всё в шаблоны Си файлов, куда только надо вписать изменения согласно задаче. Вот только для её выполнения будет создана программа работающая на удалённом ПК и с доступом через браузер.

    И никаких JSON и т.п. Тупо JS на странице передаёт событие клавиатуры/мышки на сервер. И он в свою очередь выполняет то, что нужно. Ведь идеальная отвязка от платформы, да реального времени!
    Может есть решение включить это в QtCreator (Visual Studio, как красивый но всё-таки покойник - сервера на windows это отстой) как шаблон для сервера по усмотрению - для потребителя (точно не apache и mysql и т.п.)
    Если готовые решения есть скажите!
    Ведь блин через мать такую и водку делаю велосипед, где некую форму готовлю в QtCreator, а потом их этой формы формирую набор Си файлов для компиляции. Кстати что в VS, что QtCreator делаются заготовки для заполнения событий в шаблоны функций при выполнении нажатий на кнопки и т.п.
    Это всё есть - понятно.
    Но Вот есть для WEBsocket?
    Не дайте родить ещё одного покойника(проект).
    Спасибо!
     
  15. Igor68

    Igor68 Гуру

    Вот кстати:
    Код (Bash):
    #!/bin/bash
    #

    wwwport=1111
    wsport=4321

    #запуск рабочей программы
    #./work $wsport &

    socat \
        -vv \
        TCP-LISTEN:$wwwport,crlf,reuseaddr,fork \
        SYSTEM:"
            echo HTTP/1.1 200;
            echo Content-Type\: text/html\; charset-utf-8;
            echo;
            cat index.html;
        "

     
    Сервер... простой Web сервер - на одну страницу. Замысел в том, что бы принять браузером некую страницу с этого сервера. А уж она потом получит доступ к WS. Что бы он(сервер) работал по стандартному порту(80) запускать надо от ROOT и он(порт) должен быть не занят(обычным веб сервером - например apache). Иначе как говорилось надо некий другой порт. И требуется установленый socat в системе. По этой схеме занятых рессурсов горааааздо меньше.