wirelessgateway/localserver/cmt_server.hpp
2025-02-15 18:49:38 +08:00

264 lines
5.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef CMT_PROTOCOL_HPP_
#define CMT_PROTOCOL_HPP_
#include <iostream>
#include <boost/asio.hpp>
#include <cstdlib>
#include <memory>
#include <utility>
#include <unordered_set>
using boost::asio::ip::tcp;
#define CMT_TCP_LEN 100000
//1 tcp server可以参考本安有线中的代码侦听端口10000
//2 定义无线网关与传感器用到的结构
//3 包头为
#pragma pack(1)
struct PackageHead{
uint8_t head[3]; // 固定值0xAA55AA
uint8_t cmd;
int len;
char data[0];
};
//网关版本和状态信息cmd 80
struct GatewayVersion{
int version; // 写1
char web_ver[12];
char system_ver[12];
char gateway_ver[12];
char ip[16];
char gateway_type[12];
char gateway_hw_ver[12];
char terminal_name[32]; // 终端名称如果为空填写Default
int cpu_use;
int memory_use;
int disk_remain;
int temperature;
char comm_mode[10];
char mac[20];
};
enum SensorStatus{
OFFLINE = 0,
ONLINE = 1
};
enum SensorUpgradeStatus{
UPGRADE_NORMAL = 0,
UPGRADING = 1,
UPGRADE_SUCCESS = 2,
UPGRADE_FALIED = 3
};
enum LooseStatus{
NORMAL = 0,
LOOSE = 1
};
//传感器信息cmd 81
struct SensorInfoReq{
char short_addr[4];
};
struct SensorInfo{
int version;
char sensor_name[64];
char measurement_id[20];
char short_addr[5];
char hw_ver[12];
char soft_ver[12];
int gateway_rssi;
int sensor_rssi;
int battry;
int loose_status; //参考 LooseStatus
int temperature_bot;
int temperature_top;
char product[6]; // DN101DN102
int status; // 参考 SensorStatus
int eigen_value_reporting_rate;
int wave_x_reporting_rate;
int wave_y_reporting_rate;
int wave_z_reporting_rate;
float velocity_rms;
int upgrade_status; // 参考 SensorUpgradeStatus
char upgrade_time[20];
};
enum ChannelType{
X = 1,
Y = 2,
Z = 3
};
//波形cmd 82
struct WaveReq{
char measurement_id[20];
int channel;//参考 ChannelType
};
struct WaveRes{
int version;
int sampling_rate;
int sampling_time;
char wave[0];
};
//下载配置 cmd 83
struct DownloadConfigReq{
char measurement_id[20];
};
enum Range{
RANGE_8G = 0,
RANGE_16G = 1,
RANGE_32G = 2,
RANGE_64G = 3,
RANGE_50G = 4
};
struct DownloadConfigRes{
int version;
char filename[128];
};
struct DownloadConfig{
char gw_mac[20];
char product[6]; // DN101DN102
char ip[16];
int panid;
int signal_channle;
char terminal_name[32];
char sn[10];
char sensor_mac[20];
char measurement_id[20];
int short_addr;
char sensor_name[64];
char update_date[20];
int gateway_rssi;
int sensor_rssi;
char hw_ver[12];
char soft_ver[12];
int sampling_rate;
int range; //量程 参考 Range
int sampling_time;
int viff; //速度积分起始频率
int power; //zigbee发射功率
int retry_time; //zigbee重发次数
};
//上传配置 cmd 84
struct UploadConfigReq{
char filename[64];
char md5[33];
};
struct UploadConfigRes{
int version;
int code;
char message[64];
};
//网关更新 cmd 85
struct UpgradeGwReq{
char filename[64];
char md5[33];
};
struct UpgradeGwRes{
int version;
int code;
char message[64];
};
//传感器更新 cmd 86
struct UpgradeSensorReq{
char filename[64];
char md5[33];
char upgrade_short_addr[0];
};
struct UpgradeSensorRes{
int version;
int code;
char message[64];
};
//获取特征值 cmd 87
struct GetEigenvalueReq{
char measurement_id[20];
};
struct GetEigenvalueRes{
int version;
int channel;//参考 ChannelType
float DiagnosisPk;
float IntegratPk;
float IntegratRMS;
float RmsValues;
float EnvelopEnergy;
float Amp1;
float Amp2;
float Amp3;
float Amp4;
float Amp5;
float Phase1;
float Phase2;
float Phase3;
float Phase4;
int Time;
};
//停止更新传感器 cmd 88
struct UpgradeStopReq{
int short_addr;
};
struct UpgradeStopRes{
int version;
int code;
char message[64];
};
// 搜索应答 cmd 1
struct Search {
int version;
char mac[20];
int gw_type; // GatewayType
};
class CMTSession : public std::enable_shared_from_this<CMTSession> {
public:
CMTSession(tcp::socket socket, std::unordered_set<std::shared_ptr<CMTSession>>& sessionSet) : socket_(std::move(socket)), sessionSet_(sessionSet) {
web_version_ = "1.0.1";
version_ = 1;
head_len_ = sizeof(PackageHead);
}
~CMTSession() {
if (data_ != nullptr) {
free(data_);
}
}
void start();
void set_data(char *data, int len);
void do_write(std::size_t length);
private:
void do_read();
tcp::socket socket_;
std::unordered_set<std::shared_ptr<CMTSession>>& sessionSet_;
char *data_;
std::string web_version_;
int version_;
int head_len_;
};
class CMTServer {
public:
CMTServer(boost::asio::io_service& io_service, short port) : acceptor_(io_service, tcp::endpoint(tcp::v4(), port)), socket_(io_service) { do_accept(); }
// 向所有客户端发送消息
void send_message_to_all(char *message, int len) {
for (auto& session : sessionSet_) {
session->set_data(message, len);
session->do_write(len);
}
}
private:
void do_accept();
tcp::acceptor acceptor_;
tcp::socket socket_;
std::unordered_set<std::shared_ptr<CMTSession>> sessionSet_;
};
#endif