Today SlingshotSMS has a new release for Mac and Windows and a lot of new documentation. Most importantly, it now produces RSS 2.0, works with a larger variety of modems, and can auto-connect to new devices.
Using SlingshotSMS is a lot smoother now too. Just double-click the SlingshotSMS icon in the distribution and it will launch as an OS X application.
It opens up http://localhost:8080/ in a browser, and documentation and demos are immediately available.
Documenting SlingshotSMS has been a learning experience, particularly in making documentation usable and maintainable. In this case, Python’s docutils has been very important. With docutils, the documentation — written in reStructedText — is parsed by GitHub for the project page Readme and is also parsed by docutils, which is built into SlingshotSMS to provide interactive documentation while running SlingshotSMS locally.
SlingshotSMS is a minimal HTTP wrapper around pygsm’s interface to GSM modem functions. pygsm is developed primarily by Adam Mckaig from UNICEF, and it’s the centerpiece of RapidSMS, which is an awesome framework. RapidSMS is seriously open source — the community is all using GitHub to collaborate and the basis of the project, Django, has a lot of good, clean code in it.
Modem autodetection is a tricky task, and this code is a fighting attempt at it. Most interfaces to GSM modems are still serial interfaces, whether connected via USB, Bluetooth, or a serial cable. Serial connections are far from plug-and-play, and the most notable blind spot is detection of the baudrate of modems; so SlingshotSMS (and, soon, pygsm) can scan through likely baudrates in search of the correct one for a modem. Also, great code from the PySerial project is used for the tricky task of scanning ports on Windows.
Packaging SlingshotSMS for common platforms has been a challenge but made eventually possible by the py2exe and py2app projects, which perform the difficult and impressive task of bundling a Python runtime and all required libraries into a single, portable executable.