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

Здесь все что связано с проводной и беспроводной связью (интернет, телефония, радиосвязь)
ra0uek
Сообщения: 49
Зарегистрирован: Сб сен 01, 2012 1:31 pm

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

Сообщение ra0uek »

Иван, пример я видел, для меня без какого-либо образца это сложно.

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

Аватара пользователя
lis
Сообщения: 427
Зарегистрирован: Пт авг 31, 2012 10:46 pm

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

Сообщение lis »

ra0uek писал(а):Иван, пример я видел, для меня без какого-либо образца это сложно.

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

ra0uek
Сообщения: 49
Зарегистрирован: Сб сен 01, 2012 1:31 pm

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

Сообщение ra0uek »

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

Аватара пользователя
lis
Сообщения: 427
Зарегистрирован: Пт авг 31, 2012 10:46 pm

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

Сообщение lis »

О_о тогда не понимаю что ты имел ввиду под словами "Как отправить/принять sms из delphi" какое действие надо сделать чтобы оно устроило?

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

ra0uek
Сообщения: 49
Зарегистрирован: Сб сен 01, 2012 1:31 pm

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

Сообщение ra0uek »

Мне непонятно из статьи с хабра каким кодом получить смс с модема.

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

Аватара пользователя
lis
Сообщения: 427
Зарегистрирован: Пт авг 31, 2012 10:46 pm

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

Сообщение 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"
Читаем снова, обработанной уже не будет в том что вернул модем.
И так далее.

ra0uek
Сообщения: 49
Зарегистрирован: Сб сен 01, 2012 1:31 pm

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

Сообщение ra0uek »

Решил разбираться по возрастающей.

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

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

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

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

Куда копать?

Аватара пользователя
lis
Сообщения: 427
Зарегистрирован: Пт авг 31, 2012 10:46 pm

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

Сообщение lis »

Кинь что читается.
Обычно в получении крякозябр всётаки виновата скорость.

ra0uek
Сообщения: 49
Зарегистрирован: Сб сен 01, 2012 1:31 pm

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

Сообщение ra0uek »

Итак, продолжаем.

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

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

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

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

pitman
Сообщения: 778
Зарегистрирован: Пт авг 31, 2012 8:03 pm

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

Сообщение pitman »

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

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

Ответить