There's actually a fairly simple way to deal with external systems that to me would seem to apply to hardware as well:
First, write code that "tests" the actual hardware, that means it drives the hardware and checks its results. Verify using whatever means you have available that it drives the hardware correctly.
Second, create a variant of this first test (class) that runs against your simulator (checking for the same results). I used a trivial subclass that changed nothing except replacing the device interface with the simulator.
Third, write your simulator against these tests.
Fourth, use your simulator to test the remainder of your system without requiring the hardware/external system.
Extend when you make use of new features, and occasionally test against the real system/hardware...