I ended up using
CallSubUtils with a Map.
When I send a message I am putting the Key as the ID, and the value of that as the value I am sending.
I am also then triggering a sub using CallSubUtils. So once the message is sent, I am calling a sub in 3 seconds time.
csu.CallSubPlus2(Me, "Send_again", 3000, Array("DeviceIDHere"))
When the Sub (Send_again) is triggered in 3 seconds time it will check the Map to see if that command is in the list. If it is, then it will re-send the command and won't remove it just in case it didn't get a reply. I am also using the above code in this sub so it triggers this sub again in 3 seconds, but only calling this code if there is still a item for this device in the list. If the device is removed (or not in the list no more) then I am not running that above code since there is no reason to check since we know there is no item in the Map.
When I receive the command from the device, I am removing the Key from the Map.
So far it all seems to be working fine. Thought I would post how I got it to work in case anyone else wanted to know how I ended up making it work.