Работа с GSM-модемом из Delphi
Re: Работа с GSM-модемом из Delphi
Иван, пример я видел, для меня без какого-либо образца это сложно.
Аськой я не пользуюсь.
Аськой я не пользуюсь.
Re: Работа с GSM-модемом из Delphi
=) пост на хабре, который выдаётся гуглем первой ссылкой и имеющий полный код на делфи, тоже не катит?ra0uek писал(а):Иван, пример я видел, для меня без какого-либо образца это сложно.
Аськой я не пользуюсь.
Re: Работа с GSM-модемом из Delphi
Увы.ra0uek писал(а):=) пост на хабре, который выдаётся гуглем первой ссылкой и имеющий полный код на делфи, тоже не катит?
Re: Работа с GSM-модемом из Delphi
О_о тогда не понимаю что ты имел ввиду под словами "Как отправить/принять sms из delphi" какое действие надо сделать чтобы оно устроило?
Уж на хабре разжёванно от и до, да ещё и исходник приложен.
Я лучше объяснить не смогу.
Уж на хабре разжёванно от и до, да ещё и исходник приложен.
Я лучше объяснить не смогу.
Re: Работа с GSM-модемом из Delphi
Мне непонятно из статьи с хабра каким кодом получить смс с модема.
Конкретно то есть кусок кода нужен.
Конкретно то есть кусок кода нужен.
Re: Работа с GSM-модемом из Delphi
если с хабрапримера то тут
Кратко как читается SMS
модему отправляется AT+CMGL="ALL"
он в ответ плюёт все смс какие у него есть в памяти.
В обычном текстовом формате, читаем
СМС отдаётся в 2 строки, в первой строке номер ячейки, отправитель, датавремя
Во второй строке сама смс.
Читаем первую, обрабатываем как нам надо и стираем командой AT+CMGD=номер ячейки
Опять посылаем AT+CMGL="ALL"
Читаем снова, обработанной уже не будет в том что вернул модем.
И так далее.
Код: Выделить всё
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;
модему отправляется AT+CMGL="ALL"
он в ответ плюёт все смс какие у него есть в памяти.
В обычном текстовом формате, читаем
СМС отдаётся в 2 строки, в первой строке номер ячейки, отправитель, датавремя
Во второй строке сама смс.
Читаем первую, обрабатываем как нам надо и стираем командой AT+CMGD=номер ячейки
Опять посылаем AT+CMGL="ALL"
Читаем снова, обработанной уже не будет в том что вернул модем.
И так далее.
Re: Работа с GSM-модемом из Delphi
Решил разбираться по возрастающей.
Итак, сначала просто читаю что шлет модем в порт (например, при входящем звонке должно прилететь сообщение RING).
ReadFile(hFile, Data, SizeOf(Data),i,nil);
Получаю полный бред, просто набор символов. Но всегда один и тот же.
Скорости и прочие установки порта программно выполняются нормально.
Куда копать?
Итак, сначала просто читаю что шлет модем в порт (например, при входящем звонке должно прилететь сообщение RING).
ReadFile(hFile, Data, SizeOf(Data),i,nil);
Получаю полный бред, просто набор символов. Но всегда один и тот же.
Скорости и прочие установки порта программно выполняются нормально.
Куда копать?
Re: Работа с GSM-модемом из Delphi
Кинь что читается.
Обычно в получении крякозябр всётаки виновата скорость.
Обычно в получении крякозябр всётаки виновата скорость.
Re: Работа с GSM-модемом из Delphi
Итак, продолжаем.
Начал ковырять исходники с Хабра. Столкнулся с некоторыми траблами.
Во-первых, сообщение не хочет отправляться, если телефонный номер написан через +7. То есть если написать 8914... то все работает, если в международном формате -- то нифига. Это раз.
Во-вторых, во время отправки сообщения модем не всегда отправляет смс-ку сразу, иногда он выдает сообщение ERROR, которое никак не обрабатывается и сообщение остается недоставленым. Кстати сказать, из пачки передаваемых сообщений -- половина точно не уходит.
Третье, я так и не понял как прочитать только непрочитанное сообщение. Одно сообщение. Например, пришедшее последним.
Начал ковырять исходники с Хабра. Столкнулся с некоторыми траблами.
Во-первых, сообщение не хочет отправляться, если телефонный номер написан через +7. То есть если написать 8914... то все работает, если в международном формате -- то нифига. Это раз.
Во-вторых, во время отправки сообщения модем не всегда отправляет смс-ку сразу, иногда он выдает сообщение ERROR, которое никак не обрабатывается и сообщение остается недоставленым. Кстати сказать, из пачки передаваемых сообщений -- половина точно не уходит.
Третье, я так и не понял как прочитать только непрочитанное сообщение. Одно сообщение. Например, пришедшее последним.
Re: Работа с GSM-модемом из Delphi
Исходя из того, что писал lisra0uek писал(а): Третье, я так и не понял как прочитать только непрочитанное сообщение. Одно сообщение. Например, пришедшее последним.
1. Запрашиваем сколько СМС есть вааще.
2. В цикле считываем СМСки из ячейки, обрабатываем, стираем обработанные.
3. И так пока все на данный момент не будут обработаны.
4. Спим 0.5сек
5. п.1
По отправке, делаем в памяти ПК пул исходящих сообщений. Сообщений из проги записываются в пул отправки, планировщик каждые 0.2сек (например) проверяет пул. если надо что отправить, отправлят одну СМС и проверяет результат, если ок, отправленую удаляет из пула.
Действительно, было в Михал Иваныче что-то аристократическое. Пустые бутылки он не сдавал, выбрасывал.