#include "Device.h" #include "common/Logger.h" #include "common/Utils.h" #include "protocol/Communicator.h" #include "common/JsonN.h" //int DeviceEntity::getAttrInt(std::string key) //{ // auto iter = mapAttrs.find(key); // if (iter == mapAttrs.end()) { return 0; } // return Utils::toInt(iter->second); //} // //float DeviceEntity::getAttrFloat(std::string key) //{ // auto iter = mapAttrs.find(key); // if (iter == mapAttrs.end()) { return 0.0f; } // return Utils::toFloat(iter->second); //} // //double DeviceEntity::getAttrDouble(std::string key) //{ // auto iter = mapAttrs.find(key); // if (iter == mapAttrs.end()) { return 0.0; } // return Utils::toDouble(iter->second); //} // //std::string DeviceEntity::getAttrStr(std::string key) //{ // auto iter = mapAttrs.find(key); // if (iter == mapAttrs.end()) { return ""; } // return iter->second; //} int Device::startComm() { if (!isOpen) { if (commEntity && commEntity->isAlive()) { commEntity->close(); } return 0; } // 从属性列表中获取通讯方式和通讯地址、端口 std::string commType = attrs.getStr("commType"); // 如果entity的通讯协议类型当前配置不一致,需要关闭连接删除通讯后创建新的通讯 if (commEntity && commEntity->type != commType) { commEntity->close(); commEntity = nullptr; } // 创建新的通讯 if (!commEntity) { commEntity = Communicator::createEntity(attrs); if (!commEntity) { return -1; } } commEntity->start(); return 0; } std::shared_ptr Device::create(DataFields& fields) { auto device = std::make_shared(); device->deviceId = fields.getInt("device_id"); device->type = fields.getInt("type"); device->name = fields.getStr("name"); device->code = fields.getStr("code"); device->isOpen = fields.getInt("is_open"); device->attrsJson = fields.getStr("attrs"); // 解析属性的JSON字符串,转换成键值对 NJson jsonroot; bool ret = NJsonParse(device->attrsJson, jsonroot); if (!ret) // 解析错误 { XLOGE() << "device attr json parse error, device_id=" << device->deviceId; } else { for (auto& [key, val] : jsonroot.items()) { std::string valType = val.type_name(); if (valType == "string") { device->attrs.set(key, val.get()); } else if (valType == "number") { device->attrs.set(key, val.get()); } else { XLOGE() << key << ": [" << valType << "]"; } } } // 启动通讯,该函数中会自动判断isOpen状态,选择是否进行通讯连接 device->startComm(); return device; } // //std::vector> Device::getDeviceByType(int type) //{ // std::vector> vecDevice; // for (auto iter = mapDevices.begin(); iter!=mapDevices.end(); ++iter) // { // auto device = iter->second; // if (device && (type<=0 || device->type == type)) // { // vecDevice.push_back(device); // } // } // return vecDevice; //}