diff --git a/README.md b/README.md index 8cfdd1c..8bc1824 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,16 @@ 2. 日志过期自动删除 3. DB过期记录自动删除 4. 量产时记得将websocketIP修改成127.0.0.1 +5. 远程控制功能 + +必须要完成的功能: +6. 软件升级功能 + +//补充协议 +1. 时间修改 +2. getState时,传感器信息的上报,所有受控设备的开关状态 +3. 修改密码时,需要传递旧密码。 +4. 设置的默认配置信息name错误 ---------------------------------- diff --git a/iflytoplinuxsdk b/iflytoplinuxsdk index 7be7036..419371f 160000 --- a/iflytoplinuxsdk +++ b/iflytoplinuxsdk @@ -1 +1 @@ -Subproject commit 7be7036d99eca24b6a5d4e9ae0361fcbc936b90f +Subproject commit 419371f95936fa7f49389fbc07bac250f21240a9 diff --git a/src/db/db_service.cpp b/src/db/db_service.cpp index 5bfa23a..b9b805f 100644 --- a/src/db/db_service.cpp +++ b/src/db/db_service.cpp @@ -18,53 +18,53 @@ using namespace nlohmann; // auto notJohn = storage.get_all(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(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(where(c(&User::uid) == "vendor")); if (vendor.size() == 0) { - storage.insert({"vendor", "9973", 1, true}); // 厂商 + storage.insert({-1, "vendor", "9973", 1, true}); // 厂商 } auto admin = storage.get_all(where(c(&User::uid) == "admin")); if (admin.size() == 0) { - storage.insert({"admin", "9973", 2, true}); // 管理员 + storage.insert({-1, "admin", "9973", 2, true}); // 管理员 } auto user = storage.get_all(where(c(&User::uid) == "user")); if (user.size() == 0) { - storage.insert({"user", "0000", 3, true}); // 普通用户 + storage.insert({-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(where(c(&Setting::id) == 0)); - if (s0.size() == 0) storage.insert(Setting{0, "stoped_gs", "消毒停止过氧化氢溶度", 0, 2000, 1, 1000}); - auto s1 = storage.get_all(where(c(&Setting::id) == 1)); - if (s1.size() == 0) storage.insert(Setting{1, "continued_gs", "消毒继续过氧化氢溶度", 0, 2000, 1, 800}); - auto s2 = storage.get_all(where(c(&Setting::id) == 2)); - if (s2.size() == 0) storage.insert(Setting{2, "stoped_satur", "消毒停止过氧化氢相对饱和度", 0, 100, 1, 80}); - auto s3 = storage.get_all(where(c(&Setting::id) == 3)); - if (s3.size() == 0) storage.insert(Setting{3, "continued_satur", "消毒继续过氧化氢相对饱和度", 0, 100, 1, 60}); - auto s4 = storage.get_all(where(c(&Setting::id) == 4)); - if (s4.size() == 0) storage.insert(Setting{4, "max_humidity", "允许消毒最大湿度", 0, 100, 1, 90}); - auto s5 = storage.get_all(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(where(c(&Setting::id) == 6)); - if (s6.size() == 0) storage.insert(Setting{6, "injection_pump_speed", "喷射蠕动泵转速", 0, 2000, 2, 500}); + if (storage.get_all(where(c(&Setting::id) == 1)).size() == 0) // + storage.insert(Setting{1, "stoped_gs", "消毒停止过氧化氢溶度", 0, 2000, 1, 1000}); + + if (storage.get_all(where(c(&Setting::id) == 2)).size() == 0) + storage.insert(Setting{2, "continued_gs", "消毒继续过氧化氢溶度", 0, 2000, 1, 800}); + + if (storage.get_all(where(c(&Setting::id) == 3)).size() == 0) + storage.insert(Setting{3, "stoped_satur", "消毒停止过氧化氢相对饱和度", 0, 100, 1, 80}); + + if (storage.get_all(where(c(&Setting::id) == 4)).size() == 0) + storage.insert(Setting{4, "continued_satur", "消毒继续过氧化氢相对饱和度", 0, 100, 1, 60}); + + if (storage.get_all(where(c(&Setting::id) == 5)).size() == 0) // + storage.insert(Setting{5, "max_humidity", "允许消毒最大湿度", 0, 100, 1, 90}); + + if (storage.get_all(where(c(&Setting::id) == 6)).size() == 0) + storage.insert(Setting{6, "drainage_pump_speed", "排液蠕动泵转速", 0, 2000, 2, 500}); + + if (storage.get_all(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(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; } diff --git a/src/db/db_service.hpp b/src/db/db_service.hpp index 9ed8a18..f49db1c 100644 --- a/src/db/db_service.hpp +++ b/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; }; diff --git a/src/main_control_service.cpp b/src/main_control_service.cpp index 513b104..e2e9d90 100644 --- a/src/main_control_service.cpp +++ b/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 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, 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, json& cmd, json& receipt) { @@ -136,8 +166,8 @@ void MainControlService::processFrontEndMessage(weak_ptr webSocket, j * LOGIN_CMD * *******************************************************************************/ if (cmdstr == "login") { - string uid = jsonGet(cmd["userid"]); - string pwd = jsonGet(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, j * chpasswd * *******************************************************************************/ if (cmdstr == "chpasswd") { - string uid = jsonGet(cmd["userid"]); - string pwd = jsonGet(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, j if (cmdstr == "startDisinfection") { int loglevel = jsonGet(cmd["loglevel"]); - int roomVolume = jsonGet(cmd["roomVolume"]);// + int roomVolume = jsonGet(cmd["roomVolume"]); // m_disinfectionCtrlService->startDisinfection(loglevel, roomVolume); return; } @@ -207,6 +237,7 @@ void MainControlService::processFrontEndMessage(weak_ptr 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, j } if (cmdstr == "getAllRecords") { - string disinfection_id = jsonGet(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(cmd["settingName"]); + string settingName = cmd["settingName"]; int settingVal = jsonGet(cmd["settingVal"]); bool suc = m_dbService->setSettingVal(settingName, settingVal); if (!suc) { diff --git a/src/main_control_service.hpp b/src/main_control_service.hpp index 8d41352..d3ea35e 100644 --- a/src/main_control_service.hpp +++ b/src/main_control_service.hpp @@ -56,6 +56,8 @@ class MainControlService : public enable_shared_from_this { shared_ptr m_deviceStateService; shared_ptr m_disinfectionCtrlService; + unique_ptr m_reportThread; + public: MainControlService(){}; void initialize(); diff --git a/src/service/device_state_service.hpp b/src/service/device_state_service.hpp index a14e982..a8101ab 100644 --- a/src/service/device_state_service.hpp +++ b/src/service/device_state_service.hpp @@ -48,7 +48,11 @@ class DeviceStateService : public enable_shared_from_this { 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; } diff --git a/src/service/disinfection_ctl_service.cpp b/src/service/disinfection_ctl_service.cpp index ee1467e..1be41ac 100644 --- a/src/service/disinfection_ctl_service.cpp +++ b/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 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 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 lock(lock_);