# Huake4G
**Repository Path**: andaai/huake4-g
## Basic Information
- **Project Name**: Huake4G
- **Description**: 华科手表
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2024-07-12
- **Last Updated**: 2024-07-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
### 支付交互流程图示
```mermaid
sequenceDiagram
Title: Payment Processing Timing
participant mcu as Mcu
participant module as 4G_Module
participant yunshanfu as 云闪付
participant jushangtong as 聚商通
participant tx as 微信支付
mcu ->> +module: (1) 查询4G模块状态
module -->> -module: 模块自检
module -->> +mcu: 应答Sim卡、Net和Camera状态
mcu ->> mcu: 模块状态是否正常?
mcu ->> -module: (2) 查询设备绑定状态(携带terminal_id)
module ->> jushangtong: 查询设备号是否绑卡
jushangtong -->> module: isBindCard & registerUrl
module -->> +mcu: 应答设备绑定状态(状态标志&注册url)
mcu ->> -mcu: 设备是否注册?
mcu ->> +module: (3) 发起扫码(携带terminal_id)
module ->> -module: 调用摄像头扫码
loop 尝试三次
module ->> yunshanfu: 请求获取redirectUrl
yunshanfu -->> module: 302 response
end
module ->> jushangtong: 查询订单服务JS主扫获取用户userAuthCode
jushangtong -->> module: userAuthCode
module ->> tx: 查询收款方信息
tx -->> module: payee_shop_name & is_fixed_amount & rcver_amount & paysid
module -->> +mcu: 应答收款方信息
mcu ->> mcu: 固定金额?手输金额
mcu ->> -module: (4) 发起付款
module ->> tx: 微信预支付
tx -->> module: 云闪付pay_url
module ->> yunshanfu: 获取交易流水号txnNo、交易金额txnAmt
yunshanfu -->> module: txnNo & txnAmt
module ->> jushangtong: 聚商通付款
jushangtong -->> module: 支付结果
module -->> mcu: 应答支付结果
```
### MCU与4G模块交互报文格式
本例程,采用TLV报文格式。
TLV协议,即使用三元组编码的报文格式, 它是由数据的类型Tag(T),数据的长度Length(L),数据的值Value(V)构成的一组数据报文。 TLV是基于二进制编码的,将数据以(T -L- V)的形式编码为字节数组,即TLV是字节流的数据传输协议。它规定了一帧数据的首个字节或几个字节来表示数据类型,紧接着一个或几个字节表示数据长度,最后是数据的内容。
每个字段编码后内存组织如下:
| T | L | V |
| --------- | ------------ | ----------- |
| Tag octes | Length octes | Value octes |
注:
- Value字段可以是嵌套,即Value可以是另一个完整的TLV数据包(实际在本例程中并无应用)。
- Tag采用2个字节表示,用户可自定义。
- Length采用2个字节表示,最大长度为`0xFFFF`。
- 本协议中的应答报文的Tag与请求Tag保持一致。
- 本协议字段描述字节采用HEX表示法。
- 本协议无特殊说明,整数均采用大端对齐。
### 数据类型
| 类型 | 描述 |
| ------- | -------------------------------------- |
| Byte | 1字节,8bit |
| Byte[n] | 长度为n的字节串 |
| String | 字符串(字符串长度根据协议偏移量计算) |
| Char | 1字符(1字节) |
| WORD | 2字节,大端对齐 |
| DWORD | 4字节,大端对齐 |
### 协议部分
#### 1、语音拨号
##### 1.1、请求报文格式
**TAG**: `0001`
**VALUE**: format as below
| Starting byte | Fields | Type | Description |
| ------------- | ------------ | ------ | ------------------------------------------------------------ |
| 0 | Flag | Byte | 00: 挂断电话
01: 拨打电话
02: 接听电话 |
| 1 | Phone Number | String | 如果Flag字段为`01`则,此项为电话号码(去电号码)。如果Flag字段不为`01`,无此项。 |
##### 1.2、应答报文格式
**TAG**: `0001`
**VALUE**: format as below
| Starting byte | fields | Type | Description |
| ------------- | ---------- | ---- | ------------------------------------ |
| 0 | Error Code | Byte | 00: 成功
01: 失败
02: 参数有误 |
##### 1.3、语音拨号异步通知
**TAG**: `1000`
**VALUE**: format as below
| Starting byte | Fields | Type | Description |
| ------------- | ------------ | ------ | ------------------------------------------------------------ |
| 0 | event | Byte | 一个字节表示的事件类型:
01:来电通知,响铃(volte通话)
02:通话接通(volte通话)
03:通话挂断(volte通话)
04:呼叫等待(volte通话)
05:呼出中(volte通话)
06:呼出中,对方未响铃(volte通话)
07:等待(volte通话) |
| 1 | phone number | String | 电话号码(来电号码) |
#### 2、短信
##### 2.1、请求报文格式
**TAG**: `0002`
**VALUE**: format as below
| Starting byte | Fields | Type | Description |
| ------------- | ------------ | ------ | ------------------------------------------------------------ |
| 0 | Phone Number | String | 电话号码(去信号码) |
| N | Separator | Char | 手机号码与短信内容分隔符,固定为"**;**"。
注:第一个`;`分隔符前序为手机号,后续字符全部为短信内容。 |
| N+1 | Message | String | 短信内容 |
##### 2.2、应答报文格式
| Starting byte | fields | Type | Description |
| ------------- | ---------- | ---- | ------------------------------------ |
| 0 | Error Code | Byte | 00: 成功
01: 失败
02: 参数有误 |
##### 2.3、短信异步通知
**TAG**: `1001`
**VALUE**: format as below
| Starting byte | Fields | Type | Description |
| ------------- | ------------ | ------ | ------------------------------------------------------------ |
| 0 | Phone Number | String | 电话号码(来信号码) |
| N | Separator | Char | 手机号码与短信内容分隔符,固定为"**;**"。
注:第一个`;`分隔符前序为手机号,后续字符全部为短信内容。 |
| N+1 | Message | String | 短信内容 |
#### 3、查询4G模块状态
##### 3.1、请求报文格式
**TAG**: `0003`
**VALUE**: 无
##### 3.2、应答报文格式
| Starting byte | Fields | Type | Description |
| ------------- | ----------------- | ---- | ------------------------------------------------------------ |
| 0 | Sim Status | Byte | SIM卡状态:
00:SIM卡不存在/被移除
01:SIM已经准备好
02:SIM卡已锁定,等待CHV1密码
03:SIM卡已被阻拦,需要CHV1密码解锁密码
04:由于SIM/USIM个性化检查失败,SIM卡被锁定
05:由于PCK错误导致SIM卡被阻拦,需要MEP密码解除阻拦
06:需要隐藏电话簿条目的密钥
07:需要解锁隐藏密钥的编码
08:SIM卡已锁定,等待CHV2密码
09:SIM卡被阻拦,需要CHV2解锁密码
0A:由于网络个性化检查失败,SIM卡被锁定
0B:由于NCK不正确,SIM卡被阻拦,需要MEP解锁密码
0C:由于子网络锁个性化检查失败,SIM卡被锁定
0D:由于错误的NSCK,SIM卡被阻拦,需要MEP解锁密码
0E:由于服务提供商个性化检查失败,SIM卡被锁定
0F:由于SPCK错误,SIM卡被阻拦,需要MEP解锁密码
10:由于企业个性化检查失败,SIM卡被锁定
11:由于CCK不正确,SIM卡被阻止,需要MEP解锁密码
12:SIM正在初始化,等待完成
13:有以下六种情况会导致此错误返回码。 1、由于CHV1、CHV2、通用的PIN的使用被阻拦,此三种情况。 2、由于使用代码解锁CHV1、CHV2、通用的PIN被阻拦,此三种情况。
14:SIM卡无效
15:未知状态
注:01表示SIM卡状态正常 |
| 1 | Net Status | Byte | 网络状态:
00:没有注册,MT也没有再搜索
01:注册完成,本地网络
02:没有注册,但是MT在尝试搜索
03:拒绝注册
04:未知状态
05:注册完成, 漫游网络
06:注册为“仅限短信”,本地网络 (不适用)
07:注册为“仅限短信”,漫游网络(不适用)
08:紧急attach仅限紧急承载服务
09:注册为“CSFB不优先”,本地网络 (不适用)
0A:注册为“CSFB不优先”,漫游网络(不适用)
0B:仅限紧急承载服务
注:01、05表示网络状态正常 |
| 2 | Camera Status | Byte | 摄像头状态:
00:正常
01:异常 |
| 3 | Net Csq | Byte | 信号强度:
00~1F:信号强度值,值越大信号越强
63:异常 |
| 4 | VoiceCall Status | Byte | 参考`1000`状态码,另`FF`表示无状态 |
#### 4、查询设备号是否绑卡
##### 4.1、请求报文格式
**TAG**: `0004`
**VALUE**: format as below
| Starting byte | Fields | Type | Description |
| ------------- | ----------- | ------- | ----------- |
| 0 | Terminal Id | Byte[n] | 终端号 |
##### 4.2、应答报文格式
| Starting byte | Fields | Type | Description |
| ------------- | ----------- | ------ | ------------------------------------------------------------ |
| 0 | isBindCard | Byte | 00:未绑定
01:已保定 |
| 1 | registerUrl | String | 终端注册URL用于绑卡(当isBindCard为00,即未绑定时该字段有值) |
#### 5、手表请求打开摄像头扫描收款码
##### 5.1、请求报文格式
**TAG**: `0005`
**VALUE**: format as below
| Starting byte | Fields | Type | Description |
| ------------- | ----------- | ------- | ----------- |
| 0 | Terminal Id | Byte[n] | 终端号 |
##### 5.2、应答报文格式
| Starting byte | Fields | Type | Description |
| ------------- | ---------- | ---- | ------------------------------------------ |
| 0 | Error Code | Byte | 错误码:
00:执行成功
01:执行失败 |
##### 5.3、扫码异步通知
**TAG**:`1002`
**VALUE**:format as below
| Starting byte | Fields | Type | Description |
| ------------- | ---------- | ------ | ------------------------------------------------------------ |
| 0 | Error Code | Byte | 错误码:
00:正常
01:通过云闪付接口,获取redirectUrl失败
02:通过聚商通接口,获取userAuthCode失败
03:通过腾讯接口,获取收款方信息失败
04:调用摄像头,获取收款码失败
05:调用摄像头,获取收款码成功
br />注:当Error Code为 00 时,后续字节为Payee Info(";"分隔的收款方信息,详情见字段解释),否则无Payee Info字段 |
| 1 | Payee Info | String | 收款方信息,使用"**;**"分隔的字符串,格式如下:
`"{payee_shop_name};{is_fixed_amount};{rcver_amount};{paysid}"`
各字段含义如下:
`payee_shop_name`:收款方商户名称
`is_fixed_amount`:是否固定金额,值为单字符,"0" 或 "1"
`rcver_amount`:收款金额,十进制字符串表示,单位"分"
`paysid`:预支付paysid
注:
is_fixed_amount == 0 非固定金额,rcver_amount == 0 需要手输金额;
is_fixed_amount == 1 固定金额,rcver_amount > 0 为收款码里的金额;
该字段传递的值是十进制字符串形式,判断时请转化成整数。 |
#### 6、模块发起付款
##### 6.1、请求报文格式
**TAG**: `0006`
**VALUE**: format as below
| Starting byte | Fields | Type | Description |
| ------------- | ------------ | ------ | ------------------------------------------------------------ |
| 0 | Payment Info | String | 支付信息,使用"**;**"分隔的字符串,格式如下:
`"{payee_shop_name};{total_amount};{paysid};{terminal_id}"`
各字段含义如下:
`payee_shop_name`:收款方商户名称
`total_amount`:收款金额,十进制字符串表示,单位"分"
`paysid`:预支付paysid
`terminal_id`:终端号 |
##### 6.2、应答报文格式
| Starting byte | Fields | Type | Description |
| ------------- | ---------- | ---- | ------------------------------------------------------------ |
| 0 | Error Code | Byte | 错误码:
00:聚商通接口,主扫付款,成功
01:腾讯接口,预支付下单,失败
02:云闪付接口,确认订单,获取交易流水号txnNo、交易金额txnAmt,失败
03:聚商通接口,主扫付款,失败
04:请求参数有误 |
#### 7、取消扫码
##### 7.1、请求报文格式
**TAG**: `0007`
**VALUE**: format as below
##### 7.2、应答报文格式
| Starting byte | Fields | Type | Description |
| ------------- | ---------- | ---- | --------------------------------------- |
| 0 | Error Code | Byte | 错误码:
00:成功
01:失败
|
#### 8、HTTP透传
##### 8.1、请求报文格式
**TAG**: `0008`
**VALUE**: format as below
##### 8.2、请求报文格式
| Starting byte | Fields | Type | Description |
| ------------- | ------- | ------ | ------------------------------------------------------------ |
| 0 | Request | String | `<请求方式>;;`
注:即使没有`json_body`,`;`也不可以省略 |
##### 8.3、应答报文格式
| Starting byte | Fields | Type | Description |
| ------------- | -------- | ------- | -------------------- |
| 0 | Response | Byte[n] | http请求的响应体数据 |
#### 9、使能休眠
##### 9.1、请求报文格式
**TAG**: `0009`
**VALUE**: format as below
##### 9.2、应答报文格式
| Starting byte | Fields | Type | Description |
| ------------- | ------ | ---- | --------------------- |
| 0 | Result | Byte | 00:成功
01: 失败 |
#### 10、手表请求付款二维码
##### 10.1、请求报文格式
**TAG**: `0010`
**VALUE**: format as below
| Starting byte | Fields | Type | Description |
| ------------- | ----------- | ------- | ----------- |
| 0 | Terminal Id | Byte[n] | 终端号 |
##### 10.2、应答报文格式
| Starting byte | Fields | Type | Description |
| ------------- | ---------------- | ------ | ------------------------------------------------------------ |
| 0 | isBindCard | Byte | 00:成功
01:失败 |
| 1 | qrNo or ErrorMsg | String | 根据首字节判断成功或失败,成功则为付款二维码,失败则为提示信息。UTF8编码字符串。 |
#### 11、手表查询付款结果
##### 11.1、请求报文格式
**TAG**: `0011`
**VALUE**: format as below
| Starting byte | Fields | Type | Description |
| ------------- | ------------------ | ------ | ---------------------------------------------------------- |
| 0 | Terminal Id & qrNo | String | ";"分隔的终端id和付款二维码,如"1343CF010171;1343CF010171" |
##### 11.2、应答报文格式
| Starting byte | Fields | Type | Description |
| ------------- | ------ | ------ | --------------------- |
| 0 | Result | Byte | 00:成功
01:失败 |
| 1 | Msg | String | 提示信息 |