Форум программистов, компьютерный форум CyberForum.ru

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
maestrostr88
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 6
#1

Delphi + АТС Panasonic NS500 + RanCom - Delphi WinAPI

26.01.2016, 14:59. Просмотров 706. Ответов 11
Метки нет (Все метки)

Добрый день уважаемые.
Задался вопросом интеграции АТС и программы своей. Пока реализовал на основе communication assistant. Из возможностей только получения номера звонящего, этого мало.
Нашел стороннюю программу Rander, в его состав входит RanCOM, но я ни как не могу его осилить.
Есть примеры на С#, помогите пожалуйста их перевести на Delphi
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using RanderComLib;
 
namespace RanComDemo
{
   public partial class Form1 : Form
   {
      RanCom ranCom = new RanCom();
      public Form1()
      {
         ranCom.NewCall2 += new _IRanComEvents_NewCall2EventHandler(ranCom_NewCall2);
         ranCom.CallInfoChanged += new _IRanComEvents_CallInfoChangedEventHandler(ranCom_CallInfoChanged);
         ranCom.CallStateChanged += new _IRanComEvents_CallStateChangedEventHandler(ranCom_CallStateChanged);
         InitializeComponent();         
      }
 
      private void buttonOpen_Click(object sender, EventArgs e)
      {
         try
         {
            ranCom.OpenLine(textBoxLine.Text);
         }
         catch
         {
            MessageBox.Show("Failed to open line");
         }
      }
 
      private void buttonConnect_Click(object sender, EventArgs e)
      {
          ranCom.Connect(textBoxServer.Text, "", "");
      }
 
      void ranCom_CallStateChanged(int call_id, CallState call_state)
      {
         listBoxMessages.Items.Add("Call " + call_id + " state changed to "+call_state);
      }
 
      void ranCom_CallInfoChanged(int call_id)
      {
         listBoxMessages.Items.Add("Call " + call_id + " info changed");
      }
 
      void ranCom_NewCall2(int line_id, int call_id)
      {
         listBoxMessages.Items.Add("New call "+call_id+" on line "+line_id);
      }
   }
}
так же есть примеры на php, C, VBA.
Сам RanCOM и примеры https://yadi.sk/d/sMuCBJIonky4V

Пишу на Delphi 7
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fidel42rus
24 / 24 / 7
Регистрация: 24.10.2015
Сообщений: 385
26.01.2016, 15:15     Delphi + АТС Panasonic NS500 + RanCom #2
Больше информации надо, как она подключена, что отдаёт, есть ли веб интерфейс, и т.д. что ты хочешь видеть? Если номера мало, что от программы нужно? Давай всю инфу будем думать
maestrostr88
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 6
26.01.2016, 17:05  [ТС]     Delphi + АТС Panasonic NS500 + RanCom #3
У Rander-a есть серверная часть, которая подключается к АТС Panasonic. RanCOM работает с сервером Rander.
Мне в Delphi надо получить номер звонящего, возможность взять трубку и положить трубку.
fidel42rus
24 / 24 / 7
Регистрация: 24.10.2015
Сообщений: 385
26.01.2016, 17:50     Delphi + АТС Panasonic NS500 + RanCom #4
maestrostr88, "Render" значит знает какие-то библиотеки для этой атски, у нас с тобой их нет. Думаю без
"using RanderComLib; у нас ничего не выйдет
maestrostr88
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 6
26.01.2016, 18:04  [ТС]     Delphi + АТС Panasonic NS500 + RanCom #5
Я понимаю что используется using RanderComLib, но не понимаю откуда его берет C#.
Вот пример работы RanCOM на PHP
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
// starting word
$rancom = new COM("RanderCom.RanCom.1") or die("Unable to instantiate RanCOM");
echo "RanCOM loaded...<br>";
 
$rancom->ConnectUnsec("rander.ranat.ru", "","", "109");
echo "RanCOM connected...<br>";
 
$rancom->Dial("115");
echo "RanCOM dialed extension...<br>";
 
$rancom->Disconnect();
echo "RanCOM disconnected...";
 
?>
я как понял к RanCOM надо подключаться как к COM порту, только не знаю как это реализовать в Delphi
fidel42rus
24 / 24 / 7
Регистрация: 24.10.2015
Сообщений: 385
26.01.2016, 18:41     Delphi + АТС Panasonic NS500 + RanCom #6
библиотека берется у производителя panasonic. Она интегрируется ПО, ты ведь сам ее на стадии разработки подключаешь
cotseec
Пишу на Delphi...иногда
1393 / 1253 / 174
Регистрация: 03.12.2012
Сообщений: 3,885
Записей в блоге: 5
Завершенные тесты: 3
26.01.2016, 19:21     Delphi + АТС Panasonic NS500 + RanCom #7
Цитата Сообщение от maestrostr88 Посмотреть сообщение
Сам RanCOM и примеры https://yadi.sk/d/sMuCBJIonky4V
Пишу на Delphi 7
в папке с примерами (конкретно в RanCom\examples\c\RanComTest(cpp).rar\RanComTest(cpp)\RanComTest\) имеется библиотека типов (файл RanCom.tlb) из нее очень замечательно вытаскивается модуль с описанием типов
часть unit RanderComLib_TLB
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
unit RanderComLib_TLB;
 
// ************************************************************************ //
// WARNING                                                                    
// -------                                                                    
// The types declared in this file were generated from data read from a       
// Type Library. If this type library is explicitly or indirectly (via        
// another type library referring to this type library) re-imported, or the   
// 'Refresh' command of the Type Library Editor activated while editing the   
// Type Library, the contents of this file will be regenerated and all        
// manual modifications will be lost.                                         
// ************************************************************************ //
 
// PASTLWTR : 1.2
// File generated on 2016-01-26 19:11:58 from Type Library described below.
 
// ************************************************************************  //
// 
// LIBID: {7469A0E3-66B4-4981-9AF4-7BE4B4C1A73F}
// LCID: 0
// Helpfile: 
// HelpString: RanCom 1.0 Type Library
// DepndLst: 
//   (1) v2.0 stdole, (C:\Windows\system32\stdole2.tlb)
// Errors:
//   Error creating palette bitmap of (TRanCom) : No Server registered for this CoClass
// ************************************************************************ //
// *************************************************************************//
// NOTE:                                                                      
// Items guarded by $IFDEF_LIVE_SERVER_AT_DESIGN_TIME are used by properties  
// which return objects that may need to be explicitly created via a function 
// call prior to any access via the property. These items have been disabled  
// in order to prevent accidental use from within the object inspector. You   
// may enable them by defining LIVE_SERVER_AT_DESIGN_TIME or by selectively   
// removing them from the $IFDEF blocks. However, such items must still be    
// programmatically created via a method of the appropriate CoClass before    
// they can be used.                                                          
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. 
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface
 
uses Windows, ActiveX, Classes, Graphics, OleServer, StdVCL, Variants;
  
 
const
  // TypeLibrary Major and minor versions
  RanderComLibMajorVersion = 1;
  RanderComLibMinorVersion = 0;
 
  LIBID_RanderComLib: TGUID = '{7469A0E3-66B4-4981-9AF4-7BE4B4C1A73F}';
 
  DIID__IRanComEvents: TGUID = '{EB1FE0B9-4CCD-48FA-87C9-2819354EB3C2}';
  IID_IRanCom: TGUID = '{976F744A-3962-46D7-BB17-46D8D4CCCB86}';
  CLASS_RanCom: TGUID = '{597FC297-FD13-4A86-9BD2-C43B97586738}';
type
  __MIDL___MIDL_itf_RanCom_0000_0001 = TOleEnum;
const
  state_idle = $00000000;
  state_connected = $00000001;
  state_ringing = $00000002;
  state_dialing = $00000003;
  state_busy = $00000004;
  state_hold = $00000005;
 
type
  RanCom = IRanCom;
 
  tagCallInfo = packed record
    Phone: WideString;
    CallerId: WideString;
    CalledId: WideString;
    ConnectedId: WideString;
    IsInternal: WordBool;
    IsIncoming: WordBool;
    CO: Integer;
  end;
 
  CallInfo = tagCallInfo; 
 
  tagDialPlan = packed record
    CoAccess: WideString;
    GroupAccess: WideString;
    LocalPlan: Integer;
    NationalCode: WideString;
    ZoneNumbers: WordBool;
  end;
 
  DialPlan = tagDialPlan; 
  CallState = __MIDL___MIDL_itf_RanCom_0000_0001; 
 
// *********************************************************************//
// DispIntf:  _IRanComEvents
// Flags:     (4096) Dispatchable
// GUID:      {EB1FE0B9-4CCD-48FA-87C9-2819354EB3C2}
// *********************************************************************//
  _IRanComEvents = dispinterface
    ['{EB1FE0B9-4CCD-48FA-87C9-2819354EB3C2}']
    procedure NewCall(call_id: Integer); dispid 1;
    procedure CallInfoChanged(call_id: Integer); dispid 2;
    procedure CallStateChanged(call_id: Integer; call_state: CallState); dispid 3;
    procedure PbxConnectionStatusChanged(status: WordBool); dispid 4;
    procedure ServerConnectionStatusChanged(status: WordBool); dispid 5;
  end;
 
// *********************************************************************//
// Interface: IRanCom
// Flags:     (4544) Dual NonExtensible OleAutomation Dispatchable
// GUID:      {976F744A-3962-46D7-BB17-46D8D4CCCB86}
// *********************************************************************//
  IRanCom = interface(IDispatch)
    ['{976F744A-3962-46D7-BB17-46D8D4CCCB86}']
    procedure ConnectUnsec(const server: WideString; const username: WideString; 
                           const password: WideString; const my_line_name: WideString); safecall;
    procedure Dial(const number: WideString); safecall;
    procedure Connect(const server: WideString; const username: WideString; 
                      const password_hash: WideString; const my_line_name: WideString); safecall;
    function GetCallInfo(call_id: Integer): CallInfo; safecall;
    procedure Disconnect; safecall;
    procedure Drop(call_id: Integer); safecall;
    function IsConnectedToServer: WordBool; safecall;
    function IsConnectedToPbx: WordBool; safecall;
    function GetNewCalls: OleVariant; safecall;
    function GetDialPlan: DialPlan; safecall;
    function ToDialable(const phone_in: WideString): WideString; safecall;
    procedure Answer(call_id: Integer); safecall;
    procedure Hold(call_id: Integer); safecall;
    procedure Unhold(call_id: Integer); safecall;
    procedure Transfer(call_id: Integer; const Phone: WideString); safecall;
  end;
 
// *********************************************************************//
// DispIntf:  IRanComDisp
// Flags:     (4544) Dual NonExtensible OleAutomation Dispatchable
// GUID:      {976F744A-3962-46D7-BB17-46D8D4CCCB86}
// *********************************************************************//
  IRanComDisp = dispinterface
    ['{976F744A-3962-46D7-BB17-46D8D4CCCB86}']
    procedure ConnectUnsec(const server: WideString; const username: WideString; 
                           const password: WideString; const my_line_name: WideString); dispid 1;
    procedure Dial(const number: WideString); dispid 2;
    procedure Connect(const server: WideString; const username: WideString; 
                      const password_hash: WideString; const my_line_name: WideString); dispid 3;
    function GetCallInfo(call_id: Integer): {??CallInfo}OleVariant; dispid 4;
    procedure Disconnect; dispid 5;
    procedure Drop(call_id: Integer); dispid 6;
    function IsConnectedToServer: WordBool; dispid 7;
    function IsConnectedToPbx: WordBool; dispid 8;
    function GetNewCalls: OleVariant; dispid 9;
    function GetDialPlan: {??DialPlan}OleVariant; dispid 10;
    function ToDialable(const phone_in: WideString): WideString; dispid 11;
    procedure Answer(call_id: Integer); dispid 12;
    procedure Hold(call_id: Integer); dispid 13;
    procedure Unhold(call_id: Integer); dispid 14;
    procedure Transfer(call_id: Integer; const Phone: WideString); dispid 15;
  end;
 
  CoRanCom = class
    class function Create: IRanCom;
    class function CreateRemote(const MachineName: string): IRanCom;
  end;
 
  TRanComNewCall = procedure(ASender: TObject; call_id: Integer) of object;
  TRanComCallInfoChanged = procedure(ASender: TObject; call_id: Integer) of object;
  TRanComCallStateChanged = procedure(ASender: TObject; call_id: Integer; call_state: CallState) of object;
  TRanComPbxConnectionStatusChanged = procedure(ASender: TObject; status: WordBool) of object;
  TRanComServerConnectionStatusChanged = procedure(ASender: TObject; status: WordBool) of object;
 
 
// *********************************************************************//
// OLE Server Proxy class declaration
// Server Object    : TRanCom
// Help String      : RanCom Class
// Default Interface: IRanCom
// Def. Intf. DISP? : No
// Event   Interface: _IRanComEvents
// TypeFlags        : (2) CanCreate
// *********************************************************************//
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
  TRanComProperties= class;
{$ENDIF}
  TRanCom = class(TOleServer)
  private
    FOnNewCall: TRanComNewCall;
    FOnCallInfoChanged: TRanComCallInfoChanged;
    FOnCallStateChanged: TRanComCallStateChanged;
    FOnPbxConnectionStatusChanged: TRanComPbxConnectionStatusChanged;
    FOnServerConnectionStatusChanged: TRanComServerConnectionStatusChanged;
    FIntf:        IRanCom;
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
    FProps:       TRanComProperties;
    function      GetServerProperties: TRanComProperties;
{$ENDIF}
    function      GetDefaultInterface: IRanCom;
  protected
    procedure InitServerData; override;
    procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
    procedure Connect; override;
    procedure ConnectTo(svrIntf: IRanCom);
    procedure Disconnect; override;
    procedure ConnectUnsec(const server: WideString; const username: WideString; 
                           const password: WideString; const my_line_name: WideString);
    procedure Dial(const number: WideString);
    procedure Connect1(const server: WideString; const username: WideString; 
                       const password_hash: WideString; const my_line_name: WideString);
    function GetCallInfo(call_id: Integer): CallInfo;
    procedure Disconnect1;
    procedure Drop(call_id: Integer);
    function IsConnectedToServer: WordBool;
    function IsConnectedToPbx: WordBool;
    function GetNewCalls: OleVariant;
    function GetDialPlan: DialPlan;
    function ToDialable(const phone_in: WideString): WideString;
    procedure Answer(call_id: Integer);
    procedure Hold(call_id: Integer);
    procedure Unhold(call_id: Integer);
    procedure Transfer(call_id: Integer; const Phone: WideString);
    property DefaultInterface: IRanCom read GetDefaultInterface;
  published
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
    property Server: TRanComProperties read GetServerProperties;
{$ENDIF}
    property OnNewCall: TRanComNewCall read FOnNewCall write FOnNewCall;
    property OnCallInfoChanged: TRanComCallInfoChanged read FOnCallInfoChanged write FOnCallInfoChanged;
    property OnCallStateChanged: TRanComCallStateChanged read FOnCallStateChanged write FOnCallStateChanged;
    property OnPbxConnectionStatusChanged: TRanComPbxConnectionStatusChanged read FOnPbxConnectionStatusChanged write FOnPbxConnectionStatusChanged;
    property OnServerConnectionStatusChanged: TRanComServerConnectionStatusChanged read FOnServerConnectionStatusChanged write FOnServerConnectionStatusChanged;
  end;
 
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
 TRanComProperties = class(TPersistent)
  private
    FServer:    TRanCom;
    function    GetDefaultInterface: IRanCom;
    constructor Create(AServer: TRanCom);
  protected
  public
    property DefaultInterface: IRanCom read GetDefaultInterface;
  published
  end;
{$ENDIF}
который затем можно использовать
maestrostr88
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 6
27.01.2016, 07:56  [ТС]     Delphi + АТС Panasonic NS500 + RanCom #8
cotseec, черт ты даже не представляешь как я тебе благодарен. Ты открыл мне глаза. Получилось реализовать и прием звонка и разрыв звонка и номер телефона звонящего получить.
dim-76
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 8
08.10.2016, 23:40     Delphi + АТС Panasonic NS500 + RanCom #9
maestrostr88,
не поможешь, требуется получать номер телефона от ранком, у тебя получилось?
maestrostr88
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 6
09.10.2016, 17:22  [ТС]     Delphi + АТС Panasonic NS500 + RanCom #10
Да у меня получилось. буду рад помочь, в чем у тебя загвоздка?
dim-76
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 8
09.10.2016, 19:30     Delphi + АТС Panasonic NS500 + RanCom #11
я пока еще в живую не пробовал, но вроде разобрался
в дельфи сделал Import Component -> Import a type Library выбрал RanCom, у меня сформировался компонент RanCom вот его и использую
а не пробовал на прямую без RanCom по ATAPI подключаться? я через smdr подключался, но там только после окончания звонка информация приходит, а хотелось бы как RanCom (но без денег )
maestrostr88
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 6
10.10.2016, 08:15  [ТС]     Delphi + АТС Panasonic NS500 + RanCom #12
Я в начале все это пытался организовать через Communication Assistant. У программы есть в опциях CRM-интеграция. Работало всё это не очень. Так как информацию о номере телефоне и состояние (Входящий звонок, взята трубка или звонок завершен) он пишет в файл .CSV bkb .XML и приходилось в делфи отслеживать изменения файла и считывать из него информацию. Пробовал ATAPI но мозгов не хватило что бы добить этот вопрос до конца. RanCom самый легкий способ наверное из того что платный)
Yandex
Объявления
10.10.2016, 08:15     Delphi + АТС Panasonic NS500 + RanCom
Ответ Создать тему
Опции темы

Текущее время: 14:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru