- Line of sight. If there is a lot of garbage between you and the satellite (buildings, trees, powerlines, mountains, etc) your signal quality is going to degrade. Less signal = less reliability.
- Noise and interference. Ever hear of multipathing? Multipathing is when data from the satellite, which is being broadcast over a wide area, the signal can bounce off various objects. Multiple versions of the signal, some slightly distorted and delayed, can add together and interfere with each other at the receiver. On top of this effect, you have to deal with all sorts of other interference from objects which are supposed to emit signals (think cell phones and radio stations) to those that really aren't supposed to (think HVAC units)
- Transmit power. An electromagnetic wave traveling through free space decreases in signal power proportional to the cube root of the distance travelled. Satellites are hella far away. If your little doodad can't muster the mustard, your signal is going to be lost in space.
- Protocol issues. What's your transmit frequency? bit rate? bandwidth? What's your transmission protocol? Data collision policy? Coding scheme? Interleaving? Do you have encryption? What form of modulation are you using? Error correction? Get one thing wrong, and it's bye-bye message.
Here's a sample of the type of program that we were running. It is a short test script with very little real-world application, and it was given to us directly from the manufacturer for testing purposes. The software platform is highly asynchronous, and performs a lot of tasks automatically for us.
- Enqueue a simple "hello world" message
- Enqueue a message with the GPS-derived location of the terminal
- When all messages in the queue are sent and the queue becomes empty, shut down.
- We create and enqueue the first "hello world" message
- The transmitter takes the message out of the queue and sends it before the GPS message can be added to the queue
- Seeing that the queue has become empty (as per our instructions) the device shuts down without sending the second message. Wash, rinse, repeat.
In short: If you're an engineer or a programmer and aren't familar with asynchronous systems, preemptive multithreading systems, or race conditions, do yourself a favor and spend some time to read up on it.