最近在做一个与考勤机接口对接的模块。按照接口文档来使用。结果发现用 "php://input" 接受终端机器(考勤机)发送的数据,结果出现乱码
大致的过程如下:
请求和应答中所使用的二进制数据的格式:
字符串数据是 JSON格式的字符串而且他的编码是 UTF-8。
其实使用JSON格式可以表达所有的数据格式。可是表达二进制数据时可能产生整个数据的大少问题还有通讯速度问题等较难接收的问题。
在这个通讯协议中 尽可能使用json格式却不可避免的情况下使用二进制数据来表达数据。
使用二进制数据时在前面的字符串数据里有标识对应后面的二进制数据是哪一个。
举个例子说如果某个字段的值的数据类型是二进制数据时用 “BIN_n”的字符串来表示那个字段的值。
在此 n是后面的二进制数据的序号,从1开始。
实例 :
{“log_array”:”BIN_1”}
这个JSON字符串说明记录数据是二进制数据而且放在字符串数据后面的第一个位置。
流程图:
机器(考勤机)接收操作者指令的请求
为了接收向自己发送的指令,考勤机每隔一定时间向WEB服务器发送HTTP POST 请求。
这时HTTP头部(header)里放置如下字段。
字段名 字段含义 必要选项 限制 详细说明
request_code 需求代码 必须 必须是如下字符串。
“receive_cmd” 表示机器向服务器询问有没有对自己发送的指令。
dev_id 机器识别号 必须 英数文字, 最大24位。
连接到同一个WEB服务器的所有考勤机,必须有唯一的识别号码。
此参数指考勤机的唯一的号码。
Content-type MIME类型 必须 必须是如下字符串。
“application/octet-stream” Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。
Content-Length 消息的传输长度 必须 数字。 Content-Length则必须和消息内容的传输长度完全一致。
服务器的应答对于接收指令的请求
如果服务器接收上述的请求就查询有没有对该机器发送的指令而如有的话下传应答。
应答的头(header)和体(body)里所包含的内容是如下。
应答的头(header) 里包含如下字段。
response_code 应答代码 必须 英数文字, 最大64位。
英文字母都是大字。 表示接收指令是否成功。
OK : 成功
ERROR : 失败
trans_id 任务识别号 选修 英数文字, 最大16位。
跟踪指令执行过程的识别号码。
cmd_code 指令识别号 选修 英数文字, 最大32位。
英文字母都是大字。 表示指令类型的字符串。
如: GET_ENROLL_DATA
Content-type MIME类型 必须 必须是如下字符串。
“application/octet-stream” Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。
Content-Length 消息的传输长度 必须 数字。 Content-Length如果存在并且有效的话,则必须和消息内容的传输长度完全一致。