ArtemTom
Jul 2 2009, 06:59
Помогите разобраться с подключением к серверу через GPRS с помощию OPENAT приложения.
Вобщем я с помощью АТ команд(WIP) настроил один модем для прослушивания определённого порта. Это будет сервер.
Дальше попытался сделать элементарное приложение в OPENAT на основе WIP tcp_client. Просто поменял там адрес сервера на то что у меня и GPRS_APN, login, pass. Только чтоб он постучался к серверу.
Залил приложение. Запускаю AT+WOPEN=1.
Вываливаются строки:
[GPRS]: initialized.
[GSM]: initialized.
[UART1]: initialized.
[UART2]: initialized.
[]: initialized.
И всё что дальше? На сервере ничего не происходит, он не определяет никакого коннекта к нему.
Я пока только начинаю разбираться, наверно что-то простое упустил?
bronepoezd
Jul 2 2009, 08:43
Это отработала функция wip_netInitOpts. Далее надо wip_bearerOpen();wip_bearerSetOpts() по вкусу;wip_bearerStart(). Только не забудь проверить готовность сим карты.
upd : невнимательно прочитал нельзя менять GPRS_APN, логин и пароль иначе ты не выйдешь в инет через жпрс и не сможешь приконнектится
ArtemTom
Jul 2 2009, 09:09
Это нужно в OPENAT прописывать? Или как из терминала уже запускать при этом приложении?
Мне бы хотелось чтоб при включении питания модем автоматически стучался в порт на сервере.
Как не менять APN пароль и логин там же по умолчанию:
#define GPRS_APN "websfr"
#define GPRS_USER "a2b"
#define GPRS_PASSWORD "access"
#define GPRS_PINCODE "0000"
А мне надо "internet.mts.ru", "mts", "mts". Или и с этим каракулями запустится?
bronepoezd
Jul 2 2009, 09:18
да, надо именно
#define GPRS_APN "internet.mts.ru" и т.д. А как ты обращаешься к "серверу"? IP на каждой сессии меняется) Если ты хочешь сразу после включения стучаться-поймай сначала событие об полной инициализации сим карты
ArtemTom
Jul 2 2009, 09:25
Ну сервер я не трогаю пока, запустил там "AT+WIPBR=4,6,0" и "AT+WIPCREATE=3,1,2000,5,8" и всё, узнал IP "AT+WIPBR=3,6,15" и ждет слушает.
А в OPENAT сделал приложение на основе WIP client изменил там IP адрес на полученный от сервера и порт поставил, APN поменял. Запустил наивно думал что приконектится, а нет. Для чего же это приложение пример, что оно делает кроме вывода этих строк?
bronepoezd
Jul 2 2009, 09:29
Да блин, я не понял, ты что , вместо internet.mts.ru адрес сервера в GPRS_APN поставил?=) Сокету присвается ненулевое значение?
ArtemTom
Jul 2 2009, 09:32
Нет конечно, там при создании на основе примера создается 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
Jul 2 2009, 09:42
Ну тут уже судить тяжело попробуй получить для начала данные с какого -нить ya.ru . Поставь трейсы в процедурах чтоб понять где отваливается).
Лучше всего на мой взгяд написать свое приложение на основе примеров, как хоть понять можно как и что рабоает).
ArtemTom
Jul 2 2009, 09:55
А если тариф такой что у модемов только локальная сеть и они инет не видят?
Ну что никто не делал на основе этого примера WIP tcp_client. Он должен только эти строки чтоль выводить или конектится сразу? Может после них нужно набрать что?
Лучше всего на мой взгяд написать свое приложение на основе примеров.
Да, но для этого надо наверно понять что в примерах, я пока начинаю разбираться и фразы
Только не забудь проверить готовность сим карты
поймай сначала событие об полной инициализации сим карты
Мне не совсем понятно как реализовывать.
Может кто делал что подобное дайте мне примеры, чтоб быстрей пошло.
bronepoezd
Jul 2 2009, 10:03
>Мне не совсем понятно как реализовывать.
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
Jul 2 2009, 10:29
bronepoezd Спасибо будем пробовать.
А может есть исходничком уже что-то работающее?
А то куда вставлять и сработало или нет непонятно.
И ещё вопрос чем отличаются файлы при компиляции?
gcc_Client.dwl
gcc_Client.wpb.dwl
У меня в некоторых случаях заливается только один в некоторых другой.
bronepoezd
Jul 2 2009, 10:36
Сжатый /несжатый я лью обычно несжатый) Мой исходник на 1500 строк точно будет еще менее понятен)
http://www.compeljournal.ru/enews/2007/19/9 почитай вот это и встраивай в adl' евский пример hello world=) я так разбирался)
ArtemTom
Jul 2 2009, 10:45
Спасибо будем разбиратся.
А не бывало что при заливке сразу еррор и пишется передача прервана удаленной системой?
У тебя весь код одним файлом? И при какой скорости заливаешь?
Да и самое главное забыл, можно как тестить без заливки в модем? Что каждые 5 мин не перезаливать.
Target monitoring tool вроде для этого?
bronepoezd
Jul 2 2009, 11:12
1) Да бывает=)
2) все одним файлом
3) я так и не смог настроить эмулятор) так что забил и тестю на модеме) тока надо поаккуратнее)я долго его реанимировал после fault 004=)
ArtemTom
Jul 2 2009, 12:06
bronepoezd
Тут есть вроде как работающие приложение, там и проверка как у тебя sim карты идет, и по коду вроде всё должно работать, а когда заливаю в модем он мне выдает все те же 5 строк и всё.
Как там дальше что запускать, по коду он мне должен строки выдавать по процессом ну или хотябы ошибки какие, а тут эти 5 строк и всё. Посмотри, может скажешь что.
Вобщем эти строки после WOPEN=1 выскакивают и что дальше? Автоматом все должно быть или мне что делать?
bronepoezd
Jul 2 2009, 12:24
Мое на основе этого сделано) должно все нормально работать) Еще раз ) пихай везде где можно TRACE((1,"my_text")); чтобы понять где отваливается.
Пин код на симке надеюсь отключен?
ArtemTom
Jul 2 2009, 12:38
Да пин код отключен. Щас попихаю тогда.
Там даже перед этой функцией - 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
Jul 2 2009, 12:48
В чем ты их смотришь? если m2m там есть настройки в трейсах. поставь галочки на всех каналах
ArtemTom
Jul 2 2009, 12:51
Ни в чём, компилю в Eclipse и в модем заливаю, а в Гипертерминале это и выдает.
bronepoezd
Jul 2 2009, 12:52
если надо в гипер терминале - adl_atSendResponse(ADL_AT_RSP,"my_text"); вообще для отладки юзай m2m studio
ArtemTom
Jul 2 2009, 12:54
Ок щас и m2m поставлю буду пробовать.
ArtemTom
Jul 3 2009, 04:57
В TRACE((2,"SIM state: %d",SIM_event)); есть %d, SIM_event.
А как мне в adl_atSendResponse(ADL_AT_RSP,"SIM state:"); это вставить, в мануалах для этой функции нет %d, как мне сделать аналог TRACE? Эта функция только строку может выводить или как в TRACE можно сделать.
bronepoezd
Jul 3 2009, 05:41
Ну например так
char* temp=adl_memGet(10);
int k=0;
adl_atSendResponse(ADL_AT_RSP,wm_itoa(k, temp));
ArtemTom
Jul 3 2009, 05:53
Ну а для примера выше это как будет выглядеть?
bronepoezd
Jul 3 2009, 05:58
Блин чувак, почитай мануалы там все есть .Заюзай функцию wm_strcat()
ArtemTom
Jul 3 2009, 06:09
Ладно, это и не особо обязательно.
Вобщем у меня эта функция не проходит:
Код
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
Jul 3 2009, 06:18
что выдает команда "AT+CREG?" ?
ArtemTom
Jul 3 2009, 06:21
Не понятно лог такой:
AT+CREG?
(poll_creg_call) Enter.
not ready %d
Если в ручную то:
AT+CGREG?
+CGREG: 0,1
bronepoezd
Jul 3 2009, 06:37
После regStateInt = wm_atoi(regStateString);
добавь
TRACE((1,"regStateInt %d",regStateInt));
Что выдает?
ArtemTom
Jul 3 2009, 07:04
Выдаст
regStateInt %d

. Я пока не разобрался как выводить переменную в терминал, а m2m у меня не ставится что-то.
bronepoezdПросматриваю мануалы, там у adl_atSendResponse только вывод строки везде, то что ты описал совсем найти не могу. Может как ещё взможно вывести в терминал значение переменной?
bronepoezd
Jul 3 2009, 07:32
itoa- стандартаная функция перевода инта в строку wm_itoa- она и есть. Описание есть в Basic_Development_Guide.pdf.
adl_atSendResponse выводит строку. Ну так и переведи все что надо вывести в строку, какие пробелмы?
ArtemTom
Jul 3 2009, 07:48
Проблемы в том что всё её описание это её упоминание с принемаемыми параметрами, ни примеров как использовать ничего нет.
Для меня непонятно как перевести это
Код
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
Jul 3 2009, 07:51
Еще раз) почитай как устроена itoa) где искать я тебе сказал) мануал идет вместе с SDK. k для примера- на экране у тебя выведется значение k то есть 0
ArtemTom
Jul 3 2009, 08:24
Может тебе поможет понять что я в С не особо, и указатели всякие уже подзабыл. И читать одну строку устройства функции не долго. Я нашёл что ты говорил там же 1 строка про неё.
И мне ещё не понятно почему если тут всего 2-3 строки надо написать, тебе это тудно?
Так чтоль просто? Будет работать?
adl_atSendResponse(ADL_AT_RSP, wm_itoa(regStateInt,temp));
Работает выдает 0 вобщем, понятно всё. А как теперь это исправить? Почему 0 то?
Да, насколько я понимаю он проверяет сдесь "AT+CGREG?"? Так почему он будет не 0, если регистрация в GPRS вроде как должна идти только следующим щагом по коду?
"AT+CGREG?" как раз и проверяет статус регистрации в снти GPRS.
bronepoezd
Jul 3 2009, 09:00
По идее должно выдавать 1,так как когда ты вводил вручную- выдавалось 0,1 и должно было вывести 2й параметр. Кароч) по идее процедура в данном случае нафиг не нужно, имхо=) так как в сети ты регистрируешься . попробуй обойти ее) Забей на if и сразу пиши step=4.
Это как я понимаю идет просто проверка есть сеть или нет. опять же это есть в описании к ат командам.
<stat>(второе значение)
0 :не зарегистрировано, мобильное оборудование не проводит поиск нового оператора
1 :зарегистрировано, домашний оператор
2 :не зарегистрировано, мобильное оборудование проводит поиск нового
оператора для регистрации
3 :регистрация отклонена
4 :неизвестно
5 :зарегистрировано, роуминг
Проблема в том что все хотят чтобы им все написали а мануалы никто читать не хочет)я просто сам столкнулся с этим когда разбирался пару месяуев назад) Посто надо повнимательнее почитать манулы и все) я тож не особо силен в сях , однако разобраться с этим вполне возможно)
ArtemTom
Jul 3 2009, 09:07
bronepoezd
Да я так и сделал просто вместо 1 поставил 0 при проверке. И всё дальше прошло. Теперь разбираюсь с остальным.
ArtemTom
Jul 6 2009, 04:56
bronepoezd
Можешь подкинуть интересные функции из своей программы, проверки всякие может что ещё есть?
bronepoezd
Jul 6 2009, 05:38
Ну думаю это будет полезно=) нашел на вейвкомовском форуме правда иногда работает странно)
//--------------------------------------------------------------------------------------------------------
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
Jul 6 2009, 05:58
Как-то не работает у меня, может не туда вписал.
Она для чего вообще?
bronepoezd
Jul 6 2009, 06:34
Задержка без передачи управления: OATSleep (20); -задержка 20 мс.
ArtemTom
Jul 6 2009, 07:29
А на каком этапе её вызывать? И что может быть полезного, какие возможны лаги без неё? Я тут накопал:
Цитата
После включения питания загруженное в модем приложение обеспечивает автоматическое подключение к сети GSM/GPRS и установление между двумя модемами прозрачного канала обмена данными (TCP/IP-сокета). В процессе работы контролируются нештатные ситуации (сбои SIM-карты, уровень GSM-сигнала, регистрация в сети GSM/GPRS, сбои в сети оператора связи, передача данных через TCP/IP-сокет, активность на порту данных и т.п.) и обеспечивается максимально быстрое восстановление соединения, в том числе, за счет перезагрузки или перехода на резервный канал.
Для настройки режимов работы модема введено расширение AT-команд.
Для исключения ситуации ”зависания” модема все этапы установления соединения и передачи данных охвачены контролем времени завершения (более 30 контролируемых тайм- аутов). В том числе, реализованы тайм-аут на отсутствия приема-передачи данных по интерфейсу и тайм-аут на попытку возврата с резервного канала на основной.
Вот

. Типа так. Вот такие проверки.
Что как тихо, я не порошу всё это). Так просто, какое мнение по поводу этого?
Цитата
"192.168.1.5"
"Это внутренний IP, на сервере должен быть внешний.
ArtemTom
Jul 6 2009, 07:40
sobr
Это не надо, там только первый файл работает appli.c, насколько я понимаю. Остальные есть т.к. приложение создано на основе примера из стандартных.
ArtemTom
Jul 14 2009, 08:23
Вобщем я застопорился на 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
Jul 14 2009, 09:32
Вопрос пока снимается.
Там оказывается не виснет).