Commit 2788d4ea by NitefullWind

补充Java版添加请求头示例

parent 6c082781
# 非码会员客户端与POS对接文档 V2.0.1
# 非码会员客户端与POS对接文档 V2.0.2
# 非码会员客户端与POS对接文档 V2.0.1
# 非码会员客户端与POS对接文档 V2.0.2
[TOC]
......@@ -17,26 +17,53 @@
#### 消息头构成说明:
>一个固定值(0x4d46) + 版本号(0x2) + 本次请求数据长度
#### 带消息头的请求构造举例:
- 将名为 FMSOCKHEADER 结构体类型的消息头添加到原始请求数据的开头,将新生成的数据作为请求数据发送给会员客户端。
- FMSOCKHEADER 结构体声明如下:
#### 带消息头的请求构造示例:
- C/C++代码:
```cpp
/**
*@brief FMSOCKHEADER
* 消息头结构体
*/
typedef struct {
unsigned int flag; // 固定值 0x4d46
unsigned int ver; // 版本号 0x2
unsigned int ver; // 固定值 0x2
unsigned int len; // 原始请求数据的数据长度
}FMSOCKHEADER;
```
- 代码示例:
/**
* @brief GetAddHeaderReqDataLength
* 获取添加消息头后的数据长度
* @param originData
* 原始请求数据
* @return
*/
unsigned int GetAddHeaderReqDataLength(const char *originData)
{
int originLen = strlen(originData); //获得原始数据长度
return originLen + sizeof(FMSOCKHEADER);
}
```cpp
// eg:
// 获得POS生成的JSON格式请求数据
/**
* @brief GetAddHeaderReqData
* 获取添加消息头后的数据
* @param originData
* 原始请求数据
* @param addHeaderReqData
* 预留的存储添加过消息头的请求数据指针
* @param addHeaderReqDataLength
* 添加过消息头后的数据长度,可用GetAddHeaderReqDataLength()函数获得
* @return
*/
int GetAddHeaderReqData(const char *originData, char *addHeaderReqData, unsigned int addHeaderReqDataLength)
{
int originLen = strlen(originData); //获得原始数据长度
char *originData = posReqJson.data(); // 获得原始数据
int originLen = posReqJson.length(); //获得原始数据长度
int newReqDataLength = originLen + sizeof(FMSOCKHEADER);
if (addHeaderReqDataLength < newReqDataLength) {
return 0;
}
// 设置消息头的值
FMSOCKHEADER header = {0, 0, 0};
......@@ -44,13 +71,78 @@ typedef struct {
header.len = originLen;
header.ver = 0x2;
// 声明一个新的数据指针
char* newReqData = new char[originLen + sizeof(FMSOCKHEADER)];
memset(newReqData, 0, originLen + sizeof(FMSOCKHEADER));
memcpy(newReqData, &header, sizeof(FMSOCKHEADER)); // 将消息头拷贝至newReqData
strcat(newReqData, originData); //将原始数据追加到newReqData
// 在原始数据前加消息头
memset(addHeaderReqData, 0, newReqDataLength);
memcpy(addHeaderReqData, &header, sizeof(FMSOCKHEADER)); // 将消息头拷贝至addHeaderReqData
memcpy(addHeaderReqData+sizeof(FMSOCKHEADER), originData, originLen); //将原始数据追加到addHeaderReqData
// 向会员客户端发送newReqData
return newReqDataLength;
}
// 在你的代码中构造原始请求数据,调用以下代码获取添加消息头的请求数据
// Your code.
int addHeaderDataLength = GetAddHeaderReqDataLength(ptr); // 获取添加消息头后的数据长度
char *addHeaderData = new char[addHeaderDataLength]; // 声明存储添加消息头后的数组
GetAddHeaderReqData(ptr, addHeaderData, addHeaderDataLength); // 获取添加消息头后的数据
// Your code.
```
- Java代码:
```java
/**
* @brief GetAddHeaderReqDataBytes
* 在请求数据前添加消息头
* @param reqData
* 原始请求数据
* @return
* 添加过消息头的数据
*/
byte[] GetAddHeaderReqDataBytes(String reqData) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
// 添加FM字符
dos.write('F');
dos.write('M');
byte[] b1 = new byte[4];
System.arraycopy(baos.toByteArray(), 0, b1, 0, baos.size());
baos.reset();
//添加版本号
dos.write(2);
byte[] b2 = new byte[4];
System.arraycopy(baos.toByteArray(), 0, b2, 0, baos.size());
baos.reset();
//添加请求数据的长度
int reqDataLen = reqData.getBytes().length;
dos.writeInt(reqDataLen);
byte[] b3 = new byte[4];
System.arraycopy(baos.toByteArray(), 0, b3, 0, baos.size());
baos.reset();
// for (int i = 0; i < 4; i++) {
// b3[i] = (byte)((reqDataLen >> 8 * i) & 0xff);
// }
//消息头和请求数据合并
byte[] bytes = new byte[12 + reqDataLen];
System.arraycopy(b1, 0, bytes, 0, 4);
System.arraycopy(b2, 0, bytes, 4, 4);
System.arraycopy(b3, 0, bytes, 8, 4);
System.arraycopy(reqData.getBytes(), 0, bytes, 12, reqDataLen);
return bytes;
}catch (Exception ex){
System.out.println(ex.getMessage());
ex.printStackTrace();
}
byte[] bytes = new byte[0];
return bytes;
}
```
## 常见使用场景举例
......@@ -426,5 +518,6 @@ typedef struct {
| ----- | ------- | ------- |
| V2.0.0 | 2017-10-24 09:59 | 创建2.0版本文档 |
| V2.0.1 | 2017-12-29 16:00 | 修改支付条码字段名为barcode |
| V2.0.2 | 2018-01-12 12:30 | 补充Java版添加请求头示例 |
[^fmPay]: 非码支付(非码收银),统一收银服务。详见[www.freemud.cn](http://www.freemud.cn/service.html)
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment