В один модем (http://www.linux.org.ru/view-message.jsp?msgid=3154236 ) надо периодически посылать команду AT+ZOPERTE="beeline"
Почитав man pppd, я нашёл опцию pty, которая позволяет "пропускать" все данные через скрипт.
Как же написать такой скрипт? То что сочинил я - не работает. Кто нибудь может подсказать как надо правильно?
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
struct timeval c,n;
char t='a';
int e=1;
FILE *f;
gettimeofday( &c, NULL);
f=fopen("/dev/ttyUSB0","r+");
while(e)
{
while( (t!='\n') || (t!=EOF) )
{
t=fgetc(stdin);
fputc(t,f);
}
t='a';
fflush(f);
while( (t!='\n') || (t!=EOF) )
{
t=fgetc(f);
fputc(t,stdout);
}
if ( ( feof(f) ) || ( feof(stdin) ) ) e=0;
fflush(stdout);
gettimeofday( &n, NULL);
if ( (n.tv_sec-c.tv_sec) > 59 )
{
c=n;
fprintf(f,"AT+ZOPERTER=\"beeline\"\r\n");
}
fflush(f);
}
fclose(f);
return 0;
}
Висит так, что даже магические клавиши не помогают. В strace огромное количество select'ов...
В общем, нашёл обходной манёвр: если указать опцию record, pppd устанавливает флаг O_NONBLOCK, после этого можно писать в порт кроном. Однако, делу это помогло не очень сильно: модем теперь отключается раз в 6 минут. Буду дальше следить за вендовой утилитой...
Ошибку поищу вечером, попробую запустить на ttyS0 модеме (нету USB-модемов). Наверное надо делать ioctl'ы при открытии порта (раз у pppd указывается crtscts).
>Буду дальше следить за вендовой утилитой...
Думаю, что надо детально разбирать все, что передаётся по USB, возможно, что это самый AT+ZOPERTE можно передавать только между пакетами ppp-протокола. Думаю, что раз уж вы взялись за правку ядра, то может имеет смысл поправить pppd. Насколько я помню там были простые исходники...
>Ошибку поищу вечером, попробую запустить на ttyS0 модеме (нету USB-модемов). Наверное надо делать ioctl'ы при открытии порта (раз у pppd указывается crtscts).
А я подозреваю, что usbserial не успевает что-то переслать, или ожидает ответа или просто так зависает. Пару раз я видел сообщения о его смерти в dmesg.
>Думаю, что надо детально разбирать все, что передаётся по USB, возможно, что это самый AT+ZOPERTE можно передавать только между пакетами ppp-протокола.
Пробовал (блокировал устройство, посылал +++, потом команду, также если ничего не посылать через сеть, то pppd ничего не посылает в модем). Удалось продержаться 6 минут.
>Думаю, что раз уж вы взялись за правку ядра, то может имеет смысл поправить pppd. Насколько я помню там были простые исходники...
На самом деле не такие уж и простые (для меня).
P.S. Если соединение с интернетом не установлено, то посылка команды в порт работает как надо, модем не отключается через две минуты, а вот если он уже соединился с интернетом, то тут и начинаются проблемы. Сейчас я выяснил, что родная утилита посылает команды как-то хитро, через другую конечную точку. Ситуация осложняется ещё тем, что в винде модем видится как три устройства: два последовательных порта (в один из которых и посылаются все команды) и модем (в который посылаются/из которого принимаются данные). А до отладки драйверов под виндой я ещё не дорос...