列車實時數據通信協議(TRDP)探索之路【四】

經過一段時間的學習,基於以太網交換機的TRDP PD開發調試結果已經正常了,故此,記錄一下。

TRDP基於生產者、消費者模型。

TRDP PD 通信模式有兩種,push和pull。在這兩種模式中,網絡設備又可以分爲三種角色:publisher、subscriber、requester.

publisher是數據的提供者,在push和pull模式中負責發送註冊的comId的數據,即所謂的生產者;

subscriber是數據的接受者,這push和pull模式中負責接收註冊的comid的數據,即所謂的消費者;

requester是數據的請求者,在pull模式中負責對publisher發起請求,pd-pdu的頭部中會帶有相應的reply IP和reply comID,如果頭部中沒有指定需要reply的IP和comID,則publisher會把接收到的報文的源作爲reply的目的給發送回去。

在pull模式中,requester也可以是subscriber。

/**************************************************************************************************************************************************/

 tlc_ 提供了trdp的通用接口,因此在驗證功能時非常好用。

//trdp 協議棧初始化
//初始化打印函數和VOS的內存管理
EXT_DECL TRDP_ERR_T tlc_init (
    const TRDP_PRINT_DBG_T  pPrintDebugString,
    void                    *pRefCon,
    const TRDP_MEM_CONFIG_T *pMemConfig);
//打開一個trdp 協議棧session入口,這裏主要是進行協議棧的配置,返回pAppHandle,這個至關重要
EXT_DECL TRDP_ERR_T tlc_openSession (
    TRDP_APP_SESSION_T              *pAppHandle,
    TRDP_IP_ADDR_T                  ownIpAddr,
    TRDP_IP_ADDR_T                  leaderIpAddr,
    const TRDP_MARSHALL_CONFIG_T    *pMarshall,
    const TRDP_PD_CONFIG_T          *pPdDefault,
    const TRDP_MD_CONFIG_T          *pMdDefault,
    const TRDP_PROCESS_CONFIG_T     *pProcessConfig);

1、PD publisher驗證

數據的發佈者需要先準備發送的數據,將comID、destip、timeout等信息作爲一個實體添加到協議棧的發送隊列中

EXT_DECL TRDP_ERR_T tlp_publish (
    TRDP_APP_SESSION_T      appHandle,
    TRDP_PUB_T              *pPubHandle,
    const void              *pUserRef,
    TRDP_PD_CALLBACK_T      pfCbFunction,
    UINT32                  comId,
    UINT32                  etbTopoCnt,
    UINT32                  opTrnTopoCnt,
    TRDP_IP_ADDR_T          srcIpAddr,
    TRDP_IP_ADDR_T          destIpAddr,
    UINT32                  interval,
    UINT32                  redId,
    TRDP_FLAGS_T            pktFlags,
    const TRDP_SEND_PARAM_T *pSendParam,
    const UINT8             *pData,
    UINT32                  dataSize);

TRDP_ERR_T tlp_put (
    TRDP_APP_SESSION_T  appHandle,
    TRDP_PUB_T          pubHandle,
    const UINT8         *pData,
    UINT32              dataSize);

這裏的每一個實體都是不重複的。因此,在週期推送數據的過程中,trdp 會 依次遍歷自己的發送隊列,將信息發送給目的地址。

這裏的tlp_put()的功能就是將所需要發送的信息作爲pd-pdu的dataset組織好數據報,放入發送隊列中相應的節點存儲。利用linux的select()函數來進行非阻塞的等待,週期性推送timeout的數據,即馬上要發送的數據。

2、subscriber驗證

subscriber是數據的接受者,需要先註冊接收的信息,包含了源IP範圍、comID,然後調用tlp_subscribe來註冊到協議棧session的接收隊列中。

EXT_DECL TRDP_ERR_T tlp_subscribe (
    TRDP_APP_SESSION_T  appHandle,
    TRDP_SUB_T          *pSubHandle,
    const void          *pUserRef,
    TRDP_PD_CALLBACK_T  pfCbFunction,
    UINT32              comId,
    UINT32              etbTopoCnt,
    UINT32              opTrnTopoCnt,
    TRDP_IP_ADDR_T      srcIpAddr1,
    TRDP_IP_ADDR_T      srcIpAddr2,
    TRDP_IP_ADDR_T      destIpAddr,
    TRDP_FLAGS_T        pktFlags,
    UINT32              timeout,
    TRDP_TO_BEHAVIOR_T  toBehavior)

協議棧根據timeout時間來接收綁定的socket數據,對接收到的數據進行校驗,例如CRC、TOPOCOUNT、SRCIP、COMID。根據pdu的msgType來判斷是否是Pr類型的數據,pr類型也就是請求包,收到這樣的包需要查看發送隊列是否存在comid相同的節點,如果存在,需要馬上將數據作爲msgType==Pp推送給reply IP,並且通知trdp user層(打印函數)。

3、requester驗證

請求數據和publisher很相似,不過這裏是調用了tlp_request來進行msgType==Pr數據的準備。

EXT_DECL TRDP_ERR_T tlp_request (
    TRDP_APP_SESSION_T      appHandle,
    TRDP_SUB_T              subHandle,
    UINT32                  comId,
    UINT32                  etbTopoCnt,
    UINT32                  opTrnTopoCnt,
    TRDP_IP_ADDR_T          srcIpAddr,
    TRDP_IP_ADDR_T          destIpAddr,
    UINT32                  redId,
    TRDP_FLAGS_T            pktFlags,
    const TRDP_SEND_PARAM_T *pSendParam,
    const UINT8             *pData,
    UINT32                  dataSize,
    UINT32                  replyComId,
    TRDP_IP_ADDR_T          replyIpAddr)

tlp_request會生成一個新的實體,放入trdp session的發送隊列中去。如果收到相應的Pp報文,則需要通知trdp user層。

/***********************************************************************************************************************************************/

PD數據的推拉模式,源碼中已經寫的比較獨立和清晰,需要關注的點是和操作系統的對接,主要也就是socket編程。PD使用的是UDP協議,IANA 分配的port爲17224,iec61375-2-3中規定的是20548。在UDP對接中,不同的系統的難度是不一樣的,源碼可以再Windows系統和linux系統直接生成相應的執行文件,適配網絡平臺則需要慢慢調試,驗證相應的收發功能。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章