Phidgets are hardware interfaces that let your computer interact with the environment. In this first blogpost of a new series, I explain how to automatically power-cycle a crashed embedded device.
I’ve been playing with Phidgets over the holiday season. Phidgets are inexpensive hardware interfaces for your computer. You connect them via USB, thus extending your machine with digital inputs/outputs and analogue inputs.
There are several aspects I like about the API-software:
- it’s available for Windows, Linux and Mac
- the Linux version is open-source (in a next post, I’ll show it running on my nslu2)
- there’s support for many programming languages, even Python
- input changes can trigger events (avoids polling loops)
One problem with automated fuzzing of embedded devices (for example a WiFi AP) is that you’ve to power-cycle a device when it crashed. And that’s a problem when you let it run unattended (i.e. overnight). So it would be handy to have your fuzzer power-cycle the device each time it detects the device became unresponsive.
This Phidget Interface Kit with 4 relays lets you do this. Connect the power supply of the embedded device to the NC (Normally Closed) connector of the relay. This way, the un-powered relay will let the current flow through the power-supply and feed the embedded device. To power-cycle the device, activate the relay for a second or two. This will open the circuit and shutdown the embedded device.
Activating a relay for a second is very easy with the Phidgets sofware, here is a Python example for an Interface Kit:
oInterfaceKit = Phidgets.Devices.InterfaceKit.InterfaceKit() oInterfaceKit.openPhidget() oInterfaceKit.waitForAttach(10000) oInterfaceKit.setOutputState(0, True) time.sleep(1) oInterfaceKit.setOutputState(0, False) oInterfaceKit.closePhidget()
setOutputState is the actual command used to control the relay on output 0. The other statements are necessary to setup the interface.
Before OSes took full control over the input and output ports, a popular solution was to connect a relay to a Centronics printer port and control the output of the port directly from your program. But nowadays, OSes like Windows take full control over the Centronics port (if your machine still has one…), making it much harder to control from user software.
Phidgets were used (but not hurt) for my TweetXmasTree: