亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#開發紐曼USB來電小秘書客戶端總結

2020-01-24 02:34:05
字體:
來源:轉載
供稿:網友

在使用C#開發完CRM的來電彈屏之后,有些客戶有了新的要求,他們希望不但能夠實現來電彈屏,更希望能夠將呼入呼出的電話錄音并上傳到CRM服務器上,方便日后跟蹤記錄。于是便有了來電小秘書客戶端的開發。

本文所述的來電小秘書客戶端的開發是基于紐曼USB來電通客戶端的基礎上進行開發的,由于紐曼USB來電通的硬件沒有錄音功能,于是硬件上使用了紐曼的另一個硬件產品來電小秘書,雖然是同一個廠家的產品,可是它們的API卻是完全不兼容,更煩的是,來電小秘書API沒有來電的回調接口,無法通過回調觸發程序,也沒有C#的Demo,很多功能只能通過一個不是那么詳細的文檔和一個Delphi的Demo摸索著做了,經歷了一些挫折和困惑,終于完成了這個客戶端程序。

首先,開發要做的就是與硬件的API進行溝通,依然通過C#的P/Invoke來完成,以下是來電小秘書的P/Invoke代碼。

using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices;  namespace WindowsApplication1 {   class LDT1   {     [DllImport("usbms.dll", EntryPoint = "LoadDRV")]     public static extern int LoadDRV();      [DllImport("usbms.dll", EntryPoint = "EnableCard")]     public static extern int EnableCard();      [DllImport("usbms.dll", EntryPoint = "StopSigCheck")]     public static extern int StopSigCheck(int Handle);      [DllImport("usbms.dll", EntryPoint = "ReSetUsb")]     public static extern int ReSetUsb(int Handle);      [DllImport("usbms.dll", EntryPoint = "HangUp")]     public static extern int HangUp(int Handle);      [DllImport("usbms.dll", EntryPoint = "InitDtmfBuf")]     public static extern int InitDtmfBuf(int Handle);      [DllImport("usbms.dll", EntryPoint = "SetDialPara")]     public static extern int SetDialPara(UInt16 RingBack1, UInt16 RingBack0, UInt16 BusyLen, UInt16 RingTimes, UInt16 SendNoSignalLen);       [DllImport("usbms.dll", EntryPoint = "DisableCard")]     public static extern int DisableCard();      [DllImport("usbms.dll", EntryPoint = "FreeDRV")]     public static extern int FreeDRV();      [DllImport("usbms.dll", EntryPoint = "GetDtmfCode")]     public static extern int GetDtmfCode(UInt16 Line);      [DllImport("usbms.dll", EntryPoint = "IsRing")]     public static extern bool IsRing(UInt16 Line);      [DllImport("usbms.dll", EntryPoint = "GetCallerIDStr")]     public static extern UInt16 GetCallerIDStr(UInt16 Line, StringBuilder IDStr);       [DllImport("usbms.dll", EntryPoint = "IsOffHook")]     public static extern bool IsOffHook(UInt16 Line);       [DllImport("usbms.dll", EntryPoint = "StartRecordFile")]     public static extern bool StartRecordFile(UInt16 Line, string FileName, UInt32 dwRecordLen);      [DllImport("usbms.dll", EntryPoint = "CheckRecordEnd")]     public static extern bool CheckRecordEnd(UInt16 Line);       [DllImport("usbms.dll", EntryPoint = "StopRecordFile")]     public static extern bool StopRecordFile(UInt16 Line);      [DllImport("usbms.dll", EntryPoint = "PCMtoWave")]     public static extern int PCMtoWave(string SourceFileName, string TargetFileName);      [DllImport("usbms.dll", EntryPoint = "ReadCheckResult")]     public static extern int ReadCheckResult(int line, int mode);      [DllImport("usbms.dll", EntryPoint = "StartSigCheck")]     public static extern void StartSigCheck(int line);      [DllImport("usbms.dll", EntryPoint = "ReadUsbState")]     public static extern bool ReadUsbState(int line);      [DllImport("usbms.dll", EntryPoint = "GetRingNum")]     public static extern int GetRingNum(int line);      [DllImport("usbms.dll", EntryPoint = "InitRingNum")]     public static extern void InitRingNum(int line);      [DllImport("usbms.dll", EntryPoint = "ReadSerialNo")]     public static extern int ReadSerialNo(int line,StringBuilder serialNo);    } } 

然后就是關于設備狀態檢測了,由于沒有API直接支持來電回調,所以只能自己手動的檢測設備狀態來判斷,要實現這一部分一般有兩種方式,使用Timer或者使用Thread,Delphi的Demo中使用了Timer,可是Timer實現的弊端需要使用異步的思考方式,不符合我們的思維模式,靈活度也不夠,而且C#創建線程太方便了,而線程是通過同步方式思考的,所以使用了Thread模式。

然后在特定的時刻,記錄電話號碼、彈屏(如果是來電)、電話結束后錄音和上傳文件和信息到CRM服務器,其中來電號碼可以很容易的獲取,可是播出的號碼獲取就比較的麻煩了,C#中可以使用如下代碼:

while (LDT1.IsOffHook((ushort)this.line)) {    int temp = LDT1.GetDtmfCode((ushort)this.line);     if (temp > 0)     {        phonenum = phonenum + this.convertInt(temp);     }     Thread.Sleep(300);         } private string convertInt(int code)   {     string ret="";     switch (code)     {       case 10:         ret = "0";         break;       case 11:         ret = "*";         break;       case 12:         ret = "#";         break;       case 13:         ret = "A";         break;       case 14:         ret = "B";         break;       case 15:         ret = "C";         break;       case 16:         ret = "D";         break;       default:         ret = code.ToString();         break;     }     return ret;   } 

下面說一下C#中的大文件上傳吧,網上有很多例子了,可以參考如下文章中的代碼進行開發//www.49028c.com/article/53377.htm,可是無法上傳成功,于是解讀了一下代碼,發現他將信息中的/r/n用空字符代替了,導致服務器無法識別,于是在更改了他的代碼之后,問題解決了,代碼如下:

public static string UploadFileEx(string uploadfile, string url,    string fileFormName, string contenttype, NameValueCollection querystring,    CookieContainer cookies)  {    if ((fileFormName == null) ||      (fileFormName.Length == 0))    {      fileFormName = "file";    }     if ((contenttype == null) ||      (contenttype.Length == 0))    {      contenttype = "application/octet-stream";    }      string postdata;    postdata = "?";    if (querystring != null)    {      foreach (string key in querystring.Keys)      {        postdata += key + "=" + querystring.Get(key) + "&";      }    }    Uri uri = new Uri(url + postdata);     string boundary = "----------" + DateTime.Now.Ticks.ToString("x");    HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);    //webrequest.CookieContainer = cookies;    webrequest.ContentType = "multipart/form-data; boundary=" + boundary;    webrequest.Method = "POST";    string huanhang = "/r/n";    byte[] huanhangbyte = Encoding.UTF8.GetBytes(huanhang);     // Build up the post message header      StringBuilder sb = new StringBuilder();    sb.Append("--");    sb.Append(boundary);    sb.Append("/r/n");    sb.Append("Content-Disposition: form-data; name=/"");    sb.Append(fileFormName);    sb.Append("/"; filename=/"");    sb.Append(Path.GetFileName(uploadfile));    sb.Append("/"");    sb.Append("/r/n");    sb.Append("Content-Type: ");    sb.Append(contenttype);    sb.Append("/r/n");    sb.Append("/r/n");     string postHeader = sb.ToString();    byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);     // Build the trailing boundary string as a byte array      // ensuring the boundary appears on a line by itself      byte[] boundaryBytes =        Encoding.ASCII.GetBytes("--" + boundary + "");     FileStream fileStream = new FileStream(uploadfile,                  FileMode.Open, FileAccess.Read);    long length = postHeaderBytes.Length + fileStream.Length +                        boundaryBytes.Length + huanhangbyte.Length;    webrequest.ContentLength = length;     Stream requestStream = webrequest.GetRequestStream();     // Write out our post header      requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);     // Write out the file contents      byte[] buffer = new Byte[checked((uint)Math.Min(4096,                 (int)fileStream.Length))];    int bytesRead = 0;    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)      requestStream.Write(buffer, 0, bytesRead);    requestStream.Write(huanhangbyte, 0, huanhangbyte.Length);    // Write out the trailing boundary      requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);    fileStream.Dispose();    requestStream.Dispose();    WebResponse responce = webrequest.GetResponse();    Stream s = responce.GetResponseStream();    StreamReader sr = new StreamReader(s);    string retval=sr.ReadToEnd();    sr.Dispose();     if (File.Exists(uploadfile))    {      try      {        File.Delete(uploadfile);      }catch(Exception e)      {      }    }    return retval;  } 

CRM來電小秘書客戶端完成了,當然要配合這個功能,服務器端CRM系統也要做一些修改,不過不是這篇文章的主要內容,關于服務器端的修改的小節,后續會有相關的報導。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线观看亚洲区| 久久成人一区二区| 8x海外华人永久免费日韩内陆视频| 欧美精品亚州精品| 欧美性jizz18性欧美| 日韩中文字幕久久| 操日韩av在线电影| 51久久精品夜色国产麻豆| 日韩av在线免费| 日韩亚洲在线观看| 国产香蕉一区二区三区在线视频| 国产一区二区三区久久精品| 国产成人一区二区在线| 亚洲精品国产品国语在线| 久久久91精品国产一区不卡| 狠狠色噜噜狠狠狠狠97| 国产精品69久久久久| 成人在线激情视频| 欧美日韩另类字幕中文| 97婷婷大伊香蕉精品视频| 亚洲自拍偷拍区| 色青青草原桃花久久综合| 久久久亚洲国产天美传媒修理工| 蜜臀久久99精品久久久久久宅男| 夜夜嗨av色一区二区不卡| 亚洲欧美综合精品久久成人| 日本人成精品视频在线| 亚洲天堂男人天堂女人天堂| 成人在线中文字幕| 国产精品精品视频一区二区三区| 久久影院模特热| 国内精品中文字幕| 欧美激情精品久久久| 欧美性videos高清精品| 国产欧美va欧美va香蕉在| 日韩欧美一区视频| 国产中文日韩欧美| 国模精品视频一区二区三区| 日韩精品久久久久久福利| 精品欧美激情精品一区| 亚洲欧美精品伊人久久| 亚洲欧美国产一区二区三区| 久久在线精品视频| …久久精品99久久香蕉国产| 国产精品私拍pans大尺度在线| 久久这里有精品| 精品一区二区三区四区在线| 国产91精品最新在线播放| 日韩精品高清在线观看| 51ⅴ精品国产91久久久久久| 亚洲精品小视频在线观看| 美女扒开尿口让男人操亚洲视频网站| 国产欧美日韩精品在线观看| 久久亚洲精品小早川怜子66| 国产香蕉精品视频一区二区三区| 神马国产精品影院av| 欧美日韩免费在线| 久久精品男人天堂| 国产精品视频一区二区三区四| 美女久久久久久久久久久| 国产精品一二三视频| 欧美激情a在线| 国产视频久久久久久久| 国产精品精品国产| 中文字幕亚洲二区| 97色伦亚洲国产| 2019av中文字幕| 欧美激情欧美狂野欧美精品| 91探花福利精品国产自产在线| 国产欧美日韩精品在线观看| 亚洲黄页网在线观看| 视频一区视频二区国产精品| 777国产偷窥盗摄精品视频| 日韩成人在线免费观看| 日韩欧美中文在线| 成人久久久久久| 亚洲在线观看视频网站| 国产伦精品免费视频| 欧美另类极品videosbest最新版本| 久久艹在线视频| y97精品国产97久久久久久| 91日本在线视频| 欧美电影在线观看| 日韩电影第一页| 日韩精品欧美国产精品忘忧草| 久久精品国产免费观看| 日韩精品免费一线在线观看| 亚洲精品影视在线观看| 午夜精品一区二区三区视频免费看| 在线电影中文日韩| 97人人爽人人喊人人模波多| 欧美专区国产专区| 久久久久久久香蕉网| 国内精品久久久久久中文字幕| 4438全国亚洲精品在线观看视频| 日韩免费av在线| 精品国产老师黑色丝袜高跟鞋| 亚洲免费成人av电影| 国产精品第100页| 日韩有码在线播放| 自拍偷拍免费精品| 亚洲精品久久久久久久久久久| 亚洲综合小说区| 国产精品v片在线观看不卡| 国产精品一区av| 69精品小视频| 91九色视频在线| 久久网福利资源网站| 亚洲国产小视频在线观看| 亚洲国产婷婷香蕉久久久久久| 一区二区中文字幕| 久久成人18免费网站| 亚洲天堂av图片| 中文字幕欧美视频在线| 91牛牛免费视频| 午夜免费在线观看精品视频| 日韩av日韩在线观看| 亚洲综合在线中文字幕| 国产在线观看精品一区二区三区| 欧美成人在线免费视频| 韩国三级电影久久久久久| 国产亚洲精品一区二555| 日韩在线观看成人| 欧美中文字幕精品| 亚洲福利视频网站| 欧洲亚洲在线视频| 欧美大人香蕉在线| 亚洲国产高清自拍| 色偷偷9999www| 国产精品444| 久久国产视频网站| 国产视频精品久久久| 国产精品一区二区三区成人| 欧美视频在线免费| 91精品国产综合久久久久久久久| 日韩激情av在线播放| 91麻豆国产精品| 国内精品久久久久久久| 欧美国产日韩精品| 国产亚洲精品久久久久久| 久久视频在线直播| 久久精品电影一区二区| 亚洲午夜未满十八勿入免费观看全集| 成人网页在线免费观看| 亚洲欧美国产精品| 青草成人免费视频| 日韩欧美福利视频| 欧美猛男性生活免费| 欧美性猛交丰臀xxxxx网站| 亚洲国产精品悠悠久久琪琪| 欧美日韩久久久久| 狠狠躁18三区二区一区| 亚洲精品欧美一区二区三区| 亚洲免费视频在线观看| 北条麻妃一区二区在线观看| 一区二区中文字幕| 欧美午夜美女看片| 日韩av在线资源| 国模精品系列视频| 亚洲精品免费一区二区三区| 精品亚洲国产视频| 亚洲精品成人久久| 国产自产女人91一区在线观看| 久久精品国产亚洲精品|