|
Работа с telnet протоколом из 1С | ☑ | ||
---|---|---|---|---|
0
punkforever
18.06.15
✎
10:21
|
Задача:
Коннект к серверу по протоколу telnet, авторизация Отправка данных (запрос) Получение данных (ответ) Желательно, код должен выполняться на сервере (регл. задание) Каким будет оптимальный вариант решения? Существуют ли готовые наработки? Спасибо. |
|||
1
Гёдза
18.06.15
✎
10:22
|
bat файл
|
|||
2
Гёдза
18.06.15
✎
10:23
|
telnet ... > 1.txt
|
|||
3
punkforever
18.06.15
✎
10:24
|
(1) Т.е. задачу можно решить без com-объекта?
Ответ тоже можно будет получить? |
|||
4
VladZ
18.06.15
✎
10:27
|
(0) Зачем?
|
|||
5
punkforever
18.06.15
✎
10:30
|
(4)
Нужно из 1С общаться с сервером оборудования. Мониторить, отключать, подключать и т.д. Связь по протоколам telnet (или ssh) |
|||
6
Остап Сулейманович
18.06.15
✎
10:31
|
(4) Присоединюсь.
В 1С есть WEB-сервисы, HTTP-сервисы... Все штатно. Смысл в телнетах - только если на "той стороне" стоит какая специфичная железка, которая по другому никак во внешний мир не смотрит. И еще вопрос : "Коннект к серверу по протоколу telnet, авторизация ... Желательно, код должен выполняться на сервере (регл. задание)" речь за один и тот же сервер? |
|||
7
punkforever
18.06.15
✎
10:33
|
(6)
Других протолов нет, железка специфичная. Сервер оборудования в локальной сети Код должен выполняться на сервере 1С, это физически другая машина. |
|||
8
Draziw
18.06.15
✎
10:37
|
(0) Неужели кто-то решился наконец написать на 1С клиент для MUDов ?
|
|||
9
Garikk
18.06.15
✎
10:38
|
писать в файл... потом батником вызывать телнет, результат тоже писать в файл и читать из 1С
|
|||
10
Jaap Vduul
18.06.15
✎
10:38
|
(1), (2) Не взлетит. Во-первых, ТС требуется интерактивное взаимодействие с хостом, а во-вторых виндовый клиент telnet работает в режиме эмуляции терминала и со StdOut не взаимодействует.
ИМХО, можно что-то замутить только если telnet с ключом /f запускать и команды через sendkeys отправлять. Ну, про надёжность такого решения я промолчу. |
|||
11
Остап Сулейманович
18.06.15
✎
10:39
|
(7) В пакетном режиме - вполне можно обойтись bat-файлом. В режиме вопрос/ответ - ИМХО только эмулировать протокол средствами 1С+КакойНибудьАктивИкс.
|
|||
12
Garikk
18.06.15
✎
10:40
|
(10) так можно putty взять...заодно и ssh будет
|
|||
13
quest
18.06.15
✎
10:41
|
на инфостарте вроде есть же компоненты для работы с сетью. хочешь сам сервером стань, хочешь работай с другими
|
|||
14
punkforever
18.06.15
✎
10:44
|
Спасибо за участие.
Будем думать и пробовать) |
|||
15
beaver1971
18.06.15
✎
10:56
|
(0) Сокеты пробовал?
Сокет = Новый COMОбъект("MSWinsock.Winsock"); Сокет.Connect(Сервер,Порт); Сокет.SendData(ТекстДляСервера); Сокет.GetData(ПеременнаяДляЗаписиОтветовСервера); |
|||
16
punkforever
18.06.15
✎
11:04
|
(15)
Нужно попробовать.. Авторизоваться тоже можно? Пока на 1с сервере нет этого актив икса.. Он вроде с VB ставиться или как то так.. |
|||
17
punkforever
18.06.15
✎
11:10
|
Как вариант, конечно, поковыряться с c#, и сделать com-объект (или поискать готовый)..
Примеры в сети есть. Была надежда, что кто-то сталкивался с подобной задачей, и возможно, есть более простое и элегантное решение) |
|||
18
VladZ
18.06.15
✎
11:35
|
(5) Зачем все пихать в 1С? Изначально, 1С - это программа учета. Пихать туда всякие "телнеты" - это все равно что к козе баян прикручивать. Есть механизм внешних компонент - работай через них. Тем более "отключать и подключать" 1С-у я бы не доверил.
|
|||
19
Garikk
18.06.15
✎
11:44
|
(17) <поковыряться с c#, и сделать com-объект (или поискать готовый).. >
Можно, а в итоге стать программером на C#, я так в своё время с VB6 на C# переехал...когда оказалось что фрагментацию пакетов из сети нормальные люди вручную собирают ...одну софтинку свою с winsock переводил... Потому что примеры в сети не учитывают кучи нюансов работы с сетью P.S. Лучше в данном случае winsock заюзать, будет проще, быстрее и надёжнее |
|||
20
Serginio1
18.06.15
✎
11:54
|
||||
21
punkforever
18.06.15
✎
12:16
|
(19) winsock - возможна ли авторизация? В любом случае, спасибо за наводку, проанализируем.
(20) Спасибо. Посмотрим. |
|||
22
Garikk
18.06.15
✎
12:17
|
(21) telnet это простой текстовый протокол, там нет понятия авторизации, туда просто надо логин и пароль прямым текстом передать с символами перевода строки
|
|||
23
Serginio1
18.06.15
✎
12:28
|
||||
24
beaver1971
18.06.15
✎
13:00
|
(16) Нет в 1С такого типа, ну и фиг с ним, в jscript он точно есть... Вот и пусть jscript поработает прокладкой ))))
ТекстСкрипта = " |function Init() { | var Server = """"; | var Port = """"; | var OldCommand = """"; | var n = 0; | var C = {}; | C.Connect = function(userServer, userPort){ | n = n + 1; | Server = userServer; | Port = userPort; | return ""Init "" + n + "" "" + Server + "":"" + Port + "" "" + OldCommand; | } | C.SendData = function(userCommand){ | n = n + 1; | OldCommand = userCommand; | return ""Send "" + n + "" "" + Server + "":"" + Port + "" "" + OldCommand; | } | C.GetData = function(p) { | n = n + 1; | return ""Get "" + n + "" "" + Server + "":"" + Port + "" "" + OldCommand; | } | return C; |}"; ОбъектКонсоль = СоздатьОбъект("MSScriptControl.ScriptControl"); ОбъектКонсоль.Language = "JavaScript"; ОбъектКонсоль.AddCode(ТекстСкрипта); Консоль = ОбъектКонсоль.Run("Init"); Сервер = "127.0.0.1"; Порт = "23"; Результат = Консоль.Connect(Сервер, Порт); Сообщить(Результат); Результат = Консоль.SendData("Команда 1"); Сообщить(Результат); Результат = Консоль.GetData(""); Сообщить(Результат); Результат = Консоль.SendData("Команда 2"); Сообщить(Результат); Уж внутри jscript сам сокеты откроешь ))))) |
|||
25
oleg_km
18.06.15
✎
14:37
|
У меня собирает с АТС звонки уже больше 5 лет. Раньше было на Новый COMОбъект("MSWinsock.Winsock");, теперь все перевел на v8: v8: Использование сборок .NET в 1С 7.x и 8.x
|
|||
26
vde69
18.06.15
✎
14:40
|
из 1с конектишся к серверу по WMI и дальше там можно сделать все что угодно...
|
|||
27
oleg_km
18.06.15
✎
15:04
|
(26) В WMI реализован telnet? Может с ping путаешь?
|
|||
28
punkforever
15.07.15
✎
11:50
|
Пробуем через MS winsock.
Код: ws = Новый COMОбъект("MSWinsock.Winsock"); ДобавитьОбработчик ws.Connect, Connect; ДобавитьОбработчик ws.DataArrival, DataArrival; ws.RemoteHost = "127.0.0.1"; ws.RemotePort = 23; ws.Protocol = 0; ws.Connect(); В событии DataArrival получаем данные следующим способом Процедура DataArrival(bytesTotal) Стр = ""; ws.GetData(Стр); КонецПроцедуры Переменная Стр содержит значение "яэ%яыяыяэ'яэяэ" Подскажите, какая кодировка строк нужна, можно ли это сделать в 1С. Предполагаю, что нужно кодировать как строку для sendData так и полученный ответ.. |
|||
29
ТолькоПросмотр
15.07.15
✎
12:12
|
Нужно выполнить команду системы, то же самое, что писать в командной строке, ну или батник.
|
|||
30
oleg_km
15.07.15
✎
12:14
|
(28) MSWinsock.Winsock работает с ANSI - у него в документации написано. Можно в свойствах сокета указать что в байтах. байты записать в файл, а потом уже из файла смотреть
|
|||
31
punkforever
15.07.15
✎
12:18
|
(30) Нет случайно под рукой примера?))
|
|||
32
punkforever
15.07.15
✎
12:21
|
(30)
Как в SendData передать ANSI строку из 1С.. А из GetData получить в формате, читабельном в 1с.. |
|||
33
oleg_km
15.07.15
✎
12:57
|
(32) У тебя похоже сервер работает с Юникодом. Примера работы с байтами нет. Не работал, а сейчас тем более уже не использую. Перешел на .NET, но там сходу сложнее будет разобраться. Попробуй ответ "яэ%яыяыяэ'яэяэ" записать в файл с кодировкой ANSI, а открыть уже с кодировкой UNICODE. У меня вроде получалось
|
|||
34
punkforever
15.07.15
✎
13:16
|
(33) Попробую, спасибо.
Телнет Сервер - в данном случае, для тестирования, использую свой локальный компьютер.. С командной строки всё работает конечно же.. На счет байтов - нашел в методе GetData() - вторым параметром можно передать тип получаемых данных.. Пока не получается правда)) Возможно, так же, есть какая то специфика программной работы с телнет протоколом.. Казалось, что должно быть попроще это всё)) |
|||
35
oleg_km
15.07.15
✎
13:21
|
(34) Нет никакой специфики. Telnet-клиент - это по сути голый TCP/IP. Там есть разные заморочки по поводу как отображать на консоли. Попробуй записать ответ в файл и прочитать с разными кодировками. Мне кажется должно получиться
|
|||
36
punkforever
15.07.15
✎
13:34
|
(35)
Записываю в этих кодировках oem: пн%плплпн'пнпн пл ansi: яэ%яыяыяэ'яэяэ яы Через notepad++ открываю, толку нет. |
|||
37
oleg_km
15.07.15
✎
13:44
|
(36) В нотпаде все варианты юникода перепробовал? и UTF-16 и UTF-8 и UNICODE? или положился на автораспознавание?
|
|||
38
punkforever
15.07.15
✎
14:52
|
(37) кодировал и конвертировал.
В c#, кстати, почти тоже самое получаю (есть пример работы с сокетами) Массив байтов, которые при конвертации в ascii дают ??????.. Тут что-то прниципиально не так) |
|||
39
oleg_km
15.07.15
✎
14:59
|
Какая-то трехбайтная кодировка:
FF FD 25 FF FB 01 FF FB 03 FF FD 27 FF FD 1F FF FD |
|||
40
oleg_km
15.07.15
✎
15:16
|
А кстати, а сервер что-то должен осмысленное слать? или двоичные данные?
|
|||
41
Serginio1
15.07.15
✎
15:16
|
(38) Ды закодируй строку в Base64.
Возможно, что символы которые больше 127 как то экранируются |
|||
42
Serginio1
15.07.15
✎
15:20
|
Или можешь переделать на UTF8 или Encoding.GetEncoding(1251);
https://github.com/Spksh/TentacleSoftware.Telnet/blob/master/TentacleSoftware.Telnet/TelnetClient.cs |
|||
43
punkforever
15.07.15
✎
15:22
|
(41) Да, в массиве байтов в основном значения > 127.. Как бы понять что он хочет..
(40) Я надеюсь получить что-то осмысленное). Как в телнет клиенте windows.. Запрос на ввод логина.. Или что-то типа "youre about to send pass.." |
|||
44
Serginio1
15.07.15
✎
15:27
|
https://msdn.microsoft.com/ru-ru/library/system.text.asciiencoding(v=vs.110).aspx
ASCIIEncoding соответствует кодовой странице Windows 20127. Поскольку ASCII — 7-разрядая кодировка, символы ASCII ограничены нижними 128 символами Юникода, от U+0000 до U+007F. Если вы используете кодировщик по умолчанию, возвращенный cdjqcndjv Encoding.ASCII или конструктором ASCIIEncoding, символы вне этого диапазона, заменяются на вопросительный знак (?) до выполнения операции кодирования. Поскольку класс ASCIIEncoding поддерживает только ограниченный набор симовлов, классы UTF8Encoding, UnicodeEncoding, и UTF32Encoding лучше подходит для глобализованных приложений. Следующие соображения помогут вам принять решение об использовании ASCIIEncoding: |
|||
45
punkforever
15.07.15
✎
15:37
|
(44)
С utf8 - непонятное что-то C default - яэ%яыяыяэ'яэяэ яы Возможно это особенность телнет протокола.. Мне нужно понять что дальше отправлять, чтобы выйти на авторизацию, её пройти и начать общаться с сервером по существу) |
|||
46
Garikk
15.07.15
✎
15:44
|
да нет там особенностей, протокол вообще простой, через телнет клиента даже с вебсервером общатся можно вручную
проблема явно в кодировке |
|||
47
Salimbek
15.07.15
✎
15:54
|
(37) Так кодирует, если из CP866 выкинешь в ANSI
|
|||
48
Salimbek
15.07.15
✎
15:55
|
Опс, ты же и так это пишешь, сорри, невнимательно прочитал...
|
|||
49
Serginio1
15.07.15
✎
15:56
|
По умолчанию в компоненте StreamWriter.UTF8NoBOM
|
|||
50
Salimbek
15.07.15
✎
15:58
|
(43) А есть другое ПО, нормально работающее с этим оборудованием? Если есть, то можно взять TCPDump и промониторить весь сетевой трафик в это время. Оттуда уже вытащить - что куда и как сообщается. Вполне возможно, что это нормальные сообщения во внутренней кодировке ПО.
|
|||
51
Serginio1
15.07.15
✎
16:07
|
v8: Из 1С в txt. Кодировка UTF8 без BOM сбилась на 8.3
Прочитай используя кодировку CESU-8 |
|||
52
punkforever
15.07.15
✎
16:20
|
(50)
Да пока на своем компе тестирую, через телнет сервер винды.. И здесь уже затык, при первом получении) |
|||
53
punkforever
15.07.15
✎
16:22
|
(51)
Это попытка записать в файл полученную строку через GetData с кодировкой CESU-8: СЏСЌ%яыяыяэ'СЏСЌСЏСЌ СЏС‹ |
|||
54
Serginio1
15.07.15
✎
16:27
|
(53) А пользуешься 28?
Попробуй https://github.com/Spksh/TentacleSoftware.Telnet |
|||
55
Serginio1
15.07.15
✎
16:28
|
(53) Ты уже неправильную строку получаешь. Смысл её записывать.
|
|||
56
Serginio1
15.07.15
✎
16:35
|
Вот тут народ с винсокетами мучился 1С + работа с сокетами
|
|||
57
punkforever
15.07.15
✎
16:41
|
(54) Да, использую winsock.
Надо будет что то пробовать) Если не будет получаться. |
|||
58
punkforever
15.07.15
✎
16:46
|
Пробовал такое:
http://www.codeproject.com/Articles/19071/Quick-tool-A-minimalistic-Telnet-library Даже парсинг специфический присутствует.. Не помню в чем, но тоже где то не пошло.. |
|||
59
Serginio1
15.07.15
✎
16:52
|
||||
60
punkforever
15.07.15
✎
17:16
|
(59) Спасибо за поддержку)
Буду пробовать разные варианты. |
|||
61
xaozai
15.07.15
✎
17:49
|
(0) Есть всякие ActiveX, которые позволяют работать по протоколу telnet программно.
Вот в первых результатах поиска гугола с примером даже: http://www.dart.com/telnet-activex-tool-control.aspx |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |