|
номер COM порта и gsm модем | ☑ | ||
---|---|---|---|---|
0
Bibr
17.10.14
✎
04:38
|
есть у меня GSM модем Huawei.
Научил его отправлять СМСки (Спасибо, Cube). Внешних компонент не использую. Подскажите, можно ли без использования внешних компонент узнать, на какой ком порт определился модем? пробую пока вот так: Для к=1 По 9 Цикл Попытка COMПорт = "\\.\Com"+к; ЗаписьТекста = Новый ЗаписьТекста(COMПорт, КодировкаТекста.ANSI); ЗаписьТекста.ЗаписатьСтроку("AT+CMGF=0"); ЗаписьТекста.ЗаписатьСтроку(Символ(26)); ЗаписьТекста.Закрыть(); Сообщить("порт с модемом - "+к); Исключение сообщить("не порт с модемом"+к); КонецПопытки; КонецЦикла; но так откликается не только порт с модемом, но и ещё непонятно что. Есть ли команда, которая на модем пройдёт, а на остальное нет? Или может есть другой способ без юзания вк? |
|||
1
Cube
17.10.14
✎
04:52
|
(0) "Научил его отправлять СМСки (Спасибо, Cube)"
Ты про эту ветку штоль: v8: Отправка СМС через USB-модем или сотовый телефон ? Старьё!)) У меня уже новая версия без паразитной задержки между СМСками - теперь ждет ответа от модема =)) Правда, в полете новая версия где-то с месяц всего. Ответа ждет 10 секунд - инога не дожидается. Возможно, надо увеличить интервал (я ещё не анализировал этот момент). Вот код: Процедура ОтправкаСМС() Комментарий = ""; //Инициализация модема СерверMSComm = Новый COMОбъект("MSCommLib.MSComm.1"); СерверMSComm.CommPort = 5; //Задает или возвращает номер COM порта. СерверMSComm.InBufferCount = 0; //Задает или возвращает число ожидающих символов в буфере приема. СерверMSComm.PortOpen = Истина; //Отправка СМС НомерТелефонаДляКодирования = СтрЗаменить(Выборка.НомерТелефона, "+", ""); Если СтрДлина(НомерТелефонаДляКодирования) = 10 ИЛИ СтрДлина(НомерТелефонаДляКодирования) = 11 Тогда НомерТелефонаДляКодирования = "7" + Прав(НомерТелефонаДляКодирования, 10) + "F"; Иначе Отправлено = Ложь; Комментарий = "Ошибка: у пользователя не верная длина номера телефона."; КонецЕсли; Если Отправлено Тогда НомерТелефонаСтр = ""; Для НомерСимвола = 2 По 12 Цикл Если НомерСимвола % 2 = 0 Тогда НомерТелефонаСтр = НомерТелефонаСтр + Сред(НомерТелефонаДляКодирования, НомерСимвола, 1) + Сред(НомерТелефонаДляКодирования, НомерСимвола - 1, 1); КонецЕсли; КонецЦикла; МассивСообщений = Новый Массив; ТекстСообщенияСтр = ""; ДлинаСообщения = СтрДлина(Выборка.Ссылка.ТекстСообщения); Для НомерСимвола = 1 По ДлинаСообщения Цикл Если НомерСимвола > 67 И НомерСимвола % 67 = 1 Тогда МассивСообщений.Добавить(ТекстСообщенияСтр); ТекстСообщенияСтр = ""; КонецЕсли; КодСимволаСтр = ""; КодСимвола = КодСимвола(Сред(Выборка.Ссылка.ТекстСообщения, НомерСимвола, 1)); Пока КодСимвола <> 0 Цикл Остаток = КодСимвола % 16; КодСимволаСтр = "" + ?(Остаток <= 9, Остаток, ?(Остаток = 10, "A", ?(Остаток = 11, "B", ?(Остаток = 12, "C", ?(Остаток = 13, "D", ?(Остаток = 14, "E", "F")))))) + КодСимволаСтр; КодСимвола = (КодСимвола - Остаток) / 16; КонецЦикла; Пока СтрДлина(КодСимволаСтр) < 4 Цикл КодСимволаСтр = "0" + КодСимволаСтр; КонецЦикла; ТекстСообщенияСтр = ТекстСообщенияСтр + КодСимволаСтр; КонецЦикла; МассивСообщений.Добавить(ТекстСообщенияСтр); ЧислоСМС = МассивСообщений.Количество(); ГСЧ = Новый ГенераторСлучайныхЧисел; СлучайноеЧисло = ГСЧ.СлучайноеЧисло(1, 255); УникальныйНомерСМС = ""; Пока СлучайноеЧисло <> 0 Цикл Остаток = СлучайноеЧисло % 16; УникальныйНомерСМС = "" + ?(Остаток <= 9, Остаток, ?(Остаток = 10, "A", ?(Остаток = 11, "B", ?(Остаток = 12, "C", ?(Остаток = 13, "D", ?(Остаток = 14, "E", "F")))))) + УникальныйНомерСМС; СлучайноеЧисло = (СлучайноеЧисло - Остаток) / 16; КонецЦикла; Пока СтрДлина(УникальныйНомерСМС) < 2 Цикл УникальныйНомерСМС = "0" + УникальныйНомерСМС; КонецЦикла; Для НомерСМС = 1 По ЧислоСМС Цикл Текст = "00"; //Длина и номер SMS центра. 0 - означает, что будет использоваться дефолтный номер. 07919720990100F0 = ЕТК. 07919731899699F0 = МТС Текст = Текст + "51"; //Тип PDU. 11 = у сообщения нет заголовка, 51 = у сообщения есть заголовок. Текст = Текст + "00"; //Поле предназначено для хранения количества переданных SMS. Не понятно, нафиг оно нужно. Текст = Текст + "0B"; //Длина номера получателя. Текст = Текст + "91"; //Тип-адреса. (91 указывает международный формат телефонного номера, 81 - местный формат). Текст = Текст + НомерТелефонаСтр; //Телефонный номер получателя в международном формате (закодированный). Текст = Текст + "00"; //Идентификатор протокола. Текст = Текст + "08"; //Старший полубайт означает сохранять SMS у получателя или нет (Flash SMS), Младший полубайт - кодировка(0-латиница 8-кирилица). Текст = Текст + "0B"; //Срок доставки сообщения. 0B = 1 час, 17 = 2 часа, С1 = 1 неделя. ЗаголовокСообщения = "05"; //Длина заголовка сообщения. ЗаголовокСообщения = ЗаголовокСообщения + "00"; //Длина поля "Уникальный номер СМС". 00 = 8-ми битная кодировка (1 октет, 255 значений поля), 08 = 16-битная кодировка (2 октета, 65535 значений поля). ЗаголовокСообщения = ЗаголовокСообщения + "03"; //Длина заголовка сообщения, исключая первые два поля. ЗаголовокСообщения = ЗаголовокСообщения + УникальныйНомерСМС; //Уникальный номер длинного сообщения. ЗаголовокСообщения = ЗаголовокСообщения + Формат(ЧислоСМС, "ЧЦ=2; ЧН=; ЧВН="); //Общее число сегментов составного СМС. ЗаголовокСообщения = ЗаголовокСообщения + Формат(НомерСМС, "ЧЦ=2; ЧН=; ЧВН="); //Номер текущего сегмента составного СМС. ДлинаСообщенияСтр = ""; ДлинаСообщенияДляКодирования = (СтрДлина(МассивСообщений[НомерСМС - 1]) + СтрДлина(ЗаголовокСообщения)) / 2; //Делим на 4 (т.к. уже закодировано) и умножаем на 2. Пока ДлинаСообщенияДляКодирования <> 0 Цикл Остаток = ДлинаСообщенияДляКодирования % 16; ДлинаСообщенияСтр = "" + ?(Остаток <= 9, Остаток, ?(Остаток = 10, "A", ?(Остаток = 11, "B", ?(Остаток = 12, "C", ?(Остаток = 13, "D", ?(Остаток = 14, "E", "F")))))) + ДлинаСообщенияСтр; ДлинаСообщенияДляКодирования = (ДлинаСообщенияДляКодирования - Остаток) / 16; КонецЦикла; Пока СтрДлина(ДлинаСообщенияСтр) < 2 Цикл ДлинаСообщенияСтр = "0" + ДлинаСообщенияСтр; КонецЦикла; ТекстСМС = Текст + ДлинаСообщенияСтр + ЗаголовокСообщения + МассивСообщений[НомерСМС - 1]; //Отправка команды на модем СерверMSComm.Output = "AT" + Символ(13) + Символ(10); //Ожидание ответа от модема Отправлено = Ложь; ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах(); Пока ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала <= 10000 Цикл Если СокрЛП(СерверMSComm.Input) = "OK" Тогда Отправлено = Истина; Прервать; КонецЕсли; КонецЦикла; Если НЕ Отправлено Тогда Комментарий = "Ошибка: Модем не отвечает (1)"; Прервать; КонецЕсли; //Отправка команды на модем СерверMSComm.Output = "AT+CMGF=0" + Символ(13) + Символ(10); //Ожидание ответа от модема Отправлено = Ложь; ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах(); Пока ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала <= 10000 Цикл Если СокрЛП(СерверMSComm.Input) = "OK" Тогда Отправлено = Истина; Прервать; КонецЕсли; КонецЦикла; Если НЕ Отправлено Тогда Комментарий = "Ошибка: Модем не отвечает (2)"; Прервать; КонецЕсли; //Отправка команды на модем СерверMSComm.Output = "AT+CMGS=" + Окр((СтрДлина(ТекстСМС) - 2) / 2) + Символ(13) + Символ(10); //Длина байтов сообщения (по 2 цифры), без учета длины и номера SMS центра. //Ожидание ответа от модема Отправлено = Ложь; ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах(); Пока ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала <= 10000 Цикл Если СокрЛП(СерверMSComm.Input) = ">" Тогда Отправлено = Истина; Прервать; КонецЕсли; КонецЦикла; Если НЕ Отправлено Тогда Комментарий = "Ошибка: Модем не отвечает (3)"; Прервать; КонецЕсли; //Отправка команды на модем СерверMSComm.Output = ТекстСМС + Символ(26); //Ожидание ответа от модема Отправлено = Ложь; ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах(); Пока ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала <= 10000 Цикл Если Прав(СокрЛП(СерверMSComm.Input), 2) = "OK" Тогда Отправлено = Истина; Прервать; КонецЕсли; КонецЦикла; Если НЕ Отправлено Тогда Комментарий = "Ошибка: Модем не отвечает (4)"; Прервать; КонецЕсли; КонецЦикла; КонецЕсли; //Освобождение модема СерверMSComm.PortOpen = Ложь; КонецПроцедуры //ОтправкаСМС() |
|||
2
Cube
17.10.14
✎
04:55
|
+(1) Перед строкой
Комментарий = ""; ещё нужна строка Отправлено = Истина; Удалил случайно, когда код от мусора чистил... |
|||
3
Cube
17.10.14
✎
05:01
|
И на счет библиотеки MSCommLib - я так и не понял, платная она или нет... У меня в Win7 она уже была (не знаю откуда взялась) и я её просто зарегистрировал в реестре, а вот на серваке Win2008R2 её не было. Скачал, зарегистрировал в реестре - взлетело.
Без регистрации в реестре будет ошибка вроде: "Сеанс не лицензирован". |
|||
4
Bibr
17.10.14
✎
06:59
|
(1) Клёво!
Спасибо большое! Насчёт задержки - не грузит машину? не лучше ли использовать: ? Процедура sleep(КолМиллесекунд) Экспорт wsh=Новый COMОбъект("WScript.Shell"); wsh.run("ping -n 1 -w "+Формат(КолМиллесекунд,"ЧГ=")+" 0.0.0.1",0,-1); КонецПроцедуры а порт здесь всё таки ручками задаётся. СерверMSComm.CommPort = 5; //Задает или возвращает номер COM порта. ещё не тестировал, но надеюсь, что с помощью СерверMSComm.Output = "AT" + Символ(13) + Символ(10); СокрЛП(СерверMSComm.Input) = "OK" можно будет определить, где висит именно модем, а не что-то ещё. |
|||
5
dangerouscoder
17.10.14
✎
07:24
|
(4) перебором на все доступные порты отправлять at команду. Не?
|
|||
6
Cube
17.10.14
✎
07:46
|
(4) "Насчёт задержки - не грузит машину?"
ХЗ, не тестировал этот момент... "надеюсь, что с помощью ... можно будет определить, где висит именно модем, а не что-то ещё." Да, тоже так считаю. То есть, ты и сабж решишь и код апгрейдишь)) |
|||
7
oleg_km
17.10.14
✎
09:21
|
(3) MSCommLib.MSComm.1 входит в состав VS 2003 как часть библиотек VB 6.0. Распространяется в составе многих продуктов, мне показалось ставилась также вместе с каким-то офисом. Но лучше проверять наличие и устанавливать явно. Работает давно и достаточно надежно, у меня на этой библиотеке работает сканирование штрих-кодов более 3-х лет.
|
|||
8
Йохохо
17.10.14
✎
09:38
|
(4) а если AT+CPAS а не AT?
|
|||
9
Bibr
17.10.14
✎
13:40
|
(6) что-то по новой методе не работает.
По старой схеме через запись файла норм отправляет, а через MSCommLib - нет. У меня модем HUAWEI 423S В диспетчере устройств я сейчас вижу в модемах на COM5 - модем HUAWEI Technologies Co.,LTD И в портах на COM6 - PC UI interface, на COM8 - application interface. плюс у меня ещё висит драйвер MOTOROLA на COM3, который к делу не относится. см. рис. http://prntscr.com/4wy5l9 через запись файла я отправлял на COM6 через MSCommLib даже первый запрос падает ко всем портам, кроме моторолы) Это из-за специфики модема или я что-то делаю не так? |
|||
10
Cube
17.10.14
✎
13:42
|
(9) Ты MSCommLib зарегал в реестре-то?
|
|||
11
Bibr
17.10.14
✎
13:56
|
(10)
MSCommLib это же MSCOMM32.OCX?? MSCOMM32.OCX точно зарегана. Да и все команды по инициилизации проходят нормально. Эти: //Инициализация модема СерверMSComm = Новый COMОбъект("MSCommLib.MSComm.1"); СерверMSComm.CommPort = 5; //Задает или возвращает номер COM порта. СерверMSComm.InBufferCount = 0; //Задает или возвращает число ожидающих символов в буфере приема. СерверMSComm.PortOpen = Истина; |
|||
12
oleg_km
17.10.14
✎
15:02
|
(11) Гипертерминал нормально по этому порту общается с мопедом?
|
|||
13
ice777
17.10.14
✎
15:04
|
новые модемы ничего кроме печали. Перевести в режим "только модем" гемор.
|
|||
14
Bibr
17.10.14
✎
15:20
|
попробовал и Символ(10)+ Символ(13) местами менять
и к модему (ком5) и к порту (ком6) обращаться и самые разные простые информационные команды кидать - по нулям. а вот при записи файла "\\.\Com6" - всё пучком. смс тут как тут:) :( (12) нет, не пробовал. в двух словах не подскажете, как? опять на гуглёжь время тратить не хочется.. |
|||
15
Bibr
17.10.14
✎
17:26
|
а вот интересно всё таки.
надо использовать тот порт, который виден в ком портах или в модемах? (см рис выше) потестил, при записи файла "\\.\Com5" и "\\.\Com6" отправляется одинаково. ну это так, не критично. можно считать за АП) |
|||
16
oleg_km
17.10.14
✎
17:34
|
Хелп надо смотреть к компоненту. У него есть два режима: с событиями и без. Тебе я так понимаю нужно выставить режим без событий
|
|||
17
Cube
20.10.14
✎
05:04
|
(9) У нас модем HUAWEI E303 3G.
В диспетчере устройств так: HUAWEI Mobile Connect - 3G Application Interface (COM4) HUAWEI Mobile Connect - 3G PC UI Interface (COM5) Как ты уже видел по коду выше, отправляется на COM5. По старой схеме (через запись текста) тоже через этот же интерфейс фурычило... (11) "MSCommLib это же MSCOMM32.OCX??" Да. "MSCOMM32.OCX точно зарегана." А как регал? Надо в реестр внести: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Licenses\DB4C0D00-400B-101B-A3C9-08002B2F49FB] @="mgkgtgnnmnmninigthkgogggvmkhinjggnvm" Всё это скопируй в текстовый файл, сохрани его с расширением .reg и запусти его. Как здесь: v8: v8: Как достучаться до считывателя МК Gigatek UR110U? |
|||
18
Эмбеддер
20.10.14
✎
05:17
|
команда AT
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |