Hermes 协议的封装是3年前的事了,写在这里一来是为分享,二来是为备忘,为纪念过去的那些日子。
Hermes通迅被称为半导体、SMT行业三大标准协议之一,关于它的介绍,大家可以网上找找,全称为:IPC-HERMES-952,The global standard for "M2M in SMT assenmbly. 其重要性不言而喻。
接触hermes协议,也是一次机缘,在这里感恩领导的安排,经历半个月的通读Hermes协议源码,被作者的构思和严密的逻辑所吸引,至今,我认为TCP服务端和客户端写的最好的代码还是hermes。
Hermes 是什么鬼?简单的说就是TCP的服务端和客户端,支持断线重连机制,里面包含有udp,tcp(client,server),不过它们之间的通迅协议是一套标准,发什么,下一步收什么,一步一步都规定好了。
它的原版是一个C 型风格的动态库,不容易调用,使用者一时半会很难入手,因此二次封是必须的,目的是简化使用,整理出S上、下游的调用接口 和流程通迅接口的C++动态库,让使用者一目了然,又不用给项目增加各种环境兼容处理工作,总之就是化繁为简:
以下便是二次封代码头文件部分:
#pragma once
#include <functional>
#include <HermesData.h>
#ifdef LIBHERMES_EXPORTS
#define LIBHERMESDLL_API __declspec(dllexport)
#else
#define LIBHERMESDLL_API __declspec(dllimport)
#endif
typedef std::function<void(void* m_pData, uint32_t sessionId, EHermesState state,
const HermesConnectionInfo* hercInfo)> HMS_connectedCallback;
typedef std::function<void(void* m_pData, uint32_t sessionId, EHermesState state,
const HermesError* sdata)> HMS_disconnectCallback;
//----
typedef std::function<void(void* m_pData, uint32_t sessionId, EHermesState state,
const HermesServiceDescriptionData* sdata)> HMS_servicesDescriptionCallback;
//
typedef std::function<void(void* m_pData, uint32_t sessionId, const HermesCheckAliveData* sdata)> HMS_checkAliveCallback;
//
typedef std::function<void(void* m_pData, uint32_t sessionId, EHermesState state)> HMS_stateCallback;
//
typedef std::function<void(void* m_pData, uint32_t sessionId, const HermesNotificationData* sdata)> HMS_notificationCallback;
typedef std::function<void(void* m_pData)> HMS_voidCallback;
typedef std::function<void(void* m_pData, unsigned sessionId, EHermesTraceType ehType, HermesStringView trace)> HMS_traceCallback;
//define over-------------------------------------------------------------------------------------------
//upstream--->DwonClient define
typedef std::function<void(void* m_pData, uint32_t sessionId, const HermesSendBoardInfoData* sdata)> HMS_sendBoardInfoCallback;
typedef std::function<void(void* m_pData, uint32_t sessionId, EHermesState state, const HermesBoardAvailableData* sdata)> HMS_boardAvailableCallback;
typedef std::function<void(void* m_pData, uint32_t sessionId, EHermesState state, const HermesRevokeBoardAvailableData* sdata)> HMS_revokeBoardAvailableCallback;
typedef std::function<void(void* m_pData, uint32_t, EHermesState state, const HermesTransportFinishedData* sdata)> HMS_transportFinishedCallback;
typedef std::function<void(void* m_pData, uint32_t sessionId, EHermesState state, const HermesBoardForecastData* sdata)> HMS_boardForecastCallback;
//downstream--->upserver define below
typedef std::function<void(void* m_pData, uint32_t sessionId, EHermesState state, const HermesMachineReadyData* sdata)> HMS_machineReadyCallback;
typedef std::function<void(void* m_pData, uint32_t sessionId, EHermesState state, const HermesRevokeMachineReadyData* sdata)> HMS_revokeMachineReadyCallback;
typedef std::function<void(void* m_pData, uint32_t sessionId, EHermesState state, const HermesStartTransportData* sdata)> HMS_startTransportCallback;
typedef std::function<void(void* m_pData, uint32_t sessionId, EHermesState state, const HermesStopTransportData* sdata)> HMS_stopTransportCallback;
typedef std::function<void(void* m_pData, uint32_t sessionId, const HermesQueryBoardInfoData* sdata)> HMS_queryBoardinfoCallback;
namespace LWHermes
{
extern "C"
{
//Hermes upstream:
LIBHERMESDLL_API void* __stdcall HDownCreate(std::string clientAddress, const int conport, std::string boardID, const int sessionID, std::string machinID);
LIBHERMESDLL_API void __stdcall downsv_notification(void* downclient, std::string msg);
LIBHERMESDLL_API void __stdcall downsv_sendXMLStr(void* downclient, std::string strXML);
LIBHERMESDLL_API void __stdcall downsv_resetWithXMLStr(void* downclient, std::string strXML);
LIBHERMESDLL_API void __stdcall downsv_reset(void* downclient, std::string strMsg);
LIBHERMESDLL_API void __stdcall downsv_description(void* downclient);
// downsv
LIBHERMESDLL_API void __stdcall downsv_machineReady(void* downclient);
LIBHERMESDLL_API void __stdcall downsv_revokeMachinReady(void* downclient);
LIBHERMESDLL_API void __stdcall downsv_stopTransport(void* downclient);
LIBHERMESDLL_API void __stdcall downsv_startTransport(void* downclient);
LIBHERMESDLL_API void __stdcall downsv_checkAlive(void* downclient);
LIBHERMESDLL_API void __stdcall downsv_queryBoardInfo(void* downclient);
//-----
LIBHERMESDLL_API void* __stdcall HUpCreate(std::string clientAddress, const int conport, std::string boardID, const int sessionID, std::string machinID);
LIBHERMESDLL_API void __stdcall upct_reset(void* upserver, std::string strMsg);
LIBHERMESDLL_API void __stdcall upct_resetWithXMLStr(void* upserver, std::string strXML);
LIBHERMESDLL_API void __stdcall upct_sendXMLStr(void* upserver, std::string strXML);
LIBHERMESDLL_API void __stdcall upct_notification(void* upserver, std::string msg);
LIBHERMESDLL_API void __stdcall upct_description(void* upserver);
LIBHERMESDLL_API void __stdcall upct_boardAvaliable(void* upserver);
LIBHERMESDLL_API void __stdcall upct_revokeBoardData(void* upserver);
LIBHERMESDLL_API void __stdcall upct_transportFinished(void* upserver);
//
LIBHERMESDLL_API void __stdcall upct_boardForecast(void* upserver);
LIBHERMESDLL_API void __stdcall upct_sendBoardInfo(void* upserver);
LIBHERMESDLL_API void __stdcall upct_checkAlive(void* upserver);
//downclient
LIBHERMESDLL_API void __stdcall setShareObserverD1(void* downclient, HMS_connectedCallback _hc, HMS_disconnectCallback _hd, HMS_checkAliveCallback _hcha);
LIBHERMESDLL_API void __stdcall setShareObserverD2(void* downclient, HMS_stateCallback _hst, HMS_voidCallback _hvod, HMS_traceCallback _htrac);
LIBHERMESDLL_API void __stdcall setShareObserverD3(void* downclient, HMS_servicesDescriptionCallback _hsec, HMS_notificationCallback _hnot);
LIBHERMESDLL_API void __stdcall setShareObserverNoticationD(void* downclient, HMS_notificationCallback _noct);
//
LIBHERMESDLL_API void __stdcall setObserver_down1(void* downclient, HMS_boardForecastCallback _hbsa, HMS_sendBoardInfoCallback _rba);
LIBHERMESDLL_API void __stdcall setObserver_down2(void* downclient, HMS_boardAvailableCallback _hbsa, HMS_revokeBoardAvailableCallback _rba, HMS_transportFinishedCallback _htrsf);
//Hermes upserver
LIBHERMESDLL_API void __stdcall setShareObserverU1(void* upserver, HMS_connectedCallback _hc, HMS_disconnectCallback _hd, HMS_checkAliveCallback _hcha);
LIBHERMESDLL_API void __stdcall setShareObserverU2(void* upserver, HMS_stateCallback _hst, HMS_voidCallback _hvod, HMS_traceCallback _htrac);
LIBHERMESDLL_API void __stdcall setShareObserverU3(void* upserver, HMS_servicesDescriptionCallback _hsec, HMS_notificationCallback _hnot);
LIBHERMESDLL_API void __stdcall setShareObserverNoticationU(void* upserver, HMS_notificationCallback _noct);//
LIBHERMESDLL_API void __stdcall setObserver_up1(void* upserver, HMS_machineReadyCallback _hbsa, HMS_startTransportCallback _rba, HMS_stopTransportCallback _rs);
LIBHERMESDLL_API void __stdcall setObserver_up2(void* upserver, HMS_queryBoardinfoCallback _hbsa, HMS_revokeMachineReadyCallback _rba);
}
}