Страница 2 из 3

Re: Работа с GSM-модемом из Delphi

Добавлено: Чт окт 04, 2012 6:58 pm
ra0uek
Иван, пример я видел, для меня без какого-либо образца это сложно.

Аськой я не пользуюсь.

Re: Работа с GSM-модемом из Delphi

Добавлено: Чт окт 04, 2012 7:01 pm
lis
ra0uek писал(а):Иван, пример я видел, для меня без какого-либо образца это сложно.

Аськой я не пользуюсь.
=) пост на хабре, который выдаётся гуглем первой ссылкой и имеющий полный код на делфи, тоже не катит?

Re: Работа с GSM-модемом из Delphi

Добавлено: Чт окт 04, 2012 7:02 pm
ra0uek
ra0uek писал(а):=) пост на хабре, который выдаётся гуглем первой ссылкой и имеющий полный код на делфи, тоже не катит?
Увы.

Re: Работа с GSM-модемом из Delphi

Добавлено: Чт окт 04, 2012 7:04 pm
lis
О_о тогда не понимаю что ты имел ввиду под словами "Как отправить/принять sms из delphi" какое действие надо сделать чтобы оно устроило?

Уж на хабре разжёванно от и до, да ещё и исходник приложен.
Я лучше объяснить не смогу.

Re: Работа с GSM-модемом из Delphi

Добавлено: Чт окт 04, 2012 7:12 pm
ra0uek
Мне непонятно из статьи с хабра каким кодом получить смс с модема.

Конкретно то есть кусок кода нужен.

Re: Работа с GSM-модемом из Delphi

Добавлено: Чт окт 04, 2012 7:24 pm
lis
если с хабрапримера то тут

Код: Выделить всё

function TGSMComander.GetSMSMessage(AIndex: Integer): TSMSMessage;
var
  LRead: String;
begin
  LRead := '';
  WriteStr(Format(CMD_CMGR, [AIndex]));
  if ReadToOK(LRead) then
    Result := StringToSMS('0,' + StrPart(READING_MESSAGE, END_MESSAGES, LRead));
end;

function TGSMComander.GetSMSMessages(AGetSMS: TGetSMS): TSMSMessages;
var
  LReadALL: String;
  LList: TArrayOfString;
  i: Integer;
begin
  WriteStr(Format(CMD_CMGL, [GET_SMS[AGetSMS]]));
  LReadALL := '';

  ReadToOK(LReadALL);

  LReadALL := StrPart('', END_MESSAGES, LReadALL);

  if pos(BEGIN_MESSAGE, LReadALL) > 0 then
  begin
    LReadALL := StrPart(BEGIN_MESSAGE, '', LReadALL);
    LList := StrParse(LReadALL, BEGIN_MESSAGE);
    SetLength(Result, Length(LList));
    for i := 0 to Length(LList) - 1 do
      Result[i] := TGsmSms.StringToSMS(LList[i]);
  end;
end;
Кратко как читается SMS

модему отправляется AT+CMGL="ALL"
он в ответ плюёт все смс какие у него есть в памяти.
В обычном текстовом формате, читаем
СМС отдаётся в 2 строки, в первой строке номер ячейки, отправитель, датавремя
Во второй строке сама смс.

Читаем первую, обрабатываем как нам надо и стираем командой AT+CMGD=номер ячейки

Опять посылаем AT+CMGL="ALL"
Читаем снова, обработанной уже не будет в том что вернул модем.
И так далее.

Re: Работа с GSM-модемом из Delphi

Добавлено: Сб окт 06, 2012 11:21 pm
ra0uek
Решил разбираться по возрастающей.

Итак, сначала просто читаю что шлет модем в порт (например, при входящем звонке должно прилететь сообщение RING).

ReadFile(hFile, Data, SizeOf(Data),i,nil);

Получаю полный бред, просто набор символов. Но всегда один и тот же.

Скорости и прочие установки порта программно выполняются нормально.

Куда копать?

Re: Работа с GSM-модемом из Delphi

Добавлено: Пн окт 08, 2012 12:03 am
lis
Кинь что читается.
Обычно в получении крякозябр всётаки виновата скорость.

Re: Работа с GSM-модемом из Delphi

Добавлено: Чт окт 11, 2012 10:41 pm
ra0uek
Итак, продолжаем.

Начал ковырять исходники с Хабра. Столкнулся с некоторыми траблами.

Во-первых, сообщение не хочет отправляться, если телефонный номер написан через +7. То есть если написать 8914... то все работает, если в международном формате -- то нифига. Это раз.

Во-вторых, во время отправки сообщения модем не всегда отправляет смс-ку сразу, иногда он выдает сообщение ERROR, которое никак не обрабатывается и сообщение остается недоставленым. Кстати сказать, из пачки передаваемых сообщений -- половина точно не уходит.

Третье, я так и не понял как прочитать только непрочитанное сообщение. Одно сообщение. Например, пришедшее последним.

Re: Работа с GSM-модемом из Delphi

Добавлено: Пт окт 12, 2012 8:24 am
pitman
ra0uek писал(а): Третье, я так и не понял как прочитать только непрочитанное сообщение. Одно сообщение. Например, пришедшее последним.
Исходя из того, что писал lis
1. Запрашиваем сколько СМС есть вааще.
2. В цикле считываем СМСки из ячейки, обрабатываем, стираем обработанные.
3. И так пока все на данный момент не будут обработаны.
4. Спим 0.5сек
5. п.1

По отправке, делаем в памяти ПК пул исходящих сообщений. Сообщений из проги записываются в пул отправки, планировщик каждые 0.2сек (например) проверяет пул. если надо что отправить, отправлят одну СМС и проверяет результат, если ок, отправленую удаляет из пула.