crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Stoptyssin
  опции профиля:
сообщение 20.1.2012, 17:00
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 20.1.2012
Пользователь №: 3145

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте! Заранее извиниясь за ламерство. Пишу диплом. Надо написать программу которая получает данные от нескольких ZigBee устройст и заносит их в базу данных (MySql). В принципе все устройства соеденены с ПК через ZigBee коллектор который работает как виртуальный COM-порт. Ни с мускулем ни QT особо дел не имел. Подскажите в каком направлении двигаться, если можно то с примерами (можно и на WiFi и на Bluetouth там я сам разберусь). И последний вопрос (самый ламерский), как лучше - принимать данные : буфер -> файл ->бд, или же буфер ->бд (временная таблица)-> файл. Заранее спасибо за ответы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
zloiia
  опции профиля:
сообщение 22.1.2012, 13:55
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 5.5.2011
Пользователь №: 2655

Спасибо сказали: 5 раз(а)




Репутация:   0  


Stoptyssin, а примеры... Может поможет. Кусок из моего давнего проекта. У нас было самопальное устройство, у которого сообщения с устройства были просты как валенки
Цитата
<CommandValue>

Где Command и Value были целыми числами. Данные капали где-то 5 раз в секунду и лень было заморачиваться с оптимизацией, поэтому сделал так. (писал с использованием QextSerialPort но разницы никакой). Унаследовался от QextSerialPort , завел слот, который связал с сигналом readyRead() (то есть в этом слоте читал данные, которые пришли с порта). В нем все что приходило забивал в свойство этого класса типа QByteArray (то есть создавал буфер на случай если у меня не вся команда придет сразу) и затем в этом буфере искал целую команду. Когда находил команду, высылал сигнал, который сообщал что за команда пришла и ее параметр
void Device::newData()
{
    if(bytesAvailable()<=0) return;

    _buffer.append(readAll()); //дописываю в буфер данные что прочитаны

    if(_buffer.size()>=3)
    {
        QRegExp rx("<([0-7])(\\d{0,})>"); 

        int pos =0;
        while(rx.indexIn(_buffer,pos)!= -1) //накладываю маску
        {
            char command = rx.cap(1).toAscii().at(0); //смотрю что за команда пришла
            int value=0; //какой параметр команды
            int led=0; //какой светодио
            switch(command)
            {
                case (int)LED_NUM:
                    led=rx.cap(2).toInt();
                break;

                case (int)BLINK_PERIOD:
                    value=rx.cap(2).toInt();
                break;

                case (int)LED_BRIGHT:
                    led=rx.cap(2).mid(0,1).toInt();
                    value=rx.cap(2).mid(1,BRIGHT_SIZE).toInt();
                break;

                case (int)ECHO: emit echoFounded(1); break;
            }
            emit innedData((char)command,value,led); //высылаю сигнал о том что принята команда
            _buffer.remove(pos,rx.matchedLength());
            pos+=rx.matchedLength();
        }

        rx.setPattern("error");
        if( (pos=rx.indexIn(_buffer,0)) != -1 )
        {
            _buffer.remove(pos,rx.matchedLength());
            emit errorFounded(0);
        }
    }

}


Затем создал обычный класс, унаследованный от QObject, к котором принимал этот сигнал и просто забивал очередь QQueue. В этом-же классе переопределил свойство void timerEvent(QTimerEvent *); и в нем смотрел, если очередь не пустая, то писал в базу одно первое сообщение очереди и успокаивался. Пришлось извратиться с таймером так, потому что в качестве базы выступала xml таблица на удаленной машине, подключенная через ODBC :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.5.2025, 20:20