日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WinCE Heartbeat Message的实现

發(fā)布時間:2025/4/16 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WinCE Heartbeat Message的实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Heartbeat Message通常被稱為心跳幀,用于遠(yuǎn)程設(shè)備,告訴接收者我還活著。一般Heartbeat message會每隔一段時間發(fā)送一次,時間間隔根據(jù)需要來定。如果接收者一段時間內(nèi)沒有接收到設(shè)備的Heartbeat message,就會知道該設(shè)備可能被關(guān)閉或者出了問題。

?

一般Heartbeat message都是基于UDP的廣播,根據(jù)具體的環(huán)境和需求,Heartbeat message中可以包含多種信息,用于反映設(shè)備的基本信息和運行狀態(tài)。這里給一個Heartbeat Message網(wǎng)絡(luò)數(shù)據(jù)包的格式,如下:

?

假設(shè)HeartBeat Message網(wǎng)絡(luò)數(shù)據(jù)包由包頭(Standard Message Header)和數(shù)據(jù)(Message Data)兩部分組成,這樣看來,上圖描述的數(shù)據(jù)包格式不只用于HeartBeat Message,也可以用于其它類型的網(wǎng)絡(luò)數(shù)據(jù)傳輸,當(dāng)然這里只是介紹HeartBeat Message,先來介紹一下包頭(Standard Message Header),定義如下:

?

Src Hw Type: Byte 0-1

源設(shè)備的設(shè)備類型,一般大型系統(tǒng)中可能有不同類型的設(shè)備,比如網(wǎng)絡(luò)采集設(shè)備,網(wǎng)絡(luò)顯示終端,網(wǎng)絡(luò)控制設(shè)備等。這兩個Byte用于標(biāo)示該設(shè)備的設(shè)備類型。

?

Src Dev Id: Byte 3-4

源設(shè)備的設(shè)備ID,系統(tǒng)中每個網(wǎng)絡(luò)設(shè)備都有一個唯一的ID號,這兩個Byte用于標(biāo)示該設(shè)備的ID號。

?

Dst Hw Type: Byte 5-6

目的設(shè)備的設(shè)備類型,對于Heartbeat Message來說,這兩個Byte可以是0xFF,0xFF。

?

Dst Dev Id: Byte 8-9

目的設(shè)備的設(shè)備ID,除非你要將Heartbeat Message發(fā)動到指定的設(shè)備,否則這兩個Byte應(yīng)該是0xFF, 0xFF。

?

Prot Ver: Byte 10-11

通訊協(xié)議的版本,這2個Byte指數(shù)據(jù)包的格式,以后可能會升級,所以要包含當(dāng)前協(xié)議的版本,或者說當(dāng)前數(shù)據(jù)包格式的版本信息。

?

Msg Id: Byte 12-13

這里只發(fā)送數(shù)據(jù)包中的消息的ID,你可能不只發(fā)送Heartbeat Message,可能還要發(fā)送其他的Message,每一種Message有一個ID號來標(biāo)示,比如對于Heartbeat Message,這兩個Byte可以是0x5010,當(dāng)然也可以定義為其他。

?

Msg Type: Byte 14-15

消息的類型,對于一個復(fù)雜的系統(tǒng),可能有很多種類型的消息,比如Command Message, Error Message, Response Message,當(dāng)然Heartbeat Message也是一種,可以為Heartbeat Message的類型定義為0x0005。

?

Connection Type: Byte 16

連接類型,表示當(dāng)前消息基于Broadcast,還是point to point,一般Heartbeat Message都是Broadcast的。

?

Msg Priority: Byte 17

消息的優(yōu)先級,這里可以為消息定義不同的優(yōu)先級,接收消息的設(shè)備可能同時接收很多個來自不同設(shè)備的網(wǎng)絡(luò)消息,可以按照優(yōu)先級來處理,這里Heartbeat Message的優(yōu)先級可定義為Low或者Normal。

?

Reserved: Byte 18-21

預(yù)留4個Byte以后擴展或者做特殊用途。

?

Msg Length: Byte 22-23

描述后面消息的長度。

?

前面介紹了數(shù)據(jù)包包頭,下面介紹一下數(shù)據(jù)包中的數(shù)據(jù)部分,HeartBeat Message的數(shù)據(jù)部分結(jié)構(gòu),如圖:

?

?

MAC Address: Byte 24-29

設(shè)備的MAC地址。

?

BootLoader Ver: Byte 30-31

設(shè)備的Bootloader的版本號

?

Application Ver: Byte 32-33

設(shè)備的軟件版本號

?

Config Ver: Byte 34-35

設(shè)備的配置文件或者數(shù)據(jù)庫的版本號

?

Running Status: Byte 36

設(shè)備的運行狀態(tài),是Full-run狀態(tài),還是某一種低功耗運行狀態(tài)。

?

Power Status: Byte 37

設(shè)備的電源狀態(tài),可能包含多種電源輸入,比如3.3V,5V,+/-12V等,可以每個bit表示一種電源輸入的狀態(tài),是否所有電源輸入正常。

?

Temperature Status: Byte 38

設(shè)備的溫度狀態(tài),設(shè)備中可能包含多個溫度傳感器,每個Bit表示一路溫度監(jiān)測是否正常。

?

Extended Info: Byte 39-42

擴展信息,用于傳輸一些額外的信息。

?

?

前面把Heartbeat Message的格式介紹完了,然后就是發(fā)送該數(shù)據(jù)包。在WinCE下很簡單,就是一個socket的網(wǎng)絡(luò)廣播通訊,首先include “winsock2.h”頭文件,連接Ws2.lib靜態(tài)庫,剩下的就是socket編程了,代碼如下:

?

?

char?c_name[255];

int?i_brdcast, i_blockMode;

int?serverSock;

LPHOSTENT lpAddr;

in_addr ipAddr, brdAddr;

WSADATA wsaData;

WORD wVersion;

BOOL b_Ret;

?

struct?HeartBeat* pHeartbeat, Heartbeat_Data;

struct?sockaddr_in serverAddr;

?

b_Ret = FALSE;

pHeartbeat = &Heartbeat_Data;

// Windows Socket Initialization

wVersion = MAKEWORD(2, 2);

wsaStatus = WSAStartup(wVersion, &wsaData);

?

// Initialize socket addr structure

memset((char*)&serverAddr, 0,?sizeof(serverAddr));

serverAddr.sin_family = AF_INET;

serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

serverAddr.sin_port = htons(SOCKET_PORT);

?

// Create socket

serverSock = socket(AF_INET, SOCK_DGRAM, 0);

if?(serverSock != INVALID_SOCKET)

{??????????

??????gethostname(c_name,?sizeof(c_name));

??????lpAddr = gethostbyname(c_name);

??????ipAddr = *(struct?in_addr FAR*)(lpAddr->h_addr);

?????

??????// Initialize the broadcast address that depends on your network

??????brd_addr.sin_addr.S_un.S_un_b.s_b1 = ipAddr.S_un.S_un_b.s_b1;

??????brd_addr.sin_addr.S_un.S_un_b.s_b2 = ipAddr.S_un.S_un_b.s_b2;

??????brd_addr.sin_addr.S_un.S_un_b.s_b3 = 0xFF;

??????brd_addr.sin_addr.S_un.S_un_b.s_b4 = 0xFF;

?

??????// bind socket

??????if?(bind(serverSock, (LPSOCKADDR)&serverAddr,?sizeof(struct?sockaddr)) != SOCKET_ERROR)

??????{

????????????// support broadcast

????????????i_brdcast = 1;

????????????if?(setsockopt(serverSock, SOL_SOCKET, SO_BROADCAST, (char*)&i_brdcast,sizeof(i_brdcast)) != SOCKET_ERROR)

????????????{

??????????????????// set socket block mode

??????????????????i_blockMode = 0;

?????????????????if?(ioctlsocket(serverSock, FIONBIO, (u_long*)&i_blockMode) != SOCKET_ERROR)

??????????????????{

????????????????????????b_Ret = TRUE;

??????????????????}

????????????}

??????}

}

?

if?(b_Ret == TRUE)

{

??????// Initialize the Heartbeat Message buffer

??????pHeartbeat->Mac = ;

??????pHeartbeat->Bl_Ver = ;

??????pHeartbeat->Cfg_Ver = ;

??????pHeartbeat->App_Ver = ;

??????pHeartbeat->RunStatus = ;

??????pHeartbeat->PowerStatus = ;

??????pHeartbeat->TempStatus = ;

?

?

??????while (1)

??????{????

????????????sendto(serverSock, (char*)pHeartbeat, HEARTBEAT_LEN, 0,( LPSOCKADDR)&brdAddr,?sizeof(brdAddr));

????????????// Sleep 10 seconds

????????????Sleep(10000);

??????}

}

?

該代碼是隨手寫的,沒有調(diào)試,編譯不過很正常,實際上這里只是給個例子。對于上面的代碼多說兩句,建議發(fā)送Heartbeat Message單獨啟動一個線程來做,也可以啟動一個Timer來做。還有就是廣播地址可以是255.255.255.255,也可以是分段廣播,比如192.255.255.255或者192.168.255.255。使用什么樣的廣播地址取決于你的系統(tǒng),比如你可能只希望在當(dāng)前網(wǎng)段廣播Heartbeat Message,不要影響到其他的網(wǎng)段,那就可以根據(jù)具體情況來設(shè)置廣播地址。

總結(jié)

以上是生活随笔為你收集整理的WinCE Heartbeat Message的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。