#pragma once #include "LogicDevice.h" #define CONTAINERDPC_API #define CONTAINERDPC_C_API extern "C" class CONTAINERDPC_API ModuleDevice : public LogicDevice { friend class ModuleConfig; protected: string m_strModuleFileName; string m_strModuleFilePath; string m_strConfigFilePath; ResDataObject m_resHardwareInfo; //硬件信息 ResDataObject m_resModuleConfig; //模型配置文件 是从磁盘上读取的初始内容,包含该设备模型的配置项 ResDataObject m_resProperties; //当前对象的属性值,通过set/get/add/del 操作的属性可以直接访问 ResDataObject m_resGets; ResDataObject m_resSets; ResDataObject m_resAdds; ResDataObject m_resDels; ResDataObject m_resActions; ResDataObject m_resUpdates; ResDataObject m_resWebConfig; //web配置项 bool m_bSendIndependently; //使用独立连接发送消息 ccos_mqtt_connection* m_pSendConn; string m_strSendClientID; RET_STATUS SendNotify(ResDataObject* pCmd); RET_STATUS NotifyProperty(const char* property); RET_STATUS GetUpdatableItems(string level, ResDataObject& resItems); RET_STATUS SaveToConfigFile(); bool CheckSubDevice(); virtual RET_STATUS UpdateItem(const char* pszProperty, const char* pszValueUpdate, ResDataObject& resRespons); virtual RET_STATUS OnUpdate(const char* pszProperty, const char* pszValueUpdate, ResDataObject& resRespons); virtual RET_STATUS OnDel(const char* pszPropery, ResDataObject& resDelValue, ResDataObject& resResponse); virtual RET_STATUS OnAdd(const char* pszPropery, ResDataObject& reAddValue, ResDataObject& resResponse); virtual RET_STATUS SetItem(const char* pszPropery, ResDataObject& resSetValue, ResDataObject& resResponse); virtual RET_STATUS GetItem(const char* pszPropery, ResDataObject& resResponse); virtual RET_STATUS OnAction(const char* pszActionName, const char* pszParams, ResDataObject& resResponse); virtual RET_STATUS OnMessage(const char* pszTopic, const char* pszMessageValue, ResDataObject& resResponse); RET_STATUS SystemLog(SYSLOGLEVEL Level, const char* pCode, const char* fmt, ...); RET_STATUS IoSystemLog(int Level, const char* pCode, const char* pContext, size_t ContextSize, const char* pAppId = ""); public: ModuleDevice(); virtual ~ModuleDevice(); void SetHardwareInfo(ResDataObject& resHardwareInfo) { m_resHardwareInfo = resHardwareInfo; } RET_STATUS Request(ResDataObject PARAM_IN* pRequest, ResDataObject PARAM_OUT* pResponse) override; RET_STATUS CmdToLogicDev(ResDataObject PARAM_IN* pCmd) override; bool GetDeviceType(GUID& DevType) override; void SubscribeSelf() override; void OnSetClientID() override; void SplitCcosDevicePath(string DevicePath, vector& resTopicParams) { // 使用 stringstream 和 getline 按照 "/" 切割路径 std::stringstream ss(DevicePath); std::string token; // 清空之前的数据 resTopicParams.clear(); // 按照"/"切割路径并存入resTopicParams while (std::getline(ss, token, '/')) { resTopicParams.push_back(token); } } RET_STATUS SYSTEM_CALL GetDeviceResource(ResDataObject PARAM_OUT* pDeviceResource) override; RET_STATUS DevGet(const char* pszDevUri, const char* pszProperty, ResDataObject& resRespons) override; RET_STATUS DevSet(const char* pszDevUri, const char* pszProperty, const char* pszValueSet, ResDataObject& resRespons) override; RET_STATUS DevUpdate(const char* pszDevUri, const char* pszProperty, const char* pszValueUpdate, ResDataObject& resRespons) override; RET_STATUS DevAdd(const char* pszDevUri, const char* pszProperty, const char* pszValueAdd, ResDataObject& resRespons) override; RET_STATUS DevDel(const char* pszDevUri, const char* pszProperty, const char* pszValueDel, ResDataObject& resRespons) override; RET_STATUS DevAction(const char* pszDevUri, const char* pszActionName, const char* pszParams, ResDataObject& resRespons) override; RET_STATUS DevMessage(const char* pszDevUri, const char* pszTopic, const char* pszMessageValue, ResDataObject& resRespons) override; };