在這個例子里,左邊是兩個開關(可能裝在走廊里),兩個開關共用一個Zigbee節點“Z1”(相當于開發板上的兩個按鍵,這點應該不難理解吧),他們一起控制右邊的三個燈泡(也是接在同一個節點上的--“Z2”)。Z1的key1控制Z2的lamp1,而key2則控制Z2的lamp2與lamp3。OK,回到這個問題1. short address,16位的短地址,由Coordinator/Router來分配(注:這里留個伏筆,地址分配的問題后面會專門做個專題來講)2. Profile ID, 這個是由Zigbee組織來分配的應用ID號,比如無線開關用0x0001,智能電表用ox0002,萬用遙控器用0x0003等等。在這個例子里,這個ID號是專門用來做電燈開關的。為什么要這么做呢?這里就體現了“標準”的意義,不同廠家功能的設備,由于有了這個ID就能互相間使用了,正泰的開關一樣可以控制Philips的燈。。。3. Endpoint,這個名字看起來容易誤解,以為是設備的序號了,其實不然。在這個例子中,Z1有key1/key2兩個Endpoint,分別做不同的事情。其對應了同一個"application"中的0-240個不同的“子應用”,其中0號endpoint是用"ZDO"預留的,不能占用。4. Cluster ID,這個怎么叫呢?叫信息簇ID吧。。。我的理解是,“這是個哪類的信息”,發送端和接收端一定要對應,但是具體這個“類”怎么分,是我們可以自己決定的。比如說這個例子,我可以這樣定:Cluster ID=1代表開關一次,Cluster ID=2代表連續閃爍。。。或者定義Cluster ID=1代表點對點控制,而Cluster ID=2代表全部控制,等等。。。-- 2010.5.12 00:24 by outman from Feibit[子問題]10.4 什么是Beacon?Beacon我們可以簡單地理解為一個“指揮棒”,在有beacon的傳輸中,發送與接收設備是按照一個固定的節奏來進行數據傳輸的。好了,現在我們就把要控制這個“嘴”的所有參數列出來,把最重要的一個個來說。這次就不上圖了,換個方式。注:{}中的數據為本例的“廣播”式傳輸的設置值/*****************************************************************************/*dstAddr ........................目標地址 shortAddr ................................... 16位短地址{0xFFFF--代表“廣播”} addrMode .................................... 地址類型,上文已做過闡述{AddrBroadcast} endPoint ..................................... 目標“EndPoint”序號,其意義見上文{20}/*****************************************************************************/*srcEP ...........................源“EndPoint”描述 endPoint .................................... 源“EndPoint”序號{20} *task_id ..................................... 所要調用的任務ID{BeginApp_TaskID} *simpleDesc EndPoint ..................... 源“EndPoint”序號(為什么又有一個?--等搞明白了再補充){20} AppProfId ................... profile ID號,其意義見上文{0x0F08} AppDeviceId ............... 16位的設備ID號{0x0001} AppDevVer ................. 設備版本號{0} Reserved .................... AppFlags(此上三項,具體用處以后再補充){0} AppNumInClusters ....... 輸入Cluster的總數目,Cluster的意義見上文{1} *pAppInClusterList ...... 輸入Cluster的列表{BeginApp_ClusterList} AppNumOutClusters ..... 輸出Cluster的總數目{1} *pAppOutClusterList .... 輸出Cluster的列表{BeginApp_ClusterList} latencyReq ................................. Beacon的使用情況,本例中沒有用到。{noLatencyReqs}/*****************************************************************************/cID ........................................................... 本次要發送的Cluster ID號{1}len ............................................................ 本次要發送的數據長度{發送字符串長度} *buf .......................................................... 本次要發送的數據的存放地址{字符串地址}*transID .................................................... 數據傳輸“排隊”號{0}options ...................................................... 發送選項,如是否要ACK,加密,是否跳過路由等等 {AF_DISCV_ROUTE}radius ........................................................ 最大“折射”次數/“多跳”級別{10}/*****************************************************************************/由于本例中,每個節點都只對應一個endpoint,所以只要保證設為同一個值,可以去不理會。重點設置紅色部分項目。至此,我們基本認識了這個“嘴”的每一根控制神經,下面就要正式說話了~~~不記得在OSAL中如何讀取按鍵,如何響應事件的同學請復習下“日記(二)”中的內容,這里只簡單地把最重要的代碼貼出來。1. 按鍵 Hal_key.c HalKeyPoll函數,增加 if (!(P0 & HAL_KEY_SW_1)) { ksave0 |= HAL_KEY_SW_1; }以讀取按鍵IO口狀態,判斷按鍵,當然在成熟的產品中需要做一個“消抖”算法2. 響應按鍵,發送數據BeginApp.c 的KEY_CHANGE函數中:#ifdef IAMZHANG char say_hello[] = "LAO ZHANG: lao wang, chi le mei?";#else char say_hello[] = "LAO WANG: lao zhang, chi le mei?";#endif BeginApp_SendP2PMessage(say_hello);此函數將調用AF_DataRequest,其參數按上述設置即可3. 接收數據并回復BeginApp.c 的接受信息函數BeginApp_MessageMSGCB中添加rec_msg = pkt->cmd.Data;//reply after 2 seconds osal_start_timerEx( BeginApp_TaskID, BEGINAPP_SEND_REPLY_MSG_EVT, BEGINAPP_SEND_MSG_TIMEOUT );4. 另外,添加一個LED閃爍的函數BeginApp_BlinkLED與串口發送數據函數UART_Send_String,在發送或接收時進行必要的顯示。此處只進行重點部分的講解,需要源文件的同學請跟帖,如有必要,則會以附件形式共享出來。好了,終于舒了一口氣,剩下最后一個小問題了~[子問題]10.5 如何知道當前設備的短地址?它是怎么分配的?試下在程序的某個位置調用一下NLME_GetShortAddr這個函數,看看不同的設備會返回什么值?這個就是為節點分配的short address,有點像路由器給電腦分配IP的感覺。知道了這個,我們做一個小實驗,把前面“老張”和“老王”的聊天變成“私聊”。其實只需要在上面的設置參數里,改變一下這兩個就可以了 shortAddr ................................... {Coordinator:0 /EndDevice:0x796F} addrMode .................................... {Addr16Bit}這兩個設備地址,我們都只是通過實驗的方法找到的,但究竟why?是誰在按什么標準分的?呃。。。我還不清楚,估計得專門有個專題能講得清楚了~~~-- 2010.5.12 by outman from Feibit




新聞熱點
疑難解答