Zigebee複習

主要是在老師給的重點上做一些擴展吧。

WPAN及ZigBee基礎

Zigbee、藍牙、IEEE802.11b(WiFi)標準都是工作在2.4G頻段的無線通信標準

Zigbee主要用在短距離無線控制系統,傳輸少量的控制信息

短距離無線網絡主要分爲:
無線局域網
無線個域網

無線個域網所對應的通信協議
HR-WPANS:802.15.3 Hign-Rate 高速:最高速度大於100Mbps
MR-WPANS:藍牙 Medium-Rate
LR-WPANS:802.15.4 Low-Rate低速:最低速度小於1Mbps


Zigbee最大傳輸速率:250kbps

Zigbee無線網絡分層: 物理層(PHY) 介質訪問控制(MAC)網絡層(NWK)應用程序支持子層(APS) 應用層(APL)

802.15.4 定義了物理層和介質訪問控制層
Zigbee協議定義了網絡層、應用程序支持子層和應用層

Zigbee特點:(自組網)高可靠性 低成本 低功耗 高安全 低數據速率

Zigbee設備分類:
協調器:主要負責無線網絡的建立與維護
路由器:主要負責無線網絡的路由
終端節點:主要負責無線網絡數據的採集
在這裏插入圖片描述



Zigbee工作在ISM(工業、科學和醫療)頻帶,共規定了27個信道:
2.4GHz頻段 共16個信道,通信速率爲250kbps
915MHz頻段 共10個信道,通信速率爲40kbps
896MHz頻段 共1個信道,通信速率爲20kbps
補充:2.4GHz是全球通用的ISM頻段,915Mhz是北美的ISM頻段,896MHz是歐洲認可的ISM頻段。 bps是每秒傳輸的二進制位數,即比特每秒。



Zigbee網絡拓撲結構:星型 網絡型 簇狀(樹狀)

Zigbee應用爲週期性 反覆 間斷數據採集應用
在這裏插入圖片描述

Zigbee模塊開發一般包括兩個文件:.h頭文件和.c文件
.h文件可理解爲一份接口描述文件
.c文件主要功能是對.h文件中聲明的外部函數進行具體實現

補充

1、Z-stack的工作流程:
在這裏插入圖片描述
Z-stack採用操作系統的思想來構建,可以降低系統功耗
2、課上使用的信道
範圍(11——26)共16個
在這裏插入圖片描述
如果每一個網絡設置一個信道用於區分,可能16個信道不夠使用; 如果兩個網絡設置在同一個默認信道,就有可能網絡A的終端設備加入到網絡B中去; 網絡B的協調器控制了網絡A 中的設備;好比,你們家的遙控器控制了鄰居家的燈開光;
解決這個問題的方法是; 使用PANID給網絡編號;範圍是0X0001----0XFFFF; 可以通過給不同的網絡 指定不同的網絡ID號來區分網絡,避免干擾;






CC2530

CC2530單片機是一款完全兼容8051內核,支持802.15.4協議的無線射頻單片機(高性能,低功耗)
CC2530的Flash(非易失性存儲器)容量可選: 32KB 64KB 128KB 256KB(我們用的是256)
CC2530有兩個晶振: 32MHz晶振 32.768KHz
I/O口控制
CC2530內部自帶溫度傳感器:
使用步驟:
1、使能溫度傳感器
2、連接溫度傳感器到ADC(不是lol那個了,指模擬數字轉換器)
3、初始化ADC,確定參考電壓、分辨率等,啓動ADC讀取溫度數據







補充

1、 CC2530的通用I/O端口相關的常用寄存器
引腳的控制寄存器 PxDIR:作爲通用I/O時,用來設置數據的傳輸方向。學的是設置爲0爲輸入,設置爲1爲輸出
電平設置 Px:數據端口,用來控制端口的輸出或獲取端口的輸入。
x代表的是數字


2、設置寄存器常用方法
清零:與&,置一:或|

3、 CC2530內部自帶溫度傳感器
使能溫度傳感器 :ATEST=0x01;
連接溫度傳感器:TRO|=0x01;
4、CC2530的LED間隔閃爍代碼


#include <ioCC2530.h>
#define LED1 P1_0    //定義P1_0口爲D1控制端(紅)
#define LED2 P1_1    //定義P1_1口爲D2控制端(藍)
//初始化
void IO_Init(void)
{
   
   
  P1DIR |= 0x02;     //P1_1定義爲輸出
  P1DIR |= 0x01;     //P1_0定義爲輸出
}
void delay(void)
{
   
   
  unsigned int i;
  unsigned char j;
  for(i = 0; i < 10000; i++)
  {
   
   
    for(j = 0; j < 240; j++)
    {
   
   
      asm("NOP"); //nop是內嵌彙編做空指令 延時用
      asm("NOP"); //是一個空等待彙編指令,這個指令執行時,單片機是什麼也不做,僅僅起一個時間延時作用。
      asm("NOP"); //是指函數內部的參數翻譯爲彙編指令,其作用是在C語言環境下直接使用匯編指令執行
    }  
  }  
}

void main(void)
{
   
      
    IO_Init();      //調用初始化程序
    int i = 0;
    //藍燈閃爍10次後紅燈閃爍
    /*
    while(i<10){
      LED1=0;         //點亮D1(紅)
      delay();
      LED1=1;
      delay();
      i++;
    }
      LED2=0;         //點亮D2(藍)
      delay();
      LED2=1;
    */
  //藍燈紅燈交替閃爍
     while(1){
   
   
      LED1=0;         //點亮D1(紅)
      delay();
      LED1=1;
      delay();
      LED2 =0;
      delay();
      LED2=1;
    }
}

Zigbee地址相關

設備地址:
64位IEEE地址:長地址 MAC地址 擴展地址 全球唯一
16位網絡地址:短地址 邏輯地址(協調器地址爲0x0000,其他設備入網時由協調器分配)在一個網絡中唯一

網絡地址:唯一標示網絡中的一個節點(用網絡地址來區分不同的節點)
網絡地址最多可以分配65536個節點,地址分配取決於整個網絡的架構,整個網絡的架構由一下3個值決定:
1、網絡最大深度 (5)
2、每個父節點擁有的孩子節點最大數目 (20)
3、每個父節點擁有的孩子節點路由器的最大數目 (6)
同一父節點相連的終端節點的網絡地址是連續的
同一父節點相連的路由器節點的網絡地址通常是不連續的





端口:每個節點上最多支持**240(1-240)**個端口,每個節點上的所有端口共用一個發射/接收天線(用端口來區分同一節點的端口)

PANID:Zigbee網絡號 可手動設置(或自動隨機生成),如果指定的PANID被佔用則自動加1。

補充

1、爲啥是65536個節點?
16位的網絡地址,那就是2^16次方
2、端口在Coordinator.h頭文件中定義

#define GENERICAPP_ENDPOINT 10

3、PANID(網絡號)
如果ZDAPP_CONFIG_PAN_ID被定義爲0xFFFF,那麼協調器將建立一個隨機的PANID
若要在應用中查看PANID可以這樣獲得,_NIB.nwkPanId,讀取這個就OK了
在這裏插入圖片描述在這裏插入圖片描述


數據發送接收

數據發送:調用AF_DataRequest()函數通過天線發送數據

afStatus_t  AF_DataRequest( afAddrType_t *dstAddr,
							endPointDesc_t *srcEP, 
							uint16 cID, uint16 len,
							uint8 *buf, 
							uint8 *transID,
							uint8 options,
							uint8 radius )

參數含義依次是:
afAddrType_t *dstAddr目的節點的網絡地址以及目的地址的模式(廣播,單播,或多播)和目的端口。
endPointDesc_t *srcEP源網絡地址描述
uint16 cID簇號
*uint16 len長度
uint8 buf指向發送數據緩衝區的指針

uint8 *transID事務序列號指針
uint8 options發送選項,
uint8 radius最大跳數






數據接收:調用osal_msg_receive()函數從消息隊列中接收一個消息(包含事件與數據)

uint8 *osal_msg_receive( uint8 task_id )

數據存儲位置(結構):
消息包: afIncomingMSGPacket_t

typedef struct
{
   
   
  osal_event_hdr_t hdr;     /* OSAL Message 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 InterPAN message */
  uint16 macDestAddr;       /* MAC header destination short address */
  uint8 endPoint;           /* destination endpoint */
  uint8 wasBroadcast;       /* TRUE if network destination was a broadcast address */
  uint8 LinkQuality;        /* The link quality of the received data frame */
  uint8 correlation;        /* The raw correlation value of the received data frame */
  int8  rssi;               /* The received RF power in units dBm */
  uint8 SecurityUse;        /* deprecated */
  uint32 timestamp;         /* receipt timestamp from MAC */
  afMSGCommandFormat_t  cmd; /* 重點 真正的成員數據儲存在這裏 */
} afIncomingMSGPacket_t;
typedef struct
{
   
   
  byte   TransSeqNumber;			//不重要,貌似是分包用的
  uint16 DataLength;               // 長度
  byte  *Data;					//真正的數據
} afMSGCommandFormat_t;

補充

1、如何取出發送的數據?
pkt->cmd.Data;
2、數據發送函數

//向路由器發送數據
void GenericApp_SendTheMessage( void )
{
   
   
  char theMessageData[] = "Coordinator Send!";
  afAddrType_t  my_DstAddr;
  my_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;//發送模式爲廣播
  my_DstAddr.endPoint=GENERICAPP_ENDPOINT;//目的端口
  my_DstAddr.addr.shortAddr=0xFFFF;//網絡地址爲0xFFFF時,向網絡中所有節點發送數據包
  AF_DataRequest( &my_DstAddr, &GenericApp_epDesc,
                       GENERICAPP_CLUSTERID,
                       (byte)osal_strlen( theMessageData ) + 1,
                       (byte *)&theMessageData,
                       &GenericApp_TransID,
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
}

3、數據接收處理函數
數據的接受上,在GenericApp_ProcessEvent回調函數中響應AF_INCOMING_MSG_CMD消息。這裏zstack會默認調用一個函數,是GenericApp_MessageMSGCB。在這裏處理根據afIncomingMSGPacket_t參數來進行數據的處理。
例如:

//對收到的路由器發送的數據包進行處理
void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
   
   
  unsigned char buf[20];
  unsigned char buffer[2] ={
   
   0x0A,0x0D};
  switch ( pkt->clusterId )
  {
   
   
    case GENERICAPP_CLUSTERID://簇號相等
      osal_memcpy(buf, pkt->cmd.Data,20);
      HalUARTWrite(1,buf,20); //向上位機寫路由器發來的數據
      HalUARTWrite(1,buffer,2);
      break;
  }
}

4、

endPointDesc_t GenericApp_epDesc;//節點描述符
byte GenericApp_TaskID; //任務優先級
byte GenericApp_TransID;//數據發送序列號

OSAL(操作系統抽象層)

OSAL(操作系統抽象層)是一種支持多任務運行的系統資源分配機制
OSAL主要功能:
任務註冊、初始化和啓動
任務間的同步、互斥
中斷處理
存儲器分配和管理




事件驅動: 任務(task)輪詢,事件(event )驅動
Zigbee將事件和任務的事件處理函數聯繫方法:
1、 建立一個事件表,保存各個任務的對應事件
2、 建立另一個函數表,保存各個任務事件處理函數地址
3、 將兩張表建立某種對應關係



OSAL工作原理(輪詢)void osal_start_system(void)
通過tasksEvents指針訪問事件表的每一項,如果有時間發生,則查找函數表找到事件處理函數進行處理,處理完後,繼續訪問事件表,查看是否有事件發生,無限循環

協議棧定義的事件成爲系統強制事件:
**AF_INCOMING-MSG-CMD:**收到一個新的無線數據
ZDO_STATE_CHANGE:設備網絡狀態變化
ZDO_CB_MSG:註冊的ZDO響應信息
AF_DATA_CONFIRM_CMD:發送事件後的確認信息



用戶自定義事件:用戶自定義事件

Zigbee協議棧爲半開源

補充

1、OSAL通過一個16位寬度的數組來管理事件,意味着OSAL最多可以支持16個事件,其中最高位(0x08000,SYS_EVENT_MSG)系統保留,用戶可以使用的事件有15個。
2、在這裏插入圖片描述
3、給任務添加事件:osal_set_event(uint8 task_id,uint16 event_flag)
在這裏插入圖片描述
4、自定義事件的使用
1)需要找個地方定義事件的ID,實際上是指定該事件佔用事件數組的哪個位。如#define MY_EVENT 0x02,佔用bit1。
2)在需要觸發事件的地方調用osal_set_event(task_id, event_flag) ,這個函數有兩個參數,一個是接收事件任務的ID,另一個參數指定事件ID.
3)在相應任務的處理函數,檢查該事件執行相應代碼即可。
if ( events & MY_EVENT )
4)清除事件標識。
return ( events ^ MY_EVENT )









Zigbee協議棧串口操作

串口基本操作步驟:
1、初始化串口,包括設置波特率、中斷等
2、向發送緩衝區發送數據或從接收緩衝區讀取數據
操作函數:
uint8 HalUARTOpen(uint8 port,halUARTCfg_t *config);// 初始化
uint16 HalUARTRead(uint8 port,uint8 buf,uint16 len);//讀
uint16 HalUARTWrite(uint8 port,uint8
buf,uint16 len);//寫




舉個栗子:
uartConfig.configured           = TRUE;
uartConfig.baudRate             = HAL_UART_BR_115200;//波特率
uartConfig.flowControl          = FALSE;//流控制
uartConfig.callBackFunc         = NULL; //不需要回調函數時
uartConfig.callBackFunc         = rxCB;//需要回調函數時
HalUARTOpen(1,&uartConfig);

unsigned char buf[20];
HalUARTWrite(1,buf,20); //向上位機寫路由器發來的數據
HalUARTRead(1,buf,20);//從上位機讀數據

串口回調函數:回調函數不是由該函數實現方直接調用的,而是在特定的事件或條件發生的,由另外的一方調用,用於對該事件或條件進行響應。因此,串口回調函數是在有串口操作(事件)發生時(自動觸發)調用的

當應用有串口操作時,應該對應用程序模塊的工程屬性的編譯預處理的Definedsymbols下拉列表框中輸入“HAL_UART=TRUE”。(即用條件編譯來控制是否編譯與該模塊相關的程序,目的是爲了節約存儲資源)
課上教的配置:
HAL_UART_ISR=2
串口操作端口用1
Hal目錄下的Target下的Drivers目錄的_hal_uart_isr.c中的註釋掉if(isrCfg.txMT)



程序中波特率的設置要與上位機(如串口助手)一致。

Zigbee協議棧NV操作

NV(Non Volatile),即非易失性存儲器(Flash存儲器),即系統掉電,存儲器中的數據不掉失。主要用途保存網路的配置參數,或掉電後,上電該節點還是加入原來的網絡並且該節點的網絡地址就可以從NV讀取。
NV存儲器主要的操作有初始化NV存儲器、讀NV存儲器、寫NV存儲器。
這些都在OSAL文件夾下中的OSAL_Nv.hOSAL.h文件中定義和實現。

下面三個操作函數分別是:
NV初始化函數:uint8 osal_nv_item_init( uint16 id, uint16 len, void *buf ),NV存儲器將該存儲器分成多個條目,每個條目都有一個ID號。
條目的分類見OSAL文件夾中的ZcomDef.h文件,其中要知道的是:用戶應用程序定義的條目地址範圍爲是0x0201到0x0FFF;

NV寫操作函數:uint8 osal_nv_write( uint16 id, uint16 ndx, uint16 len, void buf );
NV讀取函數:uint8 osal_nv_read( uint16 id, uint16 ndx, uint16 len, void buf );
第一個參數:uint16:NV條目ID號
第二參數:舉例條目開始的偏移量
第三參數:要寫入的數據長度
第四參數:執行要存放寫入或讀取數據函數緩衝區的指針




用戶只能使用條目ID範圍0x0201~0x0FFF
可在OSAL文件夾下的ZcomDef.h文件中添加自己的條目
如:#define Test_NV 0x0201

補充

nv操作實驗 重點看回調函數裏頭的

#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include "GenericApp.h"
#include "DebugTrace.h"
#if !defined( WIN32 )
#include "OnBoard.h"
#endif
/* HAL */
#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"
//nv
#include "OSAL_Nv.h"
// This list should be filled with Application specific Cluster IDs.
const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS] =
{
   
   
  GENERICAPP_CLUSTERID
};
const SimpleDescriptionFormat_t GenericApp_SimpleDesc =
{
   
   
  GENERICAPP_ENDPOINT,              //  int Endpoint;
  GENERICAPP_PROFID,                //  uint16 AppProfId[2];
  GENERICAPP_DEVICEID,              //  uint16 AppDeviceId[2];
  GENERICAPP_DEVICE_VERSION,        //  int   AppDevVer:4;
  GENERICAPP_FLAGS,                 //  int   AppFlags:4;
  GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;
  (cId_t *)GenericApp_ClusterList,  //  byte *pAppInClusterList;
  GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;
  (cId_t *)GenericApp_ClusterList   //  byte *pAppInClusterList;
};

byte GenericApp_TaskID;   // Task ID for internal task/event processing
                          // This variable will be received when
                          // GenericApp_Init() is called.
devStates_t GenericApp_NwkState;
byte GenericApp_TransID;  // This is the unique message ID (counter)
afAddrType_t GenericApp_DstAddr;

static void rxCB(uint8 port,uint8 event); //回調函數

void GenericApp_Init( byte task_id )
{
   
   
  halUARTCfg_t uartConfig;
  GenericApp_TaskID = task_id;
  GenericApp_NwkState = DEV_INIT;
  GenericApp_TransID = 0;
  GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;
  GenericApp_epDesc.task_id = &GenericApp_TaskID;
  GenericApp_epDesc.simpleDesc
            = (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
  GenericApp_epDesc.latencyReq = noLatencyReqs;
  afRegister( &GenericApp_epDesc );
  
  uartConfig.configured           = TRUE;
  uartConfig.baudRate             = HAL_UART_BR_115200;
  uartConfig.flowControl          = FALSE;
  uartConfig.callBackFunc         = rxCB;
  HalUARTOpen(1,&uartConfig);
}
UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events ){
   
   
}
//回調
static void rxCB(uint8 port,uint8 event){
   
   
    uint8 value_read;
    uint8 value=18;
    uint8 uartbuf[2];
    uint8 cmd[6];
    HalUARTRead(1,cmd,6);//從上位機讀數據
    if(osal_memcmp(cmd,"nvread",6)){
   
   
        osal_nv_item_init(TEST_NV,1,NULL);//初始化NV條目
        osal_nv_write(TEST_NV,0,1,&value);//向NV條目寫數據
        osal_nv_read(TEST_NV,0,1,&value_read);//從NV條目讀數據
        uartbuf[0]=value_read/10+'0';
        uartbuf[1]=value_read%10+'0';
        HalUARTWrite(1,uartbuf,2);//向上位機寫從NV條目中讀出來的數據
    }
}

常用API

事件添加函數:osal_set_event()
uint8 osal_set_event(uint8 task_id,uint16 event_flag)
uint8 task_id:任務號
uint16 event_flag:2字節的位圖,其中每位指定了一個事件。只有一個系統事件(SYSTEM_EVENT_MSG),其餘的事件/位由接收任務指定;
作用:運行一個任務,設置一個事件



定時器函數:osal_start_timerEx()
uint8 osal_start_timerEx(uint8 task_id,uint16 event_id,uint16 timeout_value)
例如:osal_start_timerEx( GenericApp_TaskID,SEND_TO_ALL_EVENT,5000);
參數:任務,事件,定時毫秒數5000對應5ms


內存拷貝函數:osal_memcpy()
例如: osal_memcpy(buf, pkt->cmd.Data,osal_strlen("Coordinator Send!"+1));

內存比較函數:osal_memcmp()
例如:osal_memcmp(buf,"Coordinator Send!",osal_strlen("Coordinator Send!"+1)

字符串長度函數:osal_strlen()
int osal_strlen(char *pString)

無線發送函數AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP,
uint16 cID, uint16 len, uint8 *buf, uint8 *transID,
uint8 options, uint8 radius )
消息接收函數uint8 *osal_msg_receive( uint8 task_id )


Zigbee通信相關:

Zigbee協議棧中的規範(Profile)和簇(Cluester)
Zigbee網絡中進行數據收發都是建立在應用規範基礎上的。每個應用規範都有一個ID來標示。在一個規範(Profile)下又提出了簇(Cluester)的概念,這個Cluester要理解爲一個應用領域下的一個特定對象。簇是由命令組成的。

同一規範下的發送命令(簇號)和接受命令(簇號)要相同才能通信

Zigbee網絡通信必須建立在具體設備節點的具體通信端口:
網絡地址可以描述一個節點,用戶可使用簡單描述符來描述一個端口。(用戶可用的端口號是1-240

Zigbee通信模式:點播 廣播 組播

點播
發送模式:Addr16Bit
發送目的端口:目的節點的簡單描述符設定的工作端口
發送地址:目的節點的網絡地址


my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;   //發送
my_DstAddr.endPoint=GENERICAPP_ENDPOINT;       //目的端口號
my_DstAddr.addr.shortAddr=0x0000;              //目標設備網絡地址

廣播
發送模式:AddrBroadcast
發送目的端口:目的節點的簡單描述符設定的工作端口
發送地址:0xFFFF 全網發送 包括休眠節點
0xFFFD 只發往休眠節點
0xFFFC 發往所有路由節點




my_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;//廣播發送
my_DstAddr.endPoint=GENERICAPP_ENDPOINT;       //目的端口號
my_DstAddr.addr.shortAddr=0xFFFF;              //協調器網絡地址

組播(同一組的節點才能通信)
發送模式:AddrGroup
發送目的端口:目的節點的簡單描述符設定的工作端口
發送地址:組ID
#include “aps_groups.h”
1、設置組對象(ID 和 name)
2、加入對象組 aps_AddGroup()
3、退出組






Zigbee協議棧網絡管理
Zigbee協議棧實現網絡管理的函數:
獲得該節點的網絡地址:uint16 NLME_GetShortAddr(void)
獲得該節點的MAC地址:byte * NLME_GetExtAddr(void)


獲得該節點的父節點網絡地址:uint16 NLME_GetCoordShortAddr(void)
獲得該節點的父節點MAC地址:void NLME_GetCoordExtAddr(byte *buf)

補充

1、afAddrType_t *dstAddr 該參數包含了目的節點的網絡地址、端點號及數據傳送的模式,如單播、廣播或多播等。
afAddrType_t 是個結構體如下:

typedef struct
{
   
        
	union
     {
   
   
       uint16 shortAddr;      //用於標識該節點網絡地址的變量
     } addr;
    afAddrMode_t addrMode;   //用於指定數據傳送模式,單播、多播還是廣播
    byte endPoint;           //端點號
} afAddrType_t;  // 其定義在AF.h中

2、組播詳細
1.首先聲明一個組對象aps_Group_t SampleApp_Group;
aps_Group_t結構體的定義:

typedef struct
{
   
   
  uint16 ID;                       // Unique to this table
  uint8  name[APS_GROUP_NAME_LEN]; // #define APS_GROUP_NAME_LEN  16
} aps_Group_t;

每個組有個特定的ID跟組名,組名存放在name數組中,name數組的第一個元素是組名的長度,第二個元素開始存放組名字符串。
2.對SampleApp_Group賦值:

 GenericApp_Group.ID=0x0001; //初始化組號
 GenericApp_Group.name[0]=6; //定義組名長度
 osal_memcpy(&(GenericApp_Group.name[1]),"Group1",6); //存放組名

3.在本任務裏將端點加入到組中:(需要添加頭文件#include ''aps_groups.h")

aps_AddGroup( GENERICAPP_ENDPOINT, &GenericApp_Group );

4.設定通信的目標地址及模式:

afAddrType_t  my_DstAddr;
my_DstAddr.addrMode=(afAddrMode_t)AddrGroup;//發送模式爲組播
my_DstAddr.endPoint=GENERICAPP_ENDPOINT;
my_DstAddr.addr.shortAddr=GenericApp_Group.ID;//網絡地址設置爲組ID

5、如何將一個設備移除組?
調用aps_RemoveGroup

aps_Group_t *grp;
grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
if ( grp )
{
   
   
   aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
}

3、devStates_t 常用的判斷zigbee設備的網絡狀態
協調器DEV_ZB_COORD
路由器 DEV_ROUTER
終端DEV_END_DEVICE


藍牙

採用高速跳頻擴展,實現語音和數據在短距離上的穩定無縫無線連接
在2.4GHz的ISM頻帶上設立79個帶寬爲GHz的信道,用每秒鐘切換1600次的頻率的跳頻(Hobbing)擴展技術實現信息的收發。
藍牙系統中的功能模塊分爲:無線射頻單元、鏈路控制單元、鏈路管理單元、軟件結構

微微網: 1主設備 7從設備

藍牙技術採用了全開放的框架結構
藍牙技術的系統結構分爲三大部分:
1.底層硬件模塊
2.中間協議層
3.高層應用
藍牙協議分爲四層:
1.核 心 協 議:BaseBand、LMP、L2CAP、SDP;
2.電 纜 替 代 協 議:RFCOMM;
3.電 話 傳 送 控 制 協 議:TCS-Binary、AT 命 令 集;
4.選 用 協 議:PPP、UDP/TCP/IP、OBEX、WAP、vCard、vCal、IrMC、 WAE。








近場通信NFC 及WIFI

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章