1. 程式人生 > >Zigbee通訊之開發篇(基於TI 的Z-Stack)

Zigbee通訊之開發篇(基於TI 的Z-Stack)

1.Zigbee協議和Z-Stack

Zigbee協議和Z-Stack是什麼關係?這可能是初學Zigbee同學想知道的問題。給大家舉個例子吧,我們生活中使用的插排是要符合一定的標準的,現在國家標準是GB2099.3-2008,裡面規定了好多插排的電氣、機械等要求。不同廠家生產的插排,要在中國國內銷售的話,必須符合這個標準。但是生產這個插排的廠家多了去了,像 公牛、philips等等(排除做廣告的嫌疑)。其實Zigbee協議棧規範和Z-Stack的關係也差不多,Z-Stack就是符合Zigbee協議棧規範的一個硬體和軟體平臺,是Zigbee協議棧的一個具體實現。當然,還有其他的具體實現,freakz協議棧和contiki作業系統、TinyOS等等。大家要注意,Z-Stack是TI公司提供的協議棧,它是個半開源的協議棧,有些核心程式碼是以庫的形式提供的,所以要想深入瞭解協議棧或者想進一步提升程式設計能力的同學還是找一個全開源的協議棧玩玩吧。比如,freakz協議棧。

2.IAR和Z-Stack

Z-Stack的整個開發環境IDE使用的是IAR(IAR的版本需要參考Z-Stack Home Sample Application User's Guide。此文件在TI提供的資料包裡\Documents內)。從來沒有使用過IAR的同學請參考文章最後附件:IAR入門。這只是個簡單的入門指導,想詳細瞭解IAR或者使用過程中遇到什麼問題請使用IAR的help選項。

 我們知道Zigbee裝置的分為Coordinator、Router、Enddevice三種角色,這三種角色在IAR裡怎麼修改吶?我們開啟一個TI HA(TI提供的關於智慧家居的解決方案),下載地址見下載平臺:http://down.51cto.com/data/2067778

wKioL1Wk53LxIEsoAAFyv-dkGSI060.jpg

從圖中標示的位置可以修改這三種裝置角色,其實這裡的選項是修改IAR project配置的地方,這裡TI提供的project裡已經配置好了這三鍾Zigbee裝置角色的配置檔案。我們這裡只選擇就可以了。

Z-Stack軟體結構有一個很大的特點:使用巨集定義來區分是否編譯某一模組/功能/函式。

wKioL1Wk7nWQmoxpAAGhZuoMECk541.jpg

wKiom1Wk7QPiEbzKAAEYILvI9E8551.jpg

全是根據巨集定義來決定是否編譯這個功能,有的是根據是否定義這個巨集,有的是根據定義的這個巨集的值來決定其什麼作用。這也可以理解,因為TI提供的是一個通用的基礎開發平臺,需要考慮相容性,易用性,並且硬體資源有限,只能使用巨集定義的方式在程式預編譯階段根據巨集定義就可以知道需要哪些功能了。

那麼關鍵的問題來了,這些巨集定義在IAR裡是怎麼定義的類?在IAR中有兩種定義方式:

第一種:

wKiom1Wk7tHBhrJaAAG4NBIk_mE550.jpg

在開啟的TI project工程目錄的Tools下面,有***.cfg檔案,這些是IAR Compiler command-line options。可以在這裡定義巨集。

wKiom1Wk71aBvXOYAAIr1o9BUYo509.jpg

定義的方法是“-D 加上你要定義的巨集”,例如上面的 -DMAC_CFG_TX_MAX,其實定義的巨集就是MAC_CFG_TX_MAX,你搜索整個工程就可以找到在哪裡使用了這個巨集。取消定義可以在定義前加上“//”。例如//-DMAC_CFG_TX_DATA_MAX=5。

你可能想知道IAR讀取這些cfg檔案需要不需要配置?自己新增加配置檔案怎麼辦?

開啟選單欄 project---option

wKioL1Wk8w7TzqMGAAH4PJsKoOM737.jpg

找到C/C++Complier 選項,然後選擇Extra Options,在這裡寫你自己需要引用的cfg檔案就可以了。

第二種:

開啟選單欄 project---option 然後找到preprocessor選項。

wKioL1Wk9GSQ33xeAAJl6zDtaeg698.jpg

在這裡也可以定義巨集,直接書寫巨集的名字即可,例如:“ZTOOL_P1”。取消巨集定義可以在前面新增“x”,例如“xZTOOL_P1”。當然也可以定義有值的巨集,“LCD_SUPPORTED=DEBUG”。

另外,還要說一下上面截圖中的上面的部分:是新增標頭檔案包含路徑的,這樣在原始碼包含標頭檔案時你就不用書寫好長的路徑名稱了,直接寫標頭檔案名稱就行。

關於這兩種定義巨集有什麼區別?要是兩個地方都定義了相同的巨集但值不同(有可能是你馬虎定義重複了),這種情況以那個為準?

關於區別,第一種定義方式其實就是將要定義的某一類功能的巨集都放到一個檔案中,方便修改、查詢。這樣所有的工程都可以通過指定檔案的方式來使用這些巨集定義或者巨集定義的值。比較方便一些,例如:TI工程裡的f8wCoord.cfg這個巨集定義配置檔案,是針對所有Coordinator的定義,好多不同project想編譯成Coordinator角色的都可以引用這個command-line options檔案。

第二種方式定義只是針對具體某個project的,通過第二種方式設定的內容都會儲存在***.ewp檔案中,這個就是具體某個project的具體配置。

還有一點需要說明:

wKioL1Wlx1fQmKbFAACoarni4NA973.jpg

上面第一處是IAR關於某一個project的一個配置檔案,選中不同的配置檔案,IAR就會根據不同的配置進行編譯、連結等等一系列動作。這裡的配置主要包括:選單欄裡 roject---option裡面所有的設定,還有選擇是否編譯某一個具體的檔案。

wKioL1WlyIXg5kgVAAHZkcjuFi4900.jpg

顯示為暗灰色的X號的檔案不參與此project的編譯,設定方法為在project具體某個檔案上右鍵--option--Exclude from buid。如上圖所示。

IAR會單獨建立資料夾用於儲存不同peoject配置的編譯、連結生成的檔案。就相當於利用不同的配置實現不同的功能,最明顯的你想編譯一個release版本,編譯一個debug版本,release版本不包括除錯資訊。你就可以設定兩個配置。新增配置的方法是選單欄--project---edit configration裡面add即可。

wKioL1WlyeWyQEVkAACjfSXP9fQ752.jpg

這裡是選擇同一個工作空間裡不同的專案的。即IAR管理思路是這樣的:一個workspace裡可以包含好多的project,而一個project又可以存在好多種的配置。具體參考選單欄---help---IDE Project Management and Building Guide。

wKiom1WlyHOzxGHAAAB3cEnhh_s461.jpg

這是IAR的連結器使用的連結指令碼,使用這個檔案制定不同變數或者儲存區域的最終連結地址,還有其他一些功能,具體參考選單欄---help---Linker and Library Reference Guide。

3.Z-Stack軟體結構簡介

關於Z-Stack結構比較詳細的資料需要看這兩個TI的官方資料:Z-Stack Home Developer's Guide.pdf

Z-Stack Home Sample Application User's Guide.pdf。是比較全面的資料。關於TI Z-Stack的project各個資料夾的作用網路上已經有大量的資料,這裡就不一一贅述。大家可以到網路搜尋資料學習。我這裡只是簡單說一下基於Z-Stack協議棧開發application的思路和方法。Z-Stack project不僅僅提供了Zigbee協議棧的各層API,還提供了一個基於輪詢排程的OS(osal),還提供了一些硬體資源驅動API。各個API使用說明見 TI安裝包 Document---API裡面有各個API的使用說明。

下面我們重點說說這個OSAL,因為它是一個簡易的輪詢式作業系統,Z-Stack協議使用它作為簡單的任務管理、排程、任務間通通訊,使用它使其軟體結構更清晰。另外,我們基於Z-Stack協議的Application設計也要基於此軟體結構。關於這個東東的講解可以參考:http://bbs.feibit.com/thread-16-1-1.html。我這裡舉個例子讓大家好理解這個輪詢作業系統。如果大家有嵌入式實時作業系統的知識,那這個OSAL就比較好理解。其實OSAL並不是實際意義上的作業系統,它只是一個輪詢系統。大家可以想象一個部門有好幾個僱員,只有一個辦公電腦,這個辦公電腦同一時間只能有一位僱員使用,僱員使用辦公電腦需要部門領導審批。部門領導根據僱員年齡的大小進行排序,年齡小的先使用,年齡大的後使用。部門領導負責通知各個僱員在使用辦公電腦時都需要做哪些具體的工作,若某一僱員在得到辦公電腦的使用權時沒有任何事情需要做,那他就將辦公電腦讓給下一個等待的僱員使用。部門領導會根據發生的事件(包括外部事件、僱員之間需要溝通)記錄在一個工作安排薄裡,每一個僱員得到辦公電腦都需要查詢工作安排薄來看自己有哪些工作,工作做完了,再接著查詢,直到沒有自己的工作了,就讓下一個等待的僱員使用辦公電腦。

這下大家可能明白了,若是那個年齡最小的僱員老是有任務做,那其他僱員就沒有機會使用辦公電腦了。所以這個OSAL只是一個簡單的輪詢外部事件的簡單排程系統。想了解嵌入式實時作業系統的相關知識,可以學習一下UCOS的相關資料。

另外,我們還需要了解這樣一種軟體設計思路:Z-Stack作為一個基礎軟體開發包,為了易於維護軟體結構設計時是分層的,那各層之間如何通訊?上層需要呼叫下層的服務時,直接呼叫下層提供的API介面即可,那下層有一些緊急事件或者有些變化是上層關心的,如何通知到上層吶?上層接收到這樣的訊息時有可能需要做不同的操作,這一般怎麼實現吶?這種下層事件發生需要通知上層的情況,需要使用回撥函式,下層事件發生,會呼叫使用者高層註冊的函式來處理下層事件,這就實現了下層到上層的通訊。

所以一般我們需要註冊回撥函式,然後底層事件發生會呼叫我們註冊的函式,註冊函式可以根據傳遞過來的引數做相應處理。

4.兩個基於TI CC2530和Z-Stack平臺的裝置Zigbee通訊

一個Coordinator一個Enddevice,它們之間通訊,我們在Z-Stack提供的project---SimpleLight的基礎上進行修改原始碼做我們的實驗。實現現象如下:Coordinator建立網路後,Enddevice裝置加入網路,然後Coordinator通過廣播的方式傳送字串“Coordinator send!”,EndDevice收到此字串後控制LED燈閃爍,並且向Coordinator傳送“EndDevice received!\r\n”。Coordinator收到後,通過串列埠打印出來。使用的硬體平臺為battery board。

我們選擇CoordinatorEB配置選項。

wKiom1WmDf2y2l_iAACvLl5s4Ks966.jpg

我們移除project中App資料夾中的zcl_samplelight.c、zcl_samplelight.h、zcl_samplelight_data.c,新增Coordinator.c、Coordinator.h這兩個檔案,OSAL_GenericApp.c這個檔案是OSAL層和Application層之間的介面檔案。這個檔案主要負責OSAL的task的初始化,新增task event處理函式。

先看Coordinator的程式碼:

我們新新增一個task,在Z-Stack中新新增task一般需要以下兩步:1,新增task初始化函式:GenericApp_Init。

wKioL1WmBUXwI8H9AANH8n0uEuA443.jpg

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 /********************************************************************* * @fn      osalInitTasks * * @brief   This function invokes the initialization function for each task. * * @param   void * * @return  none */ void osalInitTasks( void ) { uint8 taskID = 0; tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));

相關推薦

Zigbee通訊開發基於TIZ-Stack

1.Zigbee協議和Z-Stack Zigbee協議和Z-Stack是什麼關係?這可能是初學Zigbee同學想知道的問題。給大家舉個例子吧,我們生活中使用的插排是要符合一定的標準的,現在國家標準是GB2099.3-2008,裡面規定了好多插排的電氣、機械等

數據結構復習開題必要時持續更新...

ptr ++ 數組 第一個元素 賦值 red ble 1.3 算術 在復習數據結構之前有必要復習一下C語言的指針 1.指針 int* p; 一個指針類型,名為p,代表的是一個整形所存放的地址編號 1.1一個使用的實例 【註】對變量使用&操作符,意為取它所在的地址

【數學】kd 樹演算法思路憂傷的小兔子

導語:kd 樹是一種二叉樹資料結構,可以用來進行高效的 kNN 計算。kd 樹演算法偏於複雜,本篇將先介紹以二叉樹的形式來記錄和索引空間的思路,以便讀者更輕鬆地理解 kd 樹。 圖較多,小心流量  作者:肖睿編輯:巨集觀經濟算命師本文由JoinQuant量化課堂推出,本文的難度屬於

資料科學個人筆記:推薦系統推薦演算法基於圖+隱語義

一、隱語義模型(LFM演算法) (一)基礎演算法 隱語義分析採取基於使用者行為統計的自動聚類,計算出使用者和隱類的關係和物品和隱類的關係。 此處使用LFM演算法,通過如下公式計算使用者u對物品i的興趣: Preference(u,i)=r(ui)=sum(p(u,k)

led子系統實戰實際led驅動編寫

led驅動應該是linux驅動中是最簡單的一個,下面實際講解關於led驅動編寫的過程。 早期的led驅動實際上在/dev/led生成檔案,當led成為一個單獨的子系統時,我們要用到led的子系統以及相關的函式 #include <linux/kernel.h>

Android分享配圖適合新人:騰訊分享QQ空間,好友,群

                開始分享之旅第一篇,爬過好多坑,在這裡總結下供和我一樣的菜鳥學習,有不足希望留言指點,不喜勿噴!     最終成果圖:       001.相信看分享的都會新建

Android開發顯示弄懂ppi、dpi、pt、px、dp、dip、sp之間的關係看這一就夠了

版權申明】非商業目的註明出處可自由轉載 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/85165773 出自:shusheng007 文章目錄 概述 要解決的疑問 概念篇

Windows驅動開發入門

        本文主要介紹“如何入門Windows驅動開發”和“新手需要掌握哪些知識和動手技能”,大部分是本人探索Windows驅動開發近一月時間的經驗之談。大致包括如下幾個方面: 1,開發工具、除錯工具和除錯手段; 2,Windows驅動開發框架; 3,驅動程式基本知識

Revit二次開發技能———區域標高不一致縮圖的實現

使用Revit出圖時,往往會遇到專案地庫標高不一致,在標註機電管線時,需要按照地庫地面標高去標註,但地庫地面標高又無法統一,需要手動取框選區域形成標高縮圖註明標高。 本文簡單分享一下利用土建模型中的樓板實現縮圖的快速方法; 1、讀取地庫建築面層的所有輪廓,篩選出建築面層的範圍線,利用範圍線生

Revit二次開發技能———窗體的實現

在Revit中很多時候,都需要使用者輸入相關的資料,然後再進行程式的執行。在Revit中如何實現窗體呢?請看以下程式碼: ParkingForm frmDlg = new ParkingForm(); frmDlg.ShowDia

Revit二次開發技能———軸網尺寸標註

在利用revit出圖時,避免不了要對軸網進行標註,下面分享一下軸網尺寸標註的一些開發經驗: 軸網尺寸標註: 首先要獲取到尺寸標註的引用,將引用新增到引用集合中,關鍵程式碼如下: ReferenceArray array = new ReferenceArray(); array.

Revit二次開發技能———軸網自動對齊

在做專案的過程中,軸網都是進行翻模或者拾取,而翻模出來的軸網往往都是不堪入目的,為了滿足專案需要,做了軸網對齊的功能,廢話不多說,直接上乾貨。 首先做一些準備工作,先建立一個軸網過濾類,接下來會用到,程式碼如下: class GridSelectionFilter : ISelection

Docker 三劍客 Docker Swarm基於 overlay 組網通訊

這一篇主要是對 Docker Swarm 的完善,增加基於 overlay 組網通訊,以便 Docker 容器可以跨主機訪問。 不同主機間的容器之間通訊方式,大概有三種: 使用埠對映:直接把容器的服務埠對映到主機上,主機直接通過映射出來的埠通訊。 把容器放到主機所在的網段:修改 docker 的 ip 分

iOS開發基礎14—— Block

版本 Xcode 9.1 block簡介 block是一個OC物件,於iOS4開始引入。其本身封裝了一段程式碼,可被當作變數、當作引數或作為返回值。block常用於GCD、動畫、排序及各類回撥傳值中。 block程式碼結構圖 注:圖片來自

Unity串列埠通訊基於三姿態感測器

/*******************************/ using UnityEngine; using System.Collections; //Other libraries using System; using System.Threading; using System.Collect

openlayers4 入門開發系列前端動態渲染克裏金插值 kriging 附源碼下載

db2 block i++ 參數 source 文件 str value 地圖 前言 openlayers4 官網的 api 文檔介紹地址 openlayers4 api,裏面詳細的介紹 openlayers4 各個類的介紹,還有就是在線例子:openlayers4

sed和awksed含sed高級用法

清空 pre 需要 amp 打印 多條 邏輯 help n) (原創文章,謝絕轉載~) sed(stream editor)和 awk 是linux環境下處理文本、數據的強大“利器”,sed對數據列的處理稍遜,awk則更似一門語言,control flow的語法基本和c語言

2017前端面試題Css1

margin 沒有 width ati clas 經驗 visible import tom 1 . CSS 屬性是否區分大小寫? 答:不區分。 HTML,CSS都對大小寫不敏感,但為了更好的可讀性和團隊協作一般都小寫,而在XHTML 中元素名稱和屬性是必須小寫的。

2017前端面試題Html1

utf doctype clas 停止 要求 驅動 抓取 -c 顯示錯誤 1 . doctype(文檔類型) 的作用是什麽? 對文檔進行有效性驗證: 它告訴用戶代理和校驗器這個文檔是按照什麽DTD 寫的。這個動作是被動的, 每次頁面加載時,瀏覽器並不會下載DTD

2017前端面試題Js1

load urn lis property eat hub bind tlist 方法的參數 1 . 請解釋事件代理 (event delegation) 當需要對很多元素添加事件的時,可以通過將事件添加到它們的父節點通過委托來觸發處理函數。其中利用到了瀏覽器的事件冒