摘要: 最近在做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。