一种远程无线数传系统的设计方案

远程无线数传系统的设计方案

摘要:笔者尝试设计一种远程无线数据传输系统,并构建了发射终端和接收终端两个软件,成功实现了最远5km数据传输距离,为基于两地的不同数据库之间数据的传输提供了一种新的解决方案。

关键词:无线数据传输,二次开发包

1. 项目概念

远程无线数传软件开发包的软件基于Windows操作系统,采用Delphi开发,数据库采用SQL Server2000作为后台数据库。系统以简易可行的方法实现了远程无线数传技术,实时数据库的数据校验和写入。经过了实际的检验,现已成功稳定运行。

一种远程无线数传系统的设计方案

2. 远程无线数传软件开发包的无线传输模式

一种远程无线数传系统的设计方案

3. 远程无线数传软件开发包的数据流程图

一种远程无线数传系统的设计方案

4. 无线数传设备选型

采购深圳市科易连通讯设备有限公司生产的KYL-320I无线数传模块,具体参数如下:

载波频率: 433MHz, 450MHz,470MHz,868MHz,915MHz等 ISM频点;

多种可选的通讯接口:RS-232、TTL、 RS-485、USB;

8个通讯信道,也可根据客户要求扩展;

传输数率:1200、2400、4800、9600、19200、38400bps;

数据格式:8N1/8E1/8O1(也可提供其它格式,如9位数据位);

收发一体,半双工工作模式;

低功耗,并具有休眠功能;

工作温度:-35℃ ~ +75℃(工业级);

天线阻抗:50Ω(标配为SMA,可定制);

供电电源: DC 5V (可根据用户要求定制);

输出功率: ≤500mW;(可根据用户要求定制)

接收电流: <28mA(TTL接口);

接收灵敏度:-123dBm (1200bps) ;

-118dBm (9600bps)

发射电流: <350mA;

休眠电流: <20uA;

传输距离:2km 以上(BER=10-5@9600bps,标配10cm天线,空旷地,天线高度1.5m);

3Km 以上(BER=10-5@1200bps,标配10cm天线,空旷地,天线高度1.5m);

外型尺寸:80mm×45mm×20mm (不包括天线接头 )。

模块如下图

一种远程无线数传系统的设计方案

5. 系统设计

系统设计包括以下主要模块:字符信息转换设计,发送模块设计,接收模块设计,信息加密设计,系统初始化设计。以下是各模块的详细设计

1. 字符信息转换设计

字符信息转换设计所要完成的工作是将字段内容信息转换为无线电信号能够识别的二进制信息,同时在接收端收到信息后又能准确无误的将这些二进制信息还原成正确的字段内容信息,这部分是基础性工作。

1 二进制十六进制相互转换函数编写

//把二进制串转换成十六进制串或相反

function BinToHexEachOther(ValueA : string; Action : Boolean) : string;

var

ValueArray1 : Array [0..15] of string[4];

ValueArray2 : Array [0..15] of char;

i : shortint;

begin

//数组初始化

ValueArray1[0] := '0000'; ValueArray1[1] := '0001'; ValueArray1[2] := '0010';

ValueArray1[3] := '0011'; ValueArray1[4] := '0100'; ValueArray1[5] := '0101';

ValueArray1[6] := '0110'; ValueArray1[7] := '0111'; ValueArray1[8] := '1000';

ValueArray1[9] := '1001'; ValueArray1[10] := '1010'; ValueArray1[11] := '1011';

ValueArray1[12] := '1100'; ValueArray1[13] := '1101'; ValueArray1[14] := '1110';

ValueArray1[15] := '1111';

for i := 0 to 15 do

if i >= 10 then ValueArray2[i] := chr(65 + (i - 10))

else ValueArray2[i] := inttostr(i)[1];

Result := '';

if Action then

begin //二进制串转换成十六进制串

if (Length(ValueA) MOD 4 <> 0) then

ValueA := stringofchar('0',Length(ValueA) MOD 4) + ValueA;

while (Length(ValueA) >= 4) do

begin

for i := 0 to 15 do

if Copy(ValueA,1,4) = ValueArray1[i] then

Result := Result + ValueArray2[i];

ValueA := Copy(ValueA,5,Length(ValueA) - 4);

end;

end

else begin //十六进制串转换成二进制串

while (Length(ValueA) >= 1) do

begin

for i := 0 to 15 do

if Copy(ValueA,1,1) = ValueArray2[i] then

Result := Result + ValueArray1[i];

ValueA := Copy(ValueA,2,Length(ValueA) - 1);

end;

end;

end;

2 二进制与字符串互相转换函数编写

//把字符串转化为二进制数

Function ConvertStrToBin(Value : string):string;

var tempHex : string[255];

i : integer;

begin

Result := '';

if trim(Value) = '' then Exit;

tempHex := '';

for i := 1 to Length(Value) do

begin

tempHex := IntToHex(Ord(Value[i]),2);//每个字符转成两位十六进制数

Result := Result + BinToHexEachOther(tempHex,False);//十六进制转成二进制

end;

end;

function HexCharToInt(HexToken : char):Integer;

begin

Result:=0;

if (HexToken>#47) and (HexToken

Result:=Ord(HexToken)-48

else if (HexToken>#64) and (HexToken

Result:=Ord(HexToken)-65 + 10;

end;

//把二进制数据转化为字符串

Function ConvertBinToStr(Value : string):string;

Var tempHex : string;

i, tempInt : integer;

begin

Result := '';

if trim(Value) = '' then Exit;

tempHex := BinToHexEachOther(Value,true);//二进制转成十六进制

i := 0;

Repeat

begin

i := i + 1;

tempInt := HexCharToInt(tempHex[i]);

i := i + 1;

tempInt := tempInt * 16 + HexCharToInt(tempHex[i]);

//以上将两位十六进制数转变为一个十进制数

Result := Result + chr(TempInt); //转成ASCII码

end;

Until i >= length(tempHex)

end;

2. 发送模块设计

发送模块设计是完成将二进制信息用相应的载波频率发送出去,分为数据监听、无线电间隔识别码、数据发送和数据校验4个步骤。

1 数据监听

//如果数据缓冲区有数据,则实时转换2进制数据,同时完成表字段的数据校验写入。

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);

var

Str: String;

begin

ComPort1.ReadStr(Str, Count);

Memo2.Text:=Memo2.Text+Str;

if memo2.Text <> '0' then

begin

Button5.Click;

Timer1.Enabled:=true;

end;

end;

2 无线电间隔识别码

//将表字段对应的值转换为2进制后发送,前2位数字为无线电间隔码,#号符为本条记录发送完毕识别码。调用SendString过程发送数据。

procedure TForm1.Button6Click(Sender: TObject);

begin

SendString(ConvertStrToBin('a1')+ConvertStrToBin(edit1.Text));

SendString(ConvertStrToBin('b1')+ConvertStrToBin(edit2.Text));

SendString(ConvertStrToBin('c1')+ConvertStrToBin(edit3.Text));

SendString(ConvertStrToBin('d1')+ConvertStrToBin(edit4.Text));

SendString(ConvertStrToBin('#'));

3 end;

4 数据发送过程

//发送数据的过程。

procedure TForm1.SendString(const str: string);

var

obj:PAsync;

begin

InitAsync(obj);

try

ComPort1.WriteStrAsync(str,obj);

ComPort1.WaitForAsync(obj);

finally

DoneAsync(obj);

end;

end;

④数据校验

//引入时钟实时监听,并根据回传符号判断数据发送是否成功。

procedure TForm1.Timer1Timer(Sender: TObject);

begin

if (edit1.text=edit5.text) and (edit2.text=edit6.text) and (edit3.text=edit7.text) and (edit4.text=edit8.text) and (edit9.text='$') then

begin

{SendString(ConvertStrToBin('a1')+ConvertStrToBin(edit5.Text));

SendString(ConvertStrToBin('b1')+ConvertStrToBin(edit6.Text));

SendString(ConvertStrToBin('c1')+ConvertStrToBin(edit7.Text));

SendString(ConvertStrToBin('d1')+ConvertStrToBin(edit8.Text));}

SendString(ConvertStrToBin('@'));

Timer1.Enabled :=false;

Button4.Click;

memo3.Clear;

dialogs.showmessage('发送成功');

end

else

begin

SendString(ConvertStrToBin('+'));

Timer1.Enabled:=false;

Button4.Click;

memo3.Clear;

dialogs.showmessage('发送失败!');

end;

end;

3. 接收模块设计

接收模块设计完成对接收的二进制信息进行解析并实时写入数据库保存,分为数据解析、数据写入和数据界定3个步骤

1 数据解析

//将接收到的2进制数据转换为字符串,并截获出对应的字段值,即对号入座。

procedure TForm1.Button5Click(Sender: TObject);

begin

memo3.Text :=ConvertBinToStr(memo2.Text) ;

edit5.Text:= GetStr(memo3.Text,'a1','b1') ;

edit6.Text:= GetStr(memo3.Text,'b1','c1') ;

edit7.Text:= GetStr(memo3.Text,'c1','d1') ;

edit8.Text:= GetStr(memo3.Text,'d1','#') ;

edit9.Text:= RightStr(memo3.Text,1);

end;

2 数据写入

//探测时钟

procedure TForm1.Timer1Timer(Sender: TObject);

begin

if AnsiContainsStr(memo3.Text, '#') then //如果时钟探测到解析数据区收到'#'码,则表示数据接收完毕等待写入校验,并同时向发送端发送校验数据。

begin

edit5.Text:= GetStr(memo3.Text,'a1','b1') ;

edit6.Text:= GetStr(memo3.Text,'b1','c1') ;

edit7.Text:= GetStr(memo3.Text,'c1','d1') ;

edit8.Text:= GetStr(memo3.Text,'d1','#') ;

Button7.Click;

Timer1.Enabled:=false;

Button4.Click;

end;

if AnsiContainsStr(memo3.Text, '@') then //如果时钟探测到解析数据区收到'@'码,则表示发送端校验数据成功通过,可以向表中写入记录。

begin

ADOTable1.Insert;

ADOTable1.FieldByName('name').AsString:=edit5.Text;

ADOTable1.FieldByName('code').AsString:=edit6.Text;

ADOTable1.FieldByName('mz').AsString:=edit7.Text;

ADOTable1.FieldByName('dj').AsString:=edit8.Text;

ADOTable1.Post;

DBGrid1.Refresh;

Timer1.Enabled:=false;

Button4.Click;

end;

end;

3 数据界定

//指定获取数据界限的函数

function GetStr(StrSource,StrBegin,StrEnd:string):string;

var

in_star,in_end:integer;

begin

in_star:=AnsiPos(strbegin,strsource)+length(strbegin);

in_end:=AnsiPos(strend,strsource);

result:=copy(strsource,in_star,in_end-in_star);

end;

4. 信息加密设计

采用美国国防部军方的MD5加密设计,对重要财务敏感信息加密发送。使用MD5加密先定义变量并作以下单元引用声明:

var

Form1: TForm1;

md5 : TIdHashMessageDigest5;

longWordRec : T4x4LongWordRecord;

//对文本信息进行MD5加密

procedure TForm1.Button2Click(Sender: TObject);

begin

md5 := TIdHashMessageDigest5.Create;

longWordRec:=md5.HashValue(memo1.Text);

edit3.Text:= md5.AsHex(longWordRec) ;

end;

5. 测初始化设计

初始化设计包括:搜索可用的SQL服务器,建立连接,串口设置等。

//启动SQL数据库服务器并对接相应的表。

procedure TForm1.Button3Click(Sender: TObject);

begin

ADOConnection1.Connected:=false;

ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=test;Data Source='+ComboBox1.Text+'';

ADOConnection1.Connected:=true;

ADOConnection1.KeepConnection:=true;

ADOTable1.TableName:='Testtable';

ADOTable1.active:=true;

DBGridAutoSize(DBGrid1);

end;

//程序运行时搜索网内可以用的SQL服务器

procedure TForm1.FormShow(Sender: TObject);

var

I:integer;

x,y:oleVariant;

begin

x := CreateOleObject('SQLDMO.Application');

y := x.ListAvailableSQLServers;

ComboBox1.Clear;

for I := 1 to y.Count do

begin

ComboBox1.Items.Add(y.item(I))

end

end;

//启动程序时自动读取system.ini配置文件,设定串口通讯参数。

;-----------------------------------------------------

;无线传输通讯设置

;----------------------------------------------------

[COMM1]

ComPort=COM5---------------------打开串口5作为通讯端口

BaudRate=2400---------------------设置波特率2400

Parity=None---------------------校验位为空

DataBits=8---------------------数据位8

StopBits=1---------------------停止位1

6. 测试程序界面

一种远程无线数传系统的设计方案

6. 系统测试

· 数传设备:KYL-320I型无线数传模块

· 传输距离:5km(有工厂厂房阻挡及电磁干扰环境)

· 平均传输速度:3秒/每条数据

· 断电续传:有

· 正确率:100%

· 校验:MD5加密算法校验

7. 结论

笔者通过以上设计工作成功实现了最远5km数据传输距离,为基于两地的不同数据库之间数据的传输提供了一种新的解决方案。


分享到:


相關文章: