Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: OPENAT GPRS
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Сотовая связь и ее приложения
ArtemTom
Помогите разобраться с подключением к серверу через GPRS с помощию OPENAT приложения.
Вобщем я с помощью АТ команд(WIP) настроил один модем для прослушивания определённого порта. Это будет сервер.
Дальше попытался сделать элементарное приложение в OPENAT на основе WIP tcp_client. Просто поменял там адрес сервера на то что у меня и GPRS_APN, login, pass. Только чтоб он постучался к серверу.
Залил приложение. Запускаю AT+WOPEN=1.
Вываливаются строки:
[GPRS]: initialized.
[GSM]: initialized.
[UART1]: initialized.
[UART2]: initialized.
[]: initialized.
И всё что дальше? На сервере ничего не происходит, он не определяет никакого коннекта к нему.
Я пока только начинаю разбираться, наверно что-то простое упустил?
bronepoezd
Это отработала функция wip_netInitOpts. Далее надо wip_bearerOpen();wip_bearerSetOpts() по вкусу;wip_bearerStart(). Только не забудь проверить готовность сим карты.

upd : невнимательно прочитал нельзя менять GPRS_APN, логин и пароль иначе ты не выйдешь в инет через жпрс и не сможешь приконнектится
ArtemTom
Это нужно в OPENAT прописывать? Или как из терминала уже запускать при этом приложении?
Мне бы хотелось чтоб при включении питания модем автоматически стучался в порт на сервере.

Как не менять APN пароль и логин там же по умолчанию:
#define GPRS_APN "websfr"
#define GPRS_USER "a2b"
#define GPRS_PASSWORD "access"
#define GPRS_PINCODE "0000"

А мне надо "internet.mts.ru", "mts", "mts". Или и с этим каракулями запустится?
bronepoezd
да, надо именно
#define GPRS_APN "internet.mts.ru" и т.д. А как ты обращаешься к "серверу"? IP на каждой сессии меняется) Если ты хочешь сразу после включения стучаться-поймай сначала событие об полной инициализации сим карты
ArtemTom
Ну сервер я не трогаю пока, запустил там "AT+WIPBR=4,6,0" и "AT+WIPCREATE=3,1,2000,5,8" и всё, узнал IP "AT+WIPBR=3,6,15" и ждет слушает.
А в OPENAT сделал приложение на основе WIP client изменил там IP адрес на полученный от сервера и порт поставил, APN поменял. Запустил наивно думал что приконектится, а нет. Для чего же это приложение пример, что оно делает кроме вывода этих строк?
bronepoezd
Да блин, я не понял, ты что , вместо internet.mts.ru адрес сервера в GPRS_APN поставил?=) Сокету присвается ненулевое значение?
ArtemTom
Нет конечно, там при создании на основе примера создается 7 файлов в cfg_gprs.c я исправил
#define GPRS_APN "websfr"
#define GPRS_USER "a2b"
#define GPRS_PASSWORD "access"
#define GPRS_PINCODE "0000"

А в entry_point.c
#define PEER_STRADDR "192.168.1.5"
#define PEER_PORT 2000
#define RCV_BUFFER_SIZE 10240
На нужные мне.
bronepoezd
Ну тут уже судить тяжело попробуй получить для начала данные с какого -нить ya.ru . Поставь трейсы в процедурах чтоб понять где отваливается).
Лучше всего на мой взгяд написать свое приложение на основе примеров, как хоть понять можно как и что рабоает).
ArtemTom
А если тариф такой что у модемов только локальная сеть и они инет не видят?
Ну что никто не делал на основе этого примера WIP tcp_client. Он должен только эти строки чтоль выводить или конектится сразу? Может после них нужно набрать что?
Лучше всего на мой взгяд написать свое приложение на основе примеров.
Да, но для этого надо наверно понять что в примерах, я пока начинаю разбираться и фразы
Только не забудь проверить готовность сим карты
поймай сначала событие об полной инициализации сим карты
Мне не совсем понятно как реализовывать.
Может кто делал что подобное дайте мне примеры, чтоб быстрей пошло.
bronepoezd
>Мне не совсем понятно как реализовывать.

adl_tmrHandler_t Check_SIM()
{
adl_simState_e SIM_event;
SIM_event = adl_simGetState ();
TRACE((1,"SIM state: %d",SIM_event));
switch (SIM_event)
{
case ADL_SIM_STATE_INIT:
TRACE((1,"Service init state (PIN state not known yet)"));
break;

case ADL_SIM_STATE_REMOVED:
TRACE((1,"SIM removed"));
break;

case ADL_SIM_STATE_INSERTED:
TRACE((1,"SIM inserted (PIN state not known yet)"));
break;

case ADL_SIM_STATE_FULL_INIT:
TRACE((1,"SIM Full Init done"));
//sim готова к работе
break;

case ADL_SIM_STATE_PIN_ERROR:
TRACE((1,"SIM error state"));
break;

case ADL_SIM_STATE_PIN_OK:
TRACE((1,"PIN code OK, waiting for full init"));
break;

case ADL_SIM_STATE_PIN_WAIT:
TRACE((1,"SIM inserted, PIN code not entered yet"));
break;

case ADL_SIM_STATE_PUK_WAIT:
TRACE((1,"PIN is locked, PUK code is required"));
break;

case ADL_SIM_STATE_PUK_ERROR:
TRACE((1,"Wrong PUK input"));
break;

case ADL_SIM_STATE_FAILURE:
TRACE((1,"PUK is locked, SIM is unavailable"));
break;
};
}


void adl_main ( adl_InitType_e InitType )
{
My_tmr = (adl_tmr_t *)adl_tmrSubscribe ( TRUE, 10, ADL_TMR_TYPE_100MS, (adl_tmrHandler_t)Check_SIM );
}
ArtemTom
bronepoezd Спасибо будем пробовать.
А может есть исходничком уже что-то работающее?
А то куда вставлять и сработало или нет непонятно.

И ещё вопрос чем отличаются файлы при компиляции?
gcc_Client.dwl
gcc_Client.wpb.dwl
У меня в некоторых случаях заливается только один в некоторых другой.
bronepoezd
Сжатый /несжатый я лью обычно несжатый) Мой исходник на 1500 строк точно будет еще менее понятен) http://www.compeljournal.ru/enews/2007/19/9 почитай вот это и встраивай в adl' евский пример hello world=) я так разбирался)
ArtemTom
Спасибо будем разбиратся.
А не бывало что при заливке сразу еррор и пишется передача прервана удаленной системой?
У тебя весь код одним файлом? И при какой скорости заливаешь?

Да и самое главное забыл, можно как тестить без заливки в модем? Что каждые 5 мин не перезаливать.
Target monitoring tool вроде для этого?
bronepoezd
1) Да бывает=)
2) все одним файлом rolleyes.gif
3) я так и не смог настроить эмулятор) так что забил и тестю на модеме) тока надо поаккуратнее)я долго его реанимировал после fault 004=)
ArtemTom
bronepoezd
Тут есть вроде как работающие приложение, там и проверка как у тебя sim карты идет, и по коду вроде всё должно работать, а когда заливаю в модем он мне выдает все те же 5 строк и всё.
Как там дальше что запускать, по коду он мне должен строки выдавать по процессом ну или хотябы ошибки какие, а тут эти 5 строк и всё. Посмотри, может скажешь что.
Вобщем эти строки после WOPEN=1 выскакивают и что дальше? Автоматом все должно быть или мне что делать?
bronepoezd
Мое на основе этого сделано) должно все нормально работать) Еще раз ) пихай везде где можно TRACE((1,"my_text")); чтобы понять где отваливается.
Пин код на симке надеюсь отключен?
ArtemTom
Да пин код отключен. Щас попихаю тогда.

Там даже перед этой функцией - wip_netInitOpts, которая и выводит:
Код
[GPRS]: initialized.
[GSM]: initialized.
[UART1]: initialized.
[UART2]: initialized.
[]: initialized.

Стоит TRACE (( 1, "Start" ));
Значит как минимум должно быть:
Код
Start
[GPRS]: initialized.
[GSM]: initialized.
[UART1]: initialized.
[UART2]: initialized.
[]: initialized.

А у меня просто эти строки. У тебя они появляются вобще при запуске?
bronepoezd
В чем ты их смотришь? если m2m там есть настройки в трейсах. поставь галочки на всех каналах
ArtemTom
Ни в чём, компилю в Eclipse и в модем заливаю, а в Гипертерминале это и выдает.
bronepoezd
если надо в гипер терминале - adl_atSendResponse(ADL_AT_RSP,"my_text"); вообще для отладки юзай m2m studio
ArtemTom
Ок щас и m2m поставлю буду пробовать.
ArtemTom
В TRACE((2,"SIM state: %d",SIM_event)); есть %d, SIM_event.
А как мне в adl_atSendResponse(ADL_AT_RSP,"SIM state:"); это вставить, в мануалах для этой функции нет %d, как мне сделать аналог TRACE? Эта функция только строку может выводить или как в TRACE можно сделать.
bronepoezd
Ну например так
char* temp=adl_memGet(10);
int k=0;
adl_atSendResponse(ADL_AT_RSP,wm_itoa(k, temp));
ArtemTom
Ну а для примера выше это как будет выглядеть?
bronepoezd
Блин чувак, почитай мануалы там все есть .Заюзай функцию wm_strcat()
ArtemTom
Ладно, это и не особо обязательно.
Вобщем у меня эта функция не проходит:
Код
static bool poll_creg_call(adl_atResponse_t *Rsp)
{
    ascii *rsp;
    ascii regStateString[3];
    s32 regStateInt;
    TRACE (( 1, "(poll_creg_call) Enter." ));

    rsp = (ascii *)adl_memGet(Rsp->StrLength);
    wm_strRemoveCRLF(rsp, Rsp->StrData, Rsp->StrLength);
    
    wm_strGetParameterString(regStateString, Rsp->StrData, 2);
    regStateInt = wm_atoi(regStateString);
    
    if ( 1 == regStateInt || 5 ==regStateInt) {          
        TRACE (( 1, "(poll_creg_callback) Registered on GPRS network." ));
        step=4;
    } else {  TRACE (( 1, "not ready %d",regStateInt));
      /* Not ready yet, we'll check again later. Set a one-off timer. */
      My_tmr_2=adl_tmrSubscribe( FALSE, CREG_POLLING_PERIOD, ADL_TMR_TYPE_100MS,
                        poll_creg);
    }                
    return FALSE;
}

Выдает:
(poll_creg_call) Enter.
not ready %d
(poll_creg_call) Enter.
not ready %d
И так по кругу. В чём может быть проблема?
bronepoezd
что выдает команда "AT+CREG?" ?
ArtemTom
Не понятно лог такой:
AT+CREG?
(poll_creg_call) Enter.
not ready %d
Если в ручную то:
AT+CGREG?
+CGREG: 0,1
bronepoezd
После regStateInt = wm_atoi(regStateString);
добавь
TRACE((1,"regStateInt %d",regStateInt));

Что выдает?
ArtemTom
Выдаст
regStateInt %d
biggrin.gif . Я пока не разобрался как выводить переменную в терминал, а m2m у меня не ставится что-то.

bronepoezd
Просматриваю мануалы, там у adl_atSendResponse только вывод строки везде, то что ты описал совсем найти не могу. Может как ещё взможно вывести в терминал значение переменной?
bronepoezd
itoa- стандартаная функция перевода инта в строку wm_itoa- она и есть. Описание есть в Basic_Development_Guide.pdf.
adl_atSendResponse выводит строку. Ну так и переведи все что надо вывести в строку, какие пробелмы?
ArtemTom
Проблемы в том что всё её описание это её упоминание с принемаемыми параметрами, ни примеров как использовать ничего нет.
Для меня непонятно как перевести это
Код
char* temp=adl_memGet(10);
int k=0;
adl_atSendResponse(ADL_AT_RSP,wm_itoa(k, temp));

в это
TRACE((1,"regStateInt %d",regStateInt));
В часности вот это непонятно
Код
char* temp=adl_memGet(10);
int k=0;

как относится к regStateInt?
bronepoezd
Еще раз) почитай как устроена itoa) где искать я тебе сказал) мануал идет вместе с SDK. k для примера- на экране у тебя выведется значение k то есть 0
ArtemTom
Может тебе поможет понять что я в С не особо, и указатели всякие уже подзабыл. И читать одну строку устройства функции не долго. Я нашёл что ты говорил там же 1 строка про неё.
И мне ещё не понятно почему если тут всего 2-3 строки надо написать, тебе это тудно?

Так чтоль просто? Будет работать?
adl_atSendResponse(ADL_AT_RSP, wm_itoa(regStateInt,temp));

Работает выдает 0 вобщем, понятно всё. А как теперь это исправить? Почему 0 то?

Да, насколько я понимаю он проверяет сдесь "AT+CGREG?"? Так почему он будет не 0, если регистрация в GPRS вроде как должна идти только следующим щагом по коду?
"AT+CGREG?" как раз и проверяет статус регистрации в снти GPRS.
bronepoezd
По идее должно выдавать 1,так как когда ты вводил вручную- выдавалось 0,1 и должно было вывести 2й параметр. Кароч) по идее процедура в данном случае нафиг не нужно, имхо=) так как в сети ты регистрируешься . попробуй обойти ее) Забей на if и сразу пиши step=4.
Это как я понимаю идет просто проверка есть сеть или нет. опять же это есть в описании к ат командам.
<stat>(второе значение)
0 :не зарегистрировано, мобильное оборудование не проводит поиск нового оператора
1 :зарегистрировано, домашний оператор
2 :не зарегистрировано, мобильное оборудование проводит поиск нового
оператора для регистрации
3 :регистрация отклонена
4 :неизвестно
5 :зарегистрировано, роуминг

Проблема в том что все хотят чтобы им все написали а мануалы никто читать не хочет)я просто сам столкнулся с этим когда разбирался пару месяуев назад) Посто надо повнимательнее почитать манулы и все) я тож не особо силен в сях , однако разобраться с этим вполне возможно)
ArtemTom
bronepoezd
Да я так и сделал просто вместо 1 поставил 0 при проверке. И всё дальше прошло. Теперь разбираюсь с остальным.
ArtemTom
bronepoezd
Можешь подкинуть интересные функции из своей программы, проверки всякие может что ещё есть?
bronepoezd
Ну думаю это будет полезно=) нашел на вейвкомовском форуме правда иногда работает странно)
//--------------------------------------------------------------------------------------------------------
s32 GetTime(void)
{
adl_rtcTime_t time;
s32 milliseconds;
adl_rtcGetTime(&time);
milliseconds = (s32)1000*time.SecondFracPart/32768;
milliseconds += (s32)1000*time.Second;
milliseconds += (s32)(60*1000)*time.Minute;
milliseconds += (s32)(60*60*1000)*time.Hour;
milliseconds += (s32)(24*60*60*1000)*time.Day;
return milliseconds;
}
//-----------------------------------------------------------------------------------------------------
void OATSleep (u16 msec)
{
s32 initial_time;
u16 diff = 0;
initial_time = GetTime();
while (diff<msec)
{
diff = GetTime() - initial_time;
}
}
ArtemTom
Как-то не работает у меня, может не туда вписал.
Она для чего вообще?
bronepoezd
Задержка без передачи управления: OATSleep (20); -задержка 20 мс.
ArtemTom
А на каком этапе её вызывать? И что может быть полезного, какие возможны лаги без неё? Я тут накопал:
Цитата
После включения питания загруженное в модем приложение обеспечивает автоматическое подключение к сети GSM/GPRS и установление между двумя модемами прозрачного канала обмена данными (TCP/IP-сокета). В процессе работы контролируются нештатные ситуации (сбои SIM-карты, уровень GSM-сигнала, регистрация в сети GSM/GPRS, сбои в сети оператора связи, передача данных через TCP/IP-сокет, активность на порту данных и т.п.) и обеспечивается максимально быстрое восстановление соединения, в том числе, за счет перезагрузки или перехода на резервный канал.
Для настройки режимов работы модема введено расширение AT-команд.
Для исключения ситуации ”зависания” модема все этапы установления соединения и передачи данных охвачены контролем времени завершения (более 30 контролируемых тайм- аутов). В том числе, реализованы тайм-аут на отсутствия приема-передачи данных по интерфейсу и тайм-аут на попытку возврата с резервного канала на основной.

Вот biggrin.gif. Типа так. Вот такие проверки.

Что как тихо, я не порошу всё это). Так просто, какое мнение по поводу этого?
sobr
Цитата
"192.168.1.5"
"Это внутренний IP, на сервере должен быть внешний.
ArtemTom
sobr
Это не надо, там только первый файл работает appli.c, насколько я понимаю. Остальные есть т.к. приложение создано на основе примера из стандартных.
ArtemTom
Вобщем я застопорился на UART.
Ситуация такая:
Файл adl_fcm.h
Цитата
// Old constants for compatibility
#define ADL_FCM_FLOW_GSM_DATA ADL_PORT_GSM_BASE
#define ADL_FCM_FLOW_GPRS ADL_PORT_GPRS_BASE
#define ADL_FCM_FLOW_V24_UART1 ADL_PORT_UART1
#define ADL_FCM_FLOW_V24_UART2 ADL_PORT_UART2
#define ADL_FCM_FLOW_V24_USB ADL_PORT_USB

// Flow subscribed as slave only
#define ADL_FCM_FLOW_SLAVE 0x8000

// Constants for compatibility
#define ADL_FCM_FLOW_V24_MASTER ADL_FCM_FLOW_V24_UART1
#define ADL_FCM_FLOW_V24 ( ADL_FCM_FLOW_V24_UART1 | ADL_FCM_FLOW_SLAVE )

При таком определении
UART1_handle=adl_fcmSubscribe ( ADL_FCM_FLOW_V24_MASTER,(adl_fcmCtrlHdlr_f) UART1_ctrl(adl_fcmDataHdlr_f)UART1_data );
У меня зависает, лог такой:
Код
* My program step 1 * - Wait for step 1
SIM state: 3 - SIM Full Init done
* My program step 15 *
OPEN UART2
Handle UART2 return value: 0
UART1_ctrl: 0 ----- завис всё

Дальше идет перезагрузка и приложение выполняется сначала опять до этого этапа.
Т.е. как я понимаю у меня не открывается UART1.
Если же поставить UART2, т.е.
UART1_handle=adl_fcmSubscribe (ADL_FCM_FLOW_V24_UART2,(adl_fcmCtrlHdlr_f) UART1_ctrl, (adl_fcmDataHdlr_f)UART1_data );
То приложение проходит нормально:
Код
* My program step 1 * - Wait for step 1
SIM state: 3 - SIM Full Init done
* My program step 15 *
OPEN UART2
Handle UART2 return value: 0
UART1_ctrl: 0 - ADL_FCM_EVENT_FLOW_OPENNED
UART1_ctrl: 2 - ADL_FCM_EVENT_V24_DATA_MODE
* My program step 2 *
AT+CREG?
CGREG - 0
...

Но дальше при отправке через UART2 у меня ничего не выводится в терминал.
Если запустить такой код
Код
wip_debug("\n OPA");
adl_fcmSendData (UART1_handle,"Data",4);

То в терминале появится
Код
OPA
UART1_ctrl: 7 - ADL_FCM_EVENT_MEM_RELEASE

Data не выводится.
При выполнении в функции
Цитата
void UART1_write(void)
{ s8 res;
wip_debug("\nWrite to UART2");
res=adl_fcmSendData (UART1_handle,"\r\nInstalling application...\r\n", 29);
wip_debug("\nwrite to UART2: %i",res);
switch (res)
{ case OK: {wip_debug(" - OK");}; break;
case ADL_FCM_EVENT_MEM_RELEASE: {wip_debug(" - ADL_FCM_EVENT_MEM_RELEASE");}; break;
case ADL_FCM_RET_OK_WAIT_RESUME: {wip_debug(" - ADL_FCM_RET_OK_WAIT_RESUME");}; break;
case ADL_RET_ERR_PARAM: {wip_debug(" - ADL_RET_ERR_PARAM");}; break;
case ADL_RET_ERR_UNKNOWN_HDL: {wip_debug(" - ADL_RET_ERR_UNKNOWN_HDL");}; break;
case ADL_RET_ERR_BAD_STATE: {wip_debug(" - ADL_RET_ERR_BAD_STATE");}; break;
case ADL_FCM_RET_ERR_WAIT_RESUME: {wip_debug(" - ADL_FCM_RET_ERR_WAIT_RESUME");};break;
};
};

Лог такой:
Код
Write to UART2
write to UART2: 0 - OK
UART1_ctrl: 7 - ADL_FCM_EVENT_MEM_RELEASE

Т.е. пишет что вроде всё нормально, но информация же должна показыватся в терминале?
Кто может чем помочь. Почему зависает первый UART и работает второй?
Почему не выводится данные в терминал а вместо этого UART1_ctrl: 7 - ADL_FCM_EVENT_MEM_RELEASE?
Может с этим надо что делать AT+WMFM=...?
И если я что ввожу из терминала то должна по идеи выполнятся функция UART1_data? Она не выполняется совсем.
ArtemTom
Вопрос пока снимается.
Там оказывается не виснет).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.