C#和硬件驱动交互编程<二> --东进语音卡项目例子.
最近公司的项目比较忙所以没及时更新第二篇.不要骂我是贴代码...
在做这个项目的时候我发现一个问题,假如不是使用机器的内存,而是使用硬件的内存的时候,一定要手动Flush硬件的内存.
我相信这个问题在做东进语音卡项目的时候很多人都会遇到.
好,继续开贴...
1
using System;2
using System.Data;3
using System.Data.Sql;4
using System.Data.SqlClient;5
using System.Configuration;6
using System.Collections.Generic;7
using System.Text;8

9
namespace DJVoiceCard.DBMod10


{11

/**//// <summary>12
/// 电话号码连接层.连同数据处理;13
/// </summary>14
public class myTelNum15

{16
private string SqlConnString = ConfigurationSettings.AppSettings["LinkStr"];17

18
private string _newTelNum=string.Empty;19
private string _newTelPass=string.Empty;20
private string[] _newTelStr=new string[2];21

/**//// <summary>22
/// 构造连接层23
/// </summary>24
public myTelNum() 25

{26
newTelNum();27
}28

数据获取操作#region 数据获取操作29

/**//// <summary>30
/// 获取新电话用户得号码31
/// </summary>32
private void newTelNum()33

{34
string telTemp = string.Empty;35
SqlConnection sqlConn = new SqlConnection(SqlConnString);36
string sqlStr = "select top 1* from xwtx_reg_telUser where iIsPassSend=0";37
SqlDataReader sqlReader;38
sqlReader = null;39

40
SqlCommand sqlComm = new SqlCommand(sqlStr, sqlConn);41
sqlConn.Open();42
sqlReader = sqlComm.ExecuteReader();43
if (sqlReader.Read())44

{45
if (sqlReader["sTelUserID"]!=null)46

{47
_newTelStr[0] = sqlReader["sTelUserID"].ToString();48
}49
else50

{51
_newTelStr[0] = string.Empty;52
}53

54
if (sqlReader["sTelUserPass"] != null)55

{56
_newTelStr[1] = sqlReader["sTelUserPass"].ToString();57
}58
else59

{60
_newTelStr[1] = string.Empty;61
}62
}63
else64

{ 65
66
}67
sqlReader.Close();68
sqlConn.Close();69
sqlComm.Dispose();70
}71

/**//// <summary>72
/// 取得电话号码73
/// </summary>74
public string theTelNum75

{76

get
{77
if (_newTelStr != null)78

{79
newTelNum();80
if (_newTelStr.Length == 2)81

{82
if (_newTelStr[0] != null)83

{84
_newTelNum = _newTelStr[0];85
}86
else87

{ 88
_newTelNum="";89
}90
}91
else92

{ _newTelNum = ""; }93
}94
return _newTelNum; }95
96
}97

98

/**//// <summary>99
/// 获取电话号码对应得密码100
/// </summary>101
public string theTelPass102

{103

get
{104
if (_newTelStr != null)105

{106
if (_newTelStr.Length == 2)107

{108
if (_newTelStr[1] != null)109

{110
_newTelPass = _newTelStr[1];111
}112
else113

{114
_newTelPass = "";115
}116
}117
else118

{ _newTelPass = ""; }119
}120
return _newTelPass;121
}122
}123

124

/**//// <summary>125
/// 根据号码获取密码126
/// </summary>127
/// <param name="TelNum"></param>128
/// <returns></returns>129
public string GetTelPass(string TelNum)130

{131
string Pass = string.Empty;132
SqlConnection sqlConn = new SqlConnection(SqlConnString);133
string sqlStr = "select * from xwtx_reg_telUser where sTelUserID='" + TelNum + "'";134
SqlDataReader sqlReader;135
sqlReader = null;136
SqlCommand sqlComm = new SqlCommand(sqlStr, sqlConn);137
sqlConn.Open();138
sqlReader = sqlComm.ExecuteReader();139
if (sqlReader.Read())140

{141
if (sqlReader["sTelUserPass"] != null)142

{143
Pass = sqlReader["sTelUserPass"].ToString();144
}145
else146

{147
Pass = string.Empty;148
}149
}150
else151

{152

153
}154
sqlReader.Close();155
sqlConn.Close();156
sqlComm.Dispose();157
return Pass;158
}159

160
#endregion161

162

数据更新#region 数据更新163

/**//// <summary>164
/// 密码发送成功165
/// </summary>166
/// <param name="TelNum"></param>167
/// <returns></returns>168
private bool ISupdateTelNum(string TelNum)169

{170
if (TelNum==string.Empty)171

{172
TelNum = "0";173
}174
string sqlStr = "Update xwtx_reg_telUser set iIsPassSend=1 where sTelUserID='" + TelNum + "'";175
SqlConnection sqlconn = new SqlConnection(SqlConnString);176
SqlCommand sqlComm = new SqlCommand(sqlStr, sqlconn);177
try178

{179
sqlconn.Open();180
sqlComm.ExecuteNonQuery();181
182
sqlconn.Close();183
return true;184
}185
catch186

{187
if (sqlconn.State.ToString().ToLower() != "closed")188

{ sqlconn.Close(); }189
return false;190
}191
}192

/**//// <summary>193
/// 密码发送后调用194
/// </summary>195
public bool ISmodify196

{197

get
{ return ISupdateTelNum(_newTelNum); }198
}199

200
public bool ISCompelet(string TelNum)201

{202
return ISupdateTelNum(TelNum);203
}204

/**//// <summary>205
/// 密码发送失败206
/// </summary>207
/// <param name="TelNum"></param>208
public void FailSend(string TelNum)209

{210
if (TelNum == string.Empty)211

{212
TelNum = "0";213
}214
string sqlStr = "Update xwtx_reg_telUser set iIsPassSend=3 where sTelUserID='" + TelNum + "'";215
SqlConnection sqlconn = new SqlConnection(SqlConnString);216
SqlCommand sqlComm = new SqlCommand(sqlStr, sqlconn);217
try218

{219
sqlconn.Open();220
sqlComm.ExecuteNonQuery();221

222
sqlconn.Close();223
224
}225
catch226

{227
if (sqlconn.State.ToString().ToLower() != "closed")228

{ sqlconn.Close(); }229
230
}231
}232
#endregion233

234

日志记录#region 日志记录235
public void LogModify(string TelNum,string ErrorMessage)236

{237
if (TelNum == string.Empty)238

{239
TelNum = "0";240
}241
string sqlStr = "insert into xwtx_reg_telUser_Log(logContxt,logDate) values('发送用户" + TelNum + "密码时,发生" + ErrorMessage + ":错误','" + DateTime.Now + "')";242
SqlConnection sqlconn = new SqlConnection(SqlConnString);243
SqlCommand sqlComm = new SqlCommand(sqlStr, sqlconn);244
try245

{246
sqlconn.Open();247
sqlComm.ExecuteNonQuery();248

249
sqlconn.Close();250

251
}252
catch253

{254
if (sqlconn.State.ToString().ToLower() != "closed")255

{ sqlconn.Close(); }256

257
}258
}259
#endregion260

261
}262
}263

这段是获取数据库里面的东东的.具体来说对整个例子的意义不大..
下面开始的是业务逻辑部分.个人觉得是比较重要的部分.里面有很多代码没有经过优化.我贴出来了.希望大家不要骂我呃.
1
using System;2
using System.Collections.Generic;3
using System.Configuration;4
using System.ComponentModel;5
using System.Data;6
using System.Drawing;7
using System.Text;8
using System.Windows.Forms;9
using DJVoiceCard.DL;10
using System.Runtime.InteropServices;11
using DJVoiceCard.Lib;12
using System.Data.OleDb;13
using System.IO;14
using System.Threading;15
using DJVoiceCard.DBMod;16

17
namespace DJVoiceCard.App18


{19
public partial class DailMain : Form20

{21

22
//private static string[] _FileArr;23

24

/**////// <summary>25
///// 语音文件路径26
///// </summary>27
//public string[] FileArr { get { return _FileArr; } set { _FileArr = value; } }28
//private static string _CalloutST=string.Empty;29

30

/**////// <summary>31
///// 调用状态32
///// </summary>33
//public static string CalloutST34
//{35
// get { return _CalloutST; }36
// set { _CalloutST = value; }37
//}38

/**//// <summary>39
/// 中继通道总数;40
/// </summary>41
private int iTunkTotal;42

/**//// <summary>43
/// 用户通道数44
/// </summary>45
private int iUserTotal;46

47

/**//// <summary>48
/// 主叫电话号码49
/// </summary>50
public string MyCallNO =ConfigurationSettings.AppSettings["calleeNum"];51
public string WelcomeTo=ConfigurationSettings.AppSettings["Welcome"];52
public string PassReadBegin = ConfigurationSettings.AppSettings["PassReadBegin"];53
public string PassRead = ConfigurationSettings.AppSettings["PassRead"];54
public string EndSystem = ConfigurationSettings.AppSettings["EndSystem"];55
private string DbPath = ConfigurationSettings.AppSettings["LinkStr"];56
private string CallOutNum = string.Empty;57

58
public string VoiceST = string.Empty;59
ulong nOutCall ;60
ulong nMyCallNo ;61

62

/**//// <summary>63
/// 公共线程,主要用来拨号64
/// </summary>65
//public Thread TheadCall;66

67

/**//// <summary>68
/// 信道使用状态69
/// </summary>70
public string TrunkState=string.Empty;71

/**//// <summary>72
/// 用户状态73
/// </summary>74
public UR_ST[] URS = new UR_ST[120];75

76

/**//// <summary>77
/// 信道状态78
/// </summary>79
public TRK_ST[] TST = new TRK_ST[120];80
string[] CallST=new string[120];81
int[] arrVoiceChn=new int[10];82
public DailMain()83

{84
InitializeComponent();85
}86

87
private void Dail_Load(object sender, EventArgs e)88

{89
SysInit();90
}91

92
private void DailMain_FormClosing(object sender, FormClosingEventArgs e)93

{94
ReacurseTrunk();95
SysFunction.SysExit();96
this.Dispose();97
base.Dispose();98
}99

100
private void btnExit_Click(object sender, EventArgs e)101

{102
ExitSys();103
}104

105
private void TimeChk_Tick(object sender, EventArgs e)106

{107
SysFunction.Push_GerEvent();108
TrunkTimerWork();109
StateView();110
dbCall();111
}112

113
private void btnCall_Click(object sender, EventArgs e)114

{115
string telNum=txtTelNO.Text.Trim();116
if (telNum.Length < 6)117

{118
119
MessageBox.Show("请输入正确的号码");120
txtTelNO.Text = "";121
}122
else123

{124
CallOut(telNum);125
}126

127
}128

129

初始化系统#region 初始化系统130

/**//// <summary>131
/// 初始化系统132
/// </summary>133
private void SysInit()134

{135
string sErr = string.Empty;136
bool isSysLoad = SysFunction.SysInit(ref sErr);137
if (isSysLoad)138

{139
iTunkTotal = SysFunction.iTrkTotal();140
for (int i = 0; i < iTunkTotal; i++)141

{142
TST[i].ConnTrID = -1;143
TST[i].ConnUrID = -1;144
TST[i].ST = TRUNK_ST.TRK_FREE;145
TST[i].DialNum = string.Empty;146
}147

148
iUserTotal = SysFunction.iUserTotal();149
for (int i = 0; i < iUserTotal; i++)150

{151
SysFunction.UserPowerOn(i);152
if (SysFunction.UserEnableDailSound(i))153

{154
URS[i].ConnTrID = -1;155
URS[i].ConnTrID = -1;156
URS[i].ST = USER_STATE.USR_ONHOOK;157
}158
else159

{160
MessageBox.Show("初始化用户模块失败");161
ExitSys();162
break;163
}164
}165

166
arrVoiceChn[1] = SysFunction.iFreeVoiceCHNID();167
StringBuilder busy = new StringBuilder("BUSY");168
if (SysFunction.LoopVoiceM(arrVoiceChn[1], busy))169

{170

171
}172
arrVoiceChn[2] = SysFunction.iFreeVoiceCHNID();173
StringBuilder ring = new StringBuilder("RING");174
if (SysFunction.LoopVoiceM(arrVoiceChn[2], ring))175

{176

177
}178
arrVoiceChn[3] = SysFunction.iFreeVoiceCHNID();179
StringBuilder tone = new StringBuilder("TONE");180
if (SysFunction.LoopVoiceM(arrVoiceChn[2], tone))181

{182

183
}184

185
lvChn.BeginUpdate();186
for (int i = 0; i < iTunkTotal; i++)187

{188
ListViewItem lvi = new ListViewItem();189
lvi.Text = i.ToString();190
lvi.SubItems.Add("");191
lvi.SubItems.Add("");192
lvi.SubItems.Add("");193
lvi.SubItems.Add("");194
lvi.SubItems.Add("");195
lvi.SubItems.Add("");196
lvChn.Items.Add(lvi);197
}198
lvChn.EndUpdate();199
StateView();200
}201
else202

{203
//MessageBox.Show(sErr);204
// ExitSys();205
}206
}207
#endregion208

209

Exit System#region Exit System210

/**//// <summary>211
/// 退出系统212
/// </summary>213
public void ExitSys()214

{215
ReacurseTrunk();216
SysFunction.SysExit();217
this.Dispose();218
base.Dispose();219
}220

221

222
#endregion223

224

数据处理#region 数据处理225

/**//// <summary>226
/// 读取数据 拨号227
/// </summary> 228
public void dbCall()229

{230
if (TrunkState != "Calling")231

{232
myTelNum mytel = new myTelNum();233
if (mytel.theTelNum != string.Empty)234

{235
lblMsg.Text = DateTime.Now.ToString()+"自动发送";236
TheadCallOut();237
}238
else239

{240
lblMsg.Text = DateTime.Now + "无可用号码";241
}242
243
}244
else245

{246
lblMsg.Text = DateTime.Now+"自动发送信道使用中
";247
}248
}249
#endregion250

251

更新控件数据显示#region 更新控件数据显示252

253

/**//// <summary>254
/// 向控件更新数据255
/// </summary>256
public void StateView()257

{258
SysFunction.Push_GerEvent();259
iTunkTotal = SysFunction.iTrkTotal();260
for (int i = 0; i < iTunkTotal; i++)261

{262
DrawTrunkState(i);263
}264
}265
#endregion266

267

信道状态轮询#region 信道状态轮询268

/**//// <summary>269
/// 轮询270
/// </summary>271
public void TrunkTimerWork()272

{273
//int iVoiceID;274
int iResult;275
iTunkTotal = SysFunction.iTrkTotal();276

277
for (int i = 0; i < iTunkTotal; i++)278

{279

280
iResult = SysFunction.iRaleyStetes((byte)(i / 30), (byte)(i % 30));281
if (iResult == (int)RelayStates.ISUP_CH_WAIT_RELEASE)282

{283
VoiceST =string.Empty;284
TrunkState = string.Empty;285
ReaseceTrunckCHN(i);286
SysFunction.SetRelayStates(i, (int)RelayStates.ISUP_CH_FREE);287
lvChn.BeginUpdate();288
lvChn.Items[i].SubItems[5].Text = "";289
lvChn.EndUpdate();290
}291

292
if (SysFunction.iRaleyStetes(((byte)(i / 30)), ((byte)(i % 30))) == (int)RelayStates.ISUP_CALLER_CONNECT)293

{294
//lblMsg.Text = "去话连通.";295
TrunkState = "Calling";296
bool beFinish = false;297
int iST = SysFunction.iCallOutStates(i / 30, i % 30);298
string calleeNum = CalleeNum(i / 30, i % 30);299

处理声音播放#region 处理声音播放300
unsafe301

{302
byte[] filePath = GetFilePath(WelcomeTo);303

304
try305

{306
TrunkState = "Calling";307
lblTrunk.Text = "信道状态是:" + VoiceST;308

注释掉的东西,以后备用#region 注释掉的东西,以后备用309

/**//*if (Convert.ToBoolean(iST & 0x10))310
{311
int iCPGval = SysFunction.iCPGReval(i);312
int iISUPval = SysFunction.ISUPReVal(i);313
}*/314

315
//if (SysFunction.iRaleyStetes(((byte)(i / 30)), ((byte)(i % 30))) == (int)RelayStates.ISUP_CALLER_CONNECT)316
//{317

out#region out318
//PlayFiles(i);319
//PlayVoiceBegin(i, MusicFile);320
//PlayVoice(i, "call.005");321
//PlayVoiceEnd(i, "call.006");322

323

/**//*if (SysFunction.bISplayVoice(i, filePath))324
{325
beFinish = true;326
lblMsg.Text += Encoding.UTF8.GetString(filePath);327
SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);328
int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);329
if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))330
{331
SysFunction.StopPlayVocInTrunk(i);332
ReaseceTrunckCHN(i);333
beFinish = true;334
}335
}336
else337
{338
TST[i].ST = TRUNK_ST.TRK_PLAY;339
}*/340

/**//*341
bool PlayNext = false;342

343
if(SysFunction.bISplayVoice(i,filePath))344
{345
if (PlayNext)346
{347
SysFunction.StopPlayVocInTrunk(i);348
ReaseceTrunckCHN(i);349
}350
if (!PlayNext)351
{352
SysFunction.StopPlayVocInTrunk(i);353
ReaseceTrunckCHN(i);354
}355
}356
beFinish = true;357
* */358
359

/**//*if (SysFunction.bISplayVoice(i, filePath))360
{361
lblMsg.Text += Encoding.UTF8.GetString(filePath);362
SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);363
int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);364
if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))365
{366
SysFunction.StopPlayVocInTrunk(i);367
ReaseceTrunckCHN(i);368
beFinish = true;369
}370
}*/371
#endregion372
//MessageBox.Show(VoiceST);373

声音播放状态判断#region 声音播放状态判断374
//声音播放状态375

/**//*376
switch (VoiceST)377
{378
case "Callout":379
{380
lblTrunk.Text = "信道状态是:" + VoiceST;381
SysFunction.bISplayVoice(i, filePath);382
VoiceST = "Welcome";383
//if (SysFunction.bISplayVoice(i, filePath))384
//{385
SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);386
//int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);387
//if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))388
//{389
// lblTrunk.Text = "信道状态是:" + VoiceST;390
// //SysFunction.StopPlayVocInTrunk(i);391
// //ReaseceTrunckCHN(i);392
// //beFinish = true;393
// VoiceST = "Welcome";394
//}395
//}396
break;397
}398
case "Welcome":399
{400
lblTrunk.Text = "信道状态是:" + VoiceST;401
int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);402
if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))403
{404
SysFunction.bISplayVoice(i, GetFilePath("bank.005"));405
VoiceST = "ReadUser";406
//if (SysFunction.bISplayVoice(i, GetFilePath("bank.005")))407
//{408
// SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);409
// int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);410
// if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))411
// {412
// lblTrunk.Text = "信道状态是:" + VoiceST;413
// //SysFunction.StopPlayVocInTrunk(i);414
// //ReaseceTrunckCHN(i);415
// //beFinish = true;416
// VoiceST = "ReadUser";417
// }418
//}419
}420
break;421
}422
case "ReadUser":423
{424
lblTrunk.Text = "信道状态是:" + VoiceST;425
int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);426
if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))427
{428
SysFunction.bISplayVoice(i, GetFilePath("bank.006"));429
VoiceST = "SendUser";430
//if (SysFunction.bISplayVoice(i, GetFilePath("bank.006")))431
//{432
// SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);433
// int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);434
// if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))435
// {436
// lblTrunk.Text = "信道状态是:" + VoiceST;437
// //SysFunction.StopPlayVocInTrunk(i);438
// //ReaseceTrunckCHN(i);439
// //beFinish = true;440
// VoiceST = "SendUser";441
// }442
//}443
}444
break;445
}446
case "SendUser":447
{448
lblTrunk.Text = "信道状态是:" + VoiceST;449
int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);450
if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))451
{452
SysFunction.bISplayVoice(i, GetFilePath("bank.007"));453
VoiceST = "ReadPass";454
//if (SysFunction.bISplayVoice(i, GetFilePath("bank.007")))455
//{456
// SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);457
// int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);458
// if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))459
// {460
// lblTrunk.Text = "信道状态是:" + VoiceST;461
// //SysFunction.StopPlayVocInTrunk(i);462
// //ReaseceTrunckCHN(i);463
// //beFinish = true;464
// VoiceST = "ReadPass";465
// }466
//}467
}468
break;469
}470
case "ReadPass":471
{472
lblTrunk.Text = "信道状态是:" + VoiceST;473
int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);474
if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))475
{476
SysFunction.bISplayVoice(i, GetFilePath("bank.001"));477
VoiceST = "SendPass";478
//if (SysFunction.bISplayVoice(i, GetFilePath("bank.001")))479
//{480
// SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);481
// int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);482
// if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))483
// {484
// lblTrunk.Text = "信道状态是:" + VoiceST;485
// //SysFunction.StopPlayVocInTrunk(i);486
// //ReaseceTrunckCHN(i);487
// //beFinish = true;488
// VoiceST = "SendPass";489
// }490
//}491
}492
break;493
}494
case "SendPass":495
{496
lblTrunk.Text = "信道状态是:" + VoiceST;497
int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);498
if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))499
{500
SysFunction.bISplayVoice(i, GetFilePath("D1"));501
VoiceST = "ReSendPass";502
//if (SysFunction.bISplayVoice(i, GetFilePath("D1")))503
//{504
// SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);505
// int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);506
// if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))507
// {508
// lblTrunk.Text = "信道状态是:" + VoiceST;509
// //SysFunction.StopPlayVocInTrunk(i);510
// //ReaseceTrunckCHN(i);511
// //beFinish = true;512
// VoiceST = "ReSendPass";513
// }514
//}515
}516
break;517
}518
case "ReSendPass":519
{520
lblTrunk.Text = "信道状态是:" + VoiceST;521
int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);522
if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))523
{524
SysFunction.bISplayVoice(i, GetFilePath("D1"));525
VoiceST = "EndSystem";526
//if (SysFunction.bISplayVoice(i, GetFilePath("D1")))527
//{528
// SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);529
// int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);530
// if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))531
// {532
// lblTrunk.Text = "信道状态是:" + VoiceST;533
// //SysFunction.StopPlayVocInTrunk(i);534
// //ReaseceTrunckCHN(i);535
// //beFinish = true;536
// VoiceST = "EndSystem";537
// }538
//}539
}540
break;541
}542
case "EndSystem":543
{544
lblTrunk.Text = "信道状态是:" + VoiceST;545
int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);546
if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))547
{548
SysFunction.bISplayVoice(i, GetFilePath("bank.002"));549
VoiceST = "ExitSystem";550
//if (SysFunction.bISplayVoice(i, GetFilePath("bank.002")))551
//{552
// SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);553
// int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);554
// if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))555
// {556
// lblTrunk.Text = "信道状态是:" + VoiceST;557
// SysFunction.StopPlayVocInTrunk(i);558
// ReaseceTrunckCHN(i);559
// beFinish = true;560
// VoiceST = "";561
// }562
//}563
}564
break;565
}566
case "ExitSystem":567
{568
lblTrunk.Text = "信道状态是:" + VoiceST;569
int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);570
if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))571
{572
SysFunction.StopPlayVocInTrunk(i);573
ReaseceTrunckCHN(i);574
beFinish = true;575
}576
//if (SysFunction.bISplayVoice(i, filePath))577
//{578
// SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);579
// int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);580
// if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))581
// {582
// lblTrunk.Text = "信道状态是:" + VoiceST;583
// //SysFunction.StopPlayVocInTrunk(i);584
// //ReaseceTrunckCHN(i);585
// //beFinish = true;586
// VoiceST = "Welcome";587
// }588
//}589
break;590
}591
default:592
{593
int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(i);594
if (SysFunction.bIsVocPlayEnd(iVoiceLinkTunk))595
{596
SysFunction.StopPlayVocInTrunk(i);597
ReaseceTrunckCHN(i);598
beFinish = false;599
}600
break;601
}602
603

604
}605
*/606
#endregion607
//}608

609
#endregion610

611
if (VoiceST == "Callout")612

{613
myTelNum tn = new myTelNum();614
string TelNum = calleeNum;615
SysFunction.PlayFileInit(i);616
AddIndexFiles(i, WelcomeTo);617
string SysCalleeNum = Encoding.UTF8.GetString(SysFunction.GetCallNum(i / 30, i % 30).bCallNum);618
string TelPass = tn.GetTelPass(SysCalleeNum);619
for (int t = 0; t < SysCalleeNum.Length; t++)620

{621
string tmp = "d" + SysCalleeNum[t].ToString();622
AddIndexFiles(i, tmp.Trim());623
}624
if (TelPass != string.Empty || TelPass != null)625

{626
AddIndexFiles(i, PassReadBegin);627
AddIndexFiles(i, PassRead);628
for (int p = 0; p < TelPass.Length; p++)629

{630
string ptmp = "d" + TelPass[p].ToString();631
AddIndexFiles(i, ptmp.Trim());632
}633
AddIndexFiles(i, PassRead);634
for (int p = 0; p < TelPass.Length; p++)635

{636
string ptmp = "d" + TelPass[p].ToString();637
AddIndexFiles(i, ptmp.Trim());638
}639
}640
AddIndexFiles(i, EndSystem);641
SysFunction.PlayFileStart(i);642
VoiceST="FilePlay";643
}644

645
if (VoiceST == "FilePlay")646

{647
if (SysFunction.PlayFileEndCHK(i))648

{649
VoiceST = "PlayEnd";650
}651
//if()652
}653
if (VoiceST == "PlayEnd")654

{655
SysFunction.PlayFileEnd(i);656
beFinish = true;657
}658

659
}660
catch (Exception ex)661

{662
lblTrunk.Text =ex.Message.ToString();663
664
myTelNum tn = new myTelNum();665
tn.LogModify(Encoding.UTF8.GetString(SysFunction.GetCallNum(i / 30, i % 30).bCallNum), ex.Message);666
beFinish = false;667
ReaseceTrunckCHN(i); 668
SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_FREE);669
TrunkState = string.Empty;670
671
}672
}673

674
//数据插入675
if (beFinish)676

{677
lblTrunk.Text = "播放结束";678
myTelNum mt = new myTelNum();679
mt.ISCompelet(Encoding.UTF8.GetString(SysFunction.GetCallNum(i / 30, i % 30).bCallNum));680
SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);681
ReaseceTrunckCHN(i);682
SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_FREE);683
TrunkState = string.Empty;684
VoiceST = string.Empty;685
}686
else687

{688
//MessageBox.Show("beFinish:" + beFinish.ToString());689

/**//*ReaseceTrunckCHN(i);690
myTelNum tn = new myTelNum();691
tn.LogModify(calleeNum,"密码发送失败");692
beFinish = false;693
SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_FREE);694
TrunkState = string.Empty;*/695
696
}697
#endregion698
}699

700
//if (SysFunction.iRaleyStetes(((byte)(i / 30)), ((byte)(i % 30))) == (int)RelaySet.ISUP_CH_SET_REL)701
//{702
// lblTrunk.Text = "播放完毕,准备挂机";703
// ReaseceTrunckCHN(i);704
// SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_FREE);705
// TrunkState = string.Empty;706
// VoiceST = string.Empty;707
//}708

709
if (SysFunction.iRaleyStetes(((byte)(i / 30)), ((byte)(i % 30))) == (int)RelayStates.ISUP_CALLER_WAIT_ANM)710

{711
TrunkState = "Calling";712
lblMsg.Text = "等待被叫响应";713
}714
if (SysFunction.iRaleyStetes(((byte)(i / 30)), ((byte)(i % 30))) == (int)RelayStates.ISUP_CALLEE_RECV_IAM)715

{716
TrunkState = "Calling";717
lblMsg.Text = "呼叫到达";718
}719

注释掉的东西不知道以后有没有用哈#region 注释掉的东西不知道以后有没有用哈720

/**//*if (TST[i].ST == TRUNK_ST.TRK_PLAY)721
{722
iVoiceID = SysFunction.iVoicePlayForTrunk(i);723
if (iVoiceID == -1)724
{725
SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);726
return;727
}728
else729
{730
if (SysFunction.bIsVocPlayEnd(iResult))731
{732
SysFunction.StopPlayVocInTrunk(i);733
SysFunction.SetRelayStates(i, (int)RelaySet.ISUP_CH_SET_REL);734
TST[i].ST = TRUNK_ST.TRK_HANGUP;735
}736
}737
}*/738
#endregion739
}740
}741
#endregion742

743

播放声音#region 播放声音744

745

/**//// <summary>746
/// 开始播放声音747
/// </summary>748
/// <param name="TrunkID"></param>749
/// <param name="FileNames"></param>750
public void PlayVoiceBegin(int TrunkID, string FileNames)751

{752
byte[] filePath = GetFilePath(FileNames);753
//int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(TrunkID);754
if (SysFunction.iRaleyStetes(((byte)(TrunkID / 30)), ((byte)(TrunkID % 30))) == (int)RelayStates.ISUP_CALLEE_CONNECT)755

{756
bool IsPlay = SysFunction.bISplayVoice(TrunkID, filePath);757
}758
}759

760

/**//// <summary>761
/// 连续播放声音762
/// </summary>763
/// <param name="TrunkID"></param>764
/// <param name="FileNames"></param>765
public void PlayVoice(int TrunkID, string FileNames)766

{767
byte[] filePath = GetFilePath(FileNames);768
int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(TrunkID);769
if (SysFunction.bIsVocPlayEnd(TrunkID))770

{771
bool IsPlay = SysFunction.bISplayVoice(TrunkID, filePath);772
if(IsPlay)773

{774
SysFunction.StopPlayVocInTrunk(TrunkID);775
ReaseceTrunckCHN(TrunkID);776
//beFinish = true;777
//此处处理程序;778
}779
}780
}781

782
public void PlayVoiceEnd(int TrunkID, string FileNames)783

{784
byte[] filePath = GetFilePath(FileNames);785
int iVoiceLinkTunk = SysFunction.iVoicePlayForTrunk(TrunkID);786
if (SysFunction.bIsVocPlayEnd(TrunkID))787

{788
bool IsPlay = SysFunction.bISplayVoice(TrunkID, filePath);789
if (IsPlay)790

{791
//此处处理程序;792
}793
}794
}795
#endregion796

797

索引播音(多文件播音)#region 索引播音(多文件播音)798

799

/**//// <summary>800
/// 添加索引音乐文件801
/// </summary>802
/// <param name="TrunkID"></param>803
/// <param name="FileNames"></param>804
public void AddIndexFiles(int TrunkID,string FileNames)805

{806
byte[] FileArr = GetFilePath(FileNames);807
SysFunction.AddIndexFile(TrunkID, FileArr);808
}809

810
#endregion811

812

中继通道状态遍历#region 中继通道状态遍历813

/**//// <summary>814
/// 信道状态815
/// </summary>816
/// <param name="iTrunkID"></param>817
/// <returns></returns>818
819
public void DrawTrunkState(int iTrunkID)820

{821
string sST = string.Empty;822
string sCalleeNum = string.Empty;823
string sCallerNum = string.Empty;824
int iTrunkST = SysFunction.iRaleyStetes((byte)(iTrunkID / 30), (byte)(iTrunkID % 30));825
switch (iTrunkST)826

{827
case (int)RelayStates.ISUP_CH_WAIT_RELEASE:828

{829
sST = ("不可用"); 830
break;831
}832
case (int)RelayStates.ISUP_CH_FREE:833

{834
sST = ("空闲");835
break;836
}837
case (int)RelayStates.ISUP_CALLEE_CONNECT:838

{839
sST = ("来话摘机");840
break;841
}842
case (int)RelayStates.ISUP_CALLER_CONNECT:843

{844
TrunkState = "Calling";845
sCalleeNum =Encoding.UTF8.GetString(SysFunction.GetCallNum(iTrunkID / 30, iTrunkID % 30).bCallNum);846
myTelNum mt = new myTelNum();847
sCallerNum =mt.GetTelPass(sCalleeNum);848
sST = "电话呼出";849
break;850
}851
case (int)RelayStates.ISUP_CALLER_WAIT_ANM:852

{853
sCalleeNum =Encoding.UTF8.GetString(SysFunction.GetCallNum(iTrunkID / 30, iTrunkID % 30).bCallNum);854
sCallerNum = Encoding.UTF8.GetString(SysFunction.GetCallNum(iTrunkID / 30, iTrunkID % 30).bCalleeNum);855
TrunkState = "Calling";856
VoiceST = "Callout";857
sST = "呼出等待";858
break;859
}860
case (int)RelayStates.ISUP_CH_LOCAL_BLOCK:861

{862
sST = "本地闭塞";863
break;864
}865
case (int)RelayStates.ISUP_CH_LOCAL_SUSPEND:866

{867
sST = "本地暂停";868
break;869
}870
case (int)RelayStates.ISUP_CH_REMOTE_BLOCK:871

{872
sST = "远端闭塞";873
break;874
}875
case (int)RelayStates.ISUP_CH_REMOTE_SUSPEND:876

{877
sST = "远端暂停";878
break;879
}880
default:881

{882
sST = "中间状态";883
break;884

885
}886
}887
lvChn.Items[iTrunkID].SubItems[3].Text = sST;888
lvChn.Items[iTrunkID].SubItems[4].Text = sCallerNum;889
lvChn.Items[iTrunkID].SubItems[5].Text = sCalleeNum;890
}891
#endregion892

893

声音文件转换#region 声音文件转换894

/**//// <summary>895
/// 文件名转换成byte[]896
/// </summary>897
/// <param name="FileName"></param>898
/// <returns></returns>899
public byte[] GetFilePath(string FileName)900

{901
string appFile = SysFunction.appDIRStr().ToString();902
//MessageBox.Show(appFile);903
char[] charTemp = new char[256];904
byte[] byteTemp = new byte[256];905
long Pos = 0;906
long tmp = 0;907

908

909
appFile.ToCharArray().CopyTo(charTemp, Pos);910
for (short x = 0; x < charTemp.Length; x++)911

{912
if (charTemp[x] != 0)913

{914
tmp++;915
}916
}917
Pos = tmp;918
@"voc\".ToCharArray().CopyTo(charTemp, Pos);919
FileName.ToCharArray().CopyTo(charTemp, Pos + 4);920
Encoding.Unicode.GetBytes(FileName.ToCharArray()).CopyTo(byteTemp, 0);921
for (int i =0; i < charTemp.Length; i++)922

{923
byteTemp[i] = (byte)charTemp[i];924
}925
return byteTemp;926
}927
#endregion928

929

电话号码转换#region 电话号码转换930

/**//// <summary>931
/// 电话号码转换932
/// </summary>933
/// <param name="Str"></param>934
/// <param name="PCMno"></param>935
/// <param name="RelayNo"></param>936
/// <returns></returns>937
public byte[] CalleestringTobyte(string Str,int PCMno,int RelayNo)938

{939
TC_INI_TYPE TC = new TC_INI_TYPE();940
char[] charTemp = new char[256];941
byte[] byteTemp = new byte[256];942
long Pos = 0;943
long tmp = 0;944

945

946
TC=SysFunction.GetCallNum(PCMno,RelayNo);947
TC.bCalleeNum.CopyTo(byteTemp, Pos);948
for (short x = 0; x < Pos;x++ )949

{950
if(TC.bCalleeNum[x]!=0)951

{952
tmp++;953
}954
}955
Pos = tmp;956
Encoding.Unicode.GetBytes(Str.ToCharArray()).CopyTo(byteTemp, 0);957
return byteTemp;958
}959
#endregion 960

961

被叫电话号码#region 被叫电话号码962
public string CalleeNum(int PCMno, int RelayNo)963

{964
TC_INI_TYPE TC = new TC_INI_TYPE();965
char[] charTemp = new char[256];966
byte[] byteTemp = new byte[256];967
long Pos = 0;968
long tmp = 0;969

970

971
TC = SysFunction.GetCallNum(PCMno, RelayNo);972
TC.bCalleeNum.CopyTo(byteTemp, Pos);973
for (short x = 0; x < Pos; x++)974

{975
if (TC.bCalleeNum[x] != 0)976

{977
tmp++;978
}979
}980
Pos = tmp;981
// Encoding.Unicode.GetBytes(Str.ToCharArray()).CopyTo(byteTemp, 0);982
return Encoding.UTF8.GetString(byteTemp);983
}984
#endregion985

986

拨号#region 拨号987

/**//// <summary>988
/// 手动拨号989
/// </summary>990
/// 991
992
public void CallOut(string iTelNum)993

{994
995
unsafe996

{997
nOutCall = Convert.ToUInt64(iTelNum);998
nMyCallNo = Convert.ToUInt64(MyCallNO);999
TelNum telNO = new TelNum();1000
byte[] iTelNO = new byte[256];1001
char[] tempTel = new char[256];1002
tempTel = iTelNum.ToCharArray();1003
telNO.arrTelNum = Encoding.ASCII.GetBytes(tempTel);1004
char[] tempCall = new char[256];1005
byte[] iCallNO = new byte[256];1006
tempCall = MyCallNO.ToCharArray();1007
telNO.arrCallNum = Encoding.ASCII.GetBytes(tempCall);1008
int iFreeTrunkID = SysFunction.iFreePCM();1009
string sErr = string.Empty;1010
if (iFreeTrunkID == -1)1011

{1012
return;1013
}1014
else1015

{1016
StringBuilder sbCallee = new StringBuilder(iTelNum);1017
StringBuilder sbCaller = new StringBuilder(MyCallNO);1018
try1019

{1020
bool charISCallout = SysFunction.bCallOut(iFreeTrunkID, sbCallee, sbCaller);1021
}1022
catch (Exception ex)1023

{1024
lblTrunk.Text = ex.Message;1025
}1026

1027
try1028

{1029
bool bCallout = SysFunction.bCallOut(iFreeTrunkID, iTelNum, MyCallNO, ref sErr);1030
}1031
catch (Exception ex)1032

{1033
lblTrunk.Text = ex.Message + sErr;1034
}1035
try1036

{1037
bool bISout = SysFunction.bCallOut(iFreeTrunkID, iTelNum, MyCallNO, false, false);1038
}1039
catch (Exception ex)1040

{1041
lblTrunk.Text = ex.Message;1042
}1043
try1044

{1045
bool bIsCallOut = SysFunction.bCallOut(iFreeTrunkID, CalleestringTobyte(iTelNum, iFreeTrunkID / 30, iFreeTrunkID % 30), iCallNO);1046
}1047
catch (Exception ex)1048

{1049
lblTrunk.Text = ex.Message;1050
}1051
try1052

{1053
bool bSisCallOut = SysFunction.bCallOut(iFreeTrunkID, nOutCall, nMyCallNo);1054
}1055
catch (Exception ex)1056

{1057
lblTrunk.Text = ex.Message;1058
}1059
lvChn.BeginUpdate();1060
lvChn.Items[iFreeTrunkID].SubItems[5].Text = iTelNum;1061
lvChn.EndUpdate();1062
VoiceST = "Callout";1063
TrunkState = "Calling";1064
}1065
}1066
1067
}1068

1069

1070

/**//// <summary>1071
/// 自动拨号1072
/// </summary>1073
/// 1074

1075
1076
public void TheadCallOut()1077

{1078
1079
DBMod.myTelNum tn = new DJVoiceCard.DBMod.myTelNum();1080
string iTelNum = tn.theTelNum;1081
CallOutNum = tn.theTelNum;1082
1083
unsafe1084

{1085
TrunkState = "Calling";1086
ulong nOutCall = Convert.ToUInt64(iTelNum);1087
ulong nMyCallNo = Convert.ToUInt64(MyCallNO);1088
TelNum telNO = new TelNum();1089
byte[] iTelNO = new byte[256];1090
char[] tempTel = new char[256];1091
tempTel = iTelNum.ToCharArray();1092
telNO.arrTelNum = Encoding.ASCII.GetBytes(tempTel);1093
char[] tempCall = new char[256];1094
byte[] iCallNO = new byte[256];1095
tempCall = MyCallNO.ToCharArray();1096
telNO.arrCallNum = Encoding.ASCII.GetBytes(tempCall);1097
int iFreeTrunkID = SysFunction.iFreePCM();1098
string sErr = string.Empty;1099
if (iFreeTrunkID == -1)1100

{1101

1102
}1103
else1104

{1105

1106
StringBuilder sbCallee = new StringBuilder(iTelNum);1107
StringBuilder sbCaller = new StringBuilder(MyCallNO);1108
try1109

{1110
bool charISCallout = SysFunction.bCallOut(iFreeTrunkID, sbCallee, sbCaller);1111
}1112
catch(Exception ex)1113

{1114
lblTrunk.Text = ex.Message;1115
}1116

1117
try1118

{1119
bool bCallout = SysFunction.bCallOut(iFreeTrunkID, iTelNum, MyCallNO, ref sErr);1120
}1121
catch (Exception ex)1122

{1123
lblTrunk.Text = ex.Message + sErr;1124
}1125
try1126

{1127
bool bISout = SysFunction.bCallOut(iFreeTrunkID, iTelNum, MyCallNO, false, false);1128
}1129
catch (Exception ex)1130

{1131
lblTrunk.Text = ex.Message;1132
}1133
try1134

{1135
bool bIsCallOut = SysFunction.bCallOut(iFreeTrunkID, CalleestringTobyte(iTelNum, iFreeTrunkID / 30, iFreeTrunkID % 30), iCallNO);1136
}1137
catch (Exception ex)1138

{1139
lblTrunk.Text = ex.Message;1140
}1141
try1142

{1143
bool bSisCallOut = SysFunction.bCallOut(iFreeTrunkID, nOutCall, nMyCallNo);1144
}1145
catch (Exception ex)1146

{1147
lblTrunk.Text = ex.Message;1148
}1149
lvChn.BeginUpdate();1150
lvChn.Items[iFreeTrunkID].SubItems[5].Text = iTelNum;1151
lvChn.EndUpdate();1152
TrunkState = "Calling";1153
VoiceST = "Callout";1154
}1155
}1156
1157
}1158

1159
#endregion1160

1161

释放资源#region 释放资源1162

/**//// <summary>1163
/// 释放用户通道1164
/// </summary>1165
/// <param name="iUserCHNID"></param>1166
public void ReaseceUserCHN(int iUserCHNID)1167

{ 1168
if(iUserCHNID!=-1)1169

{1170
if(SysFunction.bIsRingDerctor(iUserCHNID))1171

{1172
if (SysFunction.bIsStopRing(iUserCHNID))1173

{1174
}1175
1176
}1177
if(SysFunction.bClearVoiceFromUser(iUserCHNID))1178

{}1179
if(SysFunction.bIsInitDailBuf(iUserCHNID))1180

{}1181
URS[iUserCHNID].ConnTrID = -1;1182
URS[iUserCHNID].ConnUrID = -1;1183
URS[iUserCHNID].ST = USER_STATE.USR_ONHOOK;1184
1185
}1186
}1187

1188

/**//// <summary>1189
/// 释放中继信道资源1190
/// </summary>1191
/// <param name="iTrunkCHNID"></param>1192
public void ReaseceTrunckCHN(int iTrunkCHNID)1193

{1194
bool bISCHK = (iTrunkCHNID == -1 && (SysFunction.iRaleyStetes(((byte)(iTrunkCHNID / 30)), ((byte)(iTrunkCHNID % 30))) == (int)RelayStates.ISUP_CH_FREE));1195
if(!bISCHK)1196

{1197
int iUserCHNID = SysFunction.iLinkUserCHNID(iTrunkCHNID);1198
if(iUserCHNID>-1)1199

{1200
if (SysFunction.ClearCHN(iTrunkCHNID))1201

{ }1202
}1203

1204
int iVoiceID = SysFunction.iVoicePlayForTrunk(iTrunkCHNID);1205
if (iVoiceID > -1)1206

{1207
SysFunction.bIsClearTrunkVoiceLink(iTrunkCHNID);1208
}1209

1210
SysFunction.bIsInitDtmfByTrunkID(iTrunkCHNID);1211

1212
TST[iTrunkCHNID].ST = TRUNK_ST.TRK_FREE;1213
TST[iTrunkCHNID].DialNum = string.Empty;1214
TST[iTrunkCHNID].ConnTrID = -1;1215
TST[iTrunkCHNID].ConnUrID = -1;1216

1217
SysFunction.SetRelayStates(iTrunkCHNID, (int)RelayStates.ISUP_CH_FREE);1218
}1219
}1220

/**//// <summary>1221
/// 释放资源1222
/// </summary>1223
public void ReacurseTrunk()1224

{1225
iTunkTotal = SysFunction.iTrkTotal();1226
for (int i = 0; i < iTunkTotal; i++)1227

{1228
ReaseceTrunckCHN(i);1229
}1230
iUserTotal = SysFunction.iUserTotal();1231
for (int i = 0; i < iUserTotal; i++)1232

{1233
ReaseceUserCHN(i);1234
}1235

1236
}1237

1238
#endregion1239

1240
private void button1_Click(object sender, EventArgs e)1241

{1242
ReacurseTrunk();1243
}1244
}1245
}好了,经过贴了那么长的代码.整个项目都已经弄好了.下一篇会吧整个项目贴出来让大家下载.
H.Wong
-2010
浙公网安备 33010602011771号