什麼是zigbee
無線傳感網絡的無線通信技術可以採用zigbee,藍牙,wifi和紅外
Zigbee技術是一種短距離,低複雜度,低功耗,低成本,低數據速率的雙向無線通信技術,是一組基於IEEE802.15.4無線標準研製開發的有組網,安全和應用軟件方面的通信技術
Zigbee應用範圍
智能家居 - 對家用電器的控制和家庭娛樂系統的管理
樓宇自動化 - 整合並集中管理照明,採暖,製冷和安全和採集周圍環境
工業自動化 - 利用傳感器採集工業生產過程中的數據並進行分析和處理,提高工業產生的安全性
醫學領域 - 將藉助於各種傳感器和Zigbee網絡,準確而且實時的檢測每個病人的血壓,體溫和心跳速度等信息
Zigbee協議體系結構
我們在學習網絡的時候瞭解到網絡的軟件架構是按照分層的思想設計的,每個層負責不同功能,如典型的有OSI協議參考模型以及TCP/IP協議模型
zigbee協議也是在OSI參考模型上,結合無線網絡的特點,採用分層思想實現
Zigbee標準將網絡節點按照功能分爲 協調器 (Coordinator),路由器(Router), 終端設備(EndDevice)
協調器:
爲每個設備分配一個唯一的網絡地址
爲整個網絡選擇一個唯一的16位的PAN ID(個域網標誌符),通過這個ID,網絡中的設備就可以通過網絡地址來相互通信
初始化,終止,轉發網絡中的信息
路由器:
允許設備加入網絡,擴展網絡覆蓋的物理範圍和數據包路由的功能
終端設備
主要負責無線網絡數據的採集
點亮LED的硬件電路
寄存器 :
程序 代碼:
#include "iocc2530.h"
#define LED1 P1_0
#define LED2 P1_1
#define LED3 P1_4
#define LED_NO 0
#define LED_OFF 1
void led_init(void);
void delay(unsigned int time);
int mian(void)
{
led_init();
while(1)
{
LED1 = LED_ON;
delay(10);
LED1 = LED_OFF;
delay(10);
LED2 = LED_ON;
delay(10);
LED2 = LED_OFF;
delay(10);
LED3 = LED_ON;
delay(10);
LED3 = LED_OFF;
delay(10);
}
}
void led_init(void)
{
P1SEL &= ~(1 << 0); //普通I/O口
P1DIR |= (1 << 0); //輸出模式
LED1 = LED_OFF; //關燈
P1SEL &= ~(1 << 1);
P1DIR |= (1 << 1);
LED2 = LED_OFF;
P1SEL &= ~(1 << 4);
P1DIR |= (1 <<4);
LED3 = LED_OFF;
}
void delay(unsigned int time)
{
unsigned int i,j;
for(i = 0; i < time; i++)
{
for(j = 0; j < 10000; j++)
{
}
}
}
串口通信:
添加頭文件:
#include "MT_UART.H"
#include "string.h"
在 void SampleApp_Init(uint8 task_id)函數裏添加
MT_UartInit();
在 void SampleApp_Init(uint8 task_id)函數裏添加
HalUARTWrite(0,"",strlen())
協議棧
OSAL
Zigbee協議棧的實時操作系統
操作系統抽象層 - Operating System Abstraction Layer
作用: 任務調度,資源分配和管理
關鍵字:任務與事件
taskCnt ——任務個數
taskEvents —— 指向事件表首地址的指針
taskArry —— 數組,數組中的每個元素都指向事件處理函數的指針
協議棧運行機制
入口在Zmain文件下,Zmain.c的main函數中,其中包含了各種硬件和協議棧的初始化,直到調用osal_start_system()函數,協議棧纔開始真正運行起來
int main(void)
{
//...
//...
osal_start_system(); //No Return from here
return 0; //Shouldn't get here
}
在 OSAL_SampleApp.c 中找 SampleApp_ProcessEvent
#define SYS_EVENT_MSG 0x8000
#define SAMPLEAPP_SEND_PERIODIC_MSG_EVT 0x0001
//如果這倆個事件同時發生,則events = 0x8001
//異或運算,同爲0 , 異爲 1
events ^ SYS_EVENT_MSG = 0x001 //則只剩下後一個事件
events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT = 0x8000 //只剩下前一個事件
if (events & SYS_EVENT_MSG)
{
//...
//...
}
設備間對話
功能要求
協調器組建 PAN 網絡
協調器組網成功後會週期性廣播“ I am coordinator device” 5s
終端設備節點加入該PAN網絡,加入網絡成功後週期性廣播字節串“I am endpoint device” 5s
實現過程
void SampleApp_SendPeriodicMessage(void)
{
if(AF_DataRaquest(&SampleApp_Periodic_DstAddr,
&SampleApp_eqDesc,
SAMPLEAPP_PERIODIC_CLUSTERID,
1,
(uint8 *)&SampleAppPeriodicCounter,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS) == afStatus_SUCCESS)
{
}
else
{
}
}
發送數據函數
AF_DataRequest(afAddrType_t * dstAddr, //目標設備地址
endPointDesc_t * srcFP, //端口描述符
uint16 cID, //命令號
uint16 len, //數據長度
uint8 * buf, //數據
uint8 * transID, //發送數據包序列號
uint8 options, //有效位掩碼的發送選項 一般設 AF_DISCV_ROUTE
uint8 radius) //傳送跳數或半徑 一般設 AF_DEFAULT_RADIUS
地址結構體
typedef struct
{
union
{
uint16 shortAddr; //網絡地址,該地址是設備在加入網絡時由協議棧分配的
ZLongAddr_t extAddr; //64位擴展地址,全球唯一
}addr;
afAddrMode_t addrMode; //地址模式(廣播,組播,單播)
byte endPoint; //端口號,可供範圍1 ~ 240
uint16 panId; //一個無線網絡的網絡號
}afAddrType_t;
發送模式結構體
typedef enum
{
afAddrNotPresent = AddrNotPresent, //當前地址不存在
afAddr16Bit = Addr16Bit, //用於單播
afAddr64Bit = Addr64Bit, //用於單播
afAddrGroup = AddrGroup, //用於組播
afAddrBroadcast = AddrBroadcast //用於廣播
}afAddrMode_t;
端口描述符
typedef struct
{
byte endPoint; //端口號
byte * task_id; //指定哪一個任務
SimpleDescriptionFormat_t * simpleDesc; //設備簡單描述符
afNetwordkLatencyReq_t latencyReq; //延時請求
}endPointDesc_t;
設備簡單描述符
typedef struct
{
byte EndPoint; //端口號
uint16 AppProfld; //規範號,一個規範定義一個應用領域,
uint16 AppDeviceId; //設備類型ID
byte AppDevVer:4; //應用設備版本號
byte Reserved:4; //保留位
byte AppNumInClusters; //輸入簇的列表
cId_t *pAppInClusterList; //輸入簇的列表
byte AppNumOutClusters; //輸出簇的個數
cId_t *pAppOutClusterList; //輸出簇的列表
}SimpleDescriptionFormat_t;
規範
在Zigbee網絡中進行數據收發都是建立在應用規範基礎上,每個應用規範都有一個ID來標識,應用規範又可以分爲公共規範和製造商特定規範,公共規範ID的範圍是0x0000 ~ 0x7FFF,製造商特定規範ID的範圍0xBF00 ~ 0xFFFF
簇(cluster)
簇是一個應用領域下的一個特定對象,例如:智能家居中有這個調光器需要一些命令,實現這些操作需要不同的命令,多個操作命令的集合叫簇
在設備簡單描述符中需要填充輸入簇和輸出簇,填充時需要注意:
消息發送方需把命令放在輸出簇裏,那麼消息接受方需要把同樣的命令放在輸入簇裏,之前的設備間第一次通話,由於輸入簇和輸出簇是一樣的,所以協調器和終端設備間也能正常通信