{ "info": { "author": "Nabil BENDAFI", "author_email": "nabil@bendafi.fr", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# Lenovo HW01 [![Build Status](https://travis-ci.org/nabilbendafi/HW01.svg?branch=master)](https://travis-ci.org/nabilbendafi/HW01)\n\nLibrary to work with Lenovo HW01. To be used in place of Android [Lenovo Healthy](https://play.google.com/store/apps/details?id=com.lenovohw.base.framework) app.\n\n## Dependencies\n\n - [bluepy](https://github.com/IanHarvey/bluepy)\n\n\n## Traffic analysis\n\nIn order to analyse communication between official Android app [Lenovo Healthy](https://play.google.com/store/apps/details?id=com.lenovohw.base.framework&hl=en_US) and Lenovo HW01 device, additional app [NordicSemiconductor/Android-nRF-Connect](https://github.com/NordicSemiconductor/Android-nRF-Connect) is used to perform traffic logging.\n\nIt allows us to write an API library to interact with the watch without using the official Android app.\n\n## Debugging\n\nScan for Bluetooth devices:\n```bash\n$> sudo hcitool lescan\nLE Scan ...\nXX:XX:XX:XX:XX:XX HW01\n```\n\nConnect to Bluetooth device:\n\n```bash\nsudo gatttool --device=XX:XX:XX:XX:XX:XX -I -t random\n[XX:XX:XX:XX:XX:XX][LE]> connect\nAttempting to connect to XX:XX:XX:XX:XX:XX\nConnection successful\n```\n\nList device characteristics:\n```bash\n[XX:XX:XX:XX:XX:XX][LE]> primary\nattr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb\nattr handle: 0x0008, end grp handle: 0x0008 uuid: 00001801-0000-1000-8000-00805f9b34fb\nattr handle: 0x0009, end grp handle: 0x000e uuid: 0000190a-0000-1000-8000-00805f9b34fb\nattr handle: 0x000f, end grp handle: 0x0014 uuid: 0000190b-0000-1000-8000-00805f9b34fb\nattr handle: 0x0015, end grp handle: 0xffff uuid: 0000fee7-0000-1000-8000-00805f9b34fb\n```\n\n## Documentation\n\n[hw01\u2019s documentation](https://nabilbendafi.github.io/HW01/index.html)\n\n## Test\n\n```\npip install -r dev-requirements.txt\n./setup.py nosetests\n```\n\n## References\n\n - [creotiv/MiBand2](https://github.com/creotiv/MiBand2)\n - [My journey towards Reverse Engineering a Smart Band\u200a\u2014\u200aBluetooth-LE RE](https://medium.com/@arunmag/my-journey-towards-reverse-engineering-a-smart-band-bluetooth-le-re-d1dea00e4de2)\n - [Xiaomi Mi Band BLE Protocol reverse-engineering and API](http://androiders-newbie.blogspot.com/2014/12/xiaomi-mi-band-ble-protocol-reverse.html)\n - [How I hacked my Xiaomi MiBand 2 fitness tracker\u200a\u2014\u200aa step-by-step Linux guide](https://medium.com/machine-learning-world/how-i-hacked-xiaomi-miband-2-to-control-it-from-linux-a5bd2f36d3ad)\n - [Get Started with Bluetooth Low Energy on Linux](https://www.jaredwolff.com/blog/get-started-with-bluetooth-low-energy/)\n - [NordicSemiconductor/Android-nRF-Connect](https://github.com/NordicSemiconductor/Android-nRF-Connect)\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/nabilbendafi/hw01", "keywords": "api health", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "hw01", "package_url": "https://pypi.org/project/hw01/", "platform": "", "project_url": "https://pypi.org/project/hw01/", "project_urls": { "Homepage": "https://github.com/nabilbendafi/hw01" }, "release_url": "https://pypi.org/project/hw01/1.0.0/", "requires_dist": [ "bluepy" ], "requires_python": "", "summary": "Python library to work with Lenovo HW01", "version": "1.0.0" }, "last_serial": 4500439, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "aa10e75a9b4115b875c6470bc5b18cdf", "sha256": "373847ee532fcdca476d4517f46f7ed58792896903e8fca47981ab05512848f7" }, "downloads": -1, "filename": "hw01-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "aa10e75a9b4115b875c6470bc5b18cdf", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5422, "upload_time": "2018-11-18T18:40:08", "url": "https://files.pythonhosted.org/packages/8d/8b/712ed321381743d38a6e4fcf973e5953b0a9141809373c953aa1a7007a57/hw01-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "586e568a498f3a97ec76453d19c48d61", "sha256": "3c61b73860ab41ab9335e1f1c42acb4a5b41bb730522a40c7fce38718c508794" }, "downloads": -1, "filename": "hw01-1.0.0.tar.gz", "has_sig": false, "md5_digest": "586e568a498f3a97ec76453d19c48d61", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5237, "upload_time": "2018-11-18T18:40:10", "url": "https://files.pythonhosted.org/packages/68/76/74d253ff57d92f9396cb805879bda9406982970c752df6e42c0a9430c9a1/hw01-1.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "aa10e75a9b4115b875c6470bc5b18cdf", "sha256": "373847ee532fcdca476d4517f46f7ed58792896903e8fca47981ab05512848f7" }, "downloads": -1, "filename": "hw01-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "aa10e75a9b4115b875c6470bc5b18cdf", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5422, "upload_time": "2018-11-18T18:40:08", "url": "https://files.pythonhosted.org/packages/8d/8b/712ed321381743d38a6e4fcf973e5953b0a9141809373c953aa1a7007a57/hw01-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "586e568a498f3a97ec76453d19c48d61", "sha256": "3c61b73860ab41ab9335e1f1c42acb4a5b41bb730522a40c7fce38718c508794" }, "downloads": -1, "filename": "hw01-1.0.0.tar.gz", "has_sig": false, "md5_digest": "586e568a498f3a97ec76453d19c48d61", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5237, "upload_time": "2018-11-18T18:40:10", "url": "https://files.pythonhosted.org/packages/68/76/74d253ff57d92f9396cb805879bda9406982970c752df6e42c0a9430c9a1/hw01-1.0.0.tar.gz" } ] }