264 lines
5.2 KiB
C++
264 lines
5.2 KiB
C++
#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]; // DN101;DN102
|
||
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]; // DN101;DN102
|
||
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
|