最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#開(kāi)發(fā)紐曼USB來(lái)電小秘書(shū)客戶(hù)端總結(jié)

 更新時(shí)間:2014年08月07日 11:35:52   投稿:shichen2014  
這篇文章主要介紹了C#開(kāi)發(fā)紐曼USB來(lái)電小秘書(shū)客戶(hù)端總結(jié),對(duì)于C#項(xiàng)目開(kāi)發(fā)來(lái)說(shuō)有一定的參考借鑒價(jià)值,需要的朋友可以參考下

在使用C#開(kāi)發(fā)完CRM的來(lái)電彈屏之后,有些客戶(hù)有了新的要求,他們希望不但能夠?qū)崿F(xiàn)來(lái)電彈屏,更希望能夠?qū)⒑羧牒舫龅碾娫?huà)錄音并上傳到CRM服務(wù)器上,方便日后跟蹤記錄。于是便有了來(lái)電小秘書(shū)客戶(hù)端的開(kāi)發(fā)。

本文所述的來(lái)電小秘書(shū)客戶(hù)端的開(kāi)發(fā)是基于紐曼USB來(lái)電通客戶(hù)端的基礎(chǔ)上進(jìn)行開(kāi)發(fā)的,由于紐曼USB來(lái)電通的硬件沒(méi)有錄音功能,于是硬件上使用了紐曼的另一個(gè)硬件產(chǎn)品來(lái)電小秘書(shū),雖然是同一個(gè)廠家的產(chǎn)品,可是它們的API卻是完全不兼容,更煩的是,來(lái)電小秘書(shū)API沒(méi)有來(lái)電的回調(diào)接口,無(wú)法通過(guò)回調(diào)觸發(fā)程序,也沒(méi)有C#的Demo,很多功能只能通過(guò)一個(gè)不是那么詳細(xì)的文檔和一個(gè)Delphi的Demo摸索著做了,經(jīng)歷了一些挫折和困惑,終于完成了這個(gè)客戶(hù)端程序。

首先,開(kāi)發(fā)要做的就是與硬件的API進(jìn)行溝通,依然通過(guò)C#的P/Invoke來(lái)完成,以下是來(lái)電小秘書(shū)的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); 
 
  } 
} 

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

然后在特定的時(shí)刻,記錄電話(huà)號(hào)碼、彈屏(如果是來(lái)電)、電話(huà)結(jié)束后錄音和上傳文件和信息到CRM服務(wù)器,其中來(lái)電號(hào)碼可以很容易的獲取,可是播出的號(hào)碼獲取就比較的麻煩了,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; 
  } 

下面說(shuō)一下C#中的大文件上傳吧,網(wǎng)上有很多例子了,可以參考如下文章中的代碼進(jìn)行開(kāi)發(fā)http://m.fzitv.net/article/53377.htm,可是無(wú)法上傳成功,于是解讀了一下代碼,發(fā)現(xiàn)他將信息中的\r\n用空字符代替了,導(dǎo)致服務(wù)器無(wú)法識(shí)別,于是在更改了他的代碼之后,問(wè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來(lái)電小秘書(shū)客戶(hù)端完成了,當(dāng)然要配合這個(gè)功能,服務(wù)器端CRM系統(tǒng)也要做一些修改,不過(guò)不是這篇文章的主要內(nèi)容,關(guān)于服務(wù)器端的修改的小節(jié),后續(xù)會(huì)有相關(guān)的報(bào)導(dǎo)。

相關(guān)文章

  • C#如何使用SHBrowseForFolder導(dǎo)出中文文件夾詳解

    C#如何使用SHBrowseForFolder導(dǎo)出中文文件夾詳解

    這篇文章主要給大家介紹了關(guān)于C#如何使用SHBrowseForFolder導(dǎo)出中文文件夾的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)合作工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • C# 中如何利用lambda實(shí)現(xiàn)委托事件的掛接

    C# 中如何利用lambda實(shí)現(xiàn)委托事件的掛接

    在寫(xiě)一個(gè)小程序的時(shí)候,碰到了這樣的問(wèn)題,需要用委托來(lái)掛接事件,但是又想在這事件中使用局部的變量,而委托一旦定義好后,掛接方就沒(méi)有辦法再添加額外的形參了。那有沒(méi)有什么辦法,可以實(shí)現(xiàn)呢
    2013-07-07
  • C# 中this關(guān)鍵字的主要作用

    C# 中this關(guān)鍵字的主要作用

    this 關(guān)鍵字在C#中主要用于引用當(dāng)前對(duì)象,區(qū)分字段與局部變量,調(diào)用其他構(gòu)造函數(shù)以及傳遞當(dāng)前對(duì)象給其他方法或構(gòu)造函數(shù),本文重點(diǎn)介紹C# this關(guān)鍵字的作用,感興趣的朋友一起看看吧
    2024-02-02
  • C#?wpf使用GDI+實(shí)現(xiàn)截屏效果

    C#?wpf使用GDI+實(shí)現(xiàn)截屏效果

    wpf做屏幕錄制或者屏幕廣播之類(lèi)的功能時(shí)需要實(shí)現(xiàn)截屏,在C#中比較容易實(shí)現(xiàn)的截屏方法是使用GDI+,所以本文將展示一下如何使用GDI+實(shí)現(xiàn)截屏,需要的可以參考下
    2023-09-09
  • 在C#中調(diào)用VBScript、javascript等腳本的實(shí)現(xiàn)代碼

    在C#中調(diào)用VBScript、javascript等腳本的實(shí)現(xiàn)代碼

    在C#中調(diào)用VBScript、javascript等腳本的實(shí)現(xiàn)步驟,需要的朋友可以參考下。
    2009-11-11
  • 詳談C# 圖片與byte[]之間以及byte[]與string之間的轉(zhuǎn)換

    詳談C# 圖片與byte[]之間以及byte[]與string之間的轉(zhuǎn)換

    下面小編就為大家?guī)?lái)一篇詳談C# 圖片與byte[]之間以及byte[]與string之間的轉(zhuǎn)換。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • C# Entity Framework中的IQueryable和IQueryProvider詳解

    C# Entity Framework中的IQueryable和IQueryProvider詳解

    這篇文章主要介紹了C# Entity Framework中的IQueryable和IQueryProvider詳解,本文使用實(shí)例分析這兩個(gè)接口的內(nèi)部實(shí)現(xiàn),需要的朋友可以參考下
    2015-01-01
  • c#中directory 和directoryinfo的使用小結(jié)

    c#中directory 和directoryinfo的使用小結(jié)

    當(dāng)使用C#處理目錄時(shí),可以使用?System.IO?命名空間中的?Directory?和?DirectoryInfo?類(lèi)來(lái)執(zhí)行各種目錄操作,本文主要介紹了c#中directory 和directoryinfo的使用小結(jié),感興趣的可以了解一下
    2024-02-02
  • 簡(jiǎn)單掌握Windows中C#啟動(dòng)外部程序進(jìn)程的方法

    簡(jiǎn)單掌握Windows中C#啟動(dòng)外部程序進(jìn)程的方法

    這篇文章主要介紹了Windows中C#啟動(dòng)外部程序進(jìn)程的方法,例子中同時(shí)包括了進(jìn)程關(guān)閉的方法,需要的朋友可以參考下
    2016-03-03
  • C#使用foreach語(yǔ)句遍歷堆棧(Stack)的方法

    C#使用foreach語(yǔ)句遍歷堆棧(Stack)的方法

    這篇文章主要介紹了C#使用foreach語(yǔ)句遍歷堆棧(Stack)的方法,涉及C#操作foreach實(shí)現(xiàn)遍歷堆棧的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04

最新評(píng)論

随州市| 平昌县| 花莲县| 诏安县| 平远县| 衡东县| 惠水县| 虞城县| 新昌县| 兴业县| 白河县| 南投市| 云安县| 广州市| 石柱| 吉木萨尔县| 习水县| 富锦市| 封丘县| 英吉沙县| 莱西市| 台前县| 肇东市| 高州市| 乳山市| 云林县| 雷波县| 漾濞| 长宁区| 淳化县| 华坪县| 开封市| 巨野县| 敖汉旗| 秭归县| 竹北市| 博客| 罗甸县| 沁水县| 镇巴县| 衡阳市|