硬件底层通讯协议的开发问题?

lpq21314-08 2014-09-25 04:59:30
最近需要开发一个门禁控制器的通讯接口,就是实现往控制器发卡授权,控制器是通过TCP通讯的。
但是厂商只提供最底层的通讯,有点看不明白,不知在DELPHI如何调用,其中注册用户卡的协议如下:
cmd = 0x93 //注册用户卡 *****
c0 00 09 93 00 00 01 32 00 AF 50 E9 4f c0
其中:93 是命令
00 01 是设备编号(2个字节)
32 00 AF 50 E9 是用户卡号(5个)
注册卡号的事件端口号是:5000

请问类似这样的协议如何用DELPHI来实现 , 还有这个设备是IP通讯的,如何跟这个端口5000来绑定,好像协议中没有体现IP信息?
...全文
628 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
laowang2 2014-10-08
  • 打赏
  • 举报
回复
lpq21314-08 2014-10-05
  • 打赏
  • 举报
回复
[b]哎,没办法。买产品之前对方销售说会提供很完整的DEMO和完美的技术支持。 买了产品付了钱,再打电话过去就像孙子求他一样,说什么现在很忙,没有时间做DEMO给你,要你自己研究,还说什么只要是 做软件开发的就一定能做出来,我擦。。。。。。
SupermanTm 2014-10-01
  • 打赏
  • 举报
回复
直接用TCP SOCKET, 就作为一个二进制数组发送
lpq21314-08 2014-09-30
  • 打赏
  • 举报
回复
开发的SDK几乎没有,就给了一条指令。 我做了接收,下面是代码:
procedure TForm2.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  memo2.Lines.Add(socket.ReceiveText)
end;
但是没有看到有什么东西返回
nm_wyh 2014-09-30
  • 打赏
  • 举报
回复
你没有做接收吧!看能接收到什么信息!你发送出去设置卡号之类的,一般设备界面是没有什么反应的,应该会给你一个反馈!看开发的SDK!设置接收函数,看能接收到什么数据(此时只接收记录日志然后在分析)!
lpq21314-08 2014-09-30
  • 打赏
  • 举报
回复
是这样写吗:

      count:=14;
      setlength(buf,count);
      buf[0]:=192;      //c0
      buf[1]:=0;        //00
      buf[2]:=9;        //09
      buf[3]:=147;      //93
      buf[4]:=0;        //00

      //柜号
      buf[5]:=strtoint(n1);
      buf[6]:=strtoint(n2);

      //卡号 90 55 D4 9D
      buf[7]:=144;
      buf[8]:=85;
      buf[9]:=212;
      buf[10]:=157;
      buf[11]:=0;

      buf[12]:=79;      //4f
      buf[13]:=192;     //c0

      ret:=clientsocket1.Socket.SendBuf(buf,count);
好像发送过去也没有什么反应。
nm_wyh 2014-09-30
  • 打赏
  • 举报
回复
连一个完整的SDK也没有!这简直是坑爹啊!问厂要DEMO和SDK,要不你只能做实验了!一点一点测试吧!
haitao 2014-09-30
  • 打赏
  • 举报
回复
厂家应该给demo的
  • 打赏
  • 举报
回复
引用 13 楼 u014653768 的回复:
是这样写吗:

      count:=14;
      setlength(buf,count);
      buf[0]:=192;      //c0
      buf[1]:=0;        //00
      buf[2]:=9;        //09
      buf[3]:=147;      //93
      buf[4]:=0;        //00

      //柜号
      buf[5]:=strtoint(n1);
      buf[6]:=strtoint(n2);

      //卡号 90 55 D4 9D
      buf[7]:=144;
      buf[8]:=85;
      buf[9]:=212;
      buf[10]:=157;
      buf[11]:=0;

      buf[12]:=79;      //4f
      buf[13]:=192;     //c0

      ret:=clientsocket1.Socket.SendBuf(buf,count);
好像发送过去也没有什么反应。
你用动态数组的话,发送应该: ret:=clientsocket1.Socket.SendBuf(buf[0],count);
  • 打赏
  • 举报
回复
这厂家,你起码也得有个返回代码,或者有个读状态命令,否则设置成功没有都不知道。
  • 打赏
  • 举报
回复
看你前面的说明,发送的应该是二进制数据,所以用SendBuffer方法就可以了。 你先定义一个命令缓冲区: var CmdBuffer: array[0..1023] of byte; 大小你可以自行调整,也可以用动态数组,使用之前要先用SetLength分配空间。
lpq21314-08 2014-09-29
  • 打赏
  • 举报
回复
今天连接设备测试了,用 TClientSocket 组件。 首先连接:

begin
 if not ClientSocket1.Active then
 begin
   ClientSocket1.Host := edIp.Text;
   ClientSocket1.Port := StrToInt(edPort.Text);
   ClientSocket1.Open;
   (Sender as TButton).Enabled := false;
   btnDisconnect.Enabled := true;
 end;
可以连接成功。 然后是发送数据:

procedure TForm2.btnSentClick(Sender: TObject);
var
  ret:integer;
begin
  if clientsocket1.Active then
  begin
    ret:=clientsocket1.Socket.SendText(memo1.Text);
    memo2.Lines.Add('ret='+inttostr(ret));
  end;
end;
发送后,在设备检验数据没有发送成功,我想问的是怎么通过代码sendtext函数返回的 ret值判断 数据是否正确地发送到服务端的呢?
  • 打赏
  • 举报
回复
可以的,不需要用TSocketServer。
nm_wyh 2014-09-26
  • 打赏
  • 举报
回复
把需要发送的信息都转成16进制数发送出去就可以了!
lpq21314-08 2014-09-26
  • 打赏
  • 举报
回复
有没有具体的代码调用例子? 没有接触过网络编程,不太懂哦
lpq21314-08 2014-09-26
  • 打赏
  • 举报
回复
TSocketServer 和 TSocketClient 可以吗?
  • 打赏
  • 举报
回复
只要能建立TCP连接的都可以,TcpClient之类的都行。
lpq21314-08 2014-09-26
  • 打赏
  • 举报
回复
是用 winsocket控件吗?
  • 打赏
  • 举报
回复
这个设备接入网络中就会获得一个IP地址(如果网络中某节点有DHCP功能的话,比如路由器),或者这个设备可以人工设置一个固定IP地址,你看一下这个设备的说明书。 按照你的描述,给这个设备发送命令是很简单的: 首先建立一个TCP连接到这个设备的IP:5000端口,然后发送数据,比如c0 00 09 93 00 00 01 32 00 AF 50 E9 4f c0 这些。
lpq21314-08 2014-09-26
  • 打赏
  • 举报
回复
那IP地址呢?设备有一个IP地址,但是这个协议命令并没有要求传入IP,那程序怎么知道是发给哪个设备的呢?
加载更多回复(2)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧