We do not abstract the hardware at all. Resin's job is to get your code running on the devices, and ensuring it keeps running well. If you want to use devices with underlying hardware differences, you can either make separate resin apps and maintain separate code branches for each type, or use some library that will abstract the different devices for you.
we do abstract networking control as resin is dependent on the network to keep operating, but the application can take control (and responsibility) of networking if needed.