哪位大神能把这个代码转为C#代码或者C++代码,或者VB.net代码,
unit Unit_LhmTest;interfaceuses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Unit_LonHandMiniLib,
Vcl.Mask, Vcl.ComCtrls, IdGlobal, Vcl.ExtCtrls;type
TForm1 = class(TForm)
grp_udp: TGroupBox;
btn3: TBitBtn;
lv_dev: TListView;
grp_log: TGroupBox;
redt1: TRichEdit;
btn7: TBitBtn;
grp_tcp: TGroupBox;
btn6: TBitBtn;
btn4: TBitBtn;
grp_connect: TGroupBox;
btn5: TBitBtn;
lbledt_mac: TLabeledEdit;
lbledt_ip: TLabeledEdit;
lbledt_port: TLabeledEdit;
lbledt_psd: TLabeledEdit;
lbledt_mac_connected: TLabeledEdit;
lbledt_Data: TLabeledEdit;
procedure btn3Click(Sender: TObject);
procedure btn4Click(Sender: TObject);
procedure btn5Click(Sender: TObject);
procedure btn6Click(Sender: TObject);
procedure redt1Change(Sender: TObject);
procedure btn7Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure lv_devClick(Sender: TObject);
private
lhm: ILhm;
procedure FRcvSearchResult(aData: TIdBytes);
procedure FRcvDevData(aData: TIdBytes; aMac: PChar);
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
lhm := LhmCreate;
lhm.SetRcvSearchResultProc(FRcvSearchResult);
lhm.SetRcvDevDataProc(FRcvDevData);
end;procedure Log(aStr: string);
begin
Form1.redt1.Lines.Add(aStr);
end;{ * TBUF4 to IP * }function Buf42IP(ABuf: PBUF4): string;
var
i: Integer;
begin
Result := '';
for i := 0 to SizeOf(TBUF4) - 1 do
if i = SizeOf(TBUF4) - 1 then
Result := Result + IntToStr(ABuf[i])
else
Result := Result + IntToStr(ABuf[i]) + '.';
end;function Buf62Mac(Value: TBUF6): string;
var
i: Integer;
begin
Result := '';
for i := 0 to Length(Value) - 1 do
Result := Result + IntToHex(Value[i], 2)
end;function Buf2HexStr(aBuf: TIdBytes): string;
var
i: Integer;
begin
Result := '';
for i := 0 to Length(aBuf) - 1 do
Result := Result + IntToHex(aBuf[i], 2) + ' ';
end;function HexStr2Buf(aStr: string): TIdBytes;
var
i: Integer;
len: Integer;
begin
Result := nil;
aStr := StringReplace(aStr, ' ', '', [rfReplaceAll]);
aStr := StringReplace(aStr, '0x', '', [rfReplaceAll]);
aStr := StringReplace(aStr, '$', '', [rfReplaceAll]);
len := Length(aStr);
SetLength(Result, len div 2);
for i := 0 to len - 1 do
if Odd(i) then
Result[i div 2] := StrToIntDef('$' + aStr[i] + aStr[i + 1], 1);
end;procedure HexStrToBuf(var aBuf: TIdBytes; SourStr: string; Start, Count: Integer);
var
x: Integer;
begin
SourStr := StringReplace(SourStr, ' ', '', [rfReplaceAll]);
for x := 0 to 5 do
aBuf[Start + x] := ord(SourStr[x + 1]);
end;procedure TForm1.btn3Click(Sender: TObject);
begin
lv_dev.Clear;
lhm.SearchDev;
end;{* remove dev *}procedure TForm1.btn4Click(Sender: TObject);
var
mac: PChar;
begin
mac := PChar(lbledt_mac.Text);
if mac = '' then
Exit;
lhm.RemoveDev(mac);
end;{* connect dev *}procedure TForm1.btn5Click(Sender: TObject);
var
mac, ip, port, psd: PChar;
begin
mac := PChar(lbledt_mac.Text);
ip := PChar(lbledt_ip.Text);
port := PChar(lbledt_port.Text);
psd := PChar(lbledt_psd.Text);
if (mac = '') or (ip = '') or (port = '') or (psd = '') then
Exit;
lhm.ConnectDev(mac, ip, port, psd)
end;{* send data to device by mac *}procedure TForm1.btn6Click(Sender: TObject);
var
DataBuf: TIdBytes;
macStr: PChar;
begin
if (lbledt_Data.Text = '') or (lbledt_mac_connected.Text = '') then
Exit;
DataBuf := HexStr2Buf(lbledt_Data.Text);
macStr := PChar(lbledt_mac_connected.Text);
lhm.SendDataByMac(DataBuf, macStr);
end;procedure TForm1.btn7Click(Sender: TObject);
begin
redt1.Clear;
end;procedure TForm1.FRcvSearchResult(aData: TIdBytes);
var
RxRcd: TUDPRcvRcd;
begin
Log('RcvSearchResult: ' + Buf2HexStr(aData));
BytesToRaw(AData, RxRcd, 36);
with lv_dev.Items.Add do
begin
Caption := Buf62Mac(RxRcd.DevMAC);
SubItems.Add(Buf42IP(@RxRcd.DevIP));
end;
end;procedure TForm1.lv_devClick(Sender: TObject);
begin
if lv_dev.ItemIndex = -1 then
Exit;
lbledt_mac.Text := lv_dev.Selected.Caption;
lbledt_ip.Text := lv_dev.Selected.SubItems[0];
lbledt_mac_connected.Text := lv_dev.Selected.Caption;
end;procedure TForm1.redt1Change(Sender: TObject);
begin
SendMessage(TRichEdit(Sender).Handle, WM_VSCROLL, SB_BOTTOM, 0)
end;
procedure TForm1.FRcvDevData(aData: TIdBytes; aMac: PChar);
begin Log('RcvDevData from (' + aMac + '): ' + Buf2HexStr(aData));
end;end.
unit Unit_LhmTest;interfaceuses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Unit_LonHandMiniLib,
Vcl.Mask, Vcl.ComCtrls, IdGlobal, Vcl.ExtCtrls;type
TForm1 = class(TForm)
grp_udp: TGroupBox;
btn3: TBitBtn;
lv_dev: TListView;
grp_log: TGroupBox;
redt1: TRichEdit;
btn7: TBitBtn;
grp_tcp: TGroupBox;
btn6: TBitBtn;
btn4: TBitBtn;
grp_connect: TGroupBox;
btn5: TBitBtn;
lbledt_mac: TLabeledEdit;
lbledt_ip: TLabeledEdit;
lbledt_port: TLabeledEdit;
lbledt_psd: TLabeledEdit;
lbledt_mac_connected: TLabeledEdit;
lbledt_Data: TLabeledEdit;
procedure btn3Click(Sender: TObject);
procedure btn4Click(Sender: TObject);
procedure btn5Click(Sender: TObject);
procedure btn6Click(Sender: TObject);
procedure redt1Change(Sender: TObject);
procedure btn7Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure lv_devClick(Sender: TObject);
private
lhm: ILhm;
procedure FRcvSearchResult(aData: TIdBytes);
procedure FRcvDevData(aData: TIdBytes; aMac: PChar);
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
lhm := LhmCreate;
lhm.SetRcvSearchResultProc(FRcvSearchResult);
lhm.SetRcvDevDataProc(FRcvDevData);
end;procedure Log(aStr: string);
begin
Form1.redt1.Lines.Add(aStr);
end;{ * TBUF4 to IP * }function Buf42IP(ABuf: PBUF4): string;
var
i: Integer;
begin
Result := '';
for i := 0 to SizeOf(TBUF4) - 1 do
if i = SizeOf(TBUF4) - 1 then
Result := Result + IntToStr(ABuf[i])
else
Result := Result + IntToStr(ABuf[i]) + '.';
end;function Buf62Mac(Value: TBUF6): string;
var
i: Integer;
begin
Result := '';
for i := 0 to Length(Value) - 1 do
Result := Result + IntToHex(Value[i], 2)
end;function Buf2HexStr(aBuf: TIdBytes): string;
var
i: Integer;
begin
Result := '';
for i := 0 to Length(aBuf) - 1 do
Result := Result + IntToHex(aBuf[i], 2) + ' ';
end;function HexStr2Buf(aStr: string): TIdBytes;
var
i: Integer;
len: Integer;
begin
Result := nil;
aStr := StringReplace(aStr, ' ', '', [rfReplaceAll]);
aStr := StringReplace(aStr, '0x', '', [rfReplaceAll]);
aStr := StringReplace(aStr, '$', '', [rfReplaceAll]);
len := Length(aStr);
SetLength(Result, len div 2);
for i := 0 to len - 1 do
if Odd(i) then
Result[i div 2] := StrToIntDef('$' + aStr[i] + aStr[i + 1], 1);
end;procedure HexStrToBuf(var aBuf: TIdBytes; SourStr: string; Start, Count: Integer);
var
x: Integer;
begin
SourStr := StringReplace(SourStr, ' ', '', [rfReplaceAll]);
for x := 0 to 5 do
aBuf[Start + x] := ord(SourStr[x + 1]);
end;procedure TForm1.btn3Click(Sender: TObject);
begin
lv_dev.Clear;
lhm.SearchDev;
end;{* remove dev *}procedure TForm1.btn4Click(Sender: TObject);
var
mac: PChar;
begin
mac := PChar(lbledt_mac.Text);
if mac = '' then
Exit;
lhm.RemoveDev(mac);
end;{* connect dev *}procedure TForm1.btn5Click(Sender: TObject);
var
mac, ip, port, psd: PChar;
begin
mac := PChar(lbledt_mac.Text);
ip := PChar(lbledt_ip.Text);
port := PChar(lbledt_port.Text);
psd := PChar(lbledt_psd.Text);
if (mac = '') or (ip = '') or (port = '') or (psd = '') then
Exit;
lhm.ConnectDev(mac, ip, port, psd)
end;{* send data to device by mac *}procedure TForm1.btn6Click(Sender: TObject);
var
DataBuf: TIdBytes;
macStr: PChar;
begin
if (lbledt_Data.Text = '') or (lbledt_mac_connected.Text = '') then
Exit;
DataBuf := HexStr2Buf(lbledt_Data.Text);
macStr := PChar(lbledt_mac_connected.Text);
lhm.SendDataByMac(DataBuf, macStr);
end;procedure TForm1.btn7Click(Sender: TObject);
begin
redt1.Clear;
end;procedure TForm1.FRcvSearchResult(aData: TIdBytes);
var
RxRcd: TUDPRcvRcd;
begin
Log('RcvSearchResult: ' + Buf2HexStr(aData));
BytesToRaw(AData, RxRcd, 36);
with lv_dev.Items.Add do
begin
Caption := Buf62Mac(RxRcd.DevMAC);
SubItems.Add(Buf42IP(@RxRcd.DevIP));
end;
end;procedure TForm1.lv_devClick(Sender: TObject);
begin
if lv_dev.ItemIndex = -1 then
Exit;
lbledt_mac.Text := lv_dev.Selected.Caption;
lbledt_ip.Text := lv_dev.Selected.SubItems[0];
lbledt_mac_connected.Text := lv_dev.Selected.Caption;
end;procedure TForm1.redt1Change(Sender: TObject);
begin
SendMessage(TRichEdit(Sender).Handle, WM_VSCROLL, SB_BOTTOM, 0)
end;
procedure TForm1.FRcvDevData(aData: TIdBytes; aMac: PChar);
begin Log('RcvDevData from (' + aMac + '): ' + Buf2HexStr(aData));
end;end.
unit Unit_LonHandMiniLib;interface
uses
IdGlobal;
type
// TIdBytes = array of Byte;
TBUF2 = array[0..1] of Byte;
TBUF3 = array[0..2] of Byte;
TBUF4 = array[0..3] of Byte;
PBUF4 = ^TBUF4;
TBUF6 = array[0..5] of Byte;
TBUF8 = array[0..7] of Byte;
TBUF16 = array[0..15] of Byte; { * UDP Received data Struct * }
TUDPRcvRcd = record
{ * Head * }
Head: TBUF3;
{ * Device Type * }
DevType: Byte;
{ * Device ID * }
DevID: Byte;
{ * Device IP * }
DevIP: TBUF4;
{ * Device MAC * }
DevMAC: TBUF6;
{ * Software Version * }
SoftVer: TBUF2;
{ * Hardware version * }
HardVer: TBUF2;
{ * Device Name * }
DevName: TBUF16;
{ * Check Sum * }
CHK: Byte;
end; {* UDP receive Envent *}{* udp接收事件 *}
TUdpReceiveDataEvent = procedure(aData: TIdBytes) of object;
{* TCP receive Envent *}{* TCP接收事件 *}
TIOTListRecive = procedure(aData: TIdBytes; aMac: PChar) of object; ILhm = interface
{-------------------------------------------------------------------------------
名 称(ProcName): SearchDev
作 用(Purpose ): 搜索局域网设备 (Search device on the LAN)
参 数(Param ):
返回值(Return ): Integer 0:Failure 1:Success
-------------------------------------------------------------------------------}
function SearchDev: Integer; stdcall;
{-------------------------------------------------------------------------------
名 称(ProcName): SetRcvSearchResultProc
作 用(Purpose ): 设置udp接收回调函数 (Set receive UDP search result function)
参 数(Param ): aUdpReceiveDataEvent: TUdpReceiveDataEvent
返回值(Return ): Boolean
-------------------------------------------------------------------------------}
function SetRcvSearchResultProc(aUdpReceiveDataEvent: TUdpReceiveDataEvent): Boolean; stdcall;
{-------------------------------------------------------------------------------
名 称(ProcName): ConnectDev
作 用(Purpose ): 通过mac、ip、port、psd连接设备 (connect device by mac,ip,port,psd)
参 数(Param ): aMac, aIp, aPort, aPsd: PChar
返回值(Return ): Boolean
-------------------------------------------------------------------------------}
function ConnectDev(aMac, aIp, aPort, aPsd: PChar): Boolean; stdcall;
{-------------------------------------------------------------------------------
名 称(ProcName): RemoveDev
作 用(Purpose ): 通过mac移除设备连接 (remove device by mac)
参 数(Param ): aMac: PChar
返回值(Return ): Boolean
-------------------------------------------------------------------------------}
function RemoveDev(aMac: PChar): Boolean; stdcall;
{-------------------------------------------------------------------------------
名 称(ProcName): SendDataByMac
作 用(Purpose ): 发送数据(字节数组) (send data(arrar of byte) by mac)
参 数(Param ): aData: TIdBytes; aMac: PChar
返回值(Return ): Boolean
-------------------------------------------------------------------------------}
function SendDataByMac(aData: TIdBytes; aMac: PChar): Boolean; stdcall;
{-------------------------------------------------------------------------------
名 称(ProcName): SetRcvDevDataProc
作 用(Purpose ): 设置tcp接收函数 (Set receive data from device function)
参 数(Param ): aIOTListRecive: TIOTListRecive
返回值(Return ): Boolean
-------------------------------------------------------------------------------}
function SetRcvDevDataProc(aIOTListRecive: TIOTListRecive): Boolean; stdcall;
end;{==============================================================================
名 称(ProcName): LhmCreate
作 用(Purpose ): 首先 实例化接口 (!First!Crecte interface )
参 数(Param ): 无
返回值(Return ): ILhm
==============================================================================}
function LhmCreate: ILhm; stdcall; external 'LonHandMini.dll' name 'LhmCreate';implementation
end.