Skip to main content
Glama

Bluetooth MCP Server

bluetooth_service.cpython-311.pyc24.6 kB
� (;�g�c���dZddlZddlZddlZddlZddlZddlmZm Z m Z m Z m Z ddl mZddlmZddlmZddlmZmZddlmZmZej��d kZerdd lmZejej� ��eje ��Z!ej"�#d � ��Z$Gd�de%��Z&Gd�d��Z'e'��Z(dS)u� Service principal pour la gestion des opérations Bluetooth. Ce service orchestre l'utilisation des scanners BLE, classique et Windows spécifique. �N)�List�Optional�Dict�Any�Set��BluetoothDevice)� ble_scanner)�windows_advanced_scanner)�classic_scanner�CLASSIC_BT_AVAILABLE)�merge_device_info�normalize_mac_address�Windows)�windows_scanner)�level�)� max_workersc��eZdZdZdS)�BluetoothScanErroru;Exception personnalisée pour les erreurs de scan BluetoothN)�__name__� __module__� __qualname__�__doc__���=F:\DEV\bluetooth-mcp-server\app\services\bluetooth_service.pyrrs������E�E��Drrc�d�eZdZdZ d#dedeeded ed ed ed ed ee fd�Z dedeed ee ee ffd�Z dedeeded ee ee ffd�Zdedeed ee ee ffd�Zdedeed ee ee ffd�Zde ee fde ee ee ffd eefd�Zde ee ee ffd e ee ee fffd�Zded efd�Zded efd�Zd$dededed efd�Zd e ee fd!e ee fd efd"�ZdS)%�BluetoothServiceu@Service pour gérer les opérations Bluetooth (BLE et classique)�@NFT�duration� filter_name�connect_for_details�include_classic�extended_freebox_detection�deduplicate_devices�parallel_scans�returnc��: K� t�d|�d|�d|�d|�d|�d|�d|�d���i}|�rRg} | �|�|||����|r0tr)| �|�||����t r+|r)| �|�||����t r+|r)| �|�||����tj | d d i��d {V��} | D]t} t| t��r+t� d t| �������B| D]/} | d } |r| |vrt|| | ��|| <�*| || <�0�u�nUt�d��t!j|||���d {V��}|D]?} | d } | | d<d| d<|r$| |vrt|| | ��|| <�4| || <�:| || <�@|rytrrt�d��t%j||��}|D]?} | d } | | d<d| d<|r$| |vrt|| | ��|| <�4| || <�:| || <�@n*|r(ts!t st�d��t �r|�rt�d�� t)j|dz|��}|D]�} | d } | | d<| �dd��| d<|rj| |vrt|| | ��|| <�H|�| |��r0|�| |��}t||| ��||<��| || <��| || <��nA#t$r4}t� dt|������Yd }~nd }~wwxYwt �r|�rt�d�� t/j|dz|��}|D]�} | d } | | d<| �dd��| d<|rj| |vrt|| | ��|| <�H|�| |��r0|�| |��}t||| ��||<��| || <��| || <��nA#t$r4}t� dt|������Yd }~nd }~wwxYw|r|�|��}t�dt3|���d���d�|���D��S#t$rP}t� d t|����d �!��t7d t|�������d }~wwxYw)"u� Effectue un scan des appareils Bluetooth à proximité (BLE et classique) avec une gestion améliorée des doublons et exécution parallèle Args: duration: Durée du scan en secondes filter_name: Filtre optionnel sur le nom des appareils connect_for_details: Si True, se connecte à chaque appareil pour plus d'informations include_classic: Si True, inclut les appareils Bluetooth classiques extended_freebox_detection: Si True, utilise des méthodes spéciales pour détecter la Freebox deduplicate_devices: Si True, fusionne les appareils en double parallel_scans: Si True, exécute les différents scans en parallèle Returns: Liste des appareils Bluetooth détectés Raises: BluetoothScanError: En cas d'erreur pendant le scan u.Démarrage du scan Bluetooth complet (durée: z s, filtre: u, connexion détaillée: z, Bluetooth classique: u, détection Freebox: u, déduplication: u, scans parallèles: �)�return_exceptionsTNu!Une méthode de scan a échoué: �iduDémarrage du scan BLE...� source_idr � detected_byu)Démarrage du scan Bluetooth classique...r ucLe module Bluetooth classique n'est pas disponible. Installation recommandée: pip install pybluez2u)Démarrage du scan Windows spécifique...��?r�Erreur lors du scan Windows: u%Démarrage du scan Windows avancé...�r �%Erreur lors du scan Windows avancé: uScan total terminé. u! appareil(s) unique(s) trouvé(s)c�&�g|]}tdi|����S)rr)�.0�devices r� <listcomp>z5BluetoothService.scan_for_devices.<locals>.<listcomp>�s&��Q�Q�Q�&�O�-�-�f�-�-�Q�Q�QrzErreur lors du scan Bluetooth: )�exc_info)�logger�debug�append�_ble_scan_taskr �_classic_scan_task� IS_WINDOWS�_windows_scan_task�_windows_advanced_scan_task�asyncio�gather� isinstance� Exception�error�strrr �scanr �warningr�get�_find_matching_devicer �_advanced_deduplication�len�valuesr)�selfr!r"r#r$r%r&r'� all_devices�tasks� scan_results�resultr5� device_id� ble_devices�classic_devices�windows_devices�match_id�e�windows_advanced_devicess r�scan_for_devicesz!BluetoothService.scan_for_devices%s�����6g Q� �L�L�A�(�A�A�_j�A�A�3F�A�A�_n�A�A�0J�A�A�-@�A�A�0>� A�A�A� B� B� B��K��P W���� � �T�0�0��;�H[�\�\�]�]�]�#�Q�';�Q��L�L��!8�!8��;�!O�!O�P�P�P��Q�"<�Q��L�L��!8�!8��;�!O�!O�P�P�P��Z�"<�Z��L�L��!A�!A�(�K�!X�!X�Y�Y�Y�&-�^�U�%S�d�%S�%S�S�S�S�S�S�S� �+� <� <�F�!�&�)�4�4�!�� � �%V��V���%V�%V�W�W�W� �#)�<�<��$*�4�L� �.�<�9� �3K�3K�5F�{�S\�G]�_e�5f�5f�K� �2�2�5;�K� �2�2� <� <�"� � �8�9�9�9�$/�$4�X�{�L_�$`�$`�`�`�`�`�`�`� �*� 8� 8�F� &�t� �I�*3�F�;�'�,9�F�=�)�*�8�$� �3�3�5F�{�S\�G]�_e�5f�5f�K� �2�2�5;�K� �2�2�28� �I�.�.�#�V�';�V��L�L�!L�M�M�M�&5�&:�8�[�&Q�&Q�O�#2� <� <��$*�4�L� �.7��{�+�0A��}�-�.�<�(�K�7�7�9J�;�W`�Ka�ci�9j�9j� �I� 6� 6�9?� �I� 6� 6�6<�K� �2�2� <�%�V�-A�V�*�V��N�N�$U�V�V�V��O�"<�O��L�L�!L�M�M�M�O�*9�*>�x�#�~�{�*[�*[��'6�@�@�F�(.�t� �I�2;�F�;�/�4:�J�J�}�N_�4`�4`�F�=�1�2� @�#,� �#;�#;�=N�{�[d�Oe�gm�=n�=n�K� �$:�$:�%)�%?�%?�� �%T�%T�!D�/3�/I�/I�&�R]�/^�/^�H�<M�k�Zb�Nc�ek�<l�<l�K��$9�$9�>D�K� �$:�$:�:@� �I� 6� 6�%@��(%�O�O�O�� � �%M�S��V�V�%M�%M�N�N�N�N�N�N�N�N�����O�����W�"<�W��L�L�!H�I�I�I�W�3K�3P�QY�\]�Q]�_j�3k�3k�0�'?�@�@�F�(.�t� �I�2;�F�;�/�4:�J�J�}�Nh�4i�4i�F�=�1�2� @�#,� �#;�#;�=N�{�[d�Oe�gm�=n�=n�K� �$:�$:�%)�%?�%?�� �%T�%T�!D�/3�/I�/I�&�R]�/^�/^�H�<M�k�Zb�Nc�ek�<l�<l�K��$9�$9�>D�K� �$:�$:�:@� �I� 6� 6�%@��(%�W�W�W�� � �%U�S�QR�V�V�%U�%U�V�V�V�V�V�V�V�V�����W����#� H�"�:�:�;�G�G� � �L�L�d��[�1A�1A�d�d�d� e� e� e�R�Q�K�<N�<N�<P�<P�Q�Q�Q� Q��� Q� Q� Q� �L�L�C�3�q�6�6�C�C�d�L� S� S� S�$�%O�s�1�v�v�%O�%O�P�P� P����� Q���sp�K U�B4N�U� O� *N<�7U�<O�(U�*B4R�U� S�)*S�U�S�A"U� V� A V�Vc��K� t�d��tj||���d{V��}|D]}|d|d<d|vrd|d<�t�dt |���d���|S#t $r6}t�d t|������gcYd}~Sd}~wwxYw) u.Tâche asynchrone pour le scan Windows avancéu0Démarrage du scan Windows avancé asynchrone...Nr,r-r.r uScan Windows avancé terminé. � appareil(s) trouvé(s)r2)r8r9r � scan_asyncrKrCrDrE�rMr!r"�devicesr5rWs rr?z,BluetoothService._windows_advanced_scan_task�s����� � �L�L�K� L� L� L�4�?��+�V�V�V�V�V�V�V�V�G�"� G� G��&,�T�l��{�#� ��.�.�,F�F�=�)�� �L�L�`�3�w�<�<�`�`�`� a� a� a��N��� � � � �L�L�I��Q���I�I� J� J� J��I�I�I�I�I�I����� ���s�A:A?�? B?� +B:�4B?�:B?c��~K� t�d��tj|||���d{V��}|D]}|d|d<d|d<�t�dt |���d���|S#t $r6}t�d t|������gcYd}~Sd}~wwxYw) u"Tâche asynchrone pour le scan BLEu$Démarrage du scan BLE asynchrone...Nr,r-r r.uScan BLE terminé. r[zErreur lors du scan BLE: )r8r9r rFrKrCrDrE)rMr!r"r#r^r5rWs rr;zBluetoothService._ble_scan_task�s����� � �L�L�?� @� @� @�'�,�X�{�DW�X�X�X�X�X�X�X�X�G�"� 6� 6��&,�T�l��{�#�(5��}�%�%� �L�L�T�s�7�|�|�T�T�T� U� U� U��N��� � � � �L�L�=�S��V�V�=�=� >� >� >��I�I�I�I�I�I����� ���s�A7A<�< B<�+B7�1B<�7B<c��K� t�d��tjtj|dz|���d{V��}|D]}|d|d<d|d<�t�dt |���d ���|S#t$r6}t�d t|������gcYd}~Sd}~wwxYw) u2Tâche asynchrone pour le scan Bluetooth classiqueu4Démarrage du scan Bluetooth classique asynchrone...r/Nr,r-r r.u#Scan Bluetooth classique terminé. r[z)Erreur lors du scan Bluetooth classique: ) r8r9r@� to_threadr rFrKrCrDrEr]s rr<z#BluetoothService._classic_scan_task s����� � �L�L�O� P� P� P�#�-�o�.B�H�s�N�T_�`�`�`�`�`�`�`�`�G�"� :� :��&,�T�l��{�#�(9��}�%�%� �L�L�d�s�7�|�|�d�d�d� e� e� e��N��� � � � �L�L�M�S��V�V�M�M� N� N� N��I�I�I�I�I�I����� ���s�BB � C �+C�>C �C c��K� t�d��tjtj|dz|���d{V��}|D]}|d|d<d|vrd|d<�t�dt |���d ���|S#t$r6}t�d t|������gcYd}~Sd}~wwxYw) u2Tâche asynchrone pour le scan Windows spécifiqueu(Démarrage du scan Windows asynchrone...r1Nr,r-r.ruScan Windows terminé. r[r0) r8r9r@rarrFrKrCrDrEr]s rr>z#BluetoothService._windows_scan_tasks����� � �L�L�C� D� D� D�#�-�o�.B�H�q�L�R]�^�^�^�^�^�^�^�^�G�"� >� >��&,�T�l��{�#� ��.�.�,=�F�=�)�� �L�L�X�3�w�<�<�X�X�X� Y� Y� Y��N��� � � � �L�L�A��Q���A�A� B� B� B��I�I�I�I�I�I����� ���s�BB � C �+C�C �C r5� device_dictc�n�|���D]\}}|�||��r|cS� dS)uC Recherche un appareil correspondant dans le dictionnaire d'appareils Args: device: L'appareil à rechercher device_dict: Dictionnaire des appareils existants Returns: ID de l'appareil correspondant, ou None si aucune correspondance N)�items�_device_matches)rMr5rc� existing_id�existing_devices rrIz&BluetoothService._find_matching_device1sR��-8�,=�,=�,?�,?� #� #� (�K���#�#�O�V�<�<� #�"�"�"�"� #��trr^c��i}t��}t|���d�d���}|D]�\}}||vr� |||<|�|��|���D]N\}}||vr� |�||��r.t |||��||<|�|���O��|S)u Effectue une déduplication avancée en fusionnant les appareils similaires Args: devices: Dictionnaire des appareils à dédupliquer Returns: Dictionnaire des appareils dédupliqués c�t�|d�d���|d�dd��ndS)N��rssii����)rH)�xs r�<lambda>z:BluetoothService._advanced_deduplication.<locals>.<lambda>Qs3��A�a�D�H�H�V�4D�4D�4P�!�A�$�(�(�6�4�0�0�0�VZ�rT)�key�reverse)�set�sortedre�addrfr) rMr^rQ� processed_ids�sorted_devicesrRr5�other_id� other_devices rrJz(BluetoothService._advanced_deduplicationAs�������� � � �M�M�O�O�Z�Z�� � � ��"0� 0� 0� �I�v��M�)�)��!'�F�9� � � � �i� (� (� (�+2�-�-�/�/� 0� 0�&��,��}�,�,���'�'�� �=�=�0�(9�&��:K�\�(Z�(Z�F�9�%�!�%�%�h�/�/�/�� 0�� r�addressc�V�|sdS|�|��rt|��S|S)u� Normalise une adresse d'appareil pour l'utiliser comme clé de déduplication Args: address: L'adresse de l'appareil Returns: L'adresse normalisée pour la déduplication �)�_is_mac_addressr)rMrxs r�_normalize_device_idz%BluetoothService._normalize_device_idjs>��� ��2� � � �� (� (� 2�(��1�1� 1��rc��|sdS|����dd���dd���dd��}t|��dko td�|dd�D����S) u� Vérifie si une chaîne ressemble à une adresse MAC Args: address: La chaîne à vérifier Returns: True si la chaîne ressemble à une adresse MAC, False sinon F�:rz�-�.� c3�K�|]}|dvV�� dS)�0123456789ABCDEFNr)r4�cs r� <genexpr>z3BluetoothService._is_mac_address.<locals>.<genexpr>�s(����'T�'T�A��-?�(?�'T�'T�'T�'T�'T�'TrN)�upper�replacerK�all)rMrx�cleans rr{z BluetoothService._is_mac_address~s���� ��5�� � ���'�'��R�0�0�8�8��b�A�A�I�I�#�r�R�R���5�z�z�R��T�C�'T�'T��s�PR�s��'T�'T�'T�$T�$T�Tr�ffffff�?�name1�name2� thresholdc �d�|r|sdS|���}|���}||krdS||vs||vrdSt|��t|��z}t|��ttt|����tt|������z |krdSt dt t|��t|����dz��D]:}t t|��|z dz��D]}||||z�|vrdS��;dS)ud Vérifie si deux noms d'appareils semblent correspondre en utilisant une comparaison basique Args: name1: Premier nom name2: Deuxième nom threshold: Seuil de correspondance (0.0-1.0) Returns: True si les noms semblent correspondre, False sinon FT�rk)�lowerrqrK�max�range�min)rMr�r�r�� common_chars�length�is r� _names_matchzBluetoothService._names_match�sB��� �E� ��5�� � � � ��� � � � �� �E�>�>��4� �E�>�>�U�e�^�^��4��5�z�z�C��J�J�.� � �|� � �s�3�s�5�z�z�?�?�C��E� � �O�O�D�D� D� � Q� Q��4��A�s�3�u�:�:�s�5�z�z�:�:�Q�>�?�?� � �F��3�u�:�:��.��2�3�3� � ����1�V�8��$��-�-��4�4�4�.� ��ur�device1�device2c�~�|�|�dd����rk|�|�dd����rB|�|d��}|�|d��}|r |r||krdS|�d��rQ|�d��r<|ddkr0|ddkr$|�|d|d��rdS|�d��rq|�d��r\ddlm}||d��}||d��}||dks ||dkr|r|r|�||��rdS|�d��rM|�d��r8d |dvr.d |dvr$|�|d|d��rdS|�d ��r'|�d ��r|d |d vrdS|�d ��r'|�d ��r|d |d vrdSgd �}|�d ��rL|�d ��r7t |d ��t |d ��z} |D] } | | vrdS� |�d��rh|�d��rSt |d�����t |d�����z} | rdSdS)u, Détermine si deux appareils correspondent probablement au même appareil physique Args: device1: Premier appareil device2: Deuxième appareil Returns: True si les appareils semblent correspondre, False sinon rxrzT�name�Unknownr)�decode_ascii_name� friendly_name�Devicer-� merged_from) z$0000180f-0000-1000-8000-00805f9b34fbz$00001800-0000-1000-8000-00805f9b34fbz$00001801-0000-1000-8000-00805f9b34fbz$0000180a-0000-1000-8000-00805f9b34fbz$0000180d-0000-1000-8000-00805f9b34fbz$00001803-0000-1000-8000-00805f9b34fbz$00001805-0000-1000-8000-00805f9b34fbz$00001812-0000-1000-8000-00805f9b34fbz$00001813-0000-1000-8000-00805f9b34fbz$00001819-0000-1000-8000-00805f9b34fb� service_uuids�manufacturer_dataF)r{rHr|r��app.utils.bluetooth_utilsr�rq�keys) rMr�r�� norm_addr1� norm_addr2r�� decoded_name1� decoded_name2�significant_uuids� common_uuids�uuid�common_manufacturerss rrfz BluetoothService._device_matches�s��� � � �� � �I�r� :� :� ;� ;� ��@T�@T�U\�U`�U`�aj�ln�Uo�Uo�@p�@p� ��2�2�7�9�3E�F�F�J��2�2�7�9�3E�F�F�J�� �j� �Z�:�-E�-E��t� �K�K�� � � �G�K�K��$7�$7� � �F�O�y� (� (�W�V�_� �-I�-I� � � �g�f�o�w�v�� ?� ?�.J��4� �;�;�v� � � �7�;�;�v�#6�#6� � C� C� C� C� C� C�-�-�g�f�o�>�>�M�-�-�g�f�o�>�>�M�����/�/�=�G�F�O�3S�3S� � �]� �t�7H�7H��Xe�7f�7f� ��4� �K�K�� (� (� �W�[�[��-I�-I� � �G�O�4� 4� 4���Q`�Ia�9a�9a� � � �g�o�6���8P� Q� Q�:b��4� �;�;�{� #� #� �� � �M�(B�(B� �w�{�G[�_f�gt�_u�Gu�Gu��4� �;�;�{� #� #� �� � �M�(B�(B� �w�{�G[�_f�gt�_u�Gu�Gu��4�  �  �  �� �;�;�� '� '� �G�K�K��,H�,H� ��w��7�8�8�3�w��?W�;X�;X�X�L�)� � ���<�'�'��4�4�(� �;�;�*� +� +� �� � �<O�0P�0P� �#&�w�/B�'C�'H�'H�'J�'J�#K�#K�c�RY�Zm�Rn�Rs�Rs�Ru�Ru�Nv�Nv�#v� �#� ��t��ur)r NFTTTT)r�)rrrr�floatrrE�boolrr rYrrr?r;r<r>rIrJr|r{r�rfrrrrr"s2������J�J�,/�6:�5:�15�<@�59�04�BQ�BQ�#(�BQ�&.�s�m�BQ�/3�BQ�+/� BQ� 6:� BQ� /3� BQ�*.�BQ�:>�o�9N�BQ�BQ�BQ�BQ�H�%��h�WZ�m��`d�ei�jm�or�jr�es�`t�����$�U���#���ei��nr�sw�x{�~A�yA�tB�oC�����"���X�c�]��W[�\`�ad�fi�ai�\j�Wk�����$���X�c�]��W[�\`�ad�fi�ai�\j�Wk�����&�D��c��N���c�SW�X[�]`�X`�Sa�Na�Ib��go�ps�gt����� '�t�C��c�3�h��4G�/H�'�T�RU�W[�\_�ad�\d�We�Re�Mf�'�'�'�'�R�C��C�����(U�s�U�t�U�U�U�U�$'�'�#�'�c�'�e�'�d�'�'�'�'�RK�t�C��H�~�K��S�#�X��K�SW�K�K�K�K�K�Krr))r�logging�platform�rer@�concurrent.futures� concurrent�typingrrrrr�app.models.bluetoothr �app.services.ble_scannerr �%app.services.windows_advanced_scannerr �app.services.classic_scannerr r r�rr�systemr=�app.services.windows_scannerr� basicConfig�DEBUG� getLoggerrr8�futures�ThreadPoolExecutor� thread_poolrCrr�bluetooth_servicerrr�<module>r�s������������� � � � ���������1�1�1�1�1�1�1�1�1�1�1�1�1�1�0�0�0�0�0�0�0�0�0�0�0�0�J�J�J�J�J�J�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N��X�_� � �)� +� � �=�<�<�<�<�<�<����'�-�(�(�(�(� �� �8� $� $��� �3�3��3�B�B� � � � � � �� � � �b�b�b�b�b�b�b�b�J%�$�&�&���r

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Hypijump31/bluetooth-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server