OrangePi3588Media/plugins/alarm/actions/external_api_action.h
2026-04-18 20:58:31 +08:00

93 lines
2.6 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 {
std::string BuildExternalApiResultLogLine(const std::string& prefix,
const std::string& event_id,
const std::string& alarm_content,
const std::string& pic_url,
const std::string& video_url,
long http_code,
const std::string& err);
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 event_id;
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