国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

13 關于端點和簇以及規范的補充

2019-11-08 03:09:05
字體:
來源:轉載
供稿:網友
心理學專家告訴我們,一個貼子不能寫得太長,否則會讓讀者有疲勞感。。。(背景音:哪個專家說的?--自己百度去,肯定不是奧特曼~~~)按照專家的指點,我們把設備“對話”專題,又分了個part 2,就這樣,還不知道能不能把這部分說得清楚呢,汗自己一個。。。  在第一部分中,我們只是做了下基礎的工作,從“壹”開始,搭建了一個屬于自己的工作平臺,雖然和主題有點相去甚遠,但我認為這對我們后面的理解很有必要,這能幫助我們排除一些非重要因素的干擾,把復雜的事情變得簡單--這也是我們網站的宗旨所在![注:本文源自www.feibit.com--“飛比”Zigbee論壇,為尊重勞動者成果,如需轉載請保留此行]  下面我們要繼續第一部分的工作,由于之前我們只是完成了一個設備(Coordinator)的項目搭建,對一個最小化的Zigbee網絡,在筆記一中已經做過介紹,至少要一個Coordinator和一個End Device,不過為了方便以后的應用,在這里我們把Coordinator、Router和End Device這三種設備一起添加到項目中。具體的做法如下:在“PRoject ==> edit configurations”中,分別建立“Coordinator”“Router”及“EndDevice”三種設備的項目設置,注意在"based on configuration"下拉框中要選擇之前做過配置的“debug”,然后刪除“debug”與“release”。同時,有幾個地方是“Router”及“EndDevice”與“Coordinator”設置有所差異,我們必須要按照“GenericApp”的設置手動修改的(1)C/C++ compiler ==> preprocessor ==> defined symbols(2)C/C++ compiler ==>Extra Options(3)linker ==>Extra Options這三點對我們理解到整個項目的結構也是非常有幫助的。因為這樣我們就知道了,在workspace中選擇不同的設備時,到底有哪些具體的不同。至此,我們就有了具有三種設備的一個基礎項目,終于可以開始讓機器“說話”啦。。。是不是“鋪墊”鋪得太長了,不知道還有沒有人有耐心看到這里,對我的寫作思路有異議的同學,歡迎批評啊~~~-- 2010.5.9 by outman from Feibit言歸正傳,“說話”首先要明確要跟誰說?是對某個人,一組人,所有人,還是自言自語?在Zigbee協議中,有五種類型的地址:  AddrNotPresent = 0,  AddrGroup = 1,  Addr16Bit = 2,  Addr64Bit = 3,  AddrBroadcast = 15其中,64位的地址是一個“全地址”,就像你的手機在國外打要撥008613XXXXXXXXX,此地址全球唯一,64位的地址理論上可以支持2^64=1.8*10^19個設備,8個0是一個億,那就是1800億億,天哪,這是多少啊~~~~~16位地址相當于我們的集團短號了(一個Coordinator下的唯一地址),而當地址類型為Group與Broadcast時,分別對應一組設備和所有設備。作為第一個“對話”的例子,我們從最簡單的廣播式開始--老張和老王都在大聲講話,所有人都聽得到。然后,在此基礎上,再探討一下如何進行“私聊”。明確了“跟誰說”和“說什么”的問題之后,從大腦到神經系統再到肌肉組織等等一系列的復雜的協調動作,已經由Zigbee組織給我們規定好,并且由TI公司給我們完成了,雖然很多同學可能對這個更感興趣,但介于目前的水平,我們還是先來看看“嘴”在哪里,和怎么用吧?afStatus_t AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP,                           uint16 cID, uint16 len, uint8 *buf, uint8 *transID,                           uint8 options, uint8 radius )這個就是我們要用的“嘴”--把它研究清楚了,我們就有了學習說話的基礎了。這里面的數據結構有點復雜,不過還是讓我們來一條條地逐一研究吧。在這之前,先說幾個在這個復雜的數據表中幾個比較重要的概念。[子問題]10.3 Short address, Profile ID, Endpoint, Cluster ID都代表什么意思?區別在哪里?要說明這個問題,舉個“智能家居”里的“無線開關”的例子,可能會更直觀點 在這個例子里,左邊是兩個開關(可能裝在走廊里),兩個開關共用一個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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巨鹿县| 平顶山市| 海南省| 林口县| 吉水县| 商河县| 临城县| 绥中县| 巴林右旗| 滕州市| 门头沟区| 新疆| 嘉善县| 大理市| 湘乡市| 庆城县| 朔州市| 南昌市| 栖霞市| 龙游县| 二连浩特市| 宁化县| 舟山市| 永年县| 宝丰县| 屯留县| 西乌| 鹤壁市| 胶州市| 北辰区| 蓝山县| 炎陵县| 北川| 惠州市| 固镇县| 万盛区| 田林县| 淮滨县| 高密市| 大港区| 澄江县|