safesight-edge/plugins/alarm/actions/external_api_action.h
sladro bb22c34696
Some checks are pending
CI / host-build (push) Waiting to run
CI / rk3588-cross-build (push) Waiting to run
修复对接api的问题
2026-01-06 17:04:38 +08:00

84 lines
2.1 KiB
C++

#pragma once
#include "action_base.h"
#include <chrono>
#include <atomic>
#include <condition_variable>
#include <mutex>
#include <queue>
#include <string>
#include <thread>
namespace rk3588 {
class ExternalApiAction : public IAlarmAction {
public:
~ExternalApiAction() override;
bool Init(const SimpleJson& config) override;
void Execute(AlarmEvent& event, std::shared_ptr<Frame> frame) override;
void Drain() override;
void Stop() override;
std::string Name() const override { return "external_api"; }
private:
struct Job {
std::string tenant_code;
std::string channel_no;
std::string alarm_content;
uint64_t timestamp_ms = 0;
std::string pic_url;
std::string video_url;
};
enum class QueuePolicy {
DropOldest,
DropNewest,
};
void WorkerLoop();
bool EnsureToken(std::string& err);
bool FetchToken(std::string& token_out, std::string& err);
bool SendMessageWithToken(const Job& job, const std::string& token, long& http_code, std::string& err);
std::string BuildMessageJson(const Job& job) const;
std::string FormatAlarmTime(uint64_t timestamp_ms) const;
std::string get_token_url_;
std::string put_message_url_;
std::string tenant_code_;
std::string channel_no_;
std::string alarm_content_;
bool use_rule_name_as_content_ = true;
bool include_media_url_ = true;
int timeout_ms_ = 3000;
std::string token_header_ = "X-Access-Token";
std::string token_json_path_ = "responseBody.token";
int token_cache_sec_ = 600;
int max_retries_ = 0;
int retry_backoff_ms_ = 200;
std::atomic<bool> running_{false};
std::thread worker_;
std::mutex queue_mutex_;
std::condition_variable queue_cv_;
std::queue<Job> queue_;
size_t in_flight_ = 0;
size_t max_queue_size_ = 0; // 0 = unlimited
QueuePolicy queue_policy_ = QueuePolicy::DropOldest;
uint64_t dropped_total_ = 0;
std::mutex token_mu_;
std::string token_;
std::chrono::steady_clock::time_point token_expire_tp_{};
};
} // namespace rk3588