1. 程式人生 > >Zigbee有線網路轉zigbee閘道器API

Zigbee有線網路轉zigbee閘道器API

1.1編譯選項對話方塊的位置

1.在專案名稱是右擊選擇options


2.找到C/C++ Complier選項卡,通過單擊右側紅方框的右箭頭找到Preprocessor,在Definedsymbols中就是需要增加的巨集,每個巨集一行以回車代表當前巨集結束,有關ZStack的巨集的說明請參考

\ZStack-CC2530-2.4.0-1.4.0\Documents\Z-Stack CompileOptions.pdf


1.2幾個重要的巨集

APP_UIP:用來指示是否增加UIP功能,就是網路功能,協調器端需要新增,終端側不用新增。

NV_INIT

NV_RESTORE:斷電重新上電保持原來的狀態,保護現場,通過這個巨集,終端每次啟動就不需要重新搜尋網路加入固定的網路

POWER_SAVING:省電模式,電池模式,能減小電流,TI曾經舉過一個例子,3000MAH的電池能用3年以上,參見Measuring Power Consumption of CC2530 With Z-Stack.pdf,當然想要達到這個效果僅僅配置這個是不夠的,還有很多。當前程式的配置預設空閒電流關閉所有LED拆掉usb轉串列埠晶片的時候小於1ma

2、如何使用工程

Zstack採用了類似作業系統的概念,有時間片輪訓,任務優先順序,任務建立等等,對於使用者來講,不必關心內部怎麼運轉的,只需要理解幾個重要函式即可。注意所有的函式都在App/ZigbeeGateWay.c裡面,一般不需要更改其它的檔案,使用者要更改的所有檔案幾乎都在App資料夾下面。


2.1初始化任務函式ZigbeeGateWay_Init( uint8 task_id )

您可以把你自己的初始化程式碼放到這裡面即可,為了不影響其他的執行,建議把使用者初始化程式碼放到該函式的後面



2.2訊息處理函式 uint16ZigbeeGateWay_ProcessEvent(uint8 task_id, uint16 events )

訊息處理函式:收到系統訊息並拆包呼叫相應的函式處理訊息

注意Switch裡面的case語句是檢視的是系統訊息型別,ZStack認為按鍵訊息,空中傳來的RF訊息等是系統訊息,Switch外面的if語句是非系統訊息。得到訊息後拆包訊息並交給相應的函式處理。


對於使用者來講,如何發出一個訊息呢?

系統訊息,先定義一個訊息結構體,結構體類似

typedef struct
{
 osal_event_hdr_t  hdr;   //事件頭指標
 uint8             length;  //標誌位
 uint8*            msg;
} uIP_Msg_t;

其中結構體uIP_Msg->hdr.event 的值對應的就是case裡面的條件語句判斷值

執行

osal_msg_send(ZigbeeGateWay_TaskID, (uint8 *)uIP_Msg);


就可以發出一個訊息,當然這個訊息不是馬上執行的,而是時間片輪詢到這個訊息是時候才執行。

非系統的訊息可以用類似這種

osal_start_reload_timer(ZigbeeGateWay_TaskID, UIP_PROCESS_EVT, 10);

發出一個訊息,這個訊息被if判斷語句執行,其中UIP_PROCESS_EVT對應的值就是if語句的條件判斷值。這句話的意思是每隔10ms發出UIP_PROCESS_EVT訊息。如果使用者想新增自定義的訊息,可以先定義一個唯一的event。


2.3收到RF資料void ZigbeeGateWay_MessageMSGCB( afIncomingMSGPacket_t *pkt )

空中傳來了一個RF訊息收到後就會執行這個函式,傳過來的結構體指標裡面有很多內容:



typedef struct
{
 osal_event_hdr_t hdr;     /* OSALMessage header */
 uint16 groupId;           /*Message's group ID - 0 if not set */
 uint16 clusterId;         /*Message's cluster ID */
 afAddrType_t srcAddr;     /*Source Address, if endpoint is STUBAPS_INTER_PAN_EP,
                               it's an InterPANmessage */
 uint16 macDestAddr;       /* MACheader destination short address */
 uint8 endPoint;           /*destination endpoint */
 uint8 wasBroadcast;       /* TRUEif network destination was a broadcast address */
 uint8 LinkQuality;        /* Thelink quality of the received data frame */
 uint8 correlation;        /* Theraw correlation value of the received data frame */
 int8  rssi;               /* The received RF power inunits dBm */
 uint8 SecurityUse;        /*deprecated */
 uint32 timestamp;         /*receipt timestamp from MAC */
 afMSGCommandFormat_t cmd; /* Application Data */
} afIncomingMSGPacket_t;

2.4傳送一個RF資料AF_DataRequest(……)


AF_DataRequest(&ZigbeeGateWay_Periodic_DstAddr, &ZigbeeGateWay_epDesc,
                      ZIGBEEGATEWAY_PERIODIC_CLUSTERID,
                       22,
                       ledstate,         
                      &ZigbeeGateWay_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS )

其中CLUSTERID代表簇,簡單點就是一個ID號收發都使用的。

在收到的函式裡面,有rssi代表了訊號強度

LinkQuality代表連結質量


2.5網路收到資料void APP_uIP_Message_Process(u8_t* msg,u8_t length)

收到一個乙太網包


2.6向網路傳送資料uip_tcp_send(pkt->cmd.Data,pkt->cmd.DataLength);

向乙太網傳送一個包



2.7按鍵處理程式voidZigbeeGateWay_HandleKeys( uint8 shift, uint8 keys )

按鍵按下後將會執行這個函式,KEY1對應的按鍵是

HAL_KEY_SW_6


2.8開啟關閉LED指示燈HalLedSet(HAL_LED_2,HAL_LED_MODE_TOGGLE);

關閉/開啟LED

1.        HalUARTWrite(HAL_UART_PORT,"RFreceive:",11);

向串列埠傳送資料

2.        void HalLedBlink (uint8 leds,uint8 numBlinks, uint8 percent, uint16 period)

LED閃爍

numBlinks  - number of blinks

percent    - the percentage in each period where theled

            will be on

    period    - length of each cycle in milliseconds