LINUX.ORG.RU

Сообщения seijuurou

 

Boost tcp::socket не работает асинхронное чтение / запись

Доброго всем времени суток. Пытаюсь сделать асинхронное чтение из клиентского сокета на сокетах буста, но что-то всё не получается - проходит нормально только одна итерация из send_request и только если поставить после async_read() вот это m_io_service.run(), а должно работать каждый раз. Подскажите в чём я ошибаюсь

using Json_t = nlohmann::json;
using Tcp_t = boost::asio::ip::tcp;
namespace Ip_n = boost::asio::ip;
namespace Asio_n = boost::asio;

class Protocol: public boost::enable_shared_from_this<Protocol> {
public:
    static boost::shared_ptr<Protocol> create() {
        if (m_instance == nullptr)
            m_instance =  boost::shared_ptr<Protocol>(new Protocol());
        return m_instance;
    }

    boost::shared_ptr<Protocol> shared_from_this() {
        return m_instance;
    }

private:
    static constexpr int MAX_SIZE_INPUT_BUF = 1024;
    static constexpr size_t MAX_MSEC_TO_WAIT_ANS = 5000;///< Максимальное время (мс) ожидания ответа от сервера
    static constexpr size_t MAX_MSEC_TO_WAIT_WR_TO_SCK = 10000;
    static constexpr size_t MAX_CNT_TO_REQUEST = 3; ///< Максимальное количество попыток запроса

    Asio_n::io_service m_io_service;
    Tcp_t::socket m_sck{m_io_service}; ///< Сокет для обмена данными
    Tcp_t::endpoint m_ep;
    std::array<char, MAX_SIZE_INPUT_BUF> m_bufSck; ///< Приёмный буфер данных из сокета
    std::vector<char> m_buf_sck_part;
    Tcp_t::endpoint m_sender_ep;
    bool m_dataReady=false; ///< Флаг показывающий, что пришли полные данные и они готовы для дальнейшей обработки
    bool m_logged_in=false; ///< Флаг показывающий, что программа зарегистрировалась на сервере
    static boost::shared_ptr<Protocol> m_instance;

    Protocol();

    bool connect_to_ip(const std::string &ipAddr, std::uint16_t ipPort);
    void readData(const boost::system::error_code &err, std::size_t read_bytes);
    void writeData(const boost::system::error_code &err, std::size_t wr_bytes);
    std::string send_request(const std::string& sJson);
};

Protocol::Protocol() {
    connect_to_ip("192.168.11.60", 1000);
    login();

    m_thread = std::make_unique<std::thread>(&Protocol::run_method, this);
}

void Protocol::run_method() {
    m_io_service.run();
}

bool Protocol::connect_to_ip(const std::string &ipAddr, std::uint16_t ipPort) {
    auto err = std::make_shared<Error_t>();

    try {
        m_sck.connect( {Ip_n::address::from_string( ipAddr ), ipPort} );
        return true;
    }
    catch (boost::system::system_error e) {
        std::cout << e.what() << std::endl;
    }
    return false;
}

void Protocol::readData(const boost::system::error_code &err, std::size_t read_bytes) {
    if (read_bytes > 0) {
        switch(err.value()) {
            case boost::asio::error::eof: 
            case boost::asio::error::connection_reset: on_host_disconnected(); break;

            default: 
                Json_t j = Json_t::parse(m_buf_sck_part.data());
                if (j.is_object()) { 
                    m_dataReady = true;
                }
        }
    }
}

void Protocol::writeData(const boost::system::error_code &err, std::size_t wr_bytes) {
    std::cout << "writeData - " << wr_bytes << std::endl;
}

void readDataFunct(const boost::system::error_code &err, std::size_t read_bytes) {
    std::cout << "readData_funct - " << read_bytes << std::endl;
}

bool Protocol::write(const std::string& sJson) {
    m_dataReady = false;

    m_sck.async_write_some(Asio_n::buffer(sJson.c_str(), sJson.size()),
                           boost::bind(&Protocol::writeData, this,
                           Asio_n::placeholders::error,
                           Asio_n::placeholders::bytes_transferred));

    boost::asio::async_read(m_sck,
                        boost::asio::dynamic_buffer(m_buf_sck_part),
                        boost::asio::transfer_at_least(3),
                            boost::bind(&Protocol::readData, this,
                            boost::asio::placeholders::error,
                            boost::asio::placeholders::bytes_transferred)
    );
    
    // Если сделать так, то одна итерация чтения/записи сработает, а после следующей записи в сокет чтения уже не будет
    // причём данные в обоих случаях в сокет будут записаны, но обработчики событий вызываются только при первой итерации
    m_io_service.run(); 

    return true;
}

std::string Protocol::send_request(const std::string& sJson) {
    for (size_t i=0; i<MAX_CNT_TO_REQUEST; ++i) {
        write(sJson);
        auto cnt = 20;//read();
        if ( cnt != 0 ) {
            std::cout << "m_bufSck - " << m_bufSck.data() << std::endl;;
            // делаем какую-то обработку, но стоит continue, чтобы было несколько циклов чтения/записи
            continue;
        }
        else continue;
    }
    return std::move( std::string() );
}

int main() {
    auto protocol = Protocol::create();
    protocol.send_request("{\"Request\":\"Login\"}");
    return 0;
}

 , , ,

seijuurou
()

Не линкуется CppServer с библиотекой

Всем доброго времени суток

Есть консольное приложение, которое использует самописную библиотеку libSRouter.so, которая в свою очередь использует библиотеку libcppserver.so из GitHub, а конкретно CppServer::Asio::TCPClient. Библиотека libSRouter.so собирается нормально (подключение CppServer в CMake),

include_directories( ../../../../Lib/CppServer/include )
.
.
.
target_link_libraries(${PROJECT_NAME} PUBLIC 
                                                    ${CMAKE_SOURCE_DIR}/../../../../Lib/CppServer/bin/libcppserver.so
)
но в ней нет ссылки на конструктор CppServer::Asio::TCPClient, точнее не определён для неё адрес (смотрел через nm -C libSRouter.so),
$ nm -C libSRouter.so | grep TCPClient::TCPClient
                 U CppServer::Asio::TCPClient::TCPClient(std::shared_ptr<CppServer::Asio::Service> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)

поэтому когда я пытаюсь слинковать libSRouter.so к приложению, то получаю ошибку
[build] /usr/bin/ld: ../../../srouter/build/Release/libSRouter.so: undefined reference to `CppServer::Asio::TCPClient::TCPClient(std::shared_ptr<CppServer::Asio::Service> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'

Всё собирается с помощью CMake и Clang-15.0.1 под убунтой 22.04. Подскажите что я делаю не так

 , ,

seijuurou
()

boost interprocess валится при удалении общей памяти из библиотеки

Доброго всем времени суток. Использую boost::interprocess::shared_memory_object для выделения общей памяти при межпроцессном взаимодействии, но shared_memory_object живёт в библиотеке и при вызове boost::interprocess::shared_memory_object::remove программа падает, если этот же код выполнить просто в исполняемом файле, то всё пройдёт отлично. Подскажите что я делаю не так?

Нижеприведённый код будет работать в исполняемом файле, но упадёт при remove (последняя строка), если его вынести в библиотеку

    namespace bip = boost::interprocess;
    std::unique_ptr pMem = std::make_unique<bip::shared_memory_object>(bip::create_only, "Name", bip::read_write);
    pMem->truncate(4);
    std::unique_ptr pMemReg = std::make_unique<bip::mapped_region>(*pMem.get(), bip::read_write);

    char *ar=nullptr;
    ar = static_cast<char*>(pMemReg->get_address());
    std::memset(ar,0,4);
    ar[0]=1;
    ar[1]=2;

    bip::shared_memory_object::remove("Name");

Похоже проблема проявляется только под виндой, под линуксом всё работает

 , ,

seijuurou
()

[Решено] Доступность витруалки на qemu по ssh

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

Имеется мой ПК с ip 10.96.0.216 и виртуалка qemu нанём.

Запускаю виртуалку такой командой

qemu-system-arm -M virt -m 1024 \
  -kernel /mnt/c5cf5a5b-1b9e-45ef-9ae0-401558bd94d2/VM/debianArm32hf/vmlinuz-5.10.0-12-armmp-lpae \
  -initrd /mnt/c5cf5a5b-1b9e-45ef-9ae0-401558bd94d2/VM/debianArm32hf/initrd.img-5.10.0-12-armmp-lpae \
  -append 'root=/dev/vda2' \
  -drive if=none,file=/mnt/c5cf5a5b-1b9e-45ef-9ae0-401558bd94d2/VM/debianArm32hf/arm32hf_hda.qcow2,format=qcow2,id=hd \
  -device virtio-blk-device,drive=hd \
  -netdev user,id=mynet,net=192.168.0.1/24,dhcpstart=192.168.0.100 \
  -device virtio-net-device,netdev=mynet \
  -nographic
Из виртуалки есть доступ к инету, но по ssh она не доступна.

При этом пинг до хостаидёт нормально.

Что мне сделать чтобы достучаться до виртуалки с хоста по ssh?

 ,

seijuurou
()

OpenCV не открывает pipeline gstreamer-а

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

Случилась у меня проблема с OpenCV и GStreamer-ом. Создаю pipeline для gstremera в своём приложении, пытаюсь открыть его, но ничего не происходит - оно просто висит в этой функции

cv::VideoCapture m_cap;
m_cap.open("rtspsrc location=rtsp://admin:1ICenter@10.96.0.132:554/Streaming/Channels/101 latency=10 ! decodebin ! appsink",cv::CAP_GSTREAMER)

OpenCV собран с поддержкой GStreamer-а из исходников. GStreamer только из пакетов поставлен. Если выкинуть pipeline и оставить только rtsp-ссылку, то всё будет работать

Подскажите, что я делаю не так

 , ,

seijuurou
()

Камера Huawei и Linux

Всем доброго времени суток.

Необходимо разработать некоторую программу и установить её в камеру Huawei C3250-10-SUI (не в телефон, а в стационарную купольную камеру). У меня есть к ней доступ по ssh и даже рутовый пароль, однако на камере нет scp, wget, curl, sftp тоже не работает (не разрешает залогиниться вообще). На камере стоит LiteOS. Как туда закинуть приложение? Может есть у кого опыт использования.

 , ,

seijuurou
()

[Решено] QtCharts в QML

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

Пытаюсь на qml нарисовать какой-нить график (Qt5.12.8, хотя на Qt6.2.3 поведение такое же). Сборка через cmake, в CMaleLists.txt добавил следующие строки

find_package(Qt5Charts)
target_link_libraries(testCharts
  PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::Charts)
вот qml-файл
import QtQuick 2.12
import QtQuick.Window 2.12
import QtCharts 2.3

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")


    ChartView {
        title: "Spline"
        anchors.fill: parent
        antialiasing: true

        SplineSeries {
            name: "SplineSeries"
            XYPoint { x: 0; y: 0.0 }
            XYPoint { x: 1.1; y: 3.2 }
            XYPoint { x: 1.9; y: 2.4 }
            XYPoint { x: 2.1; y: 2.1 }
            XYPoint { x: 2.9; y: 2.6 }
            XYPoint { x: 3.4; y: 2.3 }
            XYPoint { x: 4.1; y: 3.1 }
        }
    }
}

Однако, после запуска программа сразу падает. Вроде даже при установке qt указал, ткнул на gpl3 и согласился, но всё-ровно не работает. Подскажите как запустить сей велосипед

 , ,

seijuurou
()

Не могу сформировать пакет conan с библиотеками

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

Пытаюсь с помощью conan сделать пакет (пока тестовый) с бинарными файлами qt библиотеки. Создал conanfile.py

from conans import ConanFile, CMake, tools
import os
class QtDbusConan(ConanFile):
    name = "QtDbus"
    version = "5.12.8"
    url = "http://gl.vmx.org/aag/viewcam/-/packages"
    topics = ("Qt5", "libs", "Crossplatfims")
    settings = "os", "compiler", "build_type", "arch"
    options = {"shared": [True, False], "fPIC": [True, False]}
    default_options = {"shared": False, "fPIC": True}

    def package(self):
        self.copy("libQt5DBus.so.5.12.8", dst="lib", src=os.path.expanduser("~") + "/Qt/5.12.8/gcc_64/lib") 
        
    def package_info(self):
       self.cpp_info.libs = ["libQt5DBus"]

И пытаюсь всё это собрать

$ conan create .
И загрузить на локальный gitLab
$ conan upload QtDbus/5.12.8 -r=gitlab
Are you sure you want to upload 'QtDbus/5.12.8' to 'gitlab'? (yes/no): yes
Uploading to remote 'gitlab':
Uploading QtDbus/5.12.8 to remote 'gitlab'                                               
Uploaded conanfile.py -> QtDbus/5.12.8 [0.72k]                                           
Uploaded conanmanifest.txt -> QtDbus/5.12.8 [0.06k]                                      
Uploaded conan recipe 'QtDbus/5.12.8' to 'gitlab': http://gl.vmx.org/api/v4/projects/109/packages/conan
Но почему-то бинарник библиотеки он не загружает на сервер.

Подскажите что я делаю не так.

 , ,

seijuurou
()

Python 2.7 и глобальные переменные

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

Есть несколько питоновских файлов, в одном описано некоторое количество общих классов и определена глобальная переменная для экземпляра одного из классов, работающего в dbus, в других файлах определены более специфичные классы, но результат их работы должен тоже попадать в dbus через глобальную переменную. В 1-ом файле с общими классами глобальная переменная работает хорошо и выводит в dbus всё что мне надо, но в других файлах сделав import first_file и вызвав экземпляр first_file.global_val получаю что данная переменная равна None, как при определении в 1-ом файле, но к этому времени я уже присвоил ей значение и по отладочному выводу это проверил. Подскажите как присвоить этой переменной значение, которое будет видно во всех файлах

 ,

seijuurou
()

libusb и STLinkV2

Доброго всем времени суток. Помогите с такой проблемой: хочу прошить основное ПО в контроллер через stlinkv2 с помощью libusb, через функцию libusb_bulk_transfer. Но непонятным остаётся один вопрос: «Как указать адрес куда будут шиться данные?». В функции конечно есть указание endpoint-а, но как-то мне непонятно будет оно так работать или нет. Подскажите как сделать правильно

 

seijuurou
()

QTableView и модель отображения данных

Всем доброго времени суток.

Столкнулся с такой проблемой: для отображения данных из БД использую QTableView и свою модель, наследованную от QSqlTableModel, переопередил в модели метод data для SizeHintRole и по количеству новых строк («\n») определяю высоту ячейки. Это хорошо работает, когда я нажимаю кнопку «Показать» на форме, но когда использую упорядочивание по выбранному стролбцу (нажимаю на заголовок), то в case Qt::SizeHintRole программа не заходит. Подскажите как сделать поведение программы в обоих случаях одинаковым.

 , ,

seijuurou
()

QSerialPort и статическая линковка

Всем доброго времени суток.

Есть программа, написанная на Qt, и работающая с СОМ-портом. Если ей накидать библиотек в туже папку где она лежит, то всё работает нормально. Но решил я сделать статическую сборку по этому мануалу и от библиотек избавиться. Всё хорошо скомпилировалось и к QtCreator-у подцепилось, но при запуске проекта я получаю такое

Выполняется поиск устройств WinRT.
winrtrunner.exe не найден.
Project ERROR: Unknown module(s) in QT: serialport

При чём тут WinRT я так и не понял, но нашёл что winrtrunner.exe это из tools-ов, поэтому опцию -nomake tools выкинул - результата не дало. Как от этого избавиться так и не понял. Как QSerialPort подключить тоже не понял, в опциях конфигурирования этого нет.

cd c:\Qt\5.4\src
configure.bat -platform win32-g++ -?

Остаётся вариант отдельной компиляции плагина, но тогда как его потом к статической сборке привязать? Никто не сталкивался с таким?

 , ,

seijuurou
()

SenseLock и Qt5.4.2

Доброго всем времени суток. Подскажите пожалуйста, почему у меня не работает вот такой код

//в хедере
typedef DWORD (*pS4Enum) (SENSE4_CONTEXT *pS4CtxList, DWORD *pdwCtxListSize);
QLibrary* slockLib;
pS4Enum S4Enum=NULL;

//в конструкторе
slockLib = new QLibrary("sense4", parent);
slockLib->load();
if (slockLib->isLoaded()) {
  S4Enum = (pS4Enum)slockLib->resolve("S4Enum");
}


Но в последний if программа не заходит. Подскажите что не так.
ОС - win8, компилятор mingw-4.9.1

 ,

seijuurou
()

QtSerialPort смена скорости порта

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

Пишу на qt программу опроса устройства, использую этот самый QtSerialPort в потоке. Вот так его открываю

if (port->open(QIODevice::ReadWrite)) {
        switch (_connParam.iIndexBaudrate){
            case 0: port->setBaudRate(QSerialPort::Baud1200); break;
            case 1: port->setBaudRate(QSerialPort::Baud2400); break;
            case 2: port->setBaudRate(QSerialPort::Baud4800); break;
            case 3: port->setBaudRate(QSerialPort::Baud9600); break;
            case 4: port->setBaudRate(QSerialPort::Baud19200); break;
        }
        port->setDataBits(QSerialPort::Data8);
        port->setParity(QSerialPort::NoParity);
        port->setStopBits(QSerialPort::OneStop);
        port->setFlowControl(QSerialPort::NoFlowControl);
        port->open(QIODevice::ReadWrite);

запись в порт

port->clear(QSerialPort::AllDirections);
port->write(buf);

чтение порта

    int iDelay=(int)(80*1000*11/port->baudRate());
    do {
        buf.append(port->readAll());
    } while (port->waitForReadyRead(iDelay));

однако это работает только если не трогать настройки порта в процессе работы программы. Если поменять скорость, то приёмный буфер будет пустой при чтении, но если перезапустить программу и запустить чтение на новой скорости, то всё пройдёт нормально. Никто с таким не сталкивался?

 ,

seijuurou
()

Qt, serialPort и права

Всем доброго времени суток. Пишу программу в qt, работающую с сом-портом через QSerialPort и сталкнулся с проблемой нехватки прав при открытии порта на чтение/запись. Подскажите как добавить прав программе при отладке, ибо если открыть программу от рута, то всё работает нормально

 , ,

seijuurou
()

qml сигналы и слоты

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

Создаю форму на qml, жму кнопку, которая вызывает слот класса, в нём генерируется сигнал, но вот как связать данный сигнал с формой qml (т.е. отображать данные надо).

Помогите пожалуйста.

 , ,

seijuurou
()

QtSerialPort на android

Всем доброго времени суток.

Хочу написать приложение на qt для android с использованием последовательного порта, но завести его как для desktop-а не получается: при смене компилятора на комплект для андроида разбор pro-файла корректно не заканчивается:

pro-файл
QT       += core gui serialport
основные сообщения
Project ERROR: Unknown module(s) in QT: serialport
Project ERROR: Unknown module(s) in QT: serialport
Может я чего не сделал? Подскажите пожалуйста

 , ,

seijuurou
()

bash и запуск бинарника

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

пытаюсь запустить бинарный файл, но что-то не выходит

anton@anton-RS690M2MA:~/Qt/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin --> ls -l
итого 21564
-rwxr-xr-x 1 anton anton  647092 янв.  23 07:32 arm-linux-androideabi-addr2line
-rwxr-xr-x 1 anton anton  674136 янв.  23 07:32 arm-linux-androideabi-ar
-rwxr-xr-x 1 anton anton 1155960 янв.  23 07:32 arm-linux-androideabi-as
lrwxrwxrwx 1 anton anton      25 марта 26 22:14 arm-linux-androideabi-c++ -> arm-linux-androideabi-g++
-rwxr-xr-x 1 anton anton  645428 янв.  23 07:32 arm-linux-androideabi-c++filt
-rwxr-xr-x 1 anton anton  661596 янв.  23 07:32 arm-linux-androideabi-cpp
-rwxr-xr-x 1 anton anton   24056 янв.  23 07:32 arm-linux-androideabi-elfedit
-rwxr-xr-x 1 anton anton  661884 янв.  23 07:32 arm-linux-androideabi-g++
-rwxr-xr-x 1 anton anton  659292 янв.  23 07:32 arm-linux-androideabi-gcc
lrwxrwxrwx 1 anton anton      25 марта 26 22:14 arm-linux-androideabi-gcc-4.8 -> arm-linux-androideabi-gcc
-rwxr-xr-x 1 anton anton   23264 янв.  23 07:32 arm-linux-androideabi-gcc-ar
-rwxr-xr-x 1 anton anton   23200 янв.  23 07:32 arm-linux-androideabi-gcc-nm
-rwxr-xr-x 1 anton anton   23200 янв.  23 07:32 arm-linux-androideabi-gcc-ranlib
-rwxr-xr-x 1 anton anton  305404 янв.  23 07:32 arm-linux-androideabi-gcov
-rwxr-xr-x 1 anton anton 5514804 янв.  23 07:32 arm-linux-androideabi-gdb
-rwxr-xr-x 1 anton anton  710612 янв.  23 07:32 arm-linux-androideabi-gprof
lrwxrwxrwx 1 anton anton      29 марта 26 22:14 arm-linux-androideabi-ld -> arm-linux-androideabi-ld.gold
-rwxr-xr-x 1 anton anton 1111992 янв.  23 07:32 arm-linux-androideabi-ld.bfd
-rwxr-xr-x 1 anton anton 3571988 янв.  23 07:32 arm-linux-androideabi-ld.gold
lrwxrwxrwx 1 anton anton      65 марта 26 22:14 arm-linux-androideabi-ld.mcld -> ../../../../../toolchains/llvm-3.4/prebuilt/linux-x86/bin/ld.mcld
-rwxr-xr-x 1 anton anton  657972 янв.  23 07:32 arm-linux-androideabi-nm
-rwxr-xr-x 1 anton anton  822324 янв.  23 07:32 arm-linux-androideabi-objcopy
-rwxr-xr-x 1 anton anton 1003988 янв.  23 07:32 arm-linux-androideabi-objdump
-rwxr-xr-x 1 anton anton  674136 янв.  23 07:32 arm-linux-androideabi-ranlib
-rwxr-xr-x 1 anton anton  341196 янв.  23 07:32 arm-linux-androideabi-readelf
-rwxr-xr-x 1 anton anton  648596 янв.  23 07:32 arm-linux-androideabi-size
-rwxr-xr-x 1 anton anton  648436 янв.  23 07:32 arm-linux-androideabi-strings
-rwxr-xr-x 1 anton anton  822324 янв.  23 07:32 arm-linux-androideabi-strip


далее делаю так
anton@anton-RS690M2MA:~/Qt/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin --> ./arm-linux-androideabi-readelf
bash: ./arm-linux-androideabi-readelf: Нет такого файла или каталога

Подскажите почему не запускается

 

seijuurou
()

qt crc

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

Никак не могу понять почему в Qt5 в следующем коде

quint16 crc=0xffff;
char byte=0xfa;
crc ^= byte;
crc=0x05 а не 0xff05 как ожидается

подскажите пожалуйста.

seijuurou
()

qt5 и кириллица

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

В qt4 работал такой метод преобразования кодировок

QTextCodec * codec;
codec = QTextCodec::codecForName("cp1251 или utf-8 или ...");
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForTr(codec);
потом просто через tr(«нужный текст на русском») устанавливался. Теперь в qt5 не могу просто на кнопке по русски надпись сделать. Подскажите куда копать

 ,

seijuurou
()

RSS подписка на новые темы