Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с передачей данных модем Centerion BGS2
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Сотовая связь и ее приложения
Денис198375
Приборы тестировались в Украине, с оператором сотовой связи «Киевстар», проблем с передачей не было.
А в России , с оператором сотовой связи «Билайн», работает не стабильно. Не всегда устанавливается соединение. Много обрывов связи в момент передачи.

Вот набор команд инициализаций соединения

AT^sics=0,conType,GPRS0
AT^sics=0,passwd,beeline
AT^sics=0,user, beelin
AT^sics=0,apn,” internet.beeline.ru”
AT^siss=1,srvType,socket
AT^siss=1,conId,0
AT^siss=1,address,”socktcp:// gta.com:9090”
adnega
Цитата(Денис198375 @ Aug 26 2013, 17:31) *
Приборы тестировались в Украине, с оператором сотовой связи «Киевстар», проблем с передачей не было.
А в России , с оператором сотовой связи «Билайн», работает не стабильно. Не всегда устанавливается соединение. Много обрывов связи в момент передачи.

Периодически (порядка раз в час) бывают ошибки 616 (network is down) или 640 (operation of service temporary not allowed).
Обычно проходят самостоятельно от нескольких секунд до 2-3 минут, НО иногда все виснет наглухо и помогает только пересброс питания модема. Сам модем при этом работает: звонит, принимает звонки, уровень сигнала отличный, но не отвечает на команду AT^SISO=0.
viakon
У билайна вообще есть какое-то ограничение на длительность сессии. Больше часа соединение не держится, уровень сигнала при этом отличный.. Это из моего опыта по интернету билайн через 3G модем.

BGS2 тут не причем. Наблюдаю такие же проблемы с сим900. У нас в Перми в информационных табло, заменяют сейчас симки билайн на мтс, потому как вообще просто перестает работать GPRS.
РЕДКИЙ
Для какой либо рекомендации лог желательно указать более полный.
есть необязательный параметр INACT равный по умолчанию всего 20 секунд (время неактивности и зарыв GPRS)
Для диагностики проблем TCP есть команда ^SISE

AT^sics=0,conType,GPRS0
формат подачи команд желательно использовать один регистр либо верхний либо нижний. об этом в документации написано.
AT^SICS=....
at^sics=...
Главное запомнить, каждая команда AT^SISO должна заканчиваться AT^SISC

adnega
Цитата(РЕДКИЙ @ Aug 27 2013, 16:32) *
Главное запомнить, каждая команда AT^SISO должна заканчиваться AT^SISC

Можно поподробней?
Если соединение разрывает сервер (которому уже нечего передавать), то AT^SISC нужен?
РЕДКИЙ
читаем док BGS2-E_ATC_V01.301
10.6 AT^SISO
статус сервиса 6 DOWN (причину не рассматриваем)
далее написано
If a service in this state be sure to close it with AT^SISC before reopening it.

Будьте добры приберитесь за собой, а то понаоткрывали тут...
adnega
Цитата(РЕДКИЙ @ Aug 27 2013, 19:08) *
читаем док BGS2-E_ATC_V01.301
10.6 AT^SISO
статус сервиса 6 DOWN (причину не рассматриваем)
далее написано
If a service in this state be sure to close it with AT^SISC before reopening it.

Спасибо. Попробую.
Но без AT^SISC все работает годами (просто, спустя какое-то время делаю AT^SISO и сокет открывается).
yanvasiij
Нашёл тему по BGS2, поэтому пишу сюда.

Передаю данные по жпрсу, для чтения данных использую команду at^sisr=0,8 (читаю по 8 символов из первого профиля). Согласно доке, если правильно понял, сигнал о том, что данные прилетели, служит асинхронно выскакивающая ^SISR: 0,1. Соединение устанавливается и, когда данные приходят, ^SISR: 0,1 выскакивает, данные читаются и обрабатываются. Но так происходит только один раз, самый первый раз. Дальше, когда данные приходят (а они точно приходят, ибо если насильно запустить at^sisr, данные можно считать), ^SISR: 0,1 НЕ выскакивает. В чем дело? Буду признателен за помощь.

Кусок кода, вызываемый для обработки входящих, данных вот такой:
Код
    if(uart0RxNotEmpty()==0) return;
    getResponseFromBgs2ByTime(buf,100);
    /* Прочитать есть ли данные в буфере. Запрашиваю, жду ответа TIME_TO_WAIT_COMMON и ответ ложу в buf */
    if(bgs2Write("AT^SISR=0,8\r\n",13,buf,TIME_TO_WAIT_COMMON)==0) return;//100
    /* Найте место, где заканчивается эхо */
    while(buf[i]!='\n')i++;
    i++;
   /* если все отвалилось */
    if(memCmp("^SISR: 0,-2",&buf[i],11)==0)
    {
        reconnectGprs(buf);
        return;
    }
    /* Считать сведения о принятых данных */
    sscanf(&buf[i],"^SISR: %d,%d",&tmp,&dataLen);
    /* Не продолжать если данныx нет */
    if(dataLen==0) return;
    /* Если данные есть, найти их начало */
    i+=10;
    while(buf[i] != '\n')i++;
    memcpy(tmpBuf,&buf[i+1],10);
    /* Обработать данные */
    if(processModbusMsg((unsigned char*)tmpBuf,(unsigned char*)buf,&dataLen) == 0) return;
        /* ответить */
        memset(tmpBuf,0,100);
    sprintf(tmpBuf,"AT^SISW=0,%d\r\n",dataLen);
    sendStringToBgs2(tmpBuf,strlen(tmpBuf));
    getResponseFromBgs2ByTime (tmpBuf,TIME_TO_WAIT_COMMON);
    sendStringToBgs2(buf,dataLen);
adnega
Цитата(yanvasiij @ Sep 13 2013, 10:36) *
Передаю данные по жпрсу, для чтения данных использую команду at^sisr=0,8 (читаю по 8 символов из первого профиля). Согласно доке, если правильно понял, сигнал о том, что данные прилетели, служит асинхронно выскакивающая ^SISR: 0,1. Соединение устанавливается и, когда данные приходят, ^SISR: 0,1 выскакивает, данные читаются и обрабатываются. Но так происходит только один раз, самый первый раз. Дальше, когда данные приходят (а они точно приходят, ибо если насильно запустить at^sisr, данные можно считать), ^SISR: 0,1 НЕ выскакивает. В чем дело? Буду признателен за помощь.

Насколько я понял, первый раз ^SISR: 0,1 приходит не с данными, а по факту свершения тройного рукопожатия TCP.
В дальнейшем нужно вызывать AT^SISR=0,8, модем сначала ответит OK, а затем асинхронно ^SISR: 0,8 и выдаст принятые данные.
При закрытии соединения также придет асинхронное ^SISR: , но тут в зависимости чья инициатива для закрытия сокета.
yanvasiij
Цитата(adnega @ Sep 13 2013, 14:34) *
Насколько я понял, первый раз ^SISR: 0,1 приходит не с данными, а по факту свершения тройного рукопожатия TCP.
В дальнейшем нужно вызывать AT^SISR=0,8, модем сначала ответит OK, а затем асинхронно ^SISR: 0,8 и выдаст принятые данные.
При закрытии соединения также придет асинхронное ^SISR: , но тут в зависимости чья инициатива для закрытия сокета.

то есть я должен постоянно вызывать at^sisr и проверять есть ли данные?
adnega
Цитата(yanvasiij @ Sep 13 2013, 13:08) *
то есть я должен постоянно вызывать at^sisr и проверять есть ли данные?

А как Вы хотели бы?
Можно конечно выставить AT^SISR=0,1500 и если в бефере на текущий момент что-то есть, то придет порция из 1500 символов.
Представьте, что модем будет слать все что приходит. Т.е. если вторая сторона отправила сначала 100 кБ, потом еще 100 кБ...
yanvasiij
Цитата(adnega @ Sep 13 2013, 16:05) *
А как Вы хотели бы?
Можно конечно выставить AT^SISR=0,1500 и если в бефере на текущий момент что-то есть, то придет порция из 1500 символов.
Представьте, что модем будет слать все что приходит. Т.е. если вторая сторона отправила сначала 100 кБ, потом еще 100 кБ...

Нет, я не "капризничаю". Так даже удобнее, не нужно ловить асинхронные сообщения. Просто этот момент был не понятен. Спасибо за помощь!
adnega
Цитата(yanvasiij @ Sep 13 2013, 14:21) *
Нет, я не "капризничаю". Так даже удобнее, не нужно ловить асинхронные сообщения. Просто этот момент был не понятен. Спасибо за помощь!

Я в этом не уверен. Скорее и у самого нет полного понимания. Кстати, когда соединение рвет вторая сторона у меня у самого не все хорошо.
Редко, но бывает события приходят не те, которые приходят обычно. Лог как-нить могу скинуть.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.