Hi. I have 2 nano with nRF24L01 radios and one Mega with nRF24L01
Mega - server
Nano -clients
SERVER SIDE Code example:
Client One side CODE:
Client Two code is the same as Client one..just ClientId is different (ClientID =2)
What is/should do:
The server sends a radio message to clients. The message is for a specific client ( first Uint as seen in code).
The client is responsible for filtering the message. If the command is for that client, then activates the routine1 or 2, then sends a response to server.
THE PROBLEM:
Everything is working great, until the client sends his response to the server.
Example:
Server to Client 1
Client 1 received the msg, does the routine, sends back the response.
SERVER receved the client 1 response...and also Client 2 received the response, but EVERY UINT IS DOUBLED ..How?
Example:
server -> 112001 'where 1= clientId ,120=Number1, 0=Number2, 1=Typez
client1 <-112001
client2 <-112001 'IGNORES the msg..is not for him
client1 routines
client1 ->112000
server <- 112000
client2 <-224000 'THIS SHOULDN'T`T HAPPEN
Now i have a problem since the client2 id is '2' so he thinks that there is a valid message for him from the server and ignores every commands from now on from the server, since 'receivedXtimesRFID =1' .
I resolved my specific problem by changing the code in the clients:
since the Typez is only > 0 when the server sends it, so the client can ignore the double message from the other client.
But its still bothering me, because of the unnecessary data the clients receive , and I may have more than 2 clients for this project ( up until 8).
The question is..i did something wrong, or is something else?
Mega - server
Nano -clients
SERVER SIDE Code example:
B4X:
Process Globals
'Other Code
Private rf24 As RF24xt ' i`m using RF24xt(v1.02) library
Private const SERVER = 1, CLIENTradio= 2 As ULong
Private receivedXtimesRFID As Int=0
'...
End Sub
Private Sub AppStart
'other code
Serial1.Initialize(115200)
rf24.Initialize(7, 8, "rf24_NewData")
rf24.SetChannel(76)
rf24.SetGroupID(0xAB)
rf24.SetDataRate(1)
rf24.UseAutoAck(False)
rf24.UseCRC(False)
rf24.SetPower(3)
rf24.Sleep(False)
rf24.OpenReadingPipe(SERVER)
rf24.OpenWritingPipe(CLIENTradio)
'other code
End Sub
Sub SendtoCliend(ClientId as Uint,Number1 as Uint,Number2 as Uint,Typez as Uint) 'triggers when i send mqtt data from b4j app
'Example:
'ClientId=2
'Number1=1120
'Number2=0
'Typez=1
receivedXtimesRFID=0
Dim b() As Byte = bc.UIntsToBytes(Array As UInt(ClientId, Number1,Number2,Typez))
For i=0 To 2 'i`m sending without ack so i send it multiple times to be sure
rf24.Write(b)
Delay(300)
Next
rf24.ResetRx
End Sub
'receiving the data
Sub rf24_NewData (Data() As Byte) '
If receivedXtimesRFID=0 Then
receivedXtimesRFID=1
If Data.Length >= 8 Then
Dim numbers() As UInt = bc.UIntsFromBytes(bc.SubString2(Data, 0, 8))
Dim Number1 As UInt=numbers(1)
Dim Number2 As UInt=numbers(2)
Log(numbers(3))
If Number1 > 0 Then
SendSelect(Array(Clientz,numbers(0), "confirm",numbers(1))) 'mqtt sending to b4j app
Else
SendSelect(Array(Clientz,numbers(0), "confirm",numbers(2))) 'mqtt
End If
Else
Log("Missing data")
End If
Else
Log("Data already received")
End If
End Sub
Client One side CODE:
B4X:
Process Globals
'Other Code
Private rf24 As RF24xt ' i`m using RF24xt(v1.02) library
Private const SERVER = 1, CLIENTradio= 2 As ULong
Private receivedXtimesRFID As Int=0
Private ClientId as Uint = 1 'first client
'...
End Sub
Private Sub AppStart
'other code
Serial1.Initialize(115200)
rf24.Initialize(9, 10, "rf24_NewData")
rf24.SetChannel(76)
rf24.SetGroupID(0xAB)
rf24.SetDataRate(1)
rf24.UseAutoAck(False)
rf24.UseCRC(False)
rf24.SetPower(3)
rf24.Sleep(False)
rf24.OpenReadingPipe(CLIENTradio)
rf24.OpenWritingPipe(SERVER)
'other code
End Sub
Sub rf24_NewData (Data() As Byte)
If Data.Length >= 8 Then
Dim numbers() As UInt = bc.UIntsFromBytes(bc.SubString2(Data, 0, 8))
Dim ClientIdSent As UInt=numbers(0)
Dim FirstStrk As UInt =numbers(1)
Dim SecondStrk As UInt =numbers(2)
Dim Typez As UInt=numbers(3)
If ClientIdSent = ClientId Then
If receivedXtimesRFID= 0 Then
receivedXtimesRFID = 1
Else
Log("data already received")
Return
End If
If Typez=1 Then
'my routine1
CallSubPlus("Gotest",500,0)
Else If Typez = 2 Then
'my routine2
End If
End If
End If
End Sub
Sub SendResponseRadio(Tag As Byte)' triggers after myroutine1 or myroutine2 is done
'Example:
'ClientId=1
'Number1=1120
'Number2=0
'Typez=0
Dim b() As Byte = bc.UIntsToBytes(Array As UInt(ClientId, Number1,Number2,Typez))
Dim numbers() As UInt = bc.UIntsFromBytes(bc.SubString2(b, 0, 8))
For i=0 To 1
If rf24.Write(b)=True Then
Log("ok sent rfid ",numbers(0),numbers(1),numbers(2))
Else
i=0
End If
Delay(150)
Next
rf24.ResetRx
receivedXtimesRFID = 0 'because i ignore all responses if i already have a command from radio until the current command is done and i`ve sent the client`s response
End Sub
Client Two code is the same as Client one..just ClientId is different (ClientID =2)
What is/should do:
The server sends a radio message to clients. The message is for a specific client ( first Uint as seen in code).
The client is responsible for filtering the message. If the command is for that client, then activates the routine1 or 2, then sends a response to server.
THE PROBLEM:
Everything is working great, until the client sends his response to the server.
Example:
Server to Client 1
Client 1 received the msg, does the routine, sends back the response.
SERVER receved the client 1 response...and also Client 2 received the response, but EVERY UINT IS DOUBLED ..How?
Example:
server -> 112001 'where 1= clientId ,120=Number1, 0=Number2, 1=Typez
client1 <-112001
client2 <-112001 'IGNORES the msg..is not for him
client1 routines
client1 ->112000
server <- 112000
client2 <-224000 'THIS SHOULDN'T`T HAPPEN
Now i have a problem since the client2 id is '2' so he thinks that there is a valid message for him from the server and ignores every commands from now on from the server, since 'receivedXtimesRFID =1' .
I resolved my specific problem by changing the code in the clients:
B4X:
'instead of:
If receivedXtimesRFID= 0 Then
receivedXtimesRFID = 1
Else
Log("data already received")
Return
End If
'i changed it to:
If receivedXtimesRFID= 0 Then
If Not (Typez=0) Then
receivedXtimesRFID = 1
End If
Else
Log("data already received")
Return
End If
But its still bothering me, because of the unnecessary data the clients receive , and I may have more than 2 clients for this project ( up until 8).
The question is..i did something wrong, or is something else?
Last edited: