Initial commit of secondary development sample code

This commit is contained in:
2026-01-19 10:39:22 +08:00
commit c2697affd9
66 changed files with 17277 additions and 0 deletions

View File

@ -0,0 +1,83 @@
# HTTP告警推送
> **http-server-demo** 分为三个文件夹。
>
> 1. **headers** http请求头的demo代码
> 2. **http-server** http服务端接收告警推送(无token版本)
> 3. **http-server-token** http服务端接收告警推送(有token版本)
## headers
如果需要将盒子产生的告警推送到您自建平台,并且你的平台需要验证**token**,则需要用到该文件夹下的`headers_demo.py`文件。
你可自行修改`headers_demo.py`文件,并将此文件上传到盒子平台的【数据推送】-【告警】-【HTTP】-【配置token】。
`headers_demo.py`文件说明:
- 类名必须为`Headers`,继承`BaseHeaders`类。`BaseHeaders`类通过`api.http`导入
```python
from api.http import Headers as BaseHeaders
```
- 定义三个实例变量:`get_headers_url`、`timeout`、`interval`。
`get_headers_url`:指定获取`token`的**URL**地址。
`timeout`:指定获取`token`的超时时间(单位:秒)。
`interval`:定时刷新`headers`的时间间隔(单位:秒)。
```python
class Headers(BaseHeaders):
def __init__(self):
self.get_headers_url = None
self.timeout = 5
interval = 60 * 10
super().__init__(interval)
```
- 必须实现`_generate_headers`方法。返回请求头字典`headers`。返回示例:
```python
{'authorization': 'Bearer abcdefghijklmnopqrstuvwxyz'}
```
- 完整实例如下:
```python
import requests
from api.http import Headers as BaseHeaders
from logger import LOGGER
class Headers(BaseHeaders):
def __init__(self):
self.get_headers_url = None
self.timeout = 5
interval = 60 * 10
super().__init__(interval)
def _generate_headers(self):
try:
headers = {
'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkXXX'
}
return headers
except:
LOGGER.exception('_generate_headers')
return None
```
## http-server
该文件夹为**http**服务端代码,提供**python**和**java**代码。它主要用于接收盒子的**http**告警推送。如果您需要验证盒子的**http**推送功能是否正常,可使用此文件夹进行测试。
运行该文件夹下的代码,即可开启一个**http**服务端。在盒子平台的【数据推送】-【告警】-【HTTP】中启用推送管理并填写**http**服务端地址,即可开启推送功能。
## http-server-token
此文件夹同**http-server**文件夹,只是增加了**token**验证功能。
你首先需把其下的`headers_demo1.py`或`headers_demo2.py`文件上传到盒子平台的【数据推送】-【告警】-【HTTP】-【配置TOKEN】。
`headers_demo1.py`通过调用url接口获取token。(盒子必须可以ping通该url文件中的`get_headers_url`变量为**http**服务端URL)
`headers_demo2.py`固定token。

View File

@ -0,0 +1,46 @@
import requests
from api.http import Headers as BaseHeaders
from logger import LOGGER
class Headers(BaseHeaders):
def __init__(self):
"""
初始化Headers类
- `self.get_headers_url`: 获取token的URL地址根据实际环境修改。
- `self.timeout`: 请求超时时间设置为5秒。
- `interval`: 定时刷新headers的时间间隔设置为10分钟60秒 * 10
"""
self.get_headers_url = None
self.timeout = 5
interval = 60 * 10
super().__init__(interval)
def _generate_headers(self):
"""
生成请求头的方法_generate_headers方法名不允许修改
通过向指定的URL发送GET请求获取token并将token添加到请求头中
:return: 请求头字典
"""
try:
# 定义请求参数
params = {
'arg1': 'xxx',
'arg2': 'xxx'
}
if self.get_headers_url is not None:
# 发送GET请求获取token
resp = requests.get(self.get_headers_url, params=params, timeout=self.timeout)
if resp.status_code == 200:
token = resp.text
headers = {
'authorization': 'Bearer {}'.format(token)
}
return headers
else:
LOGGER.error('Get headers failed')
return None
except:
LOGGER.exception('_generate_headers')
return None

View File

@ -0,0 +1,47 @@
import requests
from api.http import Headers as BaseHeaders
from logger import LOGGER
class Headers(BaseHeaders):
def __init__(self):
"""
初始化Headers类
- `self.get_headers_url`: 获取token的URL地址根据实际环境修改。
- `self.timeout`: 请求超时时间设置为5秒。
- `interval`: 定时刷新headers的时间间隔设置为10分钟60秒 * 10
"""
self.get_headers_url = 'http://192.168.1.75:10000/token'
self.timeout = 5
interval = 60 * 10
super().__init__(interval)
def _generate_headers(self):
"""
生成请求头的方法_generate_headers方法名不允许修改
通过向指定的URL发送GET请求获取token并将token添加到请求头中
:return: 请求头字典
"""
try:
# 定义请求参数
params = {
'arg1': 'xxx',
'arg2': 'xxx'
}
if self.get_headers_url is not None:
# 发送GET请求获取token
resp = requests.get(self.get_headers_url, params=params, timeout=self.timeout)
LOGGER.info('Get headers resp {}'.format(resp))
if resp.status_code == 200:
token = resp.text
headers = {
'authorization': 'Bearer {}'.format(token)
}
return headers
else:
LOGGER.error('Get headers failed')
return None
except:
LOGGER.exception('_generate_headers')
return None

View File

@ -0,0 +1,35 @@
import requests
from api.http import Headers as BaseHeaders
from logger import LOGGER
class Headers(BaseHeaders):
def __init__(self):
"""
初始化Headers类
- `self.get_headers_url`: 获取token的URL地址根据实际环境修改。
- `self.timeout`: 请求超时时间设置为5秒。
- `interval`: 定时刷新headers的时间间隔设置为10分钟60秒 * 10
"""
self.get_headers_url = None
self.timeout = 5
interval = 60 * 10
super().__init__(interval)
def _generate_headers(self):
"""
生成请求头的方法_generate_headers方法名不允许修改
固定http请求头authorization以及值可自定义
:return: 请求头字典
"""
try:
headers = {
'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkXXX'
}
return headers
except:
LOGGER.exception('_generate_headers')
return None

View File

@ -0,0 +1,45 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping(path = "")
public class AlertController {
/**
* 目标平台接收告警及告警图片
* @param alertMsg
* @param authorization
*/
@PostMapping(path = "/alert")
public void getAlertMsg(@RequestBody AlertMsg alertMsg, @RequestHeader("Authorization") String authorization) {
log.info("authorization{}", authorization);
log.info("示例接收告警及告警图片:{}", alertMsg);
}
/**
* 目标平台接收告警及告警视频
*
* @param alertVideo
*/
@PostMapping(path = "/video")
public void getAlertVideo(@RequestBody AlertVideo alertVideo,@RequestHeader("Authorization") String authorization) {
log.info("authorization{}", authorization);
log.info("示例接收告警及告警视频:{}", alertVideo);
}
@GetMapping(path = "/token")
public String token() {
return RandomUtil.randomString(16);
}
}

View File

@ -0,0 +1,20 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class AlertMsg {
private String id;
@JsonProperty("alert_time")
private Double alertTime;
private Object device;
private Object source;
private Object alg;
private String image;
@JsonProperty("reserved_data")
private Object reservedData;
@JsonProperty("hazard_leve")
private String hazardLeve;
}

View File

@ -0,0 +1,18 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class AlertVideo {
private String id;
@JsonProperty("alert_time")
private Double alertTime;
private Object device;
private Object source;
private Object alg;
private String video;
@JsonProperty("hazard_leve")
private String hazardLeve;
}

View File

@ -0,0 +1,23 @@
import os
import sys
from flask import Flask
CURRENT_PATH = os.path.dirname(os.path.realpath(__file__))
sys.path.append(CURRENT_PATH)
url_prefix = '/'
from app import alert
def create_app():
# 初始化Flask对象
app_ = Flask(__name__)
# 注册蓝图
app_.register_blueprint(alert.bp)
return app_
app = create_app()

View File

@ -0,0 +1,31 @@
import base64
import hashlib
import json
import secrets
import time
from flask import Blueprint, request
from app import url_prefix
bp = Blueprint('alert', __name__, url_prefix=url_prefix)
@bp.route('alert', methods=['POST'])
def post_alert():
# 获取token
auth_header = request.headers.get('authorization')
print(f"Authorization Header: {auth_header}")
data = json.loads(request.get_data().decode('utf-8'))
image = data.pop('image')
print(data)
with open('image.jpg', 'wb') as f:
f.write(base64.b64decode(image.encode('utf-8')))
return data
@bp.route('/token', methods=['GET'])
def gen_token():
print(request.args)
token = secrets.token_hex(32)
return token

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

View File

@ -0,0 +1,4 @@
from app import app
if '__main__' == __name__:
app.run(host='0.0.0.0', port=10000, debug=False)

View File

@ -0,0 +1,37 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping(path = "")
public class AlertController {
/**
* 目标平台接收告警及告警图片
*
* @param alertMsg
*/
@PostMapping(path = "/alert")
public void getAlertMsg(@RequestBody AlertMsg alertMsg) {
log.info("示例接收告警及告警图片:{}", alertMsg);
}
/**
* 目标平台接收告警及告警视频
*
* @param alertVideo
*/
@PostMapping(path = "/video")
public void getAlertVideo(@RequestBody AlertVideo alertVideo) {
log.info("示例接收告警及告警视频:{}", alertVideo);
}
}

View File

@ -0,0 +1,21 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class AlertMsg {
private String id;
@JsonProperty("alert_time")
private Double alertTime;
private Object device;
private Object source;
private Object alg;
private String image;
@JsonProperty("reserved_data")
private Object reservedData;
@JsonProperty("hazard_leve")
private String hazardLeve;
}

View File

@ -0,0 +1,19 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class AlertVideo {
private String id;
@JsonProperty("alert_time")
private Double alertTime;
private Object device;
private Object source;
private Object alg;
private String video;
@JsonProperty("hazard_leve")
private String hazardLeve;
}

View File

@ -0,0 +1,23 @@
import os
import sys
from flask import Flask
CURRENT_PATH = os.path.dirname(os.path.realpath(__file__))
sys.path.append(CURRENT_PATH)
url_prefix = '/'
from app import alert
def create_app():
# 初始化Flask对象
app_ = Flask(__name__)
# 注册蓝图
app_.register_blueprint(alert.bp)
return app_
app = create_app()

View File

@ -0,0 +1,28 @@
import base64
import json
from flask import Blueprint, request
from app import url_prefix
bp = Blueprint('alert', __name__, url_prefix=url_prefix)
@bp.route('alert', methods=['POST'])
def post_alert():
data = json.loads(request.get_data().decode('utf-8'))
image = data.pop('image')
print(data)
with open('image.jpg', 'wb') as f:
f.write(base64.b64decode(image.encode('utf-8')))
return data
@bp.route('alert/video', methods=['POST'])
def post_alert_video():
data = json.loads(request.get_data().decode('utf-8'))
video = data.pop('video')
print(data)
with open('video.mp4', 'wb') as f:
f.write(base64.b64decode(video.encode('utf-8')))
return data

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

View File

@ -0,0 +1,4 @@
from app import app
if '__main__' == __name__:
app.run(host='0.0.0.0', port=10000, debug=False)