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