Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Q64 организация TCP/IP с помощью OpenAt
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Сотовая связь и ее приложения
parfum
Раньше свои решения реализовывал на GR64, так как его сняли, начал смотреть Q64. Брал пример смотрел как работает и так далее. Что уже сделал:

Инициализирую симку при помощи adl_simSubscribe(<sim_handler>,<pin_code>),
дожидаюсь результата: ADL_SIM_EVENT_FULL_INIT;
далее проверяю наличие в сети значения: NETWORK_HOME_REG;
после начинаю с GPRS, определяю контекст:
// adl_gprsSetupParams_t gprs_setup;
// u8 ctx_id=1;
adl_gprsSetup (ctx_id,gprs_setup);
ожидаю результата: ADL_GPRS_EVENT_SETUP_OK;
следую дальше, аттачу GPRS и активиру контекст:
запускаю adl_gprsAct(ctx_id), ожидаю сзначений
ADL_GPRS_EVENT_ME_ATTACH...ADL_GPRS_EVENT_ACTIVATE_OK;
после приходится лезть в wip:
инициализирую wip_netInit(), получаю положительный результат: 0;

И вот что делать дальше не понимаю, в GR64 открывал сокет и коннектился, в примерах по WIP
все сетевые работы делаются при помощи WIP функций
wip_bearerOpen(...), wip_bearerStart(...), wip_bearerStart(...) которые поднимают GPRS и активируют контекст,
а далее работа с tcp/ip при помощи wip_TCPClientCreate(PEER_STRADDR,PEER_PORT....).

Так вот непойму, как подсунуть активированный при помощи adl функций GPRS для активации сокета
и tcp/ip коннекта, а не проделывать GPRS манипуляции с помощью wip_bearer* функций,
ну типа засунуть куда нибудь готовый CID, а далее wip_TCPClientCreate(...).
От Sierra Wireless ответа ждать долго придется, я так полагаю. Заранее спасибо.
bolmoe
а после активации GPRS сразу если попробовать wip_TCPClientCreate(...), все должно прокатить...

А почему не используешь wip_bearer?
parfum
Цитата(bolmoe @ Apr 1 2010, 12:20) *
а после активации GPRS сразу если попробовать wip_TCPClientCreate(...), все должно прокатить...
А почему не используешь wip_bearer?

В том то и дело что-то не проходит, ошибка в handle вылетает, wip_bearer не использовал, потому что щас переписываю код с GR64 на Q64, и двигаюсь по аналогии, а adl_gprs как то понятней (адекватней), про поведение wip_bearer пока мне не понятно.
На GR-ке поднимал GPRS а далее сокет и tcp соединение, если адрес не доступен другой адрес и т.д., GPRS не трогаю. Вообще как то после GR-64 туговато идет, не нашел в Q64 кода события GRPS_DENIED, когда GPRS запрещен оператором, в Q-ке общая ошибка что ошибка в пароле, что запрет оператора - один код.
В wip_bearerOpen есть указатель на контекст - ему случаем нельзя подсунуть указатель на переменную с номером контескта из adp_gprs ?? или с помощью wip_setCtx чего поиграться?? Если не получиться в этом направлении то сделаю конечно через wip_bearer, но интересней прикрутить к готовому adl-кому GPRS, не пойму в чем проблема.
bolmoe
Если ты про ctxId, то это указатель на данные, которые ты можешь передать в обработчик bearer events handler, из которого можно запустить tcpCreate...
там у них в документации есть простенький пример через bearer...(у меня FASTRACK GO (Q2686)), а ты там при создании проекта прикрутил wip библиотеку(Пользуешься m2m studio?)?
Не знаю, пригодится или нет...., у меня несколько задач запускаются, так вот..., GPRS только в main task инициализируется, хоть в мурзилке и пишется что tcp можно в любой задаче запустить, у меня не прошло (может что и не так сделал), пришлось в основной задаче крутиться, это достаточно просто там делается через msg сервис, если задача одна, то все делается через bearer events handler
Хотя, честно говоря, не понимаю, почему tcpClientCreate не заработало, там же нет параметров входных от bearer, ctxId - можешь передавать, а можешь не передавать(NULL написать), через этот параметр в обработчик tcp можно передавть параметры, я к примеру передаю структуру, в которой хранятся параметры HTTP запроса на сервак (GET ...HTTP 1.1\r\n)
parfum
Цитата(bolmoe @ Apr 1 2010, 16:53) *
(Пользуешься m2m studio?)?

Только для компиляции, нет времени свой make сделать, разберусь, откажусь от этого монстра.

Цитата(bolmoe @ Apr 1 2010, 16:53) *
Хотя, честно говоря, не понимаю, почему tcpClientCreate не заработало, там же нет параметров входных от bearer,

Я то же не понимаю, щас выкину все из кода оставлю только ветку sim->gprs->ip и буду копать глубже. А bearer точно не устанавливает где-то внутрях у себя какие-нибуть указатели на установленный context gprs? В доках как-то все по скромному.
Если не добью до конца, выложу код, может мысли какие появятся.
bolmoe
Еще раз повторюсь, не забудь "прикрутить" wip библиотеку (это НЕ #include "wip.h")..., она включается на стадии создания проекта..., после этого она добавляется в твой код при компиляции
parfum
Цитата(bolmoe @ Apr 2 2010, 10:37) *
Еще раз повторюсь, не забудь "прикрутить" wip библиотеку (это НЕ #include "wip.h")..., она включается на стадии создания проекта..., после этого она добавляется в твой код при компиляции

Это само-собой разумеется, иначе бы wip_bearerStart не отрабатывал бы, а вариант с bearer я попробывал и он работает, ну чтоб исключить проблемы сборки. Когда будет результат (любой), отпишусь.
parfum
Вообщем пришёл к выводу, что bearerStart предполагаю не только GPRS поднимает, если есть событие WIP_BEV_IP_CONNECTED. Если поднимаю GPRS через adl а потом wip_TCPClientCreate(PEER_STRADDR,PEER_PORT,my_handler,NULL) то в обработчике сразу появляется WIP_CEV_ERROR. Если делаю все через bearer, то в bearer обработчике появляется событие WIP_BEV_IP_CONNECTED далее wip_TCPClientCreate(PEER_STRADDR,PEER_PORT,my_handler,NULL) и в my_handler появляется событие WIP_CEV_WRITE. Но самое интересное перед этим не появляется событие WIP_CEV_OPEN, это как понимать??
bolmoe
WIP_CEV_OPEN у меня возникает,я там формирую строку запроса GET .....HTTP 1.1
Меня тут другое интересует, если соединение с сервером заканчивается, то через несколько секунд bearer закрывается, что естественно меня не устраивает, где это полечить пока не нашел, до этих сообщений от тебя тоже собирался на GPRS активацию без bearer, теперь вот не знаю что делать, "мурзилку" буду дальше читать...
parfum
Цитата(bolmoe @ Apr 3 2010, 13:44) *
Меня тут другое интересует, если соединение с сервером заканчивается, то через несколько секунд bearer закрывается, что естественно меня не устраивает, где это полечить пока не нашел, до этих сообщений от тебя тоже собирался на GPRS активацию без bearer, теперь вот не знаю что делать, "мурзилку" буду дальше читать...

Так по этому я и пошёл по прокатанному варианту (отработано на GR64), Я вот думаю можеть информацию полученную с помощью adl_gprsGetCidInfomations куда-нибудь прикручивать. А каждый раз проходить цепочку GPRS -> IP в случае обрыва сокета, то же не охота, раньше заново переоткрывал сокет (если он был закрыт) и только ip connection, Буду дальше ковырять, от sierra wireless все равно ничего не добьешься. После исследований отпишусь.
parfum
Цитата(bolmoe @ Apr 3 2010, 13:44) *
Меня тут другое интересует, если соединение с сервером заканчивается, то через несколько секунд bearer закрывается, что естественно меня не устраивает

А что значит bearer закрывается - какое событий, и в каком обработчике в bearerStart или TCPxxxCreate?
bolmoe
сначало, сокет заврывается (как только все данные получены) - WIP_CEV_PEER_CLOSE, буквально через нескольлко секунд - WIP CE PEER CLOSE. Меня это совсем не устаривает, если бы отконнекчивался хотя бы через минуту...
parfum
Цитата(bolmoe @ Apr 5 2010, 10:51) *
сначало, сокет заврывается (как только все данные получены) - WIP_CEV_PEER_CLOSE, буквально через нескольлко секунд - WIP CE PEER CLOSE. Меня это совсем не устаривает, если бы отконнекчивался хотя бы через минуту...

Я себе делал так:
if (WIP_CEV_PEER_CLOSE==Event->kind){
wip_close(Event->channel);
adl_tmrSubscribe(FALSE, 1, ADL_TMR_TYPE_100MS, (adl_tmrHandler_t) &connect);
}
static void connect(u8 Id) {
wip_TCPClientCreate(xxxx_ipaddress,xxxx_port, xxxx_handler,NULL);
}
А вот почему у тебя приходит дважды, один за одним WIP_CEV_PEER_CLOSE - не понял, у тебя случайно где-то не сделано wip_close(), или bearerClose(), т.е. закрытие идет по цепочке, откидывается GPRS например, и он ложит соединение, и в handler пробрасывается еще раз WIP_CEV_PEER_CLOSE?
bolmoe
))), это я по ошибке скопированное вставил дважды))), естественно в последнем случае WIP_BEV_IP_DISCONNECTED
мне так часто раз в 100мс не надо, мне раз в 20-30 сек....
parfum
Цитата(bolmoe @ Apr 5 2010, 17:55) *
естественно в последнем случае WIP_BEV_IP_DISCONNECTED

Ну тогда как и писал выше, у тебя не ip сокет закрывается, а ложиться GPRS, он по цепочке закрывает сокет.
А почему GPRS у тебя ложеться, оператор ложит, или ты сам закрывешь? чего то я не понял.
Пример выше, на случай когда рубиться TCP/IP соединение, но GPRS при этом поднят, делаешь новый коннект, у меня на этот случай идет перебор резервных серверов, и будет тебе счастье.
Vlad1977
Люди подскажите плииз, был контроллер раньше, и по уарту управлял модемом wavecom FXT002, все работало замечательно. Но тут случиласт проблема нехватки озу на контроллере, вот решил использовать озу самого модема ну соответственно с помощью Open AT. Взял пример ихних что бы создать тсп_клиента, и начался какой то кошмар. Проходит ввод пин кода adl_simSubscribe( evh_sim, GPRS_PINCODE);, возвращается состояние ADL_SIM_EVENT_FULL_INIT:
Дальше делаю все как в примере после запроса
adl_atCmdCreate( "AT+CREG?", FALSE, poll_creg_callback, ADL_STR_CREG, NULL);
попадаю вот сюда
.....
if ( 1 == regStateInt || 5 ==regStateInt) {
TRACE (( 1, "(poll_creg_callback) Registered on GPRS network." ));
open_and_start_bearer();
}
.....
вызываю открыть беар. Но функция
.....
if ((r=wip_bearerOpen(&b,"GPRS", evh_bearer, NULL)) !=0)
{ TRACE (( 1, "wip_bearerOpen r = %d ",r ));

//return FALSE;
}
.....
мне постоянно возвращает значение r=-28, и соответственно дальше ничгео не работает. Может подскажите из за чего такое мождет происходить?
gosha14
А WIP стек перед этим инициализировали?
Vlad1977
Да инициализировал, там стоит вначале программы
r = wip_netInitOpts(
WIP_NET_OPT_DEBUG_PORT, WIP_NET_DEBUG_PORT_UART1, WIP_NET_OPT_END);

Это может быть как то связано с отладкой? Я запускаю программу в режиме RTE, модем подлючен по usb к компу,
вот сейчас допустим wip_bearerOpen вернул 0, а на след операторе:

r = wip_bearerSetOpts( b, WIP_BOPT_GPRS_APN, GPRS_APN,
WIP_BOPT_LOGIN, GPRS_USER,
WIP_BOPT_PASSWORD, GPRS_PASSWORD,
WIP_BOPT_END);

вылетает окно дизассемблера, и после этого, программа виснет, и дальше логику отследить невозможно в принипе sad.gif.

Vlad1977
Еще на счет отладки в m2m, у меня почему то получается запустить отладку только в RTE режиме. А вот тут вот запускают по дргуом, но почему то у меня так не получилось. http://www.youtube.com/watch?v=q_NTeAN-p_0...player_embedded
Vlad1977
оказывается проблема вот в этих параметрах: GPRS_USER и GPRS_PASSWORD, если ставлю их в NULL, отладчик вылетает на wip_bearerSetOpts, ставлю их в gdata или в *, то он проходит установку те wip_bearerSetOpts, но вылетает на старте беар, с ошибкой -27, и пишет [WIP] No more ctx, call adl_gprsUnsubscribe().
Оператор мегафон, у него никогда не было ни логина ни пароля, что можно еще попробовать туда записать?
GeGeL
Может, не совсем в тему, но если уж совсем упретесь в глухую стену, то помните о возможности соединения "вручную". Можно отлогировать конект РС с подходящим драйвером модема. Причем нет необходимости в реализации полного ррр, достаточно отработать его по минимальному шаблону, т.к. в GSM сам алгоритм ррр зависит только от прошивки модуля, но не от оператора. Таким образом, после CGDCONT и ATD обычно достаточно двух обменов фиксированными пакетами для LCP, одного обмена для PAP и двух-трех - для IPCP. Из дополнительных функций понадобится 7D-преобразование и crc16. В итоге получаем как бы raw-сокет с полным доступом к IP-заголовкам. Если обмен будет только по UDP, то просто дописываем IP-UDP заголовок к датаграмме (с длиной данных, UDP CS можно 0 , считаем IP CS и crc16, выполняем 7D-преобразование и отправляем в порт). Для TCP-сокета гимора чуть побольше (необходимо "тройное рукопожатие" вначале, вести счетчики SEQ и ACK и таймауты повторных отсылок), но вполне реализуемо.
В итоге получаем абсолютно прозрачную и полностью управляемую вами реализацию обмена без глюков встроенного стека.
Vlad1977
Да хочется же разобраться с wip, сейчас вот где стопорится: начинается соеденение с жпрс, а потом модем почему то, судя по лампочке, сбрасывается, отладка опять же ничего не показывает.

GPRS]: GPRS CTX (cid=1) found
[GPRS]: GPRS EVENT SETUP OK (cid=1): GPRS activate

+WIND: 3

+WIND: 13

+WIND: 1

+WIND: 16

+WIND: 4

+WIND: 10,"SM",0,"FD",0,"ON",0,"SN",0,"EN",0

+WIND: 11,,,,"9D59FA612615B2190DCB1F8273AE906B","CDD9FB4785F604BADC77D4B146B6147
C",

+WIND: 7

[GPRS]: open: -> DISCONNECTED
[GPRS]: start: -> CONNECTING
[WIP] No more ctx, call adl_gprsUnsubscribe()
[GPRS]: close: -> CLOSED

gosha14
Цитата(Vlad1977 @ Dec 29 2011, 07:46) *
оказывается проблема вот в этих параметрах: GPRS_USER и GPRS_PASSWORD, если ставлю их в NULL, отладчик вылетает на wip_bearerSetOpts, ставлю их в gdata или в *, то он проходит установку те wip_bearerSetOpts, но вылетает на старте беар, с ошибкой -27, и пишет [WIP] No more ctx, call adl_gprsUnsubscribe().
Оператор мегафон, у него никогда не было ни логина ни пароля, что можно еще попробовать туда записать?

Заменяете их просто пустыми кавычками #define GPRS_USER ""
Vlad1977
вот же фигня какая, оказалось все банально просто, открутилась антенна на модеме sm.gif, сеть он кое как видел, а вот жпрс не работал.
Vlad1977
А как правильно закрыть соединение c GPRS, что бы выключить модем, в опен ат? Я сейчас делаю так: вызываю wip_close(), потом попадаю на функцию finalizzer, она вызывается когда сокет закрыт. И в ней уже пытаюсь закрыть wip_bearerClose(), но в ответ приходит ошибка -24. Что это за ошибка понять не могу sad.gif
bolmoe
Цитата(Vlad1977 @ Jan 13 2012, 12:17) *
А как правильно закрыть соединение c GPRS, что бы выключить модем, в опен ат? Я сейчас делаю так: вызываю wip_close(), потом попадаю на функцию finalizzer, она вызывается когда сокет закрыт. И в ней уже пытаюсь закрыть wip_bearerClose(), но в ответ приходит ошибка -24. Что это за ошибка понять не могу sad.gif


По поводу ошибки - WIP_BERR_BAD_HDL
При открытии есть параметр wip_bearer_t *br, его же надо и при закрытии использовать

//глобальная переменная
wip_bearer_t br;

wip_bearerOpen( &br, "GPRS", Handler обработчик сообщений, NULL)
wip_bearerStart ( br );
wip_bearerClose( br);


Vlad1977
Цитата(bolmoe @ Jan 18 2012, 12:57) *
По поводу ошибки - WIP_BERR_BAD_HDL
При открытии есть параметр wip_bearer_t *br, его же надо и при закрытии использовать

//глобальная переменная
wip_bearer_t br;

wip_bearerOpen( &br, "GPRS", Handler обработчик сообщений, NULL)
wip_bearerStart ( br );
wip_bearerClose( br);

спасибо с этим уже разобрался.
Может вы сталкивались с повышенным потреблением? модем жрет собара порядка 30-40мА в sleep режиме w32k=1, уже и open at отключил вообще. А пишут что должен потьреблять порядка 3-4 мА.
bolmoe
Цитата(Vlad1977 @ Jan 18 2012, 15:19) *
спасибо с этим уже разобрался.
Может вы сталкивались с повышенным потреблением? модем жрет собара порядка 30-40мА в sleep режиме w32k=1, уже и open at отключил вообще. А пишут что должен потьреблять порядка 3-4 мА.


Честно говоря не сталкивался, задача немного другая, используем FASTRACK GO( 2686) и GL6100(WMP 100). Питаются от сети 220В, постоянно в GPRS висит, получает от и отправляет данные на сервер(а)... sm.gif Энергию не бережем sm.gif

кстати, а DTR сигнал учитываете, а то при AT+W32K=1 отруливание SLEEP режимом происходит сигналом DTR, может просто терминал не находится в sleep режиме?
Чтобы без DTR -> AT+W32K=1,0
Vlad1977
Цитата(bolmoe @ Jan 19 2012, 10:23) *
Честно говоря не сталкивался, задача немного другая, используем FASTRACK GO( 2686) и GL6100(WMP 100). Питаются от сети 220В, постоянно в GPRS висит, получает от и отправляет данные на сервер(а)... sm.gif Энергию не бережем sm.gif

кстати, а DTR сигнал учитываете, а то при AT+W32K=1 отруливание SLEEP режимом происходит сигналом DTR, может просто терминал не находится в sleep режиме?
Чтобы без DTR -> AT+W32K=1,0

Конечно dtr учитывается, в sleep mode он явно попадает, тк потребление после w32k снижается с 90ма до 30ma и сразу перестает реагировать на ат команды, через рс232. Как только dtr в 1цу загоняешь, модем просыпается. При том интересно, что если физически из модема выдернуть кабель рс232 в sleep mode, то потребление еще снижается и становится примерно 20-25ма, хотя это тоже много. И еще это потребление одинаково при рабочем gsm модуле и без него, одинаково высокое я бы сказал. Попробую завтра компорт командой отключить, хотя не уверен что это поможет. Еще можно попробовать все ноги на рс232 на землю опустить.... А больше идей никаких че то нету sad.gif, я уже даже светодиод на модема отключил, для чистоты эксперимента, что бы ничего ему не мешало.
Vlad1977
точно, погсле команды at+wasr=1, уарт отключается полностью и потребление становится как и заявлено 2-3мА.
Vlad1977
Как сдлеать прерывание от INT3? От gpio все понятно, adl_extintSubscribe(ножка, вектор,параметры). Ну еще же есть 4 входа INT0-4, а про них что то ни слова нигде нету, нашел только как приоритет у них менять.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.