1. 程式人生 > >zigbee乙太網閘道器方案

zigbee乙太網閘道器方案

*已刊登至:《無線電》8月刊

物聯網技術的實現中,無線技術是不可缺少的部分。近年無線技術的發展,將ZigBee推入人們的視線中,那麼ZigBee是怎樣的一種技術呢?帶著疑問,我查詢了它的來歷:

ZigBee,來源於蜜蜂的八字舞,由於蜜蜂(bee)是靠飛翔和“嗡嗡”(zig)地抖動翅膀的“舞蹈”來與同伴傳遞花粉所在方位資訊,可以想象蜜蜂依靠這樣的方式構成了群體中的通訊網路! 
是不是有點意思,那麼隨之 ZigBee的出現就成了一種我們熟知的無線組網通訊技術並廣為應用。本篇就帶你認識ZigBee,並實現一種常見應用:ZigBee轉乙太網閘道器。

  • 將ZigBee技術連線網際網路
Image

圖1 智慧家居中ZigBee應用示意圖


ZigBee是一種低成本,低功耗的近距離無線組網通訊技術,在智慧家居、智慧樓宇、工業監控等領域均有廣泛應用。基於ZigBee的智慧家居應用,如圖1所示,使用者在家庭中安裝一個主控中心(ZigBee閘道器),及若干個與家電裝置相連的分控終端,來遠端操控所有家用電器,設想下躺在沙發上控制廚房的電飯煲煮飯是不是無限暢快呢?如果閘道器可以連到網際網路上,甚至遠在公司,開啟手機就能登入到家裡的閘道器檢視家裡的情況。 作為開源愛好者,可能很多人已經做過ZigBee方面的開發,一般使用TI公司的CC2530射頻晶片較多,TI公司也針對這類晶片制定了完備的軟體協議棧zstack。CC2530受處理器速度和記憶體限制,無法執行TCP/IP協議,使用者往往通過串列埠獲得協調器匯聚的資料。想要讓協調器直接連上網際網路只能藉助其他網路晶片,由於W5500乙太網晶片在硬體上實現了TCP/IP協議,即使像CC2530這樣的8位微控制器也可以自如操控W5500,實現聯網,無需藉助其他輔助處理器做資料轉換。 本文我們使用兩個CC2530模組,組建一個小型的ZigBee網路,一個作為協調器建立網路,另一個作為終端節點不斷的採集溫溼度資料併發送給協調器。為實現協調器的聯網,我們在協調器上外接一個W5500模組,協調器作為TCP客戶端連線乙太網內的主機,並將終端節點發來的資料通過W5500上傳給主機。應用系統的實物如圖2所示: Zigbee2


Image
圖2系統實物

  • 準備工作
1. 安裝編譯環境IAR Embedded Workbench for MCS-51 7.51A
2. 安裝協議棧ZStack-CC2530-2.2.2-1.3.0
3. 安裝CC2530模組除錯下載器驅動

  • 硬體連線與驅動程式重寫

W5500在硬體上實現TCP/IP協議,使用者幾乎不需要任何網路基礎,並且WIZnet公司針對W5500也有很好的程式包的支援,只需呼叫socket函式,就可以完成網路的建立和通訊,當然,要獲得以上便利,我們要先將CC2530與W5500連線起來,並能夠傳送資料控制W5500。 W5500與MCU通訊使用SPI介面,CC2530是帶有8051核心的無線MCU,片上有兩個SPI介面,並且與USART複用,這裡我們選擇SPI1作為W5500的控制介面。圖2為W5500模組的管腳對應關係,控制這個模組僅需J1插針上的1-7引腳(程式上使用輪詢機制,所以可以省略INT中斷管腳)。圖3為CC2530模組上SPI1引腳的對應關係,另外使用P13作為W5500模組RST(復位)的輸出控制引腳。通過排線將以上引腳對應連好後就可以編寫硬體驅動程式啦。 Zigbee3


Image
圖3 W5500模實物與原理圖管腳對照

Image

圖4 CC2530EB板SPI管腳對照


由於W5500的函式驅動庫是分層次書寫的,我們只需將SPI通訊的硬體抽象層的函式重新編寫即可。 以下為CC2530的SPI1的初始化配置函式和資料收發函式的程式,以及復位管腳的控制程式:

#include “ioCC2530.h”

//SPI管腳和初始化配置

voidWIZ_SPI_Init(void)

{

  PERCFG |=0×02;//開啟UART1外設

  P1SEL  |=0xE0;// 使能P1_7, P1_6, and P1_5 外設功能

  P1SEL  &=~0×10;// 配置P1_4為普通GPIO (SPI_CS)

  P1DIR  |=0×10;// 配置P1_4輸出引腳

// Set baud rate to max (system clock frequency / 8)

  U1BAUD =0×00;// BAUD_M = 0

  U1GCR |=0×11;// BAUD_E = 17

  U1CSR &=~0xA0;// SPI 主機模式

// Configure phase, polarity, and bit order

  U1GCR &=~0xC0;// CPOL = CPHA = 0

  U1GCR |=0×20;// ORDER = 1

  P1SEL  &=~0×08;// 配置P1_3為普通GPIO (RST)

  P1DIR  |=0×08;// 配置P1_3為輸出引腳

}

//W5500 復位引腳的控制

void WIZ_RST(uint8 val)

{

if(val== LOW){

   P1_3=0;//引腳拉低

}elseif(val== HIGH){

   P1_3=1;//引腳拉高

}

}

//SPI CS管腳的電平控制

void WIZ_CS(uint8 val)

{

if(val== LOW){

     P1_4=0;

}elseif(val== HIGH){

     P1_4=1;

}

}

//SPI資料傳送和接收

uint8 SPI2_SendByte(uint8 byte)

{

uint8 temp;

  U1DBUF = byte;

while(!(U1CSR&0×02));//等待資料傳送完畢

  U1CSR &=0xFD;

  temp = U1DBUF;//讀取資料緩衝區接收位元組

return temp;

}


程式重寫完畢後,開啟zstack的例程,將W55[*]00的驅動程式包新增到工程中。如圖5所示,需要注意的是,CC2530的LCD驅動的部分引腳與SPI1的幾個引腳是複用的,需要將和LCD有關的編譯項去掉,避免發生衝突,導致SPI不可用。具體方法為在工程選項的編譯子項裡,去掉“LCD_SUPPORTED”,並新增“HAL_LCD=FALSE”。

Image

圖5 新增W5500驅動程式包到工程

Image

圖6 修改編譯項

  • zstack應用任務程式編寫

zstack是TI公司按照Zigbee協議編寫的協議棧程式,提供了完備的應用函式供使用者呼叫,使用者可以在應用層新增自己的任務和事件來完成感測器資料採集、節點通訊應答等功能,有關協議棧的任務排程機制還需要讀者自行學習,這裡介紹如何在應用層維護W5500的通訊。在本文的系統中,為了降低與協議棧的耦合度(儘量不在協議棧原有檔案中增刪改),開機後,當系統執行起來後,我們將W5500的初始化和配置函式放在了應用層的任務裡執行,協調器在完成組網後,應用層的任務主要有以下兩個事件,一個是W5500網路連線的維護,另一個是終端節點的資料處理。其中第一個事件為定時事件,每隔一段時間就要對W5500的網路狀態進行一次輪詢處理。 在工程中,APP子欄下有sapi、SimpleCollector(協調器)、SimpleSensor(終端節點)三組檔案,其中sapi中定義了節點組網和入網的應用函式,使用者不需要改寫這些程式,但是其中一些事件會呼叫SimpleCollector和SimpleSensor中的函式,使用者需要在這兩個檔案中編寫處理函式。 先看下協調器的應用層的程式處理過程,在sapi.c檔案中初始化了SAPI 任務,在這個任務中定義了ZB_ENTRY_EVENT和ZB_USER_EVENTS兩個事件,其中初始化函式SAPI_Init()中啟動了ZB_ENTRY_EVENT事件,即在任務建立後會首先進入該事件。任務事件處理函式SAPI_ProcessEvent()中在處理這兩個事件時呼叫zb_HandleOsalEvent()函式,交給使用者檔案SimpleCollector去處理。其中ZB_ENTRY_EVENT只執行一次,用來定義裝置的型別(協調器或終端節點),ZB_USER_EVENTS會執行多次,在這個事件裡我們用來維護W5500的網路連線。 以下是任務事件處理函式有關這兩個事件的處理程式:

UINT16 SAPI_ProcessEvent( byte task_id, UINT16 events )

{

……

if( events & ZB_ENTRY_EVENT )

{

uint8startOptions;

// 裝置啟動應用程式時給出指示

zb_HandleOsalEvent( ZB_ENTRY_EVENT );

zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);

if(startOptions& ZCD_STARTOPT_AUTO_START )

{

zb_StartRequest();

}

else

{

// led閃爍並等待外部輸入進行配置及重啟

HalLedBlink(HAL_LED_2,0,50,500);

}

return(events ^ ZB_ENTRY_EVENT );

}

// 這是最後一個要處理的事件

if( events &( ZB_USER_EVENTS ))

{

// 使用者事件傳遞給應用程式

zb_HandleOsalEvent( events );

// 這裡不要返回,稍後返回0

}

……

}

程式中都呼叫了zb_HandleOsalEvent( events ),我們看一下協調器中如何處理的:

voidzb_HandleOsalEvent( uint16 event )

{

uint8startOptions;

uint8logicalType;

if( event & ZB_ENTRY_EVENT )

{

initUart(uartRxCB);//初始化除錯埠

WIZ_SPI_Init();//初始化 SPI

    Reset_W5500();

printf(“W5500 Init…\r\n”);

set_default();

set_network();

logicalType= ZG_DEVICETYPE_COORDINATOR;//配置節點型別

zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE,sizeof(uint8),&logicalType);

startOptions= ZCD_STARTOPT_AUTO_START;// 配置啟動型別

zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);

printf(“Waiting the Network…\r\n”);

}

if( event & ZB_USER_EVENTS )

{

do_tcpclient(SOCKET_TCPC);  //tcp 客戶端保持

osal_start_timerEx(sapi_TaskID, ZB_USER_EVENTS, ENTHER_TIMEOUT );

}

}


鑑於開機後ZB_ENTRY_EVENT只會執行一次,所以我們將應用的初始化函式放在這裡執行,並且配置好網路啟動的相關引數並寫入到配置資訊裡,跳出這個函式後,程式就會啟動自動組網的程式,完成組網。在ZB_USER_EVENTS中,我們啟動TCP客戶端程式,用來維護裝置與伺服器的連線,使得裝置在插上網線後能夠及時連上伺服器。這樣當協調器收到其他終端節點的資料,處理後就可以呼叫socket傳送函式傳送給主機,我們的協調器就變成了一個zigbee轉乙太網的網關了。 有了閘道器節點,我們還需要終端節點提供溫溼度資料。我們將DHT11溫溼度感測器連線到終端節點上,並在終端節點的應用層新增採集函式,定時採集溫溼度資料。 終端節點的應用處理程式在SimpleSensor.c中定義,下面來介紹下終端節點是如何處理相關的任務的:

void zb_HandleOsalEvent( uint16 event )

{

uint8startOptions;

uint8logicalType;

if( event & ZB_ENTRY_EVENT)

{

logicalType= ZG_DEVICETYPE_ENDDEVICE;//配置成終端節點

zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE,sizeof(uint8),&logicalType);

startOptions= ZCD_STARTOPT_AUTO_START;// 配置成自啟動

zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);

}

if( event & MY_START_EVT )

{

//nothing to do

}

if( event & MY_REPORT_TEMP_EVT )

{

ReadValue();//收集DHT11 資料

zb_SendDataRequest(0xFFFE, SENSOR_REPORT_CMD_ID,4,SensorValueBuf,0, AF_ACK_REQUEST,0);//給閘道器節點發送資料

osal_start_timerEx(sapi_TaskID, MY_REPORT_TEMP_EVT,myTempReportPeriod);// Timed loop collection

}

if( event & MY_FIND_COLLECTOR_EVT )

{

// 查詢並繫結到收集器裝置

zb_BindDevice( TRUE, SENSOR_REPORT_CMD_ID,(uint8 *)NULL);//找到協調器,啟動入網

}

}


一張表一目瞭然閘道器節點和終端節點的流程比較:

Image


瞭解了程式執行流程後,我們就可以操作裝置了。 我們首先選擇SimpleCollectorEB,編譯後通過偵錯程式將程式下載到閘道器節點中,然後選擇SimpleSensorEB,編譯後下載到終端節點中。我們在電腦端開啟TCP/IP除錯助手和串列埠除錯助手,分別用來接收資料和觀察閘道器節點執行的除錯資訊。

Image



圖7 串列埠及網路除錯助手介面



閘道器節點上電後,串列埠端會列印裝置的IP地址等資訊,接下來LED1閃爍,表示閘道器節點正在組網,當Led1長亮後,網路建立完畢,這時程式的網路維護事件觸發,開始連線伺服器,通過網路除錯助手可以看到,有客戶端連線,正是我們的閘道器節點。

閘道器節點準備完畢,接下來開啟終端節點,開機後Led1閃爍,啟動網路,入網後Led1頻閃,表示正在資料採集和傳送,這時可以看到網路除錯助手上有溫溼度資料顯示,表示終端節點已經將資料傳送給閘道器節點,閘道器節點解析後再通過W5500傳送給了PC。至此,CC2530+W5500實現了ZigBee轉乙太網閘道器,資料成功遞達閘道器節點。



以上是乙太網閘道器的實現過程。實際應用中,我們可以看到眾多的物聯網裝置,都可以藉助此閘道器節點,來連入Internet,比如,連線Yeelink這樣的雲平臺,上傳感測器資料,可輕鬆實現!在這裡就不給大家列舉了,關於Zigbee轉乙太網閘道器的應用,同樣是個重要且龐大的課題,我們會接下來展開與大家繼續分享的。



  • 尾聲

目前,在裝置的無線通訊領域, Zigbee技術相比藍芽及WiFi,有著成本低、功耗低和低複雜度的特點,同時非常適合電池供電的裝置。大量的Zigbee裝置會產成龐大的資料量,這些資料不可能全部交付給協調器處理分析,但將協調器接入網際網路就完美的解決了此問題,配合W5500,協調器變成了Zigbee和乙太網閘道器,從而使無線Zigbee網路輕鬆接入網際網路,實現物聯網應用!

程式下載:http://wizwiki.net/forum/viewtopic.php?f=91&t=1075

By Allen,Katrina,Jerry

與我們更多交流:[email protected]

相關推薦

zigbee乙太網方案

*已刊登至:《無線電》8月刊 物聯網技術的實現中,無線技術是不可缺少的部分。近年無線技術的發展,將ZigBee推入人們的視線中,那麼ZigBee是怎樣的一種技術呢?帶著疑問,我查詢了它的來歷: ZigBee,來源於蜜蜂的八字舞,由於蜜蜂(bee)是靠飛翔和“嗡嗡”(zig)地抖動翅膀的“舞蹈”來與同伴傳遞花

ICH E2B | ICSR 電子傳輸對接解決方案

為落實原國家食品藥品監督管理總局《關於適用國際人用藥品註冊技術協調會二級指導原則的公告》(2018年第10號)的要求,組織制定了《藥物臨床試驗期間安全性資料快速報告標準和程式》,現予以釋出。2018年5月1日後開始實施的臨床試驗,按照本標準和程式執行。 該標準要求申請人通過Ga

警告-已計劃將多個預設用於提供單一網路(例如Intranet或Internet)的冗餘…的解決方案

問題 筆者今天需要設定膝上型電腦有線網路連線的固定IP,即設定本地連線的固定IP。設定進行到最後一步如下圖所示: 點選確定時彈出如下警告: 解決方案 1、找到並點選“開啟網路和共享中心”: 2、點選“更改介面卡設定”: 3、檢視所有的本地連線或無線連線的IP設定,例如

醫藥電子傳輸解決方案 Gateway-to-Gateway()方式

為落實原國家食品藥品監督管理總局《關於適用國際人用藥品註冊技術協調會二級指導原則的公告》(2018年第10號)的要求,組織制定了《藥物臨床試驗期間安全性資料快速報告標準和程式》,現予以釋出。2018年5月1日後開始實施的臨床試驗,按照本標準和程式執行。 該標準要求申請人通過

基於STM32F107+DP83848嵌入式zigbee設計

1. 引言 Wireless Sensor Network,WSN(無線感測器網路)是指由大量成本相對低廉的,具有感知能力、計算能力、實時通訊能力的感測器節點組成的嵌入式無線網路,是當前眾多領域的研究和應用熱點。建立在IEEE 802.15.4(LR_WPAN,低速率無線個

使用xnetoe TOE(tcp offload engine)構建的網路安全隔離實現方案

      政府或者事業部門一般按照國家電子政務建設要求組建自己的電子政務網路,採用三級聯網,政府的政務網一般主要由四部分組成:     1)內部執行資訊系統的區域網(政務內網)     2)上下級互聯的廣域網(政務專網)     3)市級各部門資訊資源共享的政務外網

ETHER CHANNEL乙太網通道-----熱備份冗餘——管理vlan

ETHER  CHANNEL乙太網通道 主要用於SW-SW間 將多個交換機間直連的物理介面(2-8,2-16)邏輯的整合為一個介面;起到頻寬疊加的作用 Pagp   埠聚合協議  Cisco私有 Lacp   鏈路聚合協

Http API服務模組設計方案(微服務)

Http  API閘道器服務模組設計方案1. 概述                           閘道器作為服務生產者和服務消費者之間的介面,一方面通過“服務路由”為服務消費找到所需服務的具體位置並呼叫;另一方面為後臺伺服器提供負載均衡、安全、流量控制、身份認證等相關功

混合雲端儲存組合拳:基於雲端儲存與混合雲備份的OSS資料備份方案

前言阿里雲物件儲存(OSS)使用者眾多。很多使用者因為業務或者合規性需求,需要對OSS內的資料做備份,無論是線上備份,還是線下備份。使用者可以選擇使用OSS的開放API,按照業務需求,做資料的備份,也可以選擇OSS已有的服務進行資料備份,比如OSS的跨域複製。但是,前一種方式,存在易用性和備份效率問題;後一種

微服務解決方案和使用總結

一.什麼是閘道器 1.1 什麼是閘道器 API Gateway(APIGW / API 閘道器),顧名思義,是出現在系統邊界上的一個面向API的、序列集中式的強管控服務,這裡的邊界是企業IT系統的邊界,可以理解為企業級應用防火牆,主要起到隔離外部訪問與內部系統的作用。在微服務概念的流行之前,API閘道

乙太網通道,Span/Rspan,NTP,CDP,冗餘總結

總結 1.乙太網通道,三層Channel 2. Span,Rspan 3. 防止MAC地址攻擊 4. NTP-----網路時間協議 5. 基於時間的ACL 6. CDP-----Cisco裝置發現協議(私有協議) 7. 閘道器冗餘 a. 最原始的閘道器冗餘 b. HSRP熱備份閘道器冗餘 c

WIN7問題問題“在釋放介面 Loopback Pseudo-Interface 1 時出錯: 系統找不到指定的檔案。操作失敗,沒有介面卡處於允許此操作的狀態”解決方案

微軟推出WINDOWS7作業系統後,很多朋友都升級到了WIN7系統,有些原來是由vista升級的。但是在使用中會碰到這樣一個問題:每次重啟或在使用中,會不定期地提示 “預設閘道器不可用” 然後就不能連線網路了。使用修復功能或者使用ipconfig -renew命令可以恢復正常,但是以後還會再次出現,該如何徹

Zigbee有線網路轉zigbeeAPI

1.1編譯選項對話方塊的位置 1.在專案名稱是右擊選擇options 2.找到C/C++ Complier選項卡,通過單擊右側紅方框的右箭頭找到Preprocessor,在Definedsymbols中就是需要增加的巨集,每個巨集一行以回車代表當前巨集結束,有關ZS

.NET Core開發的iNeuOS物聯網平臺部署樹黴派(raspbian),從到雲端整體解決方案。助力2019中國.NET峰會。

2019 中國.NET 開發者峰會正式啟動 目       錄 1.      概述... 2 2.      樹莓派硬體配置... 2 3.

微服務技術棧:API中心,落地實現方案

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/husky-spring-cloud) || [GitEE·點這裡](https://gitee.com/cicadasmile/husky-spring-cloud) # 一、服務閘道器簡介 ## 1、

支付寶 應用和授權回撥地址怎麼配置?

說明   我們在建立應用以後在應用的概覽中看到應用閘道器和授權回撥地址不知道該怎麼使用(如下圖)   名詞解釋   應用閘道器:用於接收由支付寶伺服器通知。使用介面:生活號介面和口碑門店被動通知   注意:如果您現

記一次nginx504超時解決方法

問題發生的背景: 合作方請求某個介面,由於處理時間較長,導致了閘道器超時. 問題分析: 1.可能是php程式超時報錯; 2.php-fpm處理請求超時; 3.nginx伺服器超時. 問題解決: 1.php超時設定: 檢查了php超時的配置,在php.ini

網路傳輸的中介:代理、、通道

轉載地址:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html 代理(Proxy): 一箇中間程式,它可以充當一個伺服器,也可以充當一個客戶機,為其它客戶機建立請求。請求是通過可能的翻譯在內部或經過傳遞到其它的

AliOS-Things--EMW3060--

好吧,目前下面這些還不支援。。。。。 int linkkit_main(void *paras) { #ifndef WIFI_AWSS_ENABLED set_iotx_info(); #endif int res = 0; uint64_t time_pr

zuul1

啟動registry 一 代理provider: 啟動provider   配置zuul專案: spring: application: name: microservice-gateway-zuul server: port: 8040 eureka: