1、從GitHub或者其他網站下載最新的協議棧源碼
源碼結構如圖所示:
其中src是協議棧源碼,可直接拿來使用,apps里面是一些功能的應用示例,有BACnet IP,BACnet MSTP,BACnet Router等功能。
2、協議棧移植完成后,需要改造幾個函數與自己的硬件接口想匹配才能使用
1)使用以下四個函數進行初始化工作,可參考協議棧的示例
其中Device_Set_Object_Instance_Number()用來設置本設備的ID號,通過客戶端掃描出來的設備就會帶上這個ID號,Init_Service_Handlers()用于設置本設備支持哪些服務,比如SERVICE_UNCONFIRMED_WHO_IS,SERVICE_UNCONFIRMED_WHO_HAS,SERVICE_UNCONFIRMED_I_AM,SERVICE_UNCONFIRMED_I_HAVE等等,開發者可根據自己要開發的設備等級去支持相應的服務,BACnet協議棧就是通過這些服務進行數據通訊的,address_init()是初始化地址緩存表,dlenv_init()是接口相關的初始化行為,只有這個初始化正確完成后才能進行IP或者MSTP相關的通訊。
2)dlenv_init()函數里面已經定義好了幾種不同介質的初始化行為,有IP6,IP,MSTP,BSC,開發者可根據自己要開發的設備通訊類型去開啟不同的宏定義,dlenv_init()里面最重要的是datalink_init()初始化函數
調用此函數就會跳轉到對應介質的初始化函數中,如果是定義了BACDL_BIP宏定義則
在bip_init()中用戶需自己實現兩個socket的創建,可參考應用示例完成,比較簡單;如果是定義了BACDL_MSTP宏定義,則通過dlmstp_init()去完成串口的初始化行為,串口的初始化相對麻煩點,這里對串口的初始化還附帶了MSTP端口的其他接口功能初始化,如圖所示
后續MSTP通訊都通過MSTP_Port來進行,用戶需提前注冊此接口中的一些函數,可參考如下所示
需要完成RS485接口相關的函數注冊以及時間設置相關的函數,可參考如下:
然后在dlmstp_init()函數中完成初始化行為。
至此接口部分的初始化行為就完成了。
3、創建一個任務用于接收BACnet的數據,不停地調用接收端口,如下所示
至此,就基本完成了BACnet協議棧移植和數據通訊相關的工作,如果收到IP端或者485端的數據,會進入npdu_handler()函數中,最終會調用相應的服務處理信息。