Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf7e0506

Browse files
committed
Adding a layer 2 protocol
1 parent35d68c3 commitf7e0506

File tree

3 files changed

+72
-36
lines changed

3 files changed

+72
-36
lines changed

‎MeshBase.cpp

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ void MeshBase::Update()
3737
// Periodic sends
3838
if (millis() - last_broadcast_time > PEER_DISCOVERY_TIME)
3939
{
40-
if (!IsReady())
40+
if (!IsReady())
4141
ChooseAddress();
4242
SendPeerDiscovery();
4343
}
@@ -51,11 +51,18 @@ void MeshBase::Update()
5151
uint8_t len = radio.getDynamicPayloadSize();
5252
uint8_t buff[40];
5353
done = radio.read(buff,min(len,sizeof(buff)));
54-
if (pipe_num ==0)
55-
{
56-
HandleMessage(0, buff, len);
57-
}elseif (pipe_num ==1) {
58-
HandlePeerDiscovery(buff, len);
54+
55+
const MeshBase::Message* msg = (structMeshBase::Message*)buff;
56+
uint8_t payload_length = len -sizeof(Message);
57+
constuint8_t* payload = buff +sizeof(Message);
58+
59+
switch(msg->type) {
60+
case type_peer_discovery:
61+
HandlePeerDiscovery(msg, payload, payload_length);
62+
break;
63+
default:
64+
OnMessage(msg, payload, payload_length);
65+
break;
5966
}
6067
}while (!done);
6168
}
@@ -80,22 +87,21 @@ void MeshBase::Update()
8087
}
8188
}
8289

83-
voidMeshBase::HandlePeerDiscovery(void* buff,uint8_t length)
90+
voidMeshBase::HandlePeerDiscovery(const MeshBase::Message* msg,constvoid* buff,uint8_t length)
8491
{
8592
if (length !=sizeof(PeerDiscoveryMessage))
8693
return;
87-
PeerDiscoveryMessage from = *(PeerDiscoveryMessage*)buff;
88-
// Dont know why, but this keeps happening?
89-
/*if (from == 0)
90-
return;*/
94+
const PeerDiscoveryMessage* pd = (structPeerDiscoveryMessage*)buff;
95+
//if (msg.protocol_version != 1)
96+
//return;
9197

92-
Peer* peer =GetPeer(from.address);
98+
Peer* peer =GetPeer(msg->address_from);
9399
if (peer ==NULL)
94100
{
95101
// Found a new peer
96102
Serial.print("New Peer:");
97-
Serial.println(from.address, DEC);
98-
Peer* p =newPeer(from.address);
103+
Serial.println(msg->address_from, DEC);
104+
Peer* p =newPeer(msg->address_from);
99105
peers.Add(p);
100106
OnNewPeer(p);
101107
}else {
@@ -107,27 +113,37 @@ void MeshBase::HandlePeerDiscovery(void* buff, uint8_t length)
107113
voidMeshBase::SendPeerDiscovery()
108114
{
109115
last_broadcast_time =millis();
110-
MeshBase::PeerDiscoveryMessage msg;
111-
msg.version =1;
112-
msg.address = address;
113-
msg.num_peers = peers.length;
114-
SendBroadcastMessage(PEER_DISCOVERY, &msg,sizeof(MeshBase::PeerDiscoveryMessage));
116+
MeshBase::PeerDiscoveryMessage payload;
117+
payload.protocol_version =1;
118+
payload.network_capabilities =0;
119+
payload.application_capabilities =0;
120+
payload.num_peers = peers.length;
121+
payload.uptime =millis() /1000;
122+
SendMessage(PEER_DISCOVERY, type_peer_discovery, &payload,sizeof(MeshBase::PeerDiscoveryMessage),true);
115123
}
116124

117-
voidMeshBase::SendBroadcastMessage(uint32_t to,constvoid* data,uint8_t length)
125+
voidMeshBase::SendMessage(uint32_t to,uint8_t type,constvoid* data,uint8_t length,bool is_broadcast)
118126
{
127+
uint8_t buff[32];
128+
Message* msg = (structMessage*)buff;
129+
msg->protocol_version =1;
130+
msg->ttl =0;
131+
msg->type = type;
132+
msg->address_from = address;
133+
msg->split_enabled =0;
134+
msg->split_part =0;
119135
radio.stopListening();
120-
radio.openWritingPipe(TO_BROADCAST(to));
136+
if (is_broadcast)
137+
radio.openWritingPipe(TO_BROADCAST(to));
138+
else
139+
radio.openWritingPipe(TO_ADDRESS(to));
121140
radio.write(data, length);
122141
radio.startListening();
123142
}
124143

125-
voidMeshBase::SendMessage(uint32_t to,constvoid* data,uint8_t length)
144+
voidMeshBase::SendMessage(uint32_t to,uint8_t type,constvoid* data,uint8_t length)
126145
{
127-
radio.stopListening();
128-
radio.openWritingPipe(TO_ADDRESS(to));
129-
radio.write(data, length);
130-
radio.startListening();
146+
SendMessage(to, type_user, data, length,false);
131147
}
132148

133149
voidMeshBase::ChooseAddress()

‎MeshBase.h

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,30 @@ class MeshBase
1616
Peer(uint32_t address) : address(address), time(0) {}
1717
};
1818

19+
structMessage
20+
{
21+
uint8_tprotocol_version;
22+
uint8_tttl;
23+
uint8_ttype;
24+
boolsplit_enabled :1;
25+
uint8_tsplit_part :7;
26+
uint32_taddress_from;
27+
};
28+
29+
// -- Message types --
30+
enum message_type {
31+
type_peer_discovery,
32+
type_peer_list,
33+
type_user,
34+
};
35+
1936
voidBegin();
2037
voidUpdate();
21-
voidSendMessage(uint32_t address,constvoid* data,uint8_t length);
38+
voidSendMessage(uint32_t address,uint8_t type,constvoid* data,uint8_t length);
2239
uint32_tGetAddress()const {return address; }
2340
boolIsReady()const {return address !=0; }
2441
protected:
25-
virtualvoidHandleMessage(uint32_t sender,constvoid* data,uint8_t length) = 0;
42+
virtualvoidOnMessage(const MeshBase::Message* meta,constvoid* data,uint8_t length) = 0;
2643
virtualvoidOnNewPeer(Peer*) {}
2744
virtualvoidOnLostPeer(Peer*) {}
2845
private:
@@ -32,8 +49,9 @@ class MeshBase
3249
unsignedlonglast_peer_check_time;
3350

3451
voidSendPeerDiscovery();
35-
voidSendBroadcastMessage(uint32_t address,constvoid* data,uint8_t length);
36-
voidHandlePeerDiscovery(void* buff,uint8_t length);
52+
voidSendMessage(uint32_t address,uint8_t type,constvoid* data,uint8_t length,bool is_broadcast);
53+
voidHandlePeerDiscovery(const Message* msg,constvoid* buff,uint8_t length);
54+
voidHandleMessage(const Message* msg,constvoid* data,uint8_t length);
3755
voidChooseAddress();
3856

3957
LinkedList<Peer>peers;
@@ -42,9 +60,11 @@ class MeshBase
4260

4361
structPeerDiscoveryMessage
4462
{
45-
uint8_tversion;
46-
uint32_taddress;
47-
uint16_tnum_peers;
63+
uint8_tprotocol_version;
64+
uint8_tnetwork_capabilities;// What routing/networking can I do for the network
65+
uint8_tapplication_capabilities;// What type of data do I expose
66+
uint16_tnum_peers;// Number of direct peers
67+
uint32_tuptime;// Seconds since boot
4868
};
4969

5070
};

‎RF_test.ino

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ class App : public MeshBase
77
public:
88
App() : MeshBase(9,10) {}
99
protected:
10-
virtualvoidHandleMessage(uint32_t sender,constvoid* data,uint8_t length)
10+
virtualvoidOnMessage(const MeshBase::Message* meta,constvoid* data,uint8_t length)
1111
{
12-
Serial.print(sender, DEC);
12+
Serial.print(meta->address_from, DEC);
1313
Serial.print(" :");
1414
Serial.println((constchar*)data);
1515
}
@@ -20,7 +20,7 @@ protected:
2020
int len =snprintf(buff,255,"Hello %u from %u", p->address,GetAddress());
2121
Serial.print("Sending message:");
2222
Serial.println(buff);
23-
SendMessage(p->address, buff, len +1);
23+
SendMessage(p->address,type_user,buff, len +1);
2424
}
2525
};
2626

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp