# 轻车车联网
**Repository Path**: david2lf/diditech-iov-bartender
## Basic Information
- **Project Name**: 轻车车联网
- **Description**: 不仅仅是TCP/UDP网关。轻车车联网基于Spring Boot 2.x技术,将硬件接口的复杂对接转化为简单易用的接口和消息推送方式,具备设备管理、数据分析和消息推送等多种能力,可广泛应用于各种车辆监管场景和应用平台。
bartender作为本网关的接口服务,能够为车辆联网监管和部标标准的实现提供强有力的支持,助力车辆监管的智能化和规范化。#车联网 #网关 #部标 #车辆监管 #车辆管理
- **Primary Language**: Java
- **License**: GPL-2.0
- **Default Branch**: master
- **Homepage**: https://www.qiyeyongche.com
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 67
- **Created**: 2024-11-22
- **Last Updated**: 2024-11-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 轻车车联网网关 bartender

不仅仅是TCP/UDP网关。轻车车联网基于Spring Boot 2.x技术,将硬件接口的复杂对接转化为简单易用的接口和消息推送方式,具备设备管理、数据分析和消息推送等多种能力,可广泛应用于各种车辆监管场景和应用平台。
bartender作为本网关的接口服务,能够为车辆联网监管和部标标准的实现提供强有力的支持,助力车辆监管的智能化和规范化。
## 接口已发布Apifox APIHub,在线调试更方便
[轻车车联网Apifox](https://didi-qingche.apifox.cn)

## 软件架构
.png")
## 产品线路图

## 系统配置要求
| 配置项 |规格 |
| --- | --- |
| CPU内存 | 1w台设备以内2核4G |
| 硬盘 | 每100台设备1年20G |
| 操作系统 | Linux |
## 支持设备类型
| 设备类型 | 协议 |
| --- | --- |
| 康凯斯有线/OBD接电设备 | 康凯斯私有协议 |
| 奇果OBD设备| 奇果私有协议|
| 零一OBD设备| 零一私有协议|
| 车葫芦OBD设备| 车葫芦私有协议|
| 车易控行车记录仪| JT808部标协议|
| 合正行车记录仪| 合正私有协议|
| 新源润无线设备| 新源润私有协议|
| ADAS设备| JT1078部标协议|
## 支持报警类型
| 类别 | 报警项 |
| --- | --- |
| 设备自带报警 | 电瓶拆除报警、非法拆除报警、震动报警、
风险地点报警、防劫持报警、开盖报警、
位移报警、pseudo base station报警
异常驾驶行为-疲劳/打电话/抽烟 |
| 平台判断报警 | 超速报警、进敏感区域报警、出敏感区域报警、
掉线报警、停车超时报警、分离报警、
出省报警、敏感区域停留报警、未进常用区域超时报警、
原地设防报警、进电力围栏报警、
出电子围栏报警、围栏内报警、围栏内停车超时报警 |
## 名词说明
| 概念 | 定义 |
| --- | --- |
| 报文 | 硬件上行数据,例如定位、心跳、报警、OBD等信息。 |
| 服务器时间 | 平台接收报文时间。 |
| 定位时间 | 报文中GPS定位时间,即硬件使用自身GPS模块获得的GPS定位时间。 |
| 在线/离线状态 | 平台收到硬件最后一条报文10分钟后,更新设备状态为离线。上报报文期间为在线。 |
| 停车/行驶状态 | 时速大于5视为行驶,否则停车。离线时设备速度为0。 |
| 里程 | 根据上报定位点,按GPS时间排序,累加定位点间距获得。 |
| 停留点 | 从开始停车到行驶的一段时间视为停留点,停留时长最少10分钟。 |
| 轨迹 | 将历史定位数据按定位时间排序绘制的路线。 |
| 轨迹分段 | 将轨迹分隔为多个行程段。分隔条件默认为,点间距超过10米,定位时间间距超过15分钟。 |
# 安装说明
下载 **docker-compose.yml** 以及 **lvn_bootstrap.sh**,如果需要自定义可以使用文本编辑器对其中的参数进行自定义,两个文件放置在相同目录。
## **快捷安装**
直接运行lvn_bootstrap.sh,适用于新服务器直接部署运行,会自动安装相关依赖的环境如docker、docker-compose
## 自定义安装
如已安装对应环境,可跳过该步骤,顺序执行下一个
### 安装docker
```
sudo curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
```
### 安装docker-compose
```
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m) >/usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```
### 添加项目私库地址
```
echo '{ "insecure-registries": [ "123.234.31.106" ], "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://registry.docker-cn.com" ] }' >>/etc/docker/daemon.json
```
### 启动docker
```
systemctl start docker
systemctl enable docker.service
```
### 定义环境变量
```
export \
LVN_DEPLOY_PATH=/user/local/lvn/ \
LVN_CLIENT_ID=yiqiyongche \
LVN_CLIENT_SECRET='$2a$10$FsEwMOG57LvYUzZMehWnperN1nXnWXZLLWM516HFXn7rMPEoS4Da.' \
LVN_APP_CODE=03pf80c2bae96vc49b80b917bea776d7123123asfasfas
```
- `LVN_DEPLOY_PATH`: 项目日志以及持续化文件保存的地方
- `LVN_CLIENT_ID`、`LVN_CLIENT_SECRET`、`LVN_APP_CODE`:填写项目授权或试用时分发的KEY、CODE
### 使用账号密码登录docker私库
```
docker login -u admin -p Harbor12345 http://123.234.31.106
```
### 启动
```
docker-compose up -d
```
## 定义声明
### 端口定义
- 9000,网关服务端口
- 9010,授权服务端口
- 8012,应用服务端口
- 7005,告警处理服务端口
- 12061,部标协议TCP端口
- 3306,Mysql数据库端口
- 6379,Mysql数据库端口
### 环境变量
| 环境变量 | 作用 | 是否必填| 示例 |
| ---- | ---- | ---- |---- |
| LVN_DEPLOY_PATH | 部署目录,日志以及持久化文件会存储在此目录 | /user/local/lvn/ |
| LVN_CLIENT_ID | 终端ID | 必填|yiqiyongche |
| LVN_CLIENT_SECRET | 终端秘钥 | 必填| xxxxxx |
| LVN_BAIDU_GEO_KEY | 百度逆地理编码key | 必填|xxxxxxx,xxxxx |
| LVN_GAODE_WIFI_KEY | 高德智能定位解析key | 非必填|xxxxxxx,xxxxx |
| LVN_GAODE_LBS_KEY | 高德lbs解析key | 非必填|xxxxxxx,xxxxx |
** 本项目逆地理编码、基站解析、热点解析调用两大地图商(百度和高德)的api,调用秘钥(key)需按调用量需求申请对应的配额,代码内默认使用了个人版key,不支持生产环境。
https://lbsyun.baidu.com/apiconsole/center#/home
https://console.amap.com/dev/key/app
# 使用说明
## 1. API鉴权
初次使用时我们会提供调用终端的鉴权信息`client_id`和`client_secret`,调用鉴权接口可获取凭证`access_token`,之后便可开始使用其他业务API接口。

鉴权接口 POST /oauth/token
此接口返回的token_type和access_token使用`' '`(空格)连接后,在请求header中携带调用业务接口。
> 请求参数
|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|grant_type|query|string| 是 |固定参数|
|client_id|query|string| 是 |客户端ID|
|client_secret|query|string| 是 |客户端密钥
> 成功返回示例
```json
{
"access_token": "this_is_an_example_access_token",
"token_type": "bearer",
"expires_in": 40528,
"scope": "all",
"jti": "483fb3cf-e63b-415d-93bd-bdd4f12a8213"
}
```
>返回结果
|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline|
> 返回数据结构
|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» access_token|string|true|none|鉴权token|none|
|» token_type|string|true|none|鉴权类型|none|
|» expires_in|integer|true|none|多少秒后token过期|none|
## 2. 设备接入与消息接收
系统搭建完成后,若使用第三方硬件,需将硬件配置到对应协议的TCP(UDP)上线端口,若使用我司设备,可联系客服配置。
如图所示,首先添加设备以确保设备上线,若需接收设备实时定位和告警,需开启事件推送。

### 设备-添加接口 GET /devices/syn
支持相同型号批量添加,使用默认参数,可绕过鉴权。
> 请求参数
|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|clientId|query|string| 是 |客户端ID|
|categoryNo|query|string| 是 |设备型号,长名称|
|deviceNums|query|string| 是 |设备号,批量使用逗号间隔|
> 返回结果
|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline|
### 设备-批量启停推送接口 GET /devices/batch
若设备导入时没有指定启用状态,则默认启用,不需要批量启用。若导入时指定设备初始状态为停用,则需要使用该接口控制,停用时,不推送定位状态、事件信息。
> 请求参数
|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|devices|query|string| 是 |需要启停的设备编号,多个时用逗号间隔|
|isEnable|query|string| 是 |0:启用 1:停用|
> 返回结果
|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline|
## 3. 验证设备上线
### 设备位置-运维查看设备位置状态接口 GET /opt/location
运维使用查询设备最新定位状态,当设备号不存在时提示“设备号不存在”
> 请求参数
|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|deviceNum|query|string| 是 |none|
> 成功返回示例
```json
{
"code": 200,
"data": {
"categoryNo": "DO90",
"categoryNoShort": "DO90",
"createTime": "2022-07-27 05:12:00",
"deviceNum": "868120250375836",
"direction": 28,
"directionName": "东北",
"gpsTime": "2022-07-26 16:14:49",
"isMoving": 0,
"latBd": 29.116056,
"latGc": 29.109734,
"lngBd": 119.654767,
"lngGc": 119.648356,
"locMode": 9,
"satCount": 15,
"speed": 0,
"startTimeMovingStop": "2022-06-23 07:45:53",
"startTimeOnOffLine": "2022-07-27 05:12:00",
"wifiFlag": 1
},
"message": "",
"success": true
}
```
>返回结果
|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline|
>返回数据结构
|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» code|integer|true|none||none|
|» data|object|true|none||none|
|»» categoryNo|string|true|none|设备类型|none|
|»» categoryNoShort|string|true|none|设备类型短名|none|
|»» createTime|string|true|none|创建时间|none|
|»» deviceNum|string|true|none|设备号|none|
|»» direction|integer|true|none|方向|none|
|»» directionName|string|true|none|方向描述|none|
|»» gpsTime|string|true|none|定位时间|none|
|»» isMoving|integer|true|none|行驶中状态 行驶:1;停车:0|none|
|»» latBd|number|true|none|百度坐标纬度|none|
|»» latGc|number|true|none|高德坐标纬度|none|
|»» lngBd|number|true|none|百度坐标经度|none|
|»» lngGc|number|true|none|高德坐标经度|none|
|»» locMode|integer|true|none|定位方式 0-GPS;1-LBS单基站;2-LBS多基站;5-WIFI;9-不定位|none|
|»» satCount|integer|true|none|卫星数 卫星个数|none|
|»» speed|integer|true|none|速度|none|
|»» startTimeMovingStop|string|true|none|行驶/停车 + 起始时刻 年月日 时分秒|none|
|»» startTimeOnOffLine|string|true|none|在线/离线起始时刻 年月日 时分秒|none|
|»» wifiFlag|integer|true|none|设备类型 1:有线|none|
|» message|string|true|none||none|
|» success|boolean|true|none||none|
## 4. 多媒体库
设备上报照片、视频存储到本地/media/下,可配置nginx便于通过url访问
> nginx配置示例
```
server {
listen 7001;
location /media/lib {
alias /media;
autoindex on;
}
}
```
# 常见问题
## 设备在线总数和各端口在线数
可根据各端口实时在线数量粗略判断端口健康状态,当某端口车辆较少或当前时间大部分车辆在停车状态,则不足以判断端口健康情况。可参考以下SQL query查询在线数量。
```sql
SELECT COUNT(p.ALM_OFFLINE = 0 AND (p.ISSLEEPING=0 OR p.ISSLEEPING IS NULL) OR NULL) AS '在线总数'
FROM dd_new.position p;
SELECT p.TAG as '端口',
COUNT(p.ALM_OFFLINE = 0 AND (p.ISSLEEPING=0 OR p.ISSLEEPING IS NULL) OR NULL) AS '在线数',
COUNT(*) AS '累计上线数量',
MAX(p.CREATE_TIME) AS '最新服务时间',
NOW() AS '当前时间',
IF(TIMESTAMPDIFF(SECOND,MAX(p.CREATE_TIME),NOW()) <= SECOND(3), '正常',
IF(COUNT(p.ALM_OFFLINE = 0 AND (p.ISSLEEPING=0 OR p.ISSLEEPING IS NULL) OR NULL) < 100, '设备较少', '异常')) AS '端口健康' -- 该阈值需根据活跃车辆数进行调整
FROM dd_new.position p
GROUP BY p.TAG
ORDER BY MAX(p.CREATE_TIME);
```
## 设备不上线问题
[定位更新回调](api-61168305)接收不到该设备数据,或超过30分钟没有新数据。
运维建议:
1. 确认设备是否已通电,车辆正常行驶。
2. 与网络运营商确认物联网卡为可用状态。
3. 避免将车辆置于地下停车场等信号差的位置,参看设备说明书,根据指示灯判断,确认网络信号良好,GPS信号良好。
## 设备定位不准问题
车辆于地图定位与实际位置有偏差。
运维建议:
1. 确认车辆正常行驶,否则可能导致设备断电。
3. 确认[定位更新回调](api-61168305)接收该设备数据正常,若无更新,怀疑存在设备不上线问题。
4. 若回调数据中定位标识`AV=V`,说明设备搜索不到卫星信号,GPS定位失败,建议开车移动到信号较好的位置。
## 联系我们
