摘要: 最近在做Wince開發,搞一個超市賣場採用手持機盤點的現場作業模塊。通信部分的實現有兩種,其一是通過USB線把數據拷到PDA 上,掃描條碼後,查詢本地的商品資料庫(用SQLite做本地庫),盤點完成後再通過USB把盤點結果導入服務器(還是通過讀取SQLite庫的方式),好處是賣場不需要佈局WIFI,減少投資。其二是通過WIFI,建立無線連接,打描條碼後,直接讀取服務器上的商品資料,盤點數量也直接寫入服務器,這樣的好處是盤點結果可以實時傳到服務器,並且始終能夠取得最新的商品資料,減少了盤點前導入商品資料的準備工作。
下面主要說明下通信部分的編碼。
1、DPA客戶端WINCE(主要思路)。
//定義發送數據緩存
byte[] data = new byte[1024];
//定義字符串,用於控制檯輸出或輸入
string input, stringData;
input = txt_barcode.Text + "@##";
//將發送的字符串轉換成整型數據並存儲在數組中
data = CmdResolver.getDataPDGoods(input); //按定義的數據格式生成內容,發送內容多了換行符“\n”
_socket.Send(Data);
//發送完成後等待接收返回的結果
data = new byte[1024];
int bytesRec = _socket.Receive(data );
if (bytesRec == 0)
{
//warning 0 bytes received
}
stringData = Encoding.UTF8.GetString(data , 0, bytesRec);
2、服務端C#
//接收數據後的處理
Datagram = Datagram.Replace("\n", "");//將回車符去掉
3、Delphi客戶端(D7+Indy10.5.7)
var
data: TIdBytes;
str: string;
bytes: integer;
begin
if idtcpclnt1.Connected = False then
idtcpclnt1.Connect('192.163.1.132', 5632);
str := '16923589447223@12@##';
data := ToBytes(str, Length(str), 1);//, TIdTextEncoding.UTF8, TIdTextEncoding.UTF8);//編碼轉換
data[0] := 1; //第一位是命令字
idtcpclnt1.Socket.Write(data);
bytes := 10; // Utf8ToAnsi
//str := ( idtcpclnt1.Socket.ReadString(bytes) );
str := idtcpclnt1.Socket.ReadLn( TIdTextEncoding.UTF8, TIdTextEncoding.UTF8 ); //結束標記必須是換行符
str := Utf8ToAnsi(Copy(str, 2, MAXINTATOM));
ShowMessage(str);
總結:
1、由於需要與Delphi的通信相匹配,所以C#通信時都增加了換行結束符。
2、增加了換行結束符的副作用就是C#接收到的內容中多出來一個換行符,所以需要去掉,纔出現了在服務端需要替換換行符的情況 Datagram = Datagram.Replace("\n", "")。
結束語:
您也可以用 idtcpclnt1.Socket.ReadString()或者 idtcpclnt1.Socket.ReadBytes()來實現接收,但需要提前知道要接收的字節數。那麼在服務端要發送數據之前,需要先把
數據長度發給客戶端,這對C#客戶端是沒有任何用處的,並且傳字符長度也需要特殊處理。所以我採用了增加結束符的方式來實現異構通信,簡單優雅0^0。