1. 程式人生 > >資料的傳輸方式及資料接收

資料的傳輸方式及資料接收



定址方式

地址型別(Addresstypes)

ZigBee裝置有兩種型別的地址。一種是64IEEE地址,即MAC地址,另一種是16位網路地址。

64位地址使全球唯一的地址,裝置將在它的生命週期中一直擁有它。它通常由製造商或者被安裝時設定。這些地址由IEEE來維護和分配。

16為網路地址是當裝置加入網路後分配的。它在網路中是唯一的,用來在網路中鑑別裝置和傳送資料。

Z-Stack定址(Addressinginz-stack)

為了向一個在ZigBee網路中的裝置傳送資料,應用程式通常使用AF_DataRequest()函式。資料包將要傳送給一個afAddrType_t(ZComDef.h

中定義)型別的目標裝置。

Typedefstruct

{

union{

uint16shortAddr;

}addr;

afAddrMode_taddrMode;

byteendPoint;

}afAddrType_t;

注意,除了網路地址之外,還要指定地址模式引數。目的地址模式可以設定為以下幾個值:typedefenum

{

afAddrNotPresent=AddrNotPresent,

afAddr16Bit=Addr16Bit,

afAddrGroup=AddrGroup,

afAddrBroadcast=AddrBroadcast

}afAddrMode_t;

因為在Zigbee中,資料包可以單點傳送

(unicast),多點傳送(multicast)或者廣播傳送,所以必須有地址模式引數。一個單點傳送資料包只發送給一個裝置,多點傳送資料包則要傳送給一組裝置,而廣播資料包則要傳送給整個網路的所有節點。

這個將在下面詳細解釋。

單點傳送(Unicast)

Uicast是標準定址模式,它將資料包傳送給一個已經知道網路地址的網路裝置。將afAddrMode設定為Addr16Bit並且在資料包中攜帶目標裝置地址。

間接傳送(Indirect)

當應用程式不知道資料包的目標裝置在哪裡的時候使用的模式。

將模式設定為AddrNotPresent並且目標地址沒有指定。取代它的是從傳送裝置的棧的繫結表中查詢目標裝置。這種特點稱之為源繫結。當資料向下傳送到達棧中,從繫結表中查詢並且使用該目標地址。這樣,資料包將被處理成為一個標準的單點傳送資料包。如果在繫結表中找到多個裝置,則向每個裝置都發送一個數據包的拷貝。有一個選項可以講繫結表儲存在協調器

(Coordinator)當中。傳送裝置將資料包傳送給協調器,協調器查詢它棧中的繫結表,然後將資料傳送給最終的目標裝置。這個附加的特性叫做協調器繫結(CoordinatorBinding)

廣播傳送(broadcast)

當應用程式需要將資料包傳送給網路的每一個裝置時,使用這種模式。地址模式設定為AddrBroadcast

目標地址可以設定為下面廣播地址的一種:

NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——資料包將被傳送到網路上的所有裝置,包括睡眠中的裝置。對於睡眠中的裝置,資料包將被保留在其父親節點直到查詢到它,或者訊息超時(NWK_INDIRECT_MSG_TIMEOUTf8wConifg.cfg)

NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——資料包將被傳送到網路上的所有在空閒時開啟接收的裝置(RXONWHENIDLE),也就是說,除了睡眠中的所有裝置。

NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——資料包傳送給所有的路由器,包括協調器。

0xFFFE--通過繫結表中的地址進行傳送。

組定址(GroupAddressing)

當應用程式需要將資料包傳送給網路上的一組裝置時,使用該模式。地址模式設定為afAddrGroup並且addr.shortAddr設定為組ID

在使用這個功能呢之前,必須在網路中定義組。(參見Z-stackAPI文件中的aps_AddGroup()函式)。注意組可以用來關聯間接定址。再繫結表中找到的目標地址可能是是單點傳送或者是一個組地址。另外,廣播發送可以看做是一個組定址的特例。

重要裝置地址(ImportantDeviceAdresses)

應用程式可能需要知道它的裝置地址和父親地址。

使用下面的函式獲取裝置地址(ZStackAPI中定義)

1、NLME_GetShortAddr()——返回本裝置的16位網路地址

2、NLME_GetExtAddr()——返回本裝置的64位擴充套件地址使用下面的函式獲取該裝置的父親裝置的地址:

1、NLME_GetCoordShortAddr()——返回本裝置的父親裝置的16位網路地址

2、NLME_GetCoordExtAddr()——返回本裝置的父親裝置的64位擴充套件地址

資料的傳送,廣播、組播、點對點

AF_DataRequest(afAddrType_t*dstAddr,endPointDesc_t*srcEP,uint16cID,uint16len,uint8*buf,uint8*transID,uint8options,uint8radius);

AF_DataRequest函式最終呼叫APSDE_DataReq原語,而我們只需要瞭解AF_DataRequest函式的引數,就可非常靈活的以各種方式來發送資料。

AF_DataRequest函式的呼叫會觸發afDataConfirm(...)函式

資料的傳送結果也由afDataConfirm(...)函式返回

AF_DataRequest函式返回的值並不是真正的傳送結果。

函式引數說明

*dstAddr--傳送目的地址+端點地址和傳送模式

*srcEP--(答覆或確認)終端的描述(比如作業系統中任務ID等)源EP

cID--Profile指定的有效的叢集號

len--傳送資料長度

*buf--傳送資料緩衝區

*transID--任務ID

options--有效位掩碼的傳送選項

radius--傳送跳數,通常設定為AF_DEFAULT_RADIUS

afAddrType_t*dstAddr

Typedefstruct

{

union{

uint16shortAddr;//短地址}addr;

afAddrMode_taddrMode;//傳送模式

byteendPoint;//端點號

}afAddrType_t;

endPointDesc_t*srcEP

Typedefstruct

{

byteendPoint;//端點號

byte*task_id;//那一個任務的端點號

SimpleDescriptionFormat_t*simpleDesc;//簡單的端點描述afNetworkLatencyReq_tlatencyReq;

}endPointDesc_t;

SimpleDescriptionFormat_t

Typedefstruct

{

byteEndPoint;//EP

uint16AppProfId;//應用規範ID

uint16AppDeviceId;//特定規範ID的裝置型別

byteAppDevVer:4;//特定規範ID的裝置的版本

byteReserved:4;//AF_V1_SUPPORTusesforAppFlags:4.

byteAppNumInClusters;//輸入簇ID的個數

cId_t*pAppInClusterList;//輸入簇ID的列表

byteAppNumOutClusters;//輸出簇ID的個數

cId_t*pAppOutClusterList;//輸出簇ID的列表

}SimpleDescriptionFormat_t;

ClusterID--具體應用串ID

uint8options

傳送模式選項有如下選項

#defineAF_FRAGMENTED0x01

#defineAF_ACK_REQUEST0x10

#defineAF_DISCV_ROUTE0x20

#defineAF_EN_SECURITY0x40

#defineAF_SKIP_ROUTING0x80

其中AF_ACK_REQUEST為傳送後需要接收方的確認

uint8radius傳輸跳數或傳輸半徑,預設值為10

廣播發送

廣播發送時,分為三種廣播,如果想使用廣播發送,則只需將dstAddr->addrMode設為AddrBroadcastdstAddr->addr->shortAddr設定為相應的廣播型別即可。

具體的定義如下:

NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——資料包將被傳送到網路上的所有裝置,包括睡眠中的裝置。對於睡眠中的裝置,資料包將被保留在其父親節點直到查詢到它,或者訊息超時。

NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——資料包將被傳送到網路上的所有在空閒時開啟接收的裝置(RXONWHENIDLE),也就是說,除了睡眠中的所有裝置。

NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——資料包傳送給所有的路由器,包括協調器。

組播發送

如果裝置想傳輸資料到某一組裝置,那麼只需將dstAddr->addrMode設為AddrGroupdstAddr->addr->shortAddr設定為相應的組ID即可。

程式碼如下:

//Setupfortheflashcommand'sdestinationaddress-Group1

SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;

SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;

SampleApp_Flash_DstAddr.addr.shortAddr=SAMPLEAPP_FLASH_GROUP;

//Fillouttheendpointdescription.

SampleApp_epDesc.endPoint=SAMPLEAPP_ENDPOINT;

SampleApp_epDesc.task_id=&SampleApp_TaskID;SampleApp_epDesc.simpleDesc

=(SimpleDescriptionFormat_t*)&SampleApp_SimpleDesc;

SampleApp_epDesc.latencyReq=noLatencyReqs;

根據上面程式碼的配置,然後使用AF_DataRequest()函式來進行組播發送。

點對點的傳送

點對點的傳輸需要知道目標裝置的短地址,需要將dstAddr->addrMode設為Addr16BitdstAddr->addr->shortAddr設定為目標裝置的短地址即可。

程式碼如下:

SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddr16Bit;

SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;

SampleApp_Flash_DstAddr.addr.shortAddr=0x00;//Fillouttheendpointdescription.

SampleApp_epDesc.endPoint=SAMPLEAPP_ENDPOINT;

SampleApp_epDesc.task_id=&SampleApp_TaskID;

SampleApp_epDesc.simpleDesc

=(SimpleDescriptionFormat_t*)&SampleApp_SimpleDesc;

SampleApp_epDesc.latencyReq=noLatencyReqs;

根據上面程式碼的配置,然後使用AF_DataRequest()函式來進行點對點發送。

繫結裝置資料的傳送

繫結裝置資料的傳送目標裝置可以是一個裝置、也可以是多個裝置、還可以是一組裝置,這要看繫結表中的繫結資訊。

繫結裝置資料的傳送,需要將dstAddr->addrMode設為AddrNotPresentdstAddr->addr->shortAddr可以忽略,cID設定為繫結時註冊的命令號。程式碼如下:

dstAddr.addrMode=afAddrNotPresent;//Settheendpoint

dstAddr.endPoint=sapi_epDesc.simpleDesc->EndPoint;//Fillouttheendpointdescription.

sapi_epDesc.endPoint=zb_SimpleDesc.EndPoint;

sapi_epDesc.task_id=&sapi_TaskID;

sapi_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&zb_SimpleDesc;

sapi_epDesc.latencyReq=noLatencyReqs;

根據上面程式碼的配置,然後使用AF_DataRequest()函式來進行繫結資料的傳送。

資料的接收

當收到資料時會觸發afIncomingData函式,afIncomingData函式會對資訊進行過濾,看是否為本裝置的資訊,是的話進而呼叫afBuildMSGIncoming函式,程式碼如下:

if((aff->ProfileID==epProfileID)||((epDesc->endPoint==ZDO_EP)&&(aff->ProfileID==ZDO_PROFILE_ID)))

{

{

afBuildMSGIncoming(aff,epDesc,SrcAddress,LinkQuality,SecurityUse,timestamp);

}

}

afBuildMSGIncoming函式中根據需要傳送到的任務ID,新增相應任務的AF_INCOMING_MSG_CMD事件。在相應的AF_INCOMING_MSG_CMD事件中會對資訊做進一步的處理,程式碼如下:

MSGpkt->hdr.event=AF_INCOMING_MSG_CMD;

MSGpkt->groupId=aff->GroupID;

MSGpkt->clusterId=aff->ClusterID;

afCopyAddress(&MSGpkt->srcAddr,SrcAddress);

MSGpkt->srcAddr.endPoint=aff->SrcEndPoint;

MSGpkt->endPoint=epDesc->endPoint;

MSGpkt->wasBroadcast=aff->wasBroadcast;

MSGpkt->LinkQuality=LinkQuality;

MSGpkt->SecurityUse=SecurityUse;

MSGpkt->timestamp=timestamp;

MSGpkt->cmd.TransSeqNumber=0;

MSGpkt->cmd.DataLength=aff->asduLength;

if(MSGpkt->cmd.DataLength)

{

MSGpkt->cmd.Data=(byte*)(MSGpkt+1);

osal_memcpy(MSGpkt->cmd.Data,asdu,MSGpkt->cmd.DataLength);}

Else

{

MSGpkt->cmd.Data=NULL;

}

afIncomingData函式的引數每個引數的詳細說明如下:

aps_FrameFormat_t*afftypedefstruct{

byteFrmCtrl;//傳輸模式標識0x0C;與那些資訊有關

byteXtndFrmCtrl;//0x00byteDstEndPoint;//目的EP

byteSrcEndPoint;//源端EP

uint16GroupID;//ID

uint16ClusterID;//接收的串

uint16ProfileID;//源模式識別符號

bytewasBroadcast;//是否為廣播傳輸0x00

byteapsHdrLen;//

byte*asdu;//應用資料

byteasduLength;//ASDU的長度

byteApsCounter;//每接收一次會加1

uint8transID;//任務ID

uint8BlkCount;//

uint8AckBits;//接收確認選項

}aps_FrameFormat_t;

zAddrType_t*SrcAddresstypedefstruct{

union{

uint16shortAddr;//16位短地址ZLongAddr_textAddr;//64位長地址}addr;

byteaddrMode;//地址模式}zAddrType_t;

組的加入或退出

APSME-ADD-GROUP.request{GroupAddress,Endpoint}原語用來將裝置新增到某組中APSME-REMOVE-GROUP.request{GroupAddress,Endpoint}原語用來將裝置從某組中刪除。

其中的引數只有組地址和端點號,沒有短地址等,新增或刪除組成員只能在本地裝置進行,不能遠端進行,比如一個裝置直接新增或刪除另一個裝置。

程式碼如下:

//設定EP

#defineSAMPLEAPP_ENDPOINT20//配置組表結構

SampleApp_Group.ID=0x0001;

osal_memcpy(SampleApp_Group.name,"Group1",7);/新增到組

aps_AddGroup(SAMPLEAPP_ENDPOINT,&SampleApp_Group);

//指定組ID

#defineSAMPLEAPP_FLASH_GROUP0x0001//設定EP

#defineSAMPLEAPP_ENDPOINT20//從組中移除

aps_RemoveGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);

相關推薦

資料傳輸方式資料接收

 定址方式 地址型別(Addresstypes) ZigBee裝置有兩種型別的地址。一種是64位IEEE地址,即MAC地址,另一種是16位網路地址。 64位地址使全球唯一的地址,裝置將在它的生命週期中一直擁有它。它通常由製造商或者被安裝時設定。這些地址由IEEE來維護和

Cesium 生成terrain地形資料----CTB方式步驟

背景:專案前端使用Cesium,地形服務一直使用外網的,常常因為翻牆訪問的問題,導致地形資料取不到,進而導致地球不能載入,故決定搭建自己的地形服務,徹底解決這個問題。博文包含以下幾個過程: 下載原始地形資料,格式為.tif。 處理地形資料,將零散的地形檔案整合成一個地形檔案。

java各種資料擷取方式效能

1.split()+正則表示式來進行擷取。  將正則傳入split()。返回的是一個字串陣列型別。不過通過這種方式擷取會有很大的效能損耗,因為分析正則非常耗時。 String str = "abc,12,3yy98,0"; String[]  strs=str.split("

資料傳輸方式(並行/序列通訊;同步/非同步;單工、半雙工、全雙工)

資料傳輸主要有三種不同的劃分方式。 並行/序列通訊; 同步/非同步傳輸; 按資料的不同傳輸方向可分為單工、半雙工、全雙工。 1.並行通訊和序列通訊 (1)並行通訊 並行通訊是同時傳送資料的各個位進行傳送or接收的通訊方式。 傳輸率比序列介面快8倍,理論值為1Mbits/s. 傳輸的資訊不

Activity之間傳遞資料方式常見問題總結

Activity之間傳遞資料一般通過以下幾種方式實現: 通過intent傳遞資料 通過Application 使用單例 靜態成員變數。(可以考慮 WeakReferences) 持久化(sqlite、share preference、file等)

http協議基礎(三)幾種資料傳輸方式

說說http協議的一些特點: 1)無狀態 http協議是一種自身不對請求和響應之間的通訊狀態進行儲存的協議,即無狀態協議。 這種設定的好處是:更快的處理更多的請求事務,確保協議的可伸縮性 不過隨著web的不斷髮展,有時候,需要將這種狀態進行保持,隨即,就引入了cookie技術,cookie技術通過在請

資料傳輸方式 « 關於網路那些事...

資料傳輸方式紀錄 資料傳輸常見Json, XML 的方式傳送,但這裡我們要說明的是在細節一點的格式傳輸方式 Byte 格式傳輸 一般各種格式的資料,傳輸前都必須轉為

【HBase】HBase各功能元件、整合MapReduce的方式資料遷移

1、HBase體系架構 各個功能元件闡述如下: (1)Client 整個HBase叢集的訪問入口; 使用HBase RPC機制與HMaster和HRegionServer進行通訊; 與HMaster進行通訊進行管理類操作; 與HRegionServer進行資

前臺js傳入json或map型別資料給後臺後臺接收處理操作

5.java後端使用request拿到json資料String ds = request.getParameter("postData");JSONArray json=JSONArray.fromObject(ds); //使用net.sf.json.JSONObject物件來解析jsonJSONObjec

IOS的四種資料儲存方式優劣

IOS有四種常用資料儲存方式: 第一種方法:用NSUserDefaults儲存配置資訊 NSUserDefaults被設計用來儲存裝置和應用的配置資訊,它通過一個工廠方法返回預設的、也是最常用到的例項物件。這個物件中儲存了系統中使用者的配置資訊,開發者可以通

SPI資料傳輸方式

SPI同步傳輸介面Serial Peripheral Interface,不同於I2C的是可以實現全雙工通訊。常說的四線SPI包括SCLK(Serial clock)用於產生同步訊號、MISO(master in slave out)、MOSI(master out sla

RTP實時音視訊資料傳輸,傳送端和接收

1.專案前期工作(配置好環境) 2.傳送端檔案編寫(見下面的send.cpp) 3.接收端檔案編寫(見下面的receive.cpp) 4.編譯檔案 (1)傳送端                       g++ -o send send.cpp -I /usr/loca

EasyUi DataGrid中資料編輯方式編輯後資料獲取,校驗處理

  EasyUi中的DataGrid提供前臺編輯的相關函式。 實現客戶選中DataGrid中一列後,對選中列中的一個欄位進行編輯,並對資料進行實時校驗後,傳遞至後臺儲存的需求, 主要涉及到DataGrid中設定編輯單元格,獲取編輯單元格,編輯單元格的onchange

Linux_PC間資料傳輸方式

資料壓縮能夠顯著減少傳輸的資料量。 1.SFTP(Secure File Transfer Protocol) 使用了加密、解密技術,傳輸效率比普通的FTP要低一些。 2.SCP(secure copy) scp -P portnumber -C filename [

SpaceNet遙感資料集下載資料集說明

資料集簡介:http://chgcx.sirt.edu.cn/a/2016/08/30/2016083020191315442.html 資料集說明:https://amazonaws-china.com/cn/public-datasets/

Django - 基於 ajax資料傳輸 + forms元件資料校驗 - 註冊功能頁面

目錄 一、forms元件 二、檢視函式 三、前端頁面 3-1 JQuery相關操作 四、資料庫相關 一、forms元件 from django import forms from django.core.exceptions import Validatio

AWS Snowball Edge 資料傳輸裝置_資料遷移

AWS Snowball Edge 是一種容量為 100TB 的資料遷移和邊緣計算裝置,並可通過 Amazon EC2 應用程式或 AWS Lambda 函式支援計算任務。客戶使用這些裝置在連線時斷時續的環境(例如製造業、工業和運輸)或在極其偏遠的位置(例如軍事或海事作業)進行資料收集、機器

AWS Snowmobile 資料傳輸服務_資料遷移方案

AWS Snowmobile 是一種用於將海量資料移動到 AWS 中的 EB 級資料傳輸服務。Snowmobile 是一個 45 英尺長的堅固的集裝箱,由一臺半掛卡車牽引,一次可以傳輸高達 100PB 的資料。Snowmobile 可以將海量資料輕鬆移動到雲中,實現視訊庫、圖片儲存庫甚至整個

利用閃回功能恢復刪除(drop,delete)的資料和表資料,update之後資料恢復

一、drop表 從 flashback table 裡查詢被刪除的資料表 1、select * from recyclebin order by droptime desc 2、執行表的恢復flashback table '需要恢復的表名' to before drop

springmvc資料的格式化資料校驗

一、資料的格式化 ① 配置<mvc:annotation-driven></mvc:annotation-driven> ② 直接在要格式化的屬性上加上格式化(這個格式是匹配你輸入的資料的格式) @DateTimeFormat(pattern="yy