Browse Source

update

master
zhaohe 2 years ago
parent
commit
1a4cb85444
  1. 10
      README.md
  2. 2
      iflytoplinuxsdk
  3. 125
      src/db/db_service.cpp
  4. 3
      src/db/db_service.hpp
  5. 83
      src/main_control_service.cpp
  6. 2
      src/main_control_service.hpp
  7. 6
      src/service/device_state_service.hpp
  8. 21
      src/service/disinfection_ctl_service.cpp

10
README.md

@ -20,6 +20,16 @@
2. 日志过期自动删除
3. DB过期记录自动删除
4. 量产时记得将websocketIP修改成127.0.0.1
5. 远程控制功能
必须要完成的功能:
6. 软件升级功能
//补充协议
1. 时间修改
2. getState时,传感器信息的上报,所有受控设备的开关状态
3. 修改密码时,需要传递旧密码。
4. 设置的默认配置信息name错误
----------------------------------

2
iflytoplinuxsdk

@ -1 +1 @@
Subproject commit 7be7036d99eca24b6a5d4e9ae0361fcbc936b90f
Subproject commit 419371f95936fa7f49389fbc07bac250f21240a9

125
src/db/db_service.cpp

@ -18,53 +18,53 @@ using namespace nlohmann;
// auto notJohn = storage.get_all<User>(where(c(&User::firstName) != "John"));
// 主键必须是int,或者不要主键
#define USER_DB_STRUCT \
USER_DB, /**/ \
make_table("users", /**/ \
make_column("uid", &User::uid), /**/ \
make_column("passwd", &User::passwd), /**/ \
make_column("permission_level", &User::permission_level), /**/ \
#define USER_DB_STRUCT \
USER_DB, /**/ \
make_table("users", /**/ \
make_column("id", &User::id, primary_key().autoincrement()), /**/ \
make_column("uid", &User::uid), /**/ \
make_column("passwd", &User::passwd), /**/ \
make_column("permission_level", &User::permission_level), /**/ \
make_column("visible", &User::visible))
#define SETTING_DB_STRUCT \
make_table("settings", /**/ \
make_column("id", &Setting::id), /**/ \
make_column("id", &Setting::id, primary_key()), /**/ \
make_column("name", &Setting::name), /**/ \
make_column("name_ch", &Setting::name_ch), /**/ \
make_column("val_upper_limit", &Setting::val_upper_limit), /**/ \
make_column("val_lower_limit", &Setting::val_lower_limit), /**/ \
make_column("val_upper_limit", &Setting::val_upper_limit), /**/ \
make_column("permission_level", &Setting::permission_level), /**/ \
make_column("val", &Setting::val))
#define DISINFECTION_RECORD_DB_STRUCT \
DISINFECTION_RECORD_DB, \
make_table("disinfection_records", /**/ \
make_column("id", &DisinfectionRecord::id), /**/ \
make_column("uuid", &DisinfectionRecord::uuid), /**/ \
make_column("uid", &DisinfectionRecord::uid), /**/ \
make_column("date", &DisinfectionRecord::date), /**/ \
make_column("loglevel", &DisinfectionRecord::loglevel), /**/ \
make_column("duration", &DisinfectionRecord::duration)), /**/ \
make_table("sensor_records", /**/ \
make_column("id", &SensorRecord::id), /**/ \
make_column("disinfection_id", &SensorRecord::disinfection_id), /**/ \
make_column("date", &SensorRecord::date), /**/ \
make_column("heating_strip", &SensorRecord::heating_strip), /**/ \
make_column("air_compressor", &SensorRecord::air_compressor), /**/ \
make_column("sprinkler_pump", &SensorRecord::sprinkler_pump), /**/ \
make_column("disinfectant_volume", &SensorRecord::disinfectant_volume), /**/ \
make_column("h2o2_1", &SensorRecord::h2o2_1), /**/ \
make_column("temp_1", &SensorRecord::temp_1), /**/ \
make_column("humid_1", &SensorRecord::humid_1), /**/ \
make_column("saturation_1", &SensorRecord::saturation_1), /**/ \
make_column("h2o2_2", &SensorRecord::h2o2_2), /**/ \
make_column("temp_2", &SensorRecord::temp_2), /**/ \
make_column("humid_2", &SensorRecord::humid_2), /**/ \
make_column("saturation_2", &SensorRecord::saturation_2), /**/ \
make_column("h2o2_3", &SensorRecord::h2o2_3), /**/ \
make_column("temp_3", &SensorRecord::temp_3), /**/ \
make_column("humid_3", &SensorRecord::humid_3), /**/ \
#define DISINFECTION_RECORD_DB_STRUCT \
DISINFECTION_RECORD_DB, \
make_table("disinfection_records", /**/ \
make_column("id", &DisinfectionRecord::id, primary_key().autoincrement()), /**/ \
make_column("uuid", &DisinfectionRecord::uuid), /**/ \
make_column("uid", &DisinfectionRecord::uid), /**/ \
make_column("date", &DisinfectionRecord::date), /**/ \
make_column("loglevel", &DisinfectionRecord::loglevel), /**/ \
make_column("duration", &DisinfectionRecord::duration)), /**/ \
make_table("sensor_records", /**/ \
make_column("id", &SensorRecord::id, primary_key().autoincrement()), /**/ \
make_column("disinfection_id", &SensorRecord::disinfection_id), /**/ \
make_column("date", &SensorRecord::date), /**/ \
make_column("heating_strip", &SensorRecord::heating_strip), /**/ \
make_column("air_compressor", &SensorRecord::air_compressor), /**/ \
make_column("sprinkler_pump", &SensorRecord::sprinkler_pump), /**/ \
make_column("disinfectant_volume", &SensorRecord::disinfectant_volume), /**/ \
make_column("h2o2_1", &SensorRecord::h2o2_1), /**/ \
make_column("temp_1", &SensorRecord::temp_1), /**/ \
make_column("humid_1", &SensorRecord::humid_1), /**/ \
make_column("saturation_1", &SensorRecord::saturation_1), /**/ \
make_column("h2o2_2", &SensorRecord::h2o2_2), /**/ \
make_column("temp_2", &SensorRecord::temp_2), /**/ \
make_column("humid_2", &SensorRecord::humid_2), /**/ \
make_column("saturation_2", &SensorRecord::saturation_2), /**/ \
make_column("h2o2_3", &SensorRecord::h2o2_3), /**/ \
make_column("temp_3", &SensorRecord::temp_3), /**/ \
make_column("humid_3", &SensorRecord::humid_3), /**/ \
make_column("saturation_3", &SensorRecord::saturation_3))
DBService::DBService(/* args */) {}
@ -77,6 +77,10 @@ void DBService::initialize() {
//
init_usr_db();
init_setting_db();
init_disinfection_record_db();
json settings = getAllSettingJson();
logger->info("settings: {}", settings.dump());
}
void DBService::init_usr_db() {
@ -88,21 +92,21 @@ void DBService::init_usr_db() {
storage.sync_schema();
auto root = storage.get_all<User>(where(c(&User::uid) == "root"));
if (root.size() == 0) {
storage.insert(User{"root", "iflytop.com#9973", 0, 0}); // 超级用户
storage.insert(User{-1, "root", "iflytop.com#9973", 0, 0}); // 超级用户
}
auto vendor = storage.get_all<User>(where(c(&User::uid) == "vendor"));
if (vendor.size() == 0) {
storage.insert<User>({"vendor", "9973", 1, true}); // 厂商
storage.insert<User>({-1, "vendor", "9973", 1, true}); // 厂商
}
auto admin = storage.get_all<User>(where(c(&User::uid) == "admin"));
if (admin.size() == 0) {
storage.insert<User>({"admin", "9973", 2, true}); // 管理员
storage.insert<User>({-1, "admin", "9973", 2, true}); // 管理员
}
auto user = storage.get_all<User>(where(c(&User::uid) == "user"));
if (user.size() == 0) {
storage.insert<User>({"user", "0000", 3, true}); // 普通用户
storage.insert<User>({-1, "user", "0000", 3, true}); // 普通用户
}
suc = true;
} catch (const std::exception& e) {
@ -131,20 +135,26 @@ id setting_name setting_name_ch val_upper_limit val_lower_limi
auto storage = make_storage(SETTING_DB, SETTING_DB_STRUCT);
storage.sync_schema();
auto s0 = storage.get_all<Setting>(where(c(&Setting::id) == 0));
if (s0.size() == 0) storage.insert(Setting{0, "stoped_gs", "消毒停止过氧化氢溶度", 0, 2000, 1, 1000});
auto s1 = storage.get_all<Setting>(where(c(&Setting::id) == 1));
if (s1.size() == 0) storage.insert(Setting{1, "continued_gs", "消毒继续过氧化氢溶度", 0, 2000, 1, 800});
auto s2 = storage.get_all<Setting>(where(c(&Setting::id) == 2));
if (s2.size() == 0) storage.insert(Setting{2, "stoped_satur", "消毒停止过氧化氢相对饱和度", 0, 100, 1, 80});
auto s3 = storage.get_all<Setting>(where(c(&Setting::id) == 3));
if (s3.size() == 0) storage.insert(Setting{3, "continued_satur", "消毒继续过氧化氢相对饱和度", 0, 100, 1, 60});
auto s4 = storage.get_all<Setting>(where(c(&Setting::id) == 4));
if (s4.size() == 0) storage.insert(Setting{4, "max_humidity", "允许消毒最大湿度", 0, 100, 1, 90});
auto s5 = storage.get_all<Setting>(where(c(&Setting::id) == 5));
if (s5.size() == 0) storage.insert(Setting{5, "drainage_pump_speed", "排液蠕动泵转速", 0, 2000, 2, 500});
auto s6 = storage.get_all<Setting>(where(c(&Setting::id) == 6));
if (s6.size() == 0) storage.insert(Setting{6, "injection_pump_speed", "喷射蠕动泵转速", 0, 2000, 2, 500});
if (storage.get_all<Setting>(where(c(&Setting::id) == 1)).size() == 0) //
storage.insert(Setting{1, "stoped_gs", "消毒停止过氧化氢溶度", 0, 2000, 1, 1000});
if (storage.get_all<Setting>(where(c(&Setting::id) == 2)).size() == 0)
storage.insert(Setting{2, "continued_gs", "消毒继续过氧化氢溶度", 0, 2000, 1, 800});
if (storage.get_all<Setting>(where(c(&Setting::id) == 3)).size() == 0)
storage.insert(Setting{3, "stoped_satur", "消毒停止过氧化氢相对饱和度", 0, 100, 1, 80});
if (storage.get_all<Setting>(where(c(&Setting::id) == 4)).size() == 0)
storage.insert(Setting{4, "continued_satur", "消毒继续过氧化氢相对饱和度", 0, 100, 1, 60});
if (storage.get_all<Setting>(where(c(&Setting::id) == 5)).size() == 0) //
storage.insert(Setting{5, "max_humidity", "允许消毒最大湿度", 0, 100, 1, 90});
if (storage.get_all<Setting>(where(c(&Setting::id) == 6)).size() == 0)
storage.insert(Setting{6, "drainage_pump_speed", "排液蠕动泵转速", 0, 2000, 2, 500});
if (storage.get_all<Setting>(where(c(&Setting::id) == 7)).size() == 0)
storage.insert(Setting{7, "injection_pump_speed", "喷射蠕动泵转速", 0, 2000, 2, 500});
suc = true;
} catch (const std::exception& e) {
@ -252,6 +262,7 @@ bool DBService::setSettingVal(int id, int val) {
return true;
}
bool DBService::setSettingVal(string setting_name, int val) {
logger->info("set setting val: {} {}", setting_name, val);
auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT);
settingtable.sync_schema();
auto setting = settingtable.get_all<Setting>(where(c(&Setting::name) == setting_name));
@ -264,7 +275,9 @@ bool DBService::setSettingVal(string setting_name, int val) {
return false;
}
setting[0].val = val;
settingtable.update(setting[0]);
Setting s = setting[0];
settingtable.update(s);
settingtable.sync_schema();
return true;
}

3
src/db/db_service.hpp

@ -52,6 +52,7 @@ namespace db {
struct User {
public:
int id;
string uid;
string passwd;
int permission_level;
@ -63,8 +64,8 @@ struct Setting {
int id;
string name;
string name_ch;
int val_upper_limit;
int val_lower_limit;
int val_upper_limit;
int permission_level;
int val;
};

83
src/main_control_service.cpp

@ -22,25 +22,6 @@ static void getJsonValFromJson(json j, int& val) {
}
}
static void getJsonValFromJson(json j, float& val) {
if (j.is_string()) {
string jstr = j;
val = atof(jstr.c_str());
} else if (j.is_number()) {
val = j;
} else {
throw std::runtime_error("getJsonValFromJson(float) error");
}
}
static void getJsonValFromJson(json j, string& val) {
if (j.is_string()) {
string val = j;
} else {
throw std::runtime_error("getJsonValFromJson(string) error");
}
}
template <typename T>
static T jsonGet(json j) {
T val;
@ -73,9 +54,58 @@ void MainControlService::initialize() {
m_iflytopwsService.reset(new IflytopFrontEndService());
m_iflytopwsService->initialize("0.0.0.0");
m_iflytopwsService->onMessage.connect([this](weak_ptr<WebSocket> webSocket, json& cmd, json& receipt) { processFrontEndMessage(webSocket, cmd, receipt); });
m_iflytopwsService->startListen();
m_dbService.reset(new DBService());
m_dbService->initialize();
m_reportThread.reset(new Thread("reportThread", [this]() {
//
// {
// "command": "RealtimeSensorDataReport",
// "sensor_data": {
// "heating_strip": 1,
// "air_compressor": 0,
// "sprinkler_pump": 1,
// "disinfectant_volume": 99,
// "h2o2_1": 10,
// "temp_1": 11,
// "humid_1": 12,
// "saturation_1": 13,
// "h2o2_2": 14,
// "temp_2": 15,
// "humid_2": 16,
// "saturation_2": 17,
// "h2o2_3": 18,
// "temp_3": 19,
// "humid_3": 20,
// "saturation_3": 21
// }
// }
ThisThread thisThread;
while (!thisThread.getExitFlag()) {
json report;
report["command"] = "RealtimeSensorDataReport";
report["sensor_data"]["heating_strip"] = 1;
report["sensor_data"]["air_compressor"] = 0;
report["sensor_data"]["sprinkler_pump"] = 1;
report["sensor_data"]["disinfectant_volume"] = 99;
report["sensor_data"]["h2o2_1"] = 10;
report["sensor_data"]["temp_1"] = 11;
report["sensor_data"]["humid_1"] = 12;
report["sensor_data"]["saturation_1"] = 13;
report["sensor_data"]["h2o2_2"] = 14;
report["sensor_data"]["temp_2"] = 15;
report["sensor_data"]["humid_2"] = 16;
report["sensor_data"]["saturation_2"] = 17;
report["sensor_data"]["h2o2_3"] = 18;
report["sensor_data"]["temp_3"] = 19;
report["sensor_data"]["humid_3"] = 20;
report["sensor_data"]["saturation_3"] = 21;
m_iflytopwsService->sendReport(report);
thisThread.sleepForMs(1000);
}
}));
};
void MainControlService::processFrontEndMessage(weak_ptr<WebSocket> webSocket, json& cmd, json& receipt) {
@ -136,8 +166,8 @@ void MainControlService::processFrontEndMessage(weak_ptr<WebSocket> webSocket, j
* LOGIN_CMD *
*******************************************************************************/
if (cmdstr == "login") {
string uid = jsonGet<string>(cmd["userid"]);
string pwd = jsonGet<string>(cmd["passwd"]);
string uid = cmd["userid"];
string pwd = cmd["passwd"];
auto usr = m_dbService->getUser(uid);
if (usr == nullptr) {
logger->warn("login fail, user {} not exist", uid);
@ -171,8 +201,8 @@ void MainControlService::processFrontEndMessage(weak_ptr<WebSocket> webSocket, j
* chpasswd *
*******************************************************************************/
if (cmdstr == "chpasswd") {
string uid = jsonGet<string>(cmd["userid"]);
string pwd = jsonGet<string>(cmd["passwd"]);
string uid = cmd["userid"];
string pwd = cmd["passwd"];
logger->info("changet passwd {} {}", uid, pwd);
return;
}
@ -193,7 +223,7 @@ void MainControlService::processFrontEndMessage(weak_ptr<WebSocket> webSocket, j
if (cmdstr == "startDisinfection") {
int loglevel = jsonGet<int>(cmd["loglevel"]);
int roomVolume = jsonGet<int>(cmd["roomVolume"]);//
int roomVolume = jsonGet<int>(cmd["roomVolume"]); //
m_disinfectionCtrlService->startDisinfection(loglevel, roomVolume);
return;
}
@ -207,6 +237,7 @@ void MainControlService::processFrontEndMessage(weak_ptr<WebSocket> webSocket, j
* getState *
*******************************************************************************/
if (cmdstr == "getState") {
receipt["state"]["isLogin"] = m_deviceStateService->isLogin();
receipt["state"]["loginuser"] = m_deviceStateService->getLoginUid();
receipt["state"]["permissionLevel"] = m_deviceStateService->getLoginPermissionLevel();
receipt["state"]["workState"] = m_disinfectionCtrlService->isDisinfectionRunning();
@ -232,14 +263,14 @@ void MainControlService::processFrontEndMessage(weak_ptr<WebSocket> webSocket, j
}
if (cmdstr == "getAllRecords") {
string disinfection_id = jsonGet<string>(cmd["disinfection_id"]);
string disinfection_id = cmd["disinfection_id"];
auto dbval = m_dbService->getAllRecords(disinfection_id);
receipt["dbval"] = dbval;
return;
}
if (cmdstr == "setSettingVal") {
string settingName = jsonGet<string>(cmd["settingName"]);
string settingName = cmd["settingName"];
int settingVal = jsonGet<int>(cmd["settingVal"]);
bool suc = m_dbService->setSettingVal(settingName, settingVal);
if (!suc) {

2
src/main_control_service.hpp

@ -56,6 +56,8 @@ class MainControlService : public enable_shared_from_this<MainControlService> {
shared_ptr<DeviceStateService> m_deviceStateService;
shared_ptr<DisinfectionCtrlService> m_disinfectionCtrlService;
unique_ptr<Thread> m_reportThread;
public:
MainControlService(){};
void initialize();

6
src/service/device_state_service.hpp

@ -48,7 +48,11 @@ class DeviceStateService : public enable_shared_from_this<DeviceStateService> {
login_visible = visible;
}
void unlogin() { loginFlag = false; }
void unlogin() {
loginFlag = false;
login_uid = "";
login_permission_level = 0;
}
bool isLogin() { return loginFlag; }
int getLoginPermissionLevel() { return login_permission_level; }
int getLoginVisible() { return login_visible; }

21
src/service/disinfection_ctl_service.cpp

@ -20,14 +20,14 @@ string DisinfectionCtrlService::createDisinfectionID() {
// tm = *utctime::tm_increment_hour(&tm, 8);
// logger->info("trace sendmsg_startCapture {}:{}", __FILE__, __LINE__);
return fmt::format("{:0>4}-{:0>2}{:0>2}-{:0>2}{:0>2}{:0>2}", tm.tm_year + 1900, //
tm.tm_mon + 1, //
tm.tm_mday, //
tm.tm_hour, //
tm.tm_mon + 1, //
tm.tm_mday, //
tm.tm_hour, //
tm.tm_min, tm.tm_sec);
}
void DisinfectionCtrlService::initialize() {}
void DisinfectionCtrlService::startDisinfection(int loglevel,float roomVol) {
void DisinfectionCtrlService::startDisinfection(int loglevel, float roomVol) {
lock_guard<recursive_mutex> lock(lock_);
if (m_disinfectionThread) {
@ -43,21 +43,19 @@ void DisinfectionCtrlService::startDisinfection(int loglevel,float roomVol) {
ThisThread thisThread;
// 发送开始拍照消息
logger->info("start feeding {}", m_disinfectionID);
logger->info("start disinfection {}", m_disinfectionID);
while (!thisThread.getExitFlag()) {
m_remaintime--;
if (m_remaintime == 0) {
logger->info("feeding finished {}", m_disinfectionID);
logger->info("disinfection finished {}", m_disinfectionID);
break;
}
logger->info("disinfection running {} {}s", m_disinfectionID, m_remaintime);
thisThread.sleepForMs(1000);
}
{
lock_guard<recursive_mutex> lock(lock_);
m_isDisinfectionRunning = false;
}
{ m_isDisinfectionRunning = false; }
}));
}
void DisinfectionCtrlService::stopDisinfection() {
@ -67,7 +65,8 @@ void DisinfectionCtrlService::stopDisinfection() {
m_disinfectionThread->join();
m_disinfectionThread = nullptr;
}
logger->info("stop feeding {}", m_disinfectionID);
m_remaintime = 0;
logger->info("stop disinfection {}", m_disinfectionID);
}
bool DisinfectionCtrlService::isDisinfectionRunning() {
lock_guard<recursive_mutex> lock(lock_);

Loading…
Cancel
Save