{ "info": { "author": "Stephen Oliver", "author_email": "steve@infincia.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Hardware :: Hardware Drivers" ], "description": "============================\r\nPyAirview\r\n============================\r\n\r\n.. _CC2011: http://www.ti.com/product/cc2511\r\n.. _DEVICE_API.md: https://github.com/infincia/pyairview/blob/master/DEVICE_API.md\r\n\r\n.. image:: https://pypip.in/license/pyairview/badge.svg?style=flat\r\n :target: https://pypi.python.org/pypi/pyairview/\r\n :alt: License\r\n\r\n.. image:: https://pypip.in/py_versions/pyairview/badge.svg?style=flat\r\n :target: https://pypi.python.org/pypi/pyairview/\r\n :alt: Supported Python versions\r\n\r\n.. image:: https://pypip.in/status/pyairview/badge.svg?style=flat\r\n :target: https://pypi.python.org/pypi/pyairview/\r\n :alt: Development Status\r\n\r\n.. image:: https://travis-ci.org/infincia/pyairview.svg?branch=master\r\n :target: https://travis-ci.org/infincia/pyairview\r\n\r\nPyAirview is a library for the Ubiquiti Airview2 2.4GHz spectrum analyzer, which\r\nhas an undocumented device API.\r\n\r\nPyAirview allows the Airview device to be used by 3rd party applications rather\r\nthan only with the original Java application.\r\n\r\nThe library works pretty well for the intended purpose :)\r\n\r\nOnce I have the basics written and documented I may port it to C for use in other\r\nlanguages and so that there is a common low level library available, but it's \r\nsimple enough that even a high level port to Ruby or C# would probably take no \r\nmore than a day.\r\n\r\nDevice API documentation\r\n----------------------------------\r\n\r\nSee the DEVICE_API.md_ file included in this repository\r\n\r\nUsage\r\n----------------------------------\r\n\r\n.. code-block:: python\r\n\r\n from __future__ import print_function\r\n from time import sleep\r\n\r\n import pyairview\r\n\r\n # open the proper serial port\r\n pyairview.connect(port=\"/dev/ttyACM0\")\r\n\r\n # retrieve device-specific information like RF frequency range and channel size\r\n device_info = pyairview.get_device_info()\r\n print('Device info: %s', device_info)\r\n\r\n \"\"\"\r\n start RSSI scanning in a background thread. callback should take a parameter\r\n named 'rssi_list', which will be a list of rssi values. Use information\r\n obtained in device_info to interpret the RSSI values and pair them with\r\n exact frequencies.\r\n\r\n \"\"\"\r\n def scan_callback(rssi_list):\r\n print('Received %d RSSI level readings: %s', len(rssi_list), rssi_list)\r\n\r\n pyairview.start_scan(callback=scan_callback)\r\n\r\n some_condition = False\r\n while pyairview.is_scanning():\r\n sleep(0.1) # or do something else, change some_condition, etc\r\n if some_condition == True:\r\n pyairview.stop_scan()\r\n\r\nAirview2 hardware\r\n----------------------------------\r\n\r\nThe Airview2 devices were very cheap ($29-39) and originally came with a Java \r\napp for visualizing usage of that frequency band, for Wi-Fi network planning, \r\ndiscovering rogue hotspots, diagnosing Bluetooth issues, etc.\r\n\r\nInside, the device is basically just a simple microcontroller (A CC2011_)\r\nwith an integrated 2.4GHz radio and a USB interface. It uses the standard USB \r\nCDC-ACM serial interface to connect to a PC.\r\n\r\nThe firmware running on the device is likely custom built by Ubiquiti Networks,\r\nI don't possess a copy of it outside my own Airview2 device, even in dumped binary \r\nform, so I don't know much about it but it seems to be a simple command/response\r\nloop coupled with a function to use the native RSSI power level scanning provided\r\nby the chip.\r\n\r\nLibrary development and reverse engineering\r\n-------------------------------------------\r\n\r\nThis library was created after hours and hours of manual testing with ``gtkterm``\r\nand ``screen``, guessing the proper commands to use the device API. None of the\r\ninformation used to create this library came from decompiling the device firmware\r\nor the original Java application. \r\n\r\n*DO NOT* create github issues containing, or send me the following things:\r\n\r\n- Dumped firmware from the device\r\n- Decompiled firmware or code derived from it\r\n- Decompiled versions of the original software or code derived from it\r\n- API related code of any kind (aside from documented 'clean room' efforts)\r\n- Etc.\r\n\r\nI have not seen those things, and I do not want to see them as it would prevent \r\nme from being able to write code for this library anymore.\r\n\r\nI'm not even sure how to go about using clean room documentation properly, if \r\nsomeone were to provide it to me, so while it would probably help and I would\r\nappreciate the help of course, please don't post or send documentation either \r\nwithout discussing it with me first.\r\n\r\nIf you want to help, feel free to review the code for flaws, or open a terminal \r\nconnected to your Airview device and guess some commands as I have done :)\r\n\r\nChangelog\r\n=========\r\n\r\nRelease 0.1a2\r\n-------------\r\n\r\n- Single-file Python 2.7 and 3.2+ compatibility\r\n\r\nRelease 0.1a1\r\n-------------\r\n\r\n- Rename libairview module to pyairview to match project name (same for test app)\r\n\r\n- Automatic testing with Travis-CI. Just tests importing the pyairview module\r\n for now, but that is enough to discover certain simple bugs. Code to simulate\r\n a serial connection to an actual Airview device will be added soon, which is\r\n necessary in order to actually test anything in the library itself\r\n\r\n- Make start_scan() command non-blocking, caller is expected to handle managing\r\n the library as part of a runloop etc.\r\n\r\n- Add disconnect() command to close the serial port if needed\r\n\r\n- Allow calling code to safely start and stop scanning whenever needed\r\n\r\n- Handle situations where partial responses are left in the serial buffer\r\n\r\n- Add support for newly discovered 'es' command to instruct Airview to end the\r\n current scan\r\n\r\n- Add automatic parsing of device info from 'gdi' command, each element is put\r\n into a dictionary with public module constants provided for each key\r\n\r\n\r\nRelease 0.1a0\r\n-------------\r\n\r\n- Support for Python 2.7 only for now, 3.2+ is being worked on\r\n\r\n- Initial alpha release", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://infincia.github.io/pyairview/", "keywords": "airview ubiquiti airview2 spectrum analyzer", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "pyairview", "package_url": "https://pypi.org/project/pyairview/", "platform": "any", "project_url": "https://pypi.org/project/pyairview/", "project_urls": { "Homepage": "http://infincia.github.io/pyairview/" }, "release_url": "https://pypi.org/project/pyairview/0.1a2/", "requires_dist": [ "PySerial" ], "requires_python": null, "summary": "A library for the Ubiquiti Airview2 2.4GHz spectrum analyzer", "version": "0.1a2" }, "last_serial": 1381288, "releases": { "0.1a0": [ { "comment_text": "", "digests": { "md5": "ce58f37478651865a62789e3177ba9fc", "sha256": "7805f7b2e19801c38b864895d7dc38421c09d9141dd7d9b94bede769f1c5ad8a" }, "downloads": -1, "filename": "pyairview-0.1a0-py2-none-any.whl", "has_sig": true, "md5_digest": "ce58f37478651865a62789e3177ba9fc", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 9484, "upload_time": "2015-01-10T04:32:08", "url": "https://files.pythonhosted.org/packages/4c/fa/ceda3cf361cd16c49a98ee750ea8444341345ddd64826ec859917f391f43/pyairview-0.1a0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5eb7b5f50e8df808438c0c88abbf21bc", "sha256": "97fd81baaee99aee4873b8d02df66484272209f0661a569f7df73a915b3bb428" }, "downloads": -1, "filename": "pyairview-0.1a0.tar.gz", "has_sig": true, "md5_digest": "5eb7b5f50e8df808438c0c88abbf21bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6818, "upload_time": "2015-01-10T04:32:12", "url": "https://files.pythonhosted.org/packages/19/e8/d28ab8012fc15a0322d2b85c86ff1e12234fb604413dc62f98acc10acc77/pyairview-0.1a0.tar.gz" } ], "0.1a1": [ { "comment_text": "", "digests": { "md5": "d621f718f1920855e62a5f2c5eaca50b", "sha256": "369b3a2da8b8c6d4019ce0a3566d37f9f4ad5a2cea1f3077d337c26fe41b0875" }, "downloads": -1, "filename": "pyairview-0.1a1-py2-none-any.whl", "has_sig": true, "md5_digest": "d621f718f1920855e62a5f2c5eaca50b", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 12829, "upload_time": "2015-01-12T03:52:09", "url": "https://files.pythonhosted.org/packages/10/52/996a6a27db265d90ff942358ac26416a0ad77e2b7fd56807ebb58b4332d8/pyairview-0.1a1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ef997d9e804240f9f8493bd3f8b501e6", "sha256": "d4d1d208d9325b3697f9ce5d384ed2dd9d31b6debc322cd88d7e1b86639e8f05" }, "downloads": -1, "filename": "pyairview-0.1a1.tar.gz", "has_sig": true, "md5_digest": "ef997d9e804240f9f8493bd3f8b501e6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12518, "upload_time": "2015-01-12T03:52:13", "url": "https://files.pythonhosted.org/packages/50/ea/6d2d8d668fab62947539c0b2978a8b3ac99e74c3b4d53ef8e9b5d2eb7ce8/pyairview-0.1a1.tar.gz" } ], "0.1a2": [ { "comment_text": "", "digests": { "md5": "dffe913f2ccbd393cecfd2130921f7a3", "sha256": "50467c196449a8e97131ceb23bad50a3a1c13fcd8fe6004ccfdc08b4998df390" }, "downloads": -1, "filename": "pyairview-0.1a2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "dffe913f2ccbd393cecfd2130921f7a3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12896, "upload_time": "2015-01-13T03:42:41", "url": "https://files.pythonhosted.org/packages/ce/59/1f96d9469415c4b55272acc43831f89ec2dbfc6e5e024d4594ce6c227ca2/pyairview-0.1a2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3c593390318ce4d7cbdc5cc6f863954f", "sha256": "e99f3a6de101b8a4bd421d19fd9bd0348b6ea546b3ace72a1b1db43e8790fde7" }, "downloads": -1, "filename": "pyairview-0.1a2.tar.gz", "has_sig": true, "md5_digest": "3c593390318ce4d7cbdc5cc6f863954f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12623, "upload_time": "2015-01-13T03:42:44", "url": "https://files.pythonhosted.org/packages/49/f6/ddff7dc2ab1496b873bd6d2358bb6e8d7b7eb929abbf2332f1fc9d94914d/pyairview-0.1a2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "dffe913f2ccbd393cecfd2130921f7a3", "sha256": "50467c196449a8e97131ceb23bad50a3a1c13fcd8fe6004ccfdc08b4998df390" }, "downloads": -1, "filename": "pyairview-0.1a2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "dffe913f2ccbd393cecfd2130921f7a3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12896, "upload_time": "2015-01-13T03:42:41", "url": "https://files.pythonhosted.org/packages/ce/59/1f96d9469415c4b55272acc43831f89ec2dbfc6e5e024d4594ce6c227ca2/pyairview-0.1a2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3c593390318ce4d7cbdc5cc6f863954f", "sha256": "e99f3a6de101b8a4bd421d19fd9bd0348b6ea546b3ace72a1b1db43e8790fde7" }, "downloads": -1, "filename": "pyairview-0.1a2.tar.gz", "has_sig": true, "md5_digest": "3c593390318ce4d7cbdc5cc6f863954f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12623, "upload_time": "2015-01-13T03:42:44", "url": "https://files.pythonhosted.org/packages/49/f6/ddff7dc2ab1496b873bd6d2358bb6e8d7b7eb929abbf2332f1fc9d94914d/pyairview-0.1a2.tar.gz" } ] }