1313 CBMutableDescriptor ,
1414 CBAdvertisementDataLocalNameKey ,
1515 CBAdvertisementDataServiceUUIDsKey ,
16+ CBUUID ,
1617)
1718
1819from bleak .backends .service import BleakGATTService # type: ignore
1920
2021from .peripheral_manager_delegate import PeripheralManagerDelegate # type: ignore
2122from bless .backends .server import BaseBlessServer # type: ignore
23+ from bless .backends .advertisement import BlessAdvertisementData
2224from bless .backends .corebluetooth .service import BlessGATTServiceCoreBluetooth
2325from bless .backends .corebluetooth .characteristic import ( # type: ignore
2426 BlessGATTCharacteristicCoreBluetooth ,
2527)
2628from bless .backends .corebluetooth .descriptor import ( # type: ignore
27- BlessGATTDescriptorCoreBluetooth
29+ BlessGATTDescriptorCoreBluetooth ,
2830)
2931
3032from bless .backends .descriptor import ( # type: ignore
@@ -71,7 +73,11 @@ def __init__(self, name: str, loop: Optional[AbstractEventLoop] = None, **kwargs
7173 self .peripheral_manager_delegate .write_request_func = self .write_request
7274
7375 async def start (
74- self , timeout : float = 10 , prioritize_local_name : bool = True , ** kwargs
76+ self ,
77+ advertisement_data : Optional [BlessAdvertisementData ] = None ,
78+ timeout : float = 10 ,
79+ prioritize_local_name : bool = True ,
80+ ** kwargs ,
7581 ):
7682 """
7783 Start the server
@@ -87,28 +93,42 @@ async def start(
8793 names associated with BLE applications. When true, the name of the
8894 server is prioritized over service UUIDs, and will automatrically
8995 be truncated if longer than 28 bytes.
96+ advertisement_data : Optional[BlessAdvertisementData]
97+ Optional advertisement payload to customize the local name and
98+ service UUIDs advertised
9099 """
91100 for service_uuid in self .services :
92101 bleak_service : BleakGATTService = self .services [service_uuid ]
93102 service_obj : CBService = bleak_service .obj
94103 logger .debug ("Adding service: {}" .format (bleak_service .uuid ))
95104 await self .peripheral_manager_delegate .add_service (service_obj )
96105
106+ local_name : str = self .name
107+ if advertisement_data and advertisement_data .local_name is not None :
108+ local_name = advertisement_data .local_name
109+
97110 advertisement_uuids : List
98- if (prioritize_local_name ) and len (self .name ) > 10 :
111+ if advertisement_data and advertisement_data .service_uuids is not None :
112+ advertisement_uuids = [
113+ CBUUID .alloc ().initWithString_ (uuid )
114+ for uuid in advertisement_data .service_uuids
115+ ]
116+ elif (prioritize_local_name ) and len (local_name ) > 10 :
99117 advertisement_uuids = []
100118 else :
101119 advertisement_uuids = list (
102120 map (lambda x : self .services [x ].obj .UUID (), self .services )
103121 )
104122
105- advertisement_data = {
106- CBAdvertisementDataLocalNameKey : self . name ,
123+ advertisement_payload = {
124+ CBAdvertisementDataLocalNameKey : local_name ,
107125 CBAdvertisementDataServiceUUIDsKey : advertisement_uuids ,
108126 }
109- logger .debug ("Advertisement Data: {}" .format (advertisement_data ))
127+ logger .debug ("Advertisement Data: {}" .format (advertisement_payload ))
110128 try :
111- await self .peripheral_manager_delegate .start_advertising (advertisement_data )
129+ await self .peripheral_manager_delegate .start_advertising (
130+ advertisement_payload
131+ )
112132 except TimeoutError :
113133 # If advertising fails as a result of bluetooth module power
114134 # cycling or advertisement failure, attempt to start again
0 commit comments