One of the things that has been bugging the the most when working with Arduinos and AIR is the fact that you needed some sort of proxy application running in order to allow the AIR (or Flash) application to talk to the Arduino. You see, the Arduino only exposes a Serial port (via USB), and AIR is limited in this regard. The way people have gotten around this so far is to have AIR create a TCP socket connection to some sort of Proxy application, which in turn opens the Serial port to the Arduino. It works, and it works very well, however this is a separate application you have to ship, have the user configure, and run. Heck, even me as the developer found this solution clumsy when demoing these solutions.
I finally decided to fix the problem and write an AIR Native Extension. The AIR Native Extension (ANE) is a C based .DLL / .framework for the Windows/Mac platforms that allows AIR to essentially open a COM port. I wrote it in a way that is supposed to emulate the functions of the flash.net.Socket library that is included in the AIR runtime. I’ve posted the entire project, including the source code and final binaries on Google Code at http://code.google.com/p/as3-arduino-connector/ (well, everything except for my compilation scripts, which are specific to my computers).
The biggest learning experience in creating this ANE was developing on the MacOS platform. I’ve never done any programming targeted for that platform before, and working with XCode is just a pain. I’m used to environments like Visual Studio and Eclipse, but XCode always seemed to fight me every step of the way. From simple things like hiding all the project properties, to trying to force you into an MDI workflow. Also, working with the lack of documentation on the AIR Runtime side was kind of depressing… Don’t worry, a future blog post will try to fill everybody in on how to make an ANE using XCode.
Using the ANE :
- Include the ANE into your project. Make sure you are using Flash Builder 4.6 or later. Right-Click on your project in the Package Explorer (Project Explorer), and go to Properties. Go to the Flex Build Path tab, and then the Native Extensions tab. Click “Add ANE…” and bring it in. It does not need to reside within your project source folder.
- Next, import the com.quetwo.Arduino.ArduinoConnector and the com.quetwo.Arduino.ArduinoConnectorEvent packages.
- Instantiate a new variable of type ArduinoConnector.
- Check the isSupported() function to make sure that the ANE is supported on your specific platform, and if it loaded properly.
- Call the “getComPorts()“ function which will return an array of valid list of COM ports on your OS. On Windows, this returns ALL COM ports that are valid in Windows, where on the MacOS platform, it will return any USB Serial Devices, which usually would only be your Arduino.
- Make the connection to the Arduino by calling the “connect(comPort, baud)“ function. You will need to pass in one of the COM ports from the getComPorts() array, along with the baud rate that your Arduino is operating on. If you are using Firmata, it is 57600. Most other Arduino projects use 9600.
- Next, add an event listener to listen for the “socketData” event. This will fire when new data is available in the data buffer. Don’t wait too long to pull data out of the buffer, because it is only 4k 🙂
Sending data is just like the Socket class, except you don’t have to flush() the buffer — the data goes out in realtime. The two most common ways to send data :
- writeString(“hello world”);
Getting Data from the Buffer:
As data arrives and is placed into the buffer, the bytesAvailable variable is incremented to reflect how many bytes are available. Most people will read data from the buffer using one of the two functions :
All of the read functions are FIFO, meaning they will return the oldest data in the buffer before they return the newest (First In, First Out).
On the Google Code site, I am posting more detailed documentation, including a simple patch to as3Glue which will allow as3Glue to work seamlessly with this ANE.
Enjoy, and please provide feedback on this ANE. It’s the first one I’ve released to the public and I’d like to know how it works for everybody!