Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: связь нескольких модемов с компьютером
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Сотовая связь и ее приложения
dimonbest
Недавно организовал связь точка-точка через tcp сокет.
Теперь возникла следующая задача:
Есть 5 модемов (количество будет меняться) и компьютер с выходом в интернет.
И этот самый компьютер должен опрашивать эти модемы и передавать им команды.

Есть вариант такой: модемы будут скидывать файлы на ftp, а комп считывать их. Но тогда надежность системы будет зависеть от оператора и от сервера. А хочется чтоб только от оператора.
Тоже самое можно сделать через почту.

Можна сделать как то только через оператора, без участия почты и ftp сервера?
skaarj
Цитата(dimonbest @ Aug 29 2008, 10:38) *
Есть вариант такой: модемы будут скидывать файлы на ftp, а комп считывать их. Но тогда надежность системы будет зависеть от оператора и от сервера. А хочется чтоб только от оператора.
Тоже самое можно сделать через почту.

Можна сделать как то только через оператора, без участия почты и ftp сервера?


решаю сейчас подобную задачу, пошел по пути разработки собственного протокола
Baser
Цитата(dimonbest @ Aug 29 2008, 10:38) *
...
Можна сделать как то только через оператора, без участия почты и ftp сервера?

А как вы собираетесь вообще обходится без сервера? Какой-либо сервер все равно должен быть.
Или на вашем компьютере, постоянно включенном и с реальным IP, или где-нибудь арендованный.
Модемы являются клиентами, они должны инициализировать связь.
Если вы попробуете сделать наоборот (модемы - серверы, а ваш компьютер - клиент), тогда для всех модемов придется арендовать реальные IP, а это платная услуга.
dimonbest
Цитата(skaarj @ Aug 29 2008, 12:21) *
решаю сейчас подобную задачу, пошел по пути разработки собственного протокола

Можете примерно идейку сказать?

Цитата(Baser @ Aug 29 2008, 14:13) *
А как вы собираетесь вообще обходится без сервера? Какой-либо сервер все равно должен быть.
Или на вашем компьютере, постоянно включенном и с реальным IP, или где-нибудь арендованный.
Модемы являются клиентами, они должны инициализировать связь.
Если вы попробуете сделать наоборот (модемы - серверы, а ваш компьютер - клиент), тогда для всех модемов придется арендовать реальные IP, а это платная услуга.

На всех карточках у нас статические адреса (заказали услугу у оператора).
Это упростит задачу?
skaarj
допустил неточность. вобщем я соединяюсь с удаленным сервером,посредством ат команд устанавливаю адрес и порт,модем відает коннект и все гут( модем настраивать в тн "transparent mode"). после того как модем соединился, шлю уже свои данные на комп порт. фактически используется PPP соединение, просто что я свои даные не пытаюсь в виде фтп или хтмл формата передавать а использую свой собственный,заранее обговоренный с программистом ,написавшим по на сервер, формат(заголовок,длина данные и тп) тут уже можно любой протокол использовать для модема и сети без разницы что передавать. что касается защиты сервера- не могу ничего порекомендовать.

статические айпишники-это хорошо,тогда можно модемы какк серверы конфигурироавать и опрашивать одним клиентомsmile.gif
Baser
Цитата(dimonbest @ Aug 29 2008, 15:15) *
На всех карточках у нас статические адреса (заказали услугу у оператора).
Это упростит задачу?

Упростит задачу или нет - зависит от ваших модемов (что они поддерживают) и от вашей задачи (какие данные и куда нужно посылать).

Если модем поддерживает режим TCP сервера (напр. SIM300 это умеет) или ваше ПО в железяке может это поддержать и если эти модемы должны работать только по опросу - тогда без проблем.
Модемы в режиме сервера слушают заданный порт.
Клиентская программа на компе (даже с локальным IP) - коннектится по известному IP модуля на известный порт, общается с ним и отключается. Вот и все.

Другое дело, если нужно инициировать соединение с модема, тогда такая схема в чистом виде не подойдет..
dimonbest
Цитата(skaarj @ Aug 29 2008, 16:37) *
...написавшим по на сервер...

статические айпишники-это хорошо,тогда можно модемы какк серверы конфигурироавать и опрашивать одним клиентомsmile.gif

А что примерно представляет собой ПО на сервер? На каком языке пишется? Не знаете?

Опрашивать одним клиентом - это снова будет сеанс типа точка-точка?
С какими модемами вы сейчас кстати работаете? я с Telit
skaarj
Цитата(dimonbest @ Aug 29 2008, 15:50) *
А что примерно представляет собой ПО на сервер? На каком языке пишется? Не знаете?

Опрашивать одним клиентом - это снова будет сеанс типа точка-точка?
С какими модемами вы сейчас кстати работаете? я с Telit


я работаю с сим300дз. по на сервер писалось на си++, в тонкостях сетевого программирования на большом брате я не разбираюсь, мне мой программист дал уже наброски протокола,какие данные он хотел бы получать на сервер, в соответствии с ним я и формировал данные в микроконтроллере. для меня вся лабуда "модем-сеть жпрс-интернет-сервер" была, вобщемто прозрачная- я подавал на ком порт модема некоторые данные и точно такие же данные получал программа-сервер. все классно,только мне не удпалось больше 1 кб\сек получить. примитивный подход,но для начала этого достаточно было.

насчет опроса клиентом кучу серверов - по ходу дела прийдется последовательно присоединяться клиентом к каждому серверу- это если по простому. а что вы хотите передавать? у меня модем-клиент при подаче питания устанавливает связь и опросить его- не проблема, этим опять таки сервер в случае необходимости заниамется
dimonbest
Блин, в голове уже полная каша.
Давайте более подробно опишу ТЗ.
Есть центральный компьютер с выходом в интернет - здесь будет находиться диспетчер.
Есть клиенты, 5 модемов.
Необходимо:
1. Ра в 3 секунды опрашивать клиентов и получать от них данные (обьем одного ответа небольшой, примерно 20байт).
2. При необходимости передавать команды определенному клиенту.

Используемые модемы - telit gt863 со встроеным TCP/IP стеком, IP адреса статические.

Как писал в предыдущем посте, есть решение реализовать это через ftp сервер и почту. Как по мне это будет не совсем надежно. Хочется все это делать только через интернет.


Из языков программирования под компьютер знаю только DELPHI, и то не настолько чтоб очень.

Подскажите пожалуйста куда рыть чтоб сделать проще и надежней... Запутался совсем...

P.S. Вариант устраивать соединение по очереди с каждым модемом типа точка-точка (TCP-сервер и TCP клиент) не подходит, т.к. на это все будет тратиться много времени...
million68
На мой взгляд можно организовать так:
Клиенты передают свою технологическую инфу на сервер с периодом 3 сек.
Сервер принимает пакеты, кладет в базу данных, потом по данным из базы делаются анализы,
графики, отчеты и т.п.
Никакого ftp, е-почты.
Только ТСР.
Статический адрес дать только серверу. (У нас статические адреса всем клиентам - дороговато все-таки).
У клиентов - симки любых опсосов, зависимость от опсосов следует сделать минимальной.
Хорошо бы серверу дать второй (резервный IP) другого оператора, можно даже и не сотового.
Если нужно передавать команды клиентам, то пожалуйста...
Для программы состороны РС дельфийский язык тоже подойдет, используйте компонент TServerSocket.
Для отладки протокола создайте тестовую прогу с TClientSocket.
Если хотите программно подключаться (отключаться, проверять подключение) к интернету пробуйте RAS библиотеку.
Ноу проблем...
dimonbest
Спасибо за подробное разъяснение!
Есть вопросы.
Клиенты смогут подсоединяться к серверу поочереди, я правильно понял, одновременно не смогут?
Грубо говоря будет соединение точка-точка. Одна точка будет постоянная - сервер (диспетчер) и к нему по ТCP поочереди будут стучаться модемы (клиенты), после обмена данными - разрыв связи и подключение следующего модема.
Я правильно все понял?
Baser
Цитата(dimonbest @ Sep 2 2008, 15:36) *
Клиенты смогут подсоединяться к серверу поочереди, я правильно понял, одновременно не смогут?
Грубо говоря будет соединение точка-точка. Одна точка будет постоянная - сервер (диспетчер) и к нему по ТCP поочереди будут стучаться модемы (клиенты), после обмена данными - разрыв связи и подключение следующего модема.
Я правильно все понял?

Все клиенты могут подключаться одновременно. Поскольку вы хотите период опроса 3 сек, то связь должна быть через GPRS. При этом ваши мобильные клиенты будут каждый независимо подключаться через провайдера к интернету. А поддержать на сервере 5 (50, 100) одновременных соединений не проблема.

На установление TCP соединения через GPRS может уйти около минуты (в плохом случае), так что только постоянный коннект...
dimonbest
Цитата(million68 @ Sep 2 2008, 16:25) *
Для программы состороны РС дельфийский язык тоже подойдет, используйте компонент TServerSocket.
Для отладки протокола создайте тестовую прогу с TClientSocket.

Можно пару вопросов по самому делфи?
И в сервере, и в клиенте, есть такое свойство, как service. Не понятно что оно означает...
Может у вас есть простенький примерчик, как отправить например текст от клиента к серверу?
Не совсем понятно...
million68
Цитата(dimonbest @ Sep 4 2008, 11:18) *
Может у вас есть простенький примерчик, как отправить например текст от клиента к серверу?
Не совсем понятно...

Есть пара статеек на
http://www.delphimaster.ru/articles/socksrv/index.html
http://devoid.com.ua/c-builder/cppbuilder-...rogramming.html
Свойство Service можно пока не трогать. smile.gif
dimonbest
Появилась следующая проблема.
На делфи делаю TCPserver.
А клиент - модем telit.
Так вот, при коннекте клиента к серверу происходит ошибка (событие OnClientError).
Хотя модемы между собой конектятся нормально!
Чем же эта ошибка может быть вызвана?
Evgeniy_K
Есть решение сервера на С++ для TCP/IP клиентов - элементарное
dimonbest
Цитата(Evgeniy_K @ Oct 28 2008, 10:23) *
Есть решение сервера на С++ для TCP/IP клиентов - элементарное

Можно по подробней?
Evgeniy_K
Вот минимальный кусок для VS С++ ver.6 для понимания, проект с MFC создать самим. Основан на примере из MSDN, там есть рабочий проект. Проверить работу можно даже на одном компе, используя в качестве клиента стандартный HyperTerminal (Windows):
Код
#include "stdafx.h"
#include <afxsock.h>

class CClientSocket : public CSocket
{
public:
    int no;//id
    bool isClosed;
    void close();
    CClientSocket(); //constructor
// Overridable callbacks
protected:
    virtual void OnReceive(int nErrorCode);
};

PutErr(){ //ñîîáù îá îø
    LPTSTR  lpMsgBuf;     DWORD dwError = GetLastError();
    if(dwError==0)return 0;
    FormatMessage(     FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,        dwError,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
        (LPTSTR) &lpMsgBuf,        0,        NULL     );
    char s[20];
    sprintf(s,"Îøèáêà:%u",dwError);
    MessageBox( NULL, lpMsgBuf, s, MB_OK|MB_ICONINFORMATION );
    LocalFree( lpMsgBuf );// Free the buffer.
    return dwError;
}

CClientSocket *pLastSocket, *pnSocket, *m_connectionList[MAXGPRS];

void CClientSocket ::close(){
        if(isClosed)return;
        isClosed=1;
        m_connectionList[no]=NULL;
        Send("Disconnect\n",11);
        ShutDown();
}
CClientSocket ::CClientSocket(){isClosed=0; no=0;} //constructor
void CClientSocket ::OnReceive(int nErrorCode){ //îáðàáîòêà ïîëó÷àåìûõ äàííûõ
        CSocket::OnReceive(nErrorCode);
        CClientSocket* pSocket=this;
        TCHAR buff[4096];
        int nRead;
        try{
        nRead = pSocket->Receive(buff, sizeof(buff)-1);
        switch (nRead)
        {
            case 0:
              printf("Null Receive!");
              break;
            case SOCKET_ERROR:
              if (GetLastError() != WSAEWOULDBLOCK) PutErr();
              break;
            default:
              buff[nRead] = 0; //terminate the string
              CString szTemp(buff);
            pSocket->Send("yes!\n",5);
        }
        if(no>0){
            if(m_connectionList[no] && m_connectionList[no]!=this)printf("Change client %d!\a",no);
            m_connectionList[no]=this;
        }
        }catch(...){}
}

class CListeningSocket : public CSocket
{
// Overridable callbacks
protected:
    virtual void OnAccept(int nErrorCode){ //íîâûé êëèåíò
    CSocket::OnAccept(nErrorCode);

    CClientSocket* pSocket = new CClientSocket();
    if (Accept(*pSocket))
    {
        pLastSocket=pSocket;
        printf("Client in");
    }
    else
        delete pSocket;
    }
};
    CListeningSocket Sock;    
    CListeningSocket* m_pSocket;

    //êëàññ è ðåñóðñû äëÿ äèàëîãà ñîçäàòü ñàìèì, òóò ïðèìåð èíèöèàöèè
/////////////////////////////////////////////////////////////////////////////
// CChatDlg message handlers

BOOL CChatDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
    
    // TODO: Add extra initialization here

        m_pSocket = &Sock;
        //700 - ¹ ïîðòà, ÷åðåç êîòîðûé îáìåí
        if (!m_pSocket->Create(700)){PutErr(); return TRUE;}
        if (!m_pSocket->Listen()){PutErr(); return TRUE;}
        printf("Wait clients...");
    
    return TRUE;  // return TRUE  unless you set the focus to a control
}


//700 - № порта, через который обмен
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.