Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: M2МPower
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Сотовая связь и ее приложения
msgm
Здравствуйте.
Разбираюсь потихоньку с этой средой программирования.
Для тренеровки хочу написать прогу, которая будет отсылать смс при включении модуля.
Собственно, сам кусок кода работает, смс отсылаются, но не при включении модуля, а после загрузки скрипта в модуль при выставленной галочке RunScript (single shot).
При выставленной, при загрузке скрипта, галочке RunScript (startup) тоже ничего не происходит (ни сразу после загрузки, ни после включения-выключения модуля).
Чувствую, что ошибка где-то у меня.
Помогите, пожалуйста.

Ниже сам скрипт из примеров м2м:
Цитата
main ()
{
int smserr;

smserr = smsi(0,0);

/* send SMS message */
smserr = smss("+79+++++++++", "SMS Message - test", 145, 12, 18);

if (smserr == 0)
{
prtf ("sent SMS message: SMS Message - test: +79+++++++++\n");
}


}

Модуль GR640002.
msgm
Вобщем, удалось отсылать смс при старте модуля. Просто вставил в начало программы задержку 5 секунд (мб, для регистрации модуля в сети). Однако, смс приходит, примерно, через минуту. Как вообще в таком происходит отсылка смс? Включается модуль, регистрируется, отсылается. А на каком этапе происходит задержка 5 сек? Не понимаю...
alexQ
скрипт пускается сразу. просто для функции отправки смс нужна регистрация модуля в сети и если ее нет она возвращает ошибку и вываливается. вы поставили задержку, и функция отработала.
я бы на вашем месте сделал сначала проверку регистрации модуля в сети а потом уже пускал все остальное.

можно так :

/*****************************************************************************
* CHECK GSM REGISTRATION
****************************************************************************/

CHECK_REGISTRATION()
{
/*For APPS_NETWORK_STATUSBYTE values are for reading network status*/
int APPS_NETWORK_STATUSBYTE =10;
int AT_NET_REGISTERED = 1;
int AT_NET_REGISTERED_ROAMING = 5;
int APPS_LOCK_STATUS_BYTE =16;
int LOCKS_READY = 0; /*No code is required*/
int LOCKS_SIM_PIN_REQUIRED = 1;
int tm_val1 = 20000; /*значение таймера 1 ~ 100 сек*/
int count1 = 0;
char PINCODE[5] = "1111";
int PIN_result;
prtf(" Checking registration GSM network ...");
prtf("\n");
cts(1,tm_val1,1); /*таймер 1 ставим на однократный счет 100sec*/
if(gtb(APPS_LOCK_STATUS_BYTE) == LOCKS_READY)
{
prtf("No code is required!");
}
else
{
if(gtb(APPS_LOCK_STATUS_BYTE) == LOCKS_SIM_PIN_REQUIRED)
{
prtf("\n PIN is required!");
prtf("\n Enter PIN...");
PIN_result=pin(PINCODE,0);
prtf("\n SIM result = %d",PIN_result);
prtf("\n");
}
}
while( gtb(APPS_NETWORK_STATUSBYTE)!= AT_NET_REGISTERED || AT_NET_REGISTERED_ROAMING )
{
if(gtb(APPS_NETWORK_STATUSBYTE) == AT_NET_REGISTERED_ROAMING)
{
prtf("\n We are registered in Roaming!"); prtf("\n"); break;
}
/*если вышел таймаут 100сек */
if ( ctq(1,&tm_val1,&count1) == 1)
{
prtf("\n GSM registration timeout!!! Try to restart device");
prtf("\n");
dlys(1); rst(0);
}
if(gtb(APPS_NETWORK_STATUSBYTE) == AT_NET_REGISTERED)
{
prtf(" We are registered in GSM network."); prtf("\n"); return;
}
}
}
msgm
alexQ, спасибо огромное!
Еще вопрос с вашего позволения smile.gif
prtf("blablabla"); В мануале к интерпретатору написано, что эта функция выводит blablabla в стандартный вывод. А как можно получить доступ к стандартному выводу? Другими словами, где я могу прочитать blablabla при работе программы? В терминале пусто.
alexQ
в терминале пусто потому что надо указать порт куда кидать через функцию prtfdir.

к вашему примеру:

main()
{

prs(0);
prtfdir(1);

prtf("\n Starting embedded application...");
wd(0,10000); /*сторожевой таймер*/
CHECK_REGISTRATION();
prtf("\n");prtf("\n Starting SMS subsystem...");prtf("\n");
smsi(1,1);

while(1)
{
CHECK_REGISTRATION();
/*здесь можно встявлять какие-нибудь свои функции*/
wd(1,0);
}
prtf("\n End embedded application...");
prtf("\n");
wd(0,0);
}
msgm
alexQ, еще раз огромное спасибо!
alexQ
да нет проблем. спрашивайте если будут вопросы )
PriBoris
Извините, что встреваю в разговор немного не по теме.
Сам использую GR64 и M2Mpower, но ...
Недавно к нам на фирму заехали пара FAE из Компэла (где мы собственно эти модули покупаем) и рассказали
(1) В ближайшее время GR64 снимается с производства в пользу Q64. Это полный pin-to-pin аналог, но на другом чипсете.
(2) M2Mpower на Q64 не поддерживается, там будет только OpenAT.

Это я к тому, что рекомендую msgm профильтровать эту информацию. Чтоб ваш труд по освоению и отладке (что достаточно геморройно, знаю не понаслышке) скриптов не пропал.
msgm
PriBoris, спасибо за инфу. Для меня ковыряние в этом модуле не более, чем приятное времяпрепровождение, так что не особо критично. Но пару-тройку gr64 всё же надо прикупить прозапас.
alexQ
компэл сказал полный бред. GR64 официально будут производится еще 2 года.у меня есть оффициальное письмо Wavecom про это дело.

модуль "похожий" на GR с поддержкой OpenAT wavecom действительно сделал.
называетс Q64 и он даже "живет" в GR-м отладочнике. массовое производство планируется осенью.

мне думается что компэл скоро доиграится и по шапке получит от вейвкомов за такую дезу )))

И более того, на прошлой неделе вейвком выпустил новый релиз софта для GR64
версии R5A и новый M2MPower версии 1.1.4.

Удачи!
PriBoris
Цитата(alexQ @ Jun 2 2008, 09:40) *
компэл сказал полный бред. GR64 официально будут производится еще 2 года.у меня есть оффициальное письмо Wavecom про это дело.
модуль "похожий" на GR с поддержкой OpenAT wavecom действительно сделал.
называетс Q64 и он даже "живет" в GR-м отладочнике. массовое производство планируется осенью.
мне думается что компэл скоро доиграится и по шапке получит от вейвкомов за такую дезу )))
И более того, на прошлой неделе вейвком выпустил новый релиз софта для GR64
версии R5A и новый M2MPower версии 1.1.4.
Удачи!


Блин, никому нельзя верить. 05.gif
msgm
alexQ, если после регистрации в сети сразу отсылать смс, то смс не приходит. Если поставить задержку (после реги, но перед отсылкой) в, минимум, 7 секунд (ставил 3 - не приходит; 4,5,6 - не тестил), то всё ок.
Это не вопрос, а так...Наблюдения yeah.gif


alexQ, а вот теперь вопрос:
Хочу отсылать смс с 2 симок по очереди)
1. Регаю симку 0 (внутренняя, на корпусе модуля).
2. Отсылаю смс с симки 0 моей процедурой smssend.
3. Переключаюсь на симку 1 АТ командой AT*ESSE=1.
|-4.а. Отсылаю смс smssend - неудачно.
|-4.б. Выполняю процедуру CHECK_REGISTRATION(); (см.выше), отсылаю смс smssend - неудачно.

Понятно, что проблема в том, что перерегистрация при смене симок не происходит. Куда смотреть?

Решилась проблема. Надо ставить таймаут побольше после смены активной симки (я поставил 20с). Как показывает практика, надо увеличить таймаут между инициализацией и отправкой смс с 10 до 15с.
Ну а всё же, мб можно как-нибудь проверить, готова 2 симка отправлять смс или нет? Типо борьба за чистоту кода)
alexQ
вот человек то ты ленивый smile.gif


main()
{

prs(0);
prtfdir(2);
prtf("\n Starting embedded application...");
wd(0,10000); /*сторожевой таймер на 500сек (50мсек 1тик).*/

CHECK_START_SIM(); /*после старта проверяем с какой СИМ будем работать*/
CHECK_REGISTRATION(); /*проверка GSM регистрации и состояния СИМ*/

prtf("\n");prtf("\n Starting SMS subsystem...");prtf("\n");
smsi(1,1); /*Инициализируем подсистему SMS*/

while(1)
{
CHECK_REGISTRATION(); /*проверка GSM регистрации и состояния СИМ*/
CHECK_IO_ADC_STATE();
CHECK_INCOMING_SMS();

wd(1,0); /* kick the watchdog */
}

prtf("\n End embedded application...");
prtf("\n");
wd(0,0); /*остановка сторожевого таймера*/

}

CHECK_INCOMING_SMS()
{
int sms_slot=0; /*номер слота для хранения SMS*/
char smsadrs[160]; /*буфер для номера абонента*/
char SMS[160]; /*буфер для SMS*/

int smserr;



int resCmdSize;
char resCmd[33];
char ID[6]="1234";
char adc[6];

prtf("\n");prtf("CHECK NEW SMS ARRIVED ... \n"); prtf("\n");

sms_slot=smsrs(); /*Находим в памяти первое непрочитанное SMS*/
if (sms_slot != 0)
{
prtf("NEW SMS ARRIVED!");
smserr = smsi(0,0);



smsra(smsadrs, 160, sms_slot); /*Определяем номер абонента*/
/*Создаем SMS ответ с данными и посылаем
на полученный номер телеметрическую информацию*/
prtf("PREPARING REPLY ...\n");
atcrt(); /*Открываем AT канал */
atsnd("AT+CCLK?",resCmd,8,33,&resCmdSize);
scpy (SMS, "OBJECT ID:");
scat (SMS,ID);
scat (SMS, "; CURRENT TIME: ");
sncpy(SMS+30,resCmd,33);
sncpy(SMS+61,";\nCURRENT: ",11);
itoa (gtb(0),adc,6);
scat (SMS,adc);
scat (SMS,"; VOLTAGE: ");
itoa (gtb(1),adc,6);
scat (SMS,adc);


smserr = smss(smsadrs,SMS,145,slen(smsadrs),slen(SMS));
if (smserr == 0)
{prtf("sent SMS message:\n");prtf(SMS);}
else
{prtf("\nSMS sent ERROR!\n")}

smsd(sms_slot); /*Удаляем SMS*/
atdst(); /*Закрываем AT канал */
}
prtf("\n");
prtf("NO NEW SMS FOUND ... \n");
prtf("\n");
}


CHECK_IO_ADC_STATE()
{
int io_err;
int io_state;
char ok;

io(2,"IO1",1); /*IO1 as output*/
prtf("\nNew...");
ok = io(1,"IO1",0);
prtf("\nIO1 return code low= %d",ok);
dlys(1);
ok = io(1,"IO1",1);
prtf("\nIO1 return code high= %d",ok);
dlys(1);
}



CHECK_START_SIM()
{
int nvmerr;
char NVMDATA[6];
int aterr;
int resCmdSize;
char resCmd[100];
/*читаем память NVRAM какая SIM записана*/
nvmerr = nvm(0,0,6,NVMDATA);
if (nvmerr == 0)
{
prtf ("Data read from NVM memory is: %s\n", NVMDATA);
prtf("\n");
}
/* если NVRAM пустой то инитим NVRAM c SIM0*/
if ((scmp(NVMDATA,"SIM0") != 0) && (scmp(NVMDATA,"SIM1") != 0))
{
nvmerr=nvm(1,0,4,"SIM0");
nvmerr = nvm(0,0,6,NVMDATA); /*обновляем буфер с новым значением*/
if (nvmerr == 0)
{
prtf ("CLEAR NVRAM. WRITING SIM0 TO NVRAM OK!");
prtf("\n");
}
else
{
prtf ("ERROR WRITING TO NVRAM!");
prtf("\n");
}
}
/* включаем нужную SIM */
if (scmp(NVMDATA,"SIM0") == 0)
{
atcrt ();
atsnd ("AT*ESSE=0", resCmd, 9, 100, &resCmdSize);
prtf ("Sent AT command SIM0 enable, response = %s:%d response code = %d\n",resCmd, resCmdSize, aterr); prtf("\n");
atdst ();
}
else
{
atcrt ();
atsnd ("AT*ESSE=1", resCmd, 9, 100, &resCmdSize);
prtf ("Sent AT command SIM1 enable, response = %s:%d response code = %d\n",resCmd, resCmdSize, aterr); prtf("\n");
atdst ();
}
}


CHECK_REGISTRATION()
{
/*For APPS_NETWORK_STATUSBYTE values are for reading network status*/
int APPS_NETWORK_STATUSBYTE =10;
int AT_NET_NOT_REG_NOT_SEARCHING = 0;
int AT_NET_REGISTERED = 1;
int AT_NET_NOT_REG_SEARCHING = 2;
int AT_NET_REGISTRATION_DENIED = 3;
int AT_NET_UNKNOWN = 4;
int AT_NET_REGISTERED_ROAMING = 5;
int AT_NET_UNDEFINED = 255;
/*For APPS_GPRS_STATUSBYTE values are for reading GPRS status*/
int APPS_GPRS_STATUSBYTE =11;
int NRS_NOT_REGISTERED_NOT_SEARCHING=0;
int NRS_REGISTERED_HOME = 1;
int NRS_NOT_REGISTERED_SEARCHING = 2;
int NRS_REGISTRATION_DENIED = 3;
int NRS_UNKNOWN = 4;
int NRS_REGISTERED_ROAMING = 5;
int NRS_VALUE_NOT_SET = 6;
/*For APPS_LOCK_STATUS_BYTE values are as follows*/
int APPS_LOCK_STATUS_BYTE =16;
int LOCKS_READY = 0; /*No code is required*/
int LOCKS_SIM_PIN_REQUIRED = 1;
int LOCKS_SIM_PUK_REQUIRED = 2;
int LOCKS_SIM_PIN2_REQUIRED = 3;
int LOCKS_SIM_PUK2_REQUIRED = 4;
int LOCKS_PH_SIM_PIN_REQUIRED = 5;
int LOCKS_SIM_FAILURE = 6; /*the SIM card is present but blocked.*/
int LOCKS_SIM_REQUIRED = 7; /*no SIM card is present.*/
int LOCKS_PH_SIM_STATUS_PENDIN = 8;
int LOCKS_STATUS_UNKNOWN = 255;

/*Основная SIM*/
char PINCODE[5] = "0000";
char PUKCODE[9] = "53247491";
/*Резервная SIM*/
char PINCODE1[5] = "0000";
char PUKCODE1[9] = "53247491";

int PIN_result;
int nvmerr;
char NVMDATA[6];

int tm_val1 = 20000; /*значение таймера 1 ставим на 100 сек*/
int count1 = 0;

prtf("\n Checking SIM card and registration GSM network ...");
prtf("\n");

nvm(0,0,6,NVMDATA); /*читаем данные NVRAM*/

while(1) /*проверяем сеть GSM,наличие СИМ и вводим ПИН если надо*/
{
if(gtb(APPS_LOCK_STATUS_BYTE) == LOCKS_SIM_REQUIRED | LOCKS_SIM_FAILURE)
{
prtf("\n No SIM card is present or SIM blocked!");
prtf("\n Try to restart device ...");
prtf("\n");
if (scmp (NVMDATA,"SIM0") == 0)
{
nvmerr = nvm(1,0,4,"SIM1");
if (nvmerr != 0)
{
prtf ("ERROR WRITING TO NVRAM!");
prtf("\n");
}
{
prtf ("WRITING SIM1 TO NVRAM OK!");
prtf("\n");
}
}
else
{
nvmerr = nvm(1,0,4,"SIM0");
if (nvmerr != 0)
{
prtf ("ERROR WRITING TO NVRAM!");
prtf("\n");
}
{
prtf ("WRITING SIM0 TO NVRAM OK!");
prtf("\n");
}
}
dlys(5);
rst (0);
}

if(gtb(APPS_LOCK_STATUS_BYTE) == LOCKS_READY)
{
prtf("\n No code is required!");
break;
}

if(gtb(APPS_LOCK_STATUS_BYTE) == LOCKS_SIM_PIN_REQUIRED)
{
prtf("\n PIN is required!");
prtf("\n Enter PIN...");
PIN_result=pin(PINCODE,0);
prtf("\n SIM result = %d",PIN_result);
prtf("\n");
break;
}
}


/*после SIM проверяем GSM регистрацию*/

cts(1,tm_val1,1); /*таймер 1 ставим на однократный счет 100sec*/
while(gtb(APPS_NETWORK_STATUSBYTE)!= AT_NET_REGISTERED||AT_NET_REGISTERED_ROAMING)
{
if(gtb(APPS_NETWORK_STATUSBYTE) == AT_NET_REGISTERED)
{ prtf("\n We are registered in GSM network!"); break; }
if(gtb(APPS_NETWORK_STATUSBYTE) == AT_NET_REGISTERED_ROAMING)
{ prtf("\n We are registered in Roaming!"); break; }

/*если вышел таймаут 100сек */
if ( ctq(1,&tm_val1,&count1) == 1)
{
prtf("\n GSM registration timeout!!!");
prtf("\n Try to restart device with another SIM...");
prtf("\n");
if (scmp (NVMDATA,"SIM0") == 0)
{
nvmerr = nvm(1,0,4,"SIM1");
if (nvmerr != 0)
{prtf ("ERROR WRITING TO NVRAM!");prtf("\n");}
{prtf ("WRITING SIM1 TO NVRAM OK!");prtf("\n");}
}
else
{
nvmerr = nvm(1,0,4,"SIM0");
if (nvmerr != 0)
{prtf ("ERROR WRITING TO NVRAM!");prtf("\n");}
{prtf ("WRITING SIM0 TO NVRAM OK!");prtf("\n");}
}
dlys(5); rst(0);
}
}
}
bolmoe
такой вопрос, может и не в тему......
В GR64 появился встроенный FTP или еще нет?
Просто , когда выбирался модем, необходим был доступ к FTP серваку. Изначально смотрели на GR64, в котором в анонсе указывалась такая возможность, даже приобрели модуль, но как оказалось доступа к FTP нет, прозвонили, узнали, что в далльшейших версиях появится.... Поэтому остановились на телитовских модемах с Python. Ситуация не изменилась...?
msgm
alexQ, спасибо большое.
Я не совсем программист, потому подобные вещи даются с трудом 05.gif
Где можно почитать про NVRAM GR64? В мануалах пусто sad.gif
alexQ
2bolmoe.
В GR64 появился встроенный FTP начиная с софта версии R5A... появилась месяц назад где-то.
не уверен что телит хороший выбор.
уж тогда лучше выбрать wavecom WMP100. он полноценно программируется на С.
памяти и возможностей до одурения. очень быстрый. 104МГц. -40 и т.п.
единственный минус это BGA576+ внешняя память (~5USD).


2msgm.
NVRAM доступна только из скриптов. в хелпе по M2Mpower все разжовано с примерами.
bolmoe
Цитата(alexQ @ Jun 7 2008, 17:16) *
2bolmoe.
В GR64 появился встроенный FTP начиная с софта версии R5A... появилась месяц назад где-то.
не уверен что телит хороший выбор.
уж тогда лучше выбрать wavecom WMP100. он полноценно программируется на С.
памяти и возможностей до одурения. очень быстрый. 104МГц. -40 и т.п.
единственный минус это BGA576+ внешняя память (~5USD).
2msgm.
NVRAM доступна только из скриптов. в хелпе по M2Mpower все разжовано с примерами.



Спасибо...)
Вот именно, что все в корпус упирается....(((
С бгашками стараемся не работать. Телитовцы тож обещают вот-вот выпустить или даж уже пошел с кристаллом на АРМ9 со встроенным линуксом.
alexQ
новые телиты тоже bga. очень сырая весч ...
и по возможностям на 3-.
про линукс прогруз. я не думаю что им удасться сделать такого монстра.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.