对接指南

Posted on 2019-02-22 00:42:06.278571

开发包所包含的文件: 

1. WX46.exe   版本的驱动程序,以下简称为 WX46,该程序不可以直接运行和退出,它必须由

你编写接口程序调用和关闭,改为别的文件名不影响其使用。

2. TXT 目录  —  放置供下载及交换用文本的目录,目录名称固定为 TXT。

3.   fea.dll  运行库

4、  skins目录 ,用来存放客户自定义平板首页背景文件。

运行过程中产生的文件和目录:

  1. caippic 目录 保存菜品图片、菜品视频、文本简介、声音介绍等文件
  2. media 目录,保存自定义首页中需要的视频文件。
  3. skins\interface.xml 自定义界面定义文件,(iPad竖屏界面定义 高1004x宽768)
  4. skins\interface2.xml 自定义界面定义文件,(iPad横屏界面定义高748x宽1024)

5、skins\interface.xml 自定义界面定义文件,(安卓横屏界面定义--分辨率要特别注意安卓电子菜谱程序系统设置中的分辨率设定。)

6、skins\interface1.xml 自定义界面定义文件,(电视点菜机顶盒定义界面)

接口程序开发原理: 

接口程序的开发原理是基于文本+消息机制的。文本是说要用到文本文件的读和写,消息是说要用到 Windows 窗口消息的发与收。

Windows 系统允许不同的窗口或进程间使用消息交换数据,消息发送时可以带四个参数,第一个参数叫接收窗口句柄,也就是说是 Windows 给接受者分配的一个编号;第二个参数是类型标志,是用来给各种消息做分类的,比如说按键类为 10,窗口放大缩小及关闭为 16,在我们系统中约定 WX46与接口通信的消息固定为十进制的 1280(十六进制 0x500) ;第三和第四个参数都是你可以利用来传递信息的,不过在我们系统中第三个固定为 0,我们只用第四个参数来区分消息,我们管它也叫消息类型。

Delphi 中发送消息的函数:PostMessage(ToHandle,1280,0,Msg.LParam)

VB 中发送消息的函数:PostMessage(ToHandle, 1280, 0, ByVal lParam&)   

PB 中发送消息的函数:send(ToHandle,1280,0,1)

在 Delphi 中关闭 WX46:PostMessage(ToHandle,16,0,0)

接口程序接收消息类似中断或事件的概念, 也就是说消息事件发生了, 就会自动执行消息的处理过程,这一点不同的语言区别比较大。

Delphi 中是声明一个消息处理过程: Procedure Inter(var Msg :TMessage); message WMA_InterPro; 其中的 WMA_InterPro 为常数=1280

PB 中是窗口的 OTHER 事件里进行消息判断。

 

注意:默认情况下接口抬头会显示端口等动态信息,PB采用窗口抬头获得句柄的方法要设置 wxbst.ini 中的TITLE设置, 以固定住窗口抬头文字,不然会找不到正确句柄。

 

   点菜发送功能过程: 

1. 在点菜机上按发送后,WX46将接收到的数据写到 T1.TXT 中,并发送一消息给接口。

2. 消息自动激活了接口中的消息处理过程,消息参数 1=1280 说明确实是来自 WX46 的消息,参数2=1 代表是来电子菜谱网关 1 的,接口程序去读 T1.TXT 文件,其中的请求类型码为“DC” ,则转点菜处理函数。

3. 处理完毕后,写处理结果或提示到 R1.TXT 文件,并发一消息给 WX46。

4. WX46自动去读 R1.TXT,并把此文件内容显示到点菜机屏幕上。如果等待不到接口回送来消息, WX46最多等待 600 秒后,会放弃此次操作。

   如何得到窗口的句柄: 

从上面的描述就可以看出来,建立消息连接联结首先是要得到的窗口句柄,包括自己的和对方的。

Delphi 中自己的窗口句柄:Form1.Handle

VB 中是:frmMain.hWnd

接口程序运行后就首先要将自己句柄做为字串参数运行 WX46.exe:

Delphi6 下是:

ShellExecute(Application.Handle, Nil,Pchar(ExtractFilePath(Application.ExeName) + 'WX46.exe'), Pchar(IntToStr(Form1.Handle)), Nil, SW_SHOWNORMAL); 而 WX46 运行后的第一个消息就是返回自己的窗口句柄给接口程序,所以接口可以用以下方式得到WX46句柄的:

  IF ToHandle =0 Then Begin

    ToHandle :=Msg.LParam;  

  End Else begin

  …….

  End;

如果用以下方式获得 WX46 的窗口句柄的话,如果电脑中同时运行有两个相同标题的程序则可能就弄错了。

pda_Handle = FindWindowA(pda_Class, "无线点菜机管理")  特别注意:“无线点菜机管理”在新版本WX中已经更名为“无线点菜应用服务”

消息类型: 

消息的类型是指在消息中的 message.LongParm参数,也就是发送时的最后一个参数

WX46到接口程序:

=1   —  电子菜谱网关 1 有请求,内容在 T1.TXT 中,请回复到 R1.TXT。

由接口程序到 WX46:

=1   —  接口程序处理基站 1 相应的请求完毕,回复文件已在 R1.TXT 中。

基础数据: 

需要下载的数据:

必须数据:菜品表.TXT、菜品类别表.TXT 、包房名称表.TXT

其他数据:厨师推荐.TXT、每日新菜.TXT、多单位.TXT、沽清表.TXT、退菜理由表.TXT、客户要求表.TXT、菜品套餐表.txt 、菜品套餐内容表.txt

新增可选数据:客户要求分类表.txt 、楼层表.txt、 餐台状态表.txt

 

注意:

①、所有下载数据字段间无空格。但当字段不足指定长度时应该补空格,所有名称类字段应该在尾部补空格,也就是说左对齐。所有金额类字段应该在头部补空格,也就是说右对齐,并带两位小数点。所有编码类字段应该在头部补 0,也就是说左对齐。所有供下载的文件在记事本中观察,各字段都应该是对齐的。

②、所有数据文件包括交换文件都存放在当前文件夹下的 TXT 文件夹里。

 

Java云后台对接方案

改用TCP消息代替Windows 消息来触发WX与后台的文本数据交换。

 

  1. WX启动参数:

参数1    保留(默认设置1000)

参数2    后台端口

参数3    后台IP

 

示例:  CMD> WX.exe 1000 17031 127.0.0.1

2、通讯方式:

以平板上用户登录过程为例:

WX将平板登录参数写入T1.txt后,把文件路径通过TCP以writeln方式发往后台17031端口。

后台收到文件路径,读取文件,判断用户是否可以登录。

后台将登录结果写入R1.txt, 并将路径发回给WX。

WX收到TCP回应后,读取R1.txt,,并返回给平板。

WX关闭TCP连接。

 

------------------------服务端delphi示例代码-------------------------------------------

var

   InFile: String;

begin

try

// 读取行数据,windows下0d0a是行结束符

InFile := AContext.Connection.IOHandler.WaitFor(#13#10);

//业务处理函数

    ReadWrite(InFile ,AppPath + 'R1.TXT');

//处理完成返回文件名

    AContext.Connection.IOHandler.WriteLn(AppPath + 'R1.TXT');

  finally

    //Closing connection

    if AContext.Connection.Connected then

      AContext.Connection.Disconnect;

  end;

 

end;

 

 

UDP端口对接方案

改用UDP消息代替Windows 消息来触发WX与后台的文本数据交换。

 

  1. WX启动参数:

参数1    保留(默认设置1000)

参数2    后台端口

参数3    后台IP

 

示例:  CMD> WX.exe 1000 17031 127.0.0.1

2、通讯方式:

以平板上用户登录过程为例:

WX将平板登录参数写入T1.txt后,把文件路径通过UDP以writeln方式发往后台17031端口。

后台收到文件路径,读取文件,判断用户是否可以登录。

后台将登录结果写入R1.txt, 并将路径发回给WX。

WX收到UDP回应后,读取R1.txt,,并返回给平板。

 

------------------------服务端delphi示例代码-------------------------------------------

procedure TForm3.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;

  AData: TBytes; ABinding: TIdSocketHandle);

var

  fStream:  TMemoryStream;

  s,AppPath,ip: String;

  i,j:integer;

begin

  AppPath := ExtractFilePath(Application.ExeName);

  fStream := TMemoryStream.Create;

  try

    fStream.WriteBuffer(AData[0],length(AData));

    fStream.SaveToFile(AppPath + 'TXT\UDPT1.txt');  //收到的内容也可以不写文件, 直接解析处理。

ReadWrite(AppPath + 'TXT\UDPT1.txt' ,AppPath + 'TXT\UDPR1.TXT'); //业务处理后将返回的内容写入文件。

    fStream.LoadFromFile(AppPath + 'TXT\UDPR1.TXT');               //也可以不写文件, 直接发送。

    ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort,fStream.Memory,0,fstream.Size);

  finally

    fStream.Free;

  end;

 

end;