{ "info": { "author": "Chris Peplin ", "author_email": "github@rhubarbtech.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3" ], "description": "pygatt - Python Module for Bluetooth LE Generic Attribute Profile (GATT).\n=========================================================================\n\nThis Module allows reading and writing to GATT descriptors on devices\nsuch as fitness trackers, sensors, and anything implementing standard\nGATT Descriptor behavior.\n\npygatt provides a Pythonic API by wrapping two different backends:\n\n- BlueZ (requires Linux), using the ``gatttool`` command-line utility.\n- Bluegiga's BGAPI, compatible with USB adapters like the BLED112.\n\nMotivation\n----------\n\nDespite the popularity of BLE, we have yet to find a good programming\ninterface for it on desktop computers. Since most peripherals are\ndesigned to work with smartphones, this space is neglected. One\ninteractive interface, BlueZ's ``gatttool``, is functional but difficult\nto use programmatically. BlueZ itself obviously works, but the interface\nleaves something to be desired and only works in Linux.\n\nRequirements\n------------\n\n- Python 2.7.5 or greater, or Python 3.5 or greater\n\n - Python 2.7.3's ``struct`` library has a bug that will break PyGATT - 2.7.5\n or greater is recommended.\n\n- BlueZ 5.18 or greater (with gatttool) - required for the gatttool\n backend only.\n\n - Tested on 5.18, 5.21, 5.35 and 5.43\n\n- GATTToolBackend requires Linux (i.e. not Windows compatible)\n\nInstallation\n------------\n\nInstall ``pygatt`` with pip from PyPI:\n\n::\n\n $ pip install pygatt\n\nThe BlueZ backend is not supported by default as it requires\n``pexpect``, which can only be installed in a UNIX-based environment. If\nyou wish to use that backend, install the optional dependencies with:\n\n::\n\n $ pip install \"pygatt[GATTTOOL]\"\n\nInstall the latest development version of ``pygatt`` with pip:\n\n::\n\n $ pip install git+https://github.com/peplin/pygatt\n\nDocumentation\n-------------\n\nThe documentation for pygatt consists of:\n\n- This README\n- The code in the ``samples`` directory\n- The Python docstrings in the code itself.\n\nThe ``BLEDevice`` and ``BLEBackend`` base classes are the primary interfaces for\nusers of the library.\n\nExample Use\n-----------\n\nThe primary API for users of this library is provided by\n``pygatt.BLEBackend`` and ``pygatt.BLEDevice``. After initializing an\ninstance of the preferred backend (available implementations are found\nin ``pygatt.backends``, use the ``BLEBackend.connect`` method to connect\nto a device and get an instance of ``BLEDevice.``\n\n.. code:: python\n\n import pygatt\n\n # The BGAPI backend will attempt to auto-discover the serial device name of the\n # attached BGAPI-compatible USB adapter.\n adapter = pygatt.BGAPIBackend()\n\n try:\n adapter.start()\n device = adapter.connect('01:23:45:67:89:ab')\n value = device.char_read(\"a1e8f5b1-696b-4e4c-87c6-69dfe0b0093b\")\n finally:\n adapter.stop()\n\nNote that not all backends support connecting to more than 1 device at\nat time, so calling ``BLEBackend.connect`` again may terminate existing\nconnections.\n\nHere's the same example using the GATTTool backend. It's identical\nexcept for the initialization of the backend:\n\n.. code:: python\n\n import pygatt\n\n adapter = pygatt.GATTToolBackend()\n\n try:\n adapter.start()\n device = adapter.connect('01:23:45:67:89:ab')\n value = device.char_read(\"a1e8f5b1-696b-4e4c-87c6-69dfe0b0093b\")\n finally:\n adapter.stop()\n\nNotifications Example\n---------------------\n\nThis example uses the gatttool backend to connect to a device with a specific\nMAC address, subscribes for notifications on a characteristic, and prints the\ndata returned in each notification.\n\n.. code:: python\n\n import pygatt\n from binascii import hexlify\n\n adapter = pygatt.GATTToolBackend()\n\n def handle_data(handle, value):\n \"\"\"\n handle -- integer, characteristic read handle the data was received on\n value -- bytearray, the data returned in the notification\n \"\"\"\n print(\"Received data: %s\" % hexlify(value))\n\n try:\n adapter.start()\n device = adapter.connect('01:23:45:67:89:ab')\n\n device.subscribe(\"a1e8f5b1-696b-4e4c-87c6-69dfe0b0093b\",\n callback=handle_data)\n finally:\n adapter.stop()\n\nDebugging\n---------\n\nWhile debugging software using pygatt, it is often useful to see what's\nhappening inside the library. You can enable debugging logging and have\nit printed to your terminal with this code:\n\n::\n\n import pygatt\n import logging\n\n logging.basicConfig()\n logging.getLogger('pygatt').setLevel(logging.DEBUG)\n\nCan't find BGAPI device in Windows\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nYou may need to explicitly specify the COM port of your BGAPI-compatible\ndevice in windows, e.g.:\n\n::\n\n adapter = pygatt.BGAPIBackend(serial_port='COM9')\n\nIf you provide the COM port name, but still get an error such as\n``WindowsError(2, 'The system cannot find the file specified.')``, try\nchanging the COM port of the device to a value under 10, e.g. ``COM9``.\n\nAuthors\n-------\n\n- Jeff Rowberg @jrowberg https://github.com/jrowberg/bglib\n- Greg Albrecht @ampledata https://github.com/ampledata/pygatt\n- Christopher Peplin @peplin https://github.com/peplin/pygatt\n- Morten Kjaergaard @mkjaergaard https://github.com/mkjaergaard/pygatt\n- Michael Saunby @msaunby https://github.com/msaunby/ble-sensor-pi\n- Steven Sloboda https://github.com/sloboste\n- Ilya Sukhanov @IlyaSukhanov\n- @dcliftreaves\n- Jonathan Dan\n- Ilann Adjedj\n- Ralph Hempel\n- Rene Jacobsen\n- Marcus Georgi\n- Alexandre Barachant\n- Michel Rivas Hernandez\n- Jean Regisser\n- David Martin\n- Pieter Hooimeijer\n- Thomas Li Fredriksen\n- Markus Proeller\n- lachtanek\n- Andrea Merello\n- Richard Mitchell\n- Daniel Santos\n- Andrew Connell\n- Jakub Hrabec\n- John Schoenberger\n- Georgi Boiko\n- Jose Phillips\n\nReleasing to PyPI\n-----------------\n\nFor the maintainers of the project, when you want to make a release:\n\n- Merge all of the changes into ``master``.\n- Update the version in ``setup.py``.\n- Update the ``CHANGELOG.mkd``\n- Tag the commit and push to GitHub (will need to push to a separate\n branch of PR first since ``master`` is a protected branch).\n- Travis CI will take care of the rest - it will build and deploy\n tagged commits to PyPI automatically.\n\nLicense\n-------\n\nCopyright 2015 Stratos Inc. and Orion Labs\n\nApache License, Version 2.0 and MIT License. See LICENSE.\n\n\n.. :changelog:\n\nRelease History\n================\n\nV4.0.5\n------\n\nSame as 4.0.4. Re-released to fix PyPi upload.\n\nV4.0.4\n------\n\n* Improvement: Remove Bluetooth specification PDFs, refer to bluetooth.com to\n avoid copyright issues.\n* Improvement: Add wait_for_response option to subscription methods\n\nV4.0.3\n------\n\n* Fix: Regression with receiving indications with GATTTOOL backend\n* Fix: Regression with subscribing to characteristics with GATTTOOL (need to use\n writes, not commands) (#234)\n* Improvement: Don't require sudo for removing bonding (#234)\n\nV4.0.1\n------\n\n* Improvement: Wait longer for characteristics discovery with BGAPI backend (#201)\n* Fix: Protect against invalid BGAPI packets\n* Fix: Fix parsing fields from BGAPI connection status\n* Fix: Robust to non-UTF8 characters in hcitool scan results\n* Fix: Log correct connection flags from BGAPI response\n\nV4.0.0\n------\n\n* Feature: Add ``char_read_long`` for reading characteristics longer than a\n single packet (#206, #177)\n* Feature: Add command to change MTU (GATTTool only) (#182)\n* Feature: Allow registering callbacks for device discovery events. (#176)\n* Feature: Support fetching BLE device MAC address (#150)\n* Improvement: Add better serial port error handling for BGAPI. (#162)\n* Improvement: Expand and allow overriding pexpect search buffer for gatttool\n output to support devices with many characteristics without negatively\n impacting performance (#209)\n* Improvement: Wait before re-opening BGAPI serial port to improve detection on\n Windows. (#162)\n* Improvement: Add support for Python 3.7\n* Fix: Use ATT write (not command) by default for char_write\n* Fix: Wait longer for ATT write according to BlueGiga spec\n* Fix: Fix BGAPI device detection (#154)\n* Fix: Stop leaking file descriptors when erasing BLE bonds with GATTTool\n backend (#188)\n* Fix: Typos (#173)\n* Drop official support for Python 3.4, 3.5 and 3.6.\n\nV3.2.1\n------\n\n- Improvement: Officially support Python 3.6.\n- Improvement: Permit use of non-standard characteristics in reserved range (#140)\n\nV3.2.0\n------\n\n- Fix: Reliably auto-reconnect after restarting BGAPI device. Fixes a bug in\n first attempt at auto-reconnection, only worked in some environments. (#144)\n- Fix: Remove spurious \"no handler for logger\" warnings (#143)\n- Fix: Use enum-compat instead of enum34, to fix installation in Python 3.4+\n- Feature: Limit search window size for GATTTool backend, to avoid high CPU\n usage for long running connections. (#123)\n- Feature: Add support for write commands to BGAPIBackend (#115)\n\nV3.1.1\n------\n\n- Improvement: Convert documentation to RST for better PyPI integration.\n\nV3.1.0\n------\n\n- Fix: Support platforms without ``termios`` (Windows)\n- Feature: Add ``char_read_handle`` to GATTTool backend.\n- Improvement: Warn if ``hcitool`` requires a sudo authentication.\n- Improvement: Allow BGAPI device more time to reboot for more reliable\n discovery.\n- Improvement: Interpret \"invalid file descriptor\" as a disconnect\n event.\n- Fix: Correctly handle service class UUIDs that aren't 16 bytes.\n- Improvement: Support BLE devices with any UTF8 character.\n- Improvement: Make gatttol prompt timeout configurable.\n- Improvement: Gracefully stop ``lescan`` to avoid leaving the adapter\n in a bad state.\n- Improvement: Allow custom timeout for discovery on GATTTool backend.\n- Fix: Make sure responses to char reads on BGAPI backend are from the\n requested handle.\n- Improvement: Raise and exception if trying to instantiate the\n GATTTool backend in Windows.\n- Improvement: If no BGAPI device attached, abort immediately.\n- Fix: Use user's configured HCI device for connection and scanning in\n GATTTool backend.\n\nV3.0.0\n------\n\n- [API Change] The BGAPIBackend.connect method now takes the same\n ``address_type`` argument as the GATTTool backend [BGAPI].\n- [API Change] The ``address_type`` argument on both backends now\n requires a value from a new enum, ``pygatt.BLEAddressType``, instead\n of a string.\n- Made Python 3 support a priority for both GATTTOOL and BGAPI\n backends.\n- Improve reliability of BGAPI backend by re-setting device for each\n connection.\n\nV2.1.0\n------\n\n- Added all standard GATT characteristics. [BGAPI]\n- Move gatttool monitor to a background thread for increased\n performance. [GATTTOOL]\n\nV2.0.1\n------\n\n- Feature: Allow unsubscribing from notifications.\n- Improvement: Allow more time to discover characteristics. [GATTTOOL]\n- Improvement: Allow using gatttol backend without root. [GATTTOOL]\n- Improvement: Standardize type of UUID so comparison always works (str\n vs unicode)\n- Fix: Fix packaging so the version on PyPI can be installed.\n- Fix: Fix Python 3 compatibility.\n\nThanks to Ilya Sukhanov and Alexey Roslyakov for the changes in this\nrelease!\n\nv2.0.0\n------\n\n- New API with support for multiple BLE adapters.", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/peplin/pygatt", "keywords": "", "license": "Apache 2.0 and MIT", "maintainer": "", "maintainer_email": "", "name": "pygatt", "package_url": "https://pypi.org/project/pygatt/", "platform": "", "project_url": "https://pypi.org/project/pygatt/", "project_urls": { "Homepage": "https://github.com/peplin/pygatt" }, "release_url": "https://pypi.org/project/pygatt/4.0.5/", "requires_dist": null, "requires_python": "", "summary": "Python Bluetooth LE (Low Energy) and GATT Library", "version": "4.0.5" }, "last_serial": 5809209, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "5c56ccd53adf4b27a808fcc8875fc138", "sha256": "2bd62e962107356fdea248de2f887f7b3b2baba5c1117b34493c691a376df6b8" }, "downloads": -1, "filename": "pygatt-1.0.0.tar.gz", "has_sig": false, "md5_digest": "5c56ccd53adf4b27a808fcc8875fc138", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6698, "upload_time": "2014-12-14T10:08:00", "url": "https://files.pythonhosted.org/packages/0d/7b/8a6cafa737d0b8a6c67ec323538c948b0a8271f28af08671257d8680285c/pygatt-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "7a1590853f056cf5d78fbeb2e4bbce48", "sha256": "806dc5fbd66ff00e59864942707063f5e6ce26e022b9cbdd18f6b2e08cf41934" }, "downloads": -1, "filename": "pygatt-1.0.1.tar.gz", "has_sig": false, "md5_digest": "7a1590853f056cf5d78fbeb2e4bbce48", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6698, "upload_time": "2015-06-01T04:19:13", "url": "https://files.pythonhosted.org/packages/d1/73/5c270eb83ad4cbdf864431d15972529c17e7c6a39b002fff86229d511837/pygatt-1.0.1.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "80f8ec2ae68ee33ebb0a94bd016aa7c6", "sha256": "42817e663da36735f2d0a68c5a76408d485821d65143611c5c83816eb9b064d2" }, "downloads": -1, "filename": "pygatt-1.1.0.tar.gz", "has_sig": false, "md5_digest": "80f8ec2ae68ee33ebb0a94bd016aa7c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6839, "upload_time": "2015-07-29T17:56:30", "url": "https://files.pythonhosted.org/packages/a2/17/460ffed01aa91b1fb6a63cbf8f18b257d31ff31496a11c507d807d9bf06a/pygatt-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "351f182c9434b95b230e6a0df4fd18ad", "sha256": "23fdb960612449ed3f2090d9a63ad3755304decfa937c911ef049361b902e932" }, "downloads": -1, "filename": "pygatt-1.2.0.tar.gz", "has_sig": false, "md5_digest": "351f182c9434b95b230e6a0df4fd18ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6807, "upload_time": "2015-09-30T01:57:47", "url": "https://files.pythonhosted.org/packages/76/2d/7685d8f3e4ae1deeea1afc5b4bd73ab44bca2b92d6735cdbd285a4ae6d8f/pygatt-1.2.0.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "95a1b770e9d637f5bd4d3a637e81f70a", "sha256": "bf170bea9086dfc52aa9989ad1424d1afe84f2cd05a6cd2f6d17e9d783aaae9b" }, "downloads": -1, "filename": "pygatt-1.3.0.tar.gz", "has_sig": false, "md5_digest": "95a1b770e9d637f5bd4d3a637e81f70a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6879, "upload_time": "2015-10-15T21:56:11", "url": "https://files.pythonhosted.org/packages/c5/e6/c04a6119c7a93553840d62f4110a148fd6c3cf55fd0145cc262584ed9b26/pygatt-1.3.0.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "bcc02fb5237b9c1ecc2179cf18f0fdae", "sha256": "8f5a212c666dd9f0fe71e25210f4559bbe0b27ac0a6ce4e4ef5ce076b5bae737" }, "downloads": -1, "filename": "pygatt-2.0.0.tar.gz", "has_sig": false, "md5_digest": "bcc02fb5237b9c1ecc2179cf18f0fdae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6325, "upload_time": "2015-11-17T15:25:48", "url": "https://files.pythonhosted.org/packages/5c/a6/2ba4696b26e28bbeee6cbb0f5f549d2c7c36e884c4e8326ee82fcf10a97d/pygatt-2.0.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "eb84d16f92808b4658196a699df25fd1", "sha256": "98ae175136794768702e98eddbf53441c7d47a9df0b9cd9d2972bb90f41575ba" }, "downloads": -1, "filename": "pygatt-2.0.1.tar.gz", "has_sig": false, "md5_digest": "eb84d16f92808b4658196a699df25fd1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29271, "upload_time": "2016-02-02T15:56:11", "url": "https://files.pythonhosted.org/packages/70/cc/65233fa5e65b33510fdb258d6b311994937f45a8b5fb500ff1a13cc91bae/pygatt-2.0.1.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "500c72a4b78a465f4b53585630eb86ad", "sha256": "3004b57dae81184bac8aa2b15fa7ad218c2e784500ad8988bf4907664051ba82" }, "downloads": -1, "filename": "pygatt-2.1.0.tar.gz", "has_sig": false, "md5_digest": "500c72a4b78a465f4b53585630eb86ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32096, "upload_time": "2016-09-05T01:40:23", "url": "https://files.pythonhosted.org/packages/4d/4f/b40f78d9e08fc20847653e012f843b723650cc60f08c87ae5a1ebb84df2d/pygatt-2.1.0.tar.gz" } ], "3.0.0": [ { "comment_text": "", "digests": { "md5": "d2b52bf2c63a1e8d2fa41ec5b67fca28", "sha256": "7a5e0537d56e12ac6397aa70e47202d22f315403dd50d09f8fb7b30c8ee44fd7" }, "downloads": -1, "filename": "pygatt-3.0.0.tar.gz", "has_sig": false, "md5_digest": "d2b52bf2c63a1e8d2fa41ec5b67fca28", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32908, "upload_time": "2016-09-23T02:16:06", "url": "https://files.pythonhosted.org/packages/de/89/4699d335ebf25366c64a1184eb574c3f767dfcee27314d9456d2973f0425/pygatt-3.0.0.tar.gz" } ], "3.1.0": [ { "comment_text": "", "digests": { "md5": "73ef0a76cc25663e5a0455e1ff6ce767", "sha256": "a2a40f12495a4e02fbbdbe21b83f8b71d3b34944d0bd09e3bf0d4ecf6eb74e26" }, "downloads": -1, "filename": "pygatt-3.1.0.tar.gz", "has_sig": false, "md5_digest": "73ef0a76cc25663e5a0455e1ff6ce767", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34324, "upload_time": "2017-04-01T20:35:55", "url": "https://files.pythonhosted.org/packages/fe/33/99c8ccb1dde7f455629662aa17470b9c64a595b5dc2e22058a5d1b1a3648/pygatt-3.1.0.tar.gz" } ], "3.1.1": [ { "comment_text": "", "digests": { "md5": "cb9c445b1d28e7f7da4ec538881d5489", "sha256": "ed661d54f903f198f5e1c14aee25bcf71145880b1916e3a712ae23a83f556136" }, "downloads": -1, "filename": "pygatt-3.1.1.tar.gz", "has_sig": false, "md5_digest": "cb9c445b1d28e7f7da4ec538881d5489", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36462, "upload_time": "2017-04-01T20:54:04", "url": "https://files.pythonhosted.org/packages/9e/21/edf0eed0c4121bfd888b00e3b0a257f72a54fc546262a91780eca36bf503/pygatt-3.1.1.tar.gz" } ], "3.2.0": [ { "comment_text": "", "digests": { "md5": "6fa2ba2eb50ecb48cfc84d51cafbb742", "sha256": "7ec18d043814c4bb9ca2180e0eb454500fa9f525b8f8f40fe95836e558c9a787" }, "downloads": -1, "filename": "pygatt-3.2.0.tar.gz", "has_sig": false, "md5_digest": "6fa2ba2eb50ecb48cfc84d51cafbb742", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37670, "upload_time": "2017-09-16T21:17:57", "url": "https://files.pythonhosted.org/packages/34/b0/70618804ab57ef1ed11122c3119378732c7aab1a400d02458a3ec0a9b62b/pygatt-3.2.0.tar.gz" } ], "4.0.0": [ { "comment_text": "", "digests": { "md5": "15e1d20ace3480754c8910a2fab4347e", "sha256": "0a8f7538f44bd7a324ac462972dd760d9dc42080a256688a1df1184b776429e1" }, "downloads": -1, "filename": "pygatt-4.0.0.tar.gz", "has_sig": false, "md5_digest": "15e1d20ace3480754c8910a2fab4347e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43828, "upload_time": "2019-03-30T21:24:09", "url": "https://files.pythonhosted.org/packages/b4/1b/91cc9169656c1865df19bdc6a8a7ced1537c5d6f4976a5535ea10be2dcd6/pygatt-4.0.0.tar.gz" } ], "4.0.1": [ { "comment_text": "", "digests": { "md5": "3d975ab62476e459864fcf970adaaae6", "sha256": "2ec4d23659ed79c6ed27f9ca051c52e3131c4c24c49acb0154767566e1e4e634" }, "downloads": -1, "filename": "pygatt-4.0.1.tar.gz", "has_sig": false, "md5_digest": "3d975ab62476e459864fcf970adaaae6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39779, "upload_time": "2019-03-30T23:18:59", "url": "https://files.pythonhosted.org/packages/ee/ea/b25b8e350a9258604a3c94ebbb60a78fa243a7d6c83daa9bddb0892365b3/pygatt-4.0.1.tar.gz" } ], "4.0.3": [ { "comment_text": "", "digests": { "md5": "66781df9afaec6a9dcff6e0a88446dc3", "sha256": "b1db8e294fc9c68f4dee66e7e2bdde3240c18c2495237059b83f3e7ca9897466" }, "downloads": -1, "filename": "pygatt-4.0.3.tar.gz", "has_sig": false, "md5_digest": "66781df9afaec6a9dcff6e0a88446dc3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39900, "upload_time": "2019-04-05T02:50:20", "url": "https://files.pythonhosted.org/packages/b1/3d/e7a6ea8c43428d4be09bdb29fc59fe44d088c59b8ad61f2b6006079fc62a/pygatt-4.0.3.tar.gz" } ], "4.0.4": [ { "comment_text": "", "digests": { "md5": "faffb513366def5e383155b16ea578e1", "sha256": "10961db7f5862f19b456fdb4cb2e5efb86a1419fc099939ca7afb6344b60e9f2" }, "downloads": -1, "filename": "pygatt-4.0.4.tar.gz", "has_sig": false, "md5_digest": "faffb513366def5e383155b16ea578e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40070, "upload_time": "2019-09-10T14:01:47", "url": "https://files.pythonhosted.org/packages/20/ae/8b11cdc8af4c3bdf8fb063a2f8036b96eb78feab532b11290b724fefd51d/pygatt-4.0.4.tar.gz" } ], "4.0.5": [ { "comment_text": "", "digests": { "md5": "dd6e7b5ce0e009bcf85e224922e80d6a", "sha256": "7f4e0ec72f03533a3ef5fdd532f08d30ab7149213495e531d0f6580e9fcb1a7d" }, "downloads": -1, "filename": "pygatt-4.0.5.tar.gz", "has_sig": false, "md5_digest": "dd6e7b5ce0e009bcf85e224922e80d6a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40109, "upload_time": "2019-09-10T14:08:50", "url": "https://files.pythonhosted.org/packages/10/1a/adf63764143593430e21500d34f00b8ff133f0c43462bcb3a11f35cfa3e3/pygatt-4.0.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "dd6e7b5ce0e009bcf85e224922e80d6a", "sha256": "7f4e0ec72f03533a3ef5fdd532f08d30ab7149213495e531d0f6580e9fcb1a7d" }, "downloads": -1, "filename": "pygatt-4.0.5.tar.gz", "has_sig": false, "md5_digest": "dd6e7b5ce0e009bcf85e224922e80d6a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40109, "upload_time": "2019-09-10T14:08:50", "url": "https://files.pythonhosted.org/packages/10/1a/adf63764143593430e21500d34f00b8ff133f0c43462bcb3a11f35cfa3e3/pygatt-4.0.5.tar.gz" } ] }