From 8fc4737f64b65f7667f3393699c948ceea9558c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E7=83=9C?= Date: Fri, 2 Aug 2024 01:14:02 -0700 Subject: [PATCH 1/5] =?UTF-8?q?=E5=86=85=E9=83=A8=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\344\273\243\347\240\201/README.md" | 9 +++--- "\344\273\243\347\240\201/client.py" | 30 +++++++++---------- "\344\273\243\347\240\201/server.py" | 10 +++---- "\344\273\243\347\240\201/the_uuids.py" | 6 ++-- ...7\255\345\257\271\347\205\247\350\241\250" | 29 ++++++++++-------- 5 files changed, 43 insertions(+), 41 deletions(-) diff --git "a/\344\273\243\347\240\201/README.md" "b/\344\273\243\347\240\201/README.md" index c42e78f..8f32cef 100644 --- "a/\344\273\243\347\240\201/README.md" +++ "b/\344\273\243\347\240\201/README.md" @@ -22,12 +22,11 @@ | 服务端运行系统 | 客户端运行系统 | 测试结果 | |-------------------|----------|-------| -| Win10 | Win11 | 成功 | -| Win11 | Win10 | 成功 | -| Win11 | Mac 14.5 | 成功 | -| Win11 | Win11 外设属性否 | 成功发送一次,之后客户端启动发送失败 | -| Win11 外设属性否 | | 服务端启动失败,报错“设备不支持命令功能” | +| Win10 | Win11 | 【待测】 | | Win11 | Win10 | 成功 | +| Win11 | Mac (型号?)14.5 | 成功 | +| Win11 | Win11 外设属性否 | 【待测】成功发送一次,之后客户端启动发送失败 | +| Win11 外设属性否 | | 【待测】服务端启动失败,报错“设备不支持命令功能” | ## 运行机制 diff --git "a/\344\273\243\347\240\201/client.py" "b/\344\273\243\347\240\201/client.py" index bdd0ff9..7800981 100644 --- "a/\344\273\243\347\240\201/client.py" +++ "b/\344\273\243\347\240\201/client.py" @@ -1,7 +1,7 @@ import asyncio import logging from bleak import BleakScanner, BleakClient, BLEDevice, AdvertisementData -from the_uuids import UUID as UUIDs +from the_uuids import 唯一识别码 # Configure logging logging.basicConfig( @@ -12,38 +12,38 @@ logging.basicConfig( logger = logging.getLogger(__name__) -uuids = UUIDs() +各识别码 = 唯一识别码() -def match_service_uuid(device: BLEDevice, adv: AdvertisementData): - if uuids.service_uuid.lower() in adv.service_uuids: - logger.info(f"Found matching device: {device.name} ({device.address})") +def 匹配服务识别码(设备: BLEDevice, adv: AdvertisementData): + if 各识别码.服务识别码.lower() in adv.service_uuids: + logger.info(f"Found matching device: {设备.name} ({设备.address})") return True return False -def handle_notification(sender, data): - logger.info(f"Received data: {data.decode('utf-8')}") +def 处理通知(sender, 数据): + logger.info(f"Received data: {数据.decode('utf-8')}") async def main(): try: # Search for devices and check if they match the UUID - device = await BleakScanner.find_device_by_filter(match_service_uuid, timeout=20) + 设备 = await BleakScanner.find_device_by_filter(匹配服务识别码, timeout=20) logger.info("Device search completed.") # Create a BleakClient instance and connect, then perform read/write operations - async with BleakClient(device) as client: + async with BleakClient(设备) as 客户端: logger.info("Connected to the device.") - service = client.services.get_service(uuids.service_uuid) - logger.info(f"Service {service} retrieved.") + 服务 = 客户端.services.get_service(各识别码.服务识别码) + logger.info(f"Service {服务} retrieved.") # Receive Bluetooth serial port information - char = service.get_characteristic(uuids.characteristic_uuid) - logger.info(f"Characteristic {char} retrieved.") + 特征 = 服务.get_characteristic(各识别码.特征识别码) + logger.info(f"Characteristic {特征} retrieved.") - await client.start_notify(char, handle_notification) + await 客户端.start_notify(特征, 处理通知) logger.info("Notification started.") - await client.write_gatt_char(char, "吃了吗".encode("utf-8")) + await 客户端.write_gatt_char(特征, "吃了吗".encode("utf-8")) logger.info("Data written to characteristic.") except AttributeError: diff --git "a/\344\273\243\347\240\201/server.py" "b/\344\273\243\347\240\201/server.py" index 1c8ca6d..0b15784 100644 --- "a/\344\273\243\347\240\201/server.py" +++ "b/\344\273\243\347\240\201/server.py" @@ -10,7 +10,7 @@ from bless import BlessGATTCharacteristic from bless import GATTCharacteristicProperties from bless import GATTAttributePermissions -from the_uuids import UUID as UUIDs +from the_uuids import 唯一识别码 # Configure logging logging.basicConfig( @@ -22,7 +22,7 @@ logging.basicConfig( logger = logging.getLogger(__name__) -uuids = UUIDs() +各识别码 = 唯一识别码() # NOTE: Some systems require different synchronization methods. trigger: Union[asyncio.Event, threading.Event] @@ -42,12 +42,12 @@ async def run(loop): def write_request(characteristic: BlessGATTCharacteristic, value: Any, **kwargs): logger.info(f"Received data: {value.decode('utf-8')}") characteristic.value = '我吃了'.encode('utf-8') - server.update_value(uuids.service_uuid, uuids.characteristic_uuid) + server.update_value(各识别码.服务识别码, 各识别码.特征识别码) server.write_request_func = write_request # Add Service - await server.add_new_service(uuids.service_uuid) + await server.add_new_service(各识别码.服务识别码) logger.info("Service added.") # Add a Characteristic to the service @@ -57,7 +57,7 @@ async def run(loop): ) permissions = GATTAttributePermissions.readable | GATTAttributePermissions.writeable await server.add_new_characteristic( - uuids.service_uuid, uuids.characteristic_uuid, char_flags, None, permissions + 各识别码.服务识别码, 各识别码.特征识别码, char_flags, None, permissions ) logger.info("Characteristic added.") diff --git "a/\344\273\243\347\240\201/the_uuids.py" "b/\344\273\243\347\240\201/the_uuids.py" index ed5eef8..964b79e 100644 --- "a/\344\273\243\347\240\201/the_uuids.py" +++ "b/\344\273\243\347\240\201/the_uuids.py" @@ -1,4 +1,4 @@ -class UUID: +class 唯一识别码: def __init__(self): - self.service_uuid = "A07498CA-AD5B-474E-940D-16F1FBE7E8CD" - self.characteristic_uuid = "51FF12BB-3ED8-46E5-B4F9-D64E2FEC021B" + self.服务识别码 = "A07498CA-AD5B-474E-940D-16F1FBE7E8CD" + self.特征识别码 = "51FF12BB-3ED8-46E5-B4F9-D64E2FEC021B" diff --git "a/\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250" "b/\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250" index 021389c..8567fd9 100644 --- "a/\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250" +++ "b/\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250" @@ -1,20 +1,23 @@ -UUID | 通用唯一识别码 -request | 请求 +char_flags | 特征标志 +characteristic | 特征 client | 客户端 +data | 数据 device | 设备 -read | 读取 -write | 写入 -trigger | 触发器 -server | 服务器 -characteristic | 特征 -service | 服务 -loop | 循环 event | 事件 -read_request | 读取请求 -write_request | 写入请求 +handle | 处理 +loop | 循环 +match | 匹配 my_service_name | 我的服务名称 my_service_uuid | 我的服务UUID my_char_uuid | 我的特征UUID -char_flags | 特征标志 +notify, notification | 通知 permissions | 权限 -notify | 通知 \ No newline at end of file +read | 读取 +read_request | 读取请求 +request | 请求 +server | 服务器 +service | 服务 +trigger | 触发器 +UUID | 通用唯一识别码 +write | 写入 +write_request | 写入请求 \ No newline at end of file -- Gitee From 8d849c5f5a6def21cb6e9ae10e53162d5e14493f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E7=83=9C?= Date: Fri, 2 Aug 2024 09:56:47 -0700 Subject: [PATCH 2/5] =?UTF-8?q?=E9=99=A4main/run/loop=E5=A4=96=E5=A4=A7?= =?UTF-8?q?=E9=83=A8,=20=E5=85=88=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\344\273\243\347\240\201/client.py" | 22 +++++++------- "\344\273\243\347\240\201/server.py" | 44 ++++++++++++++-------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git "a/\344\273\243\347\240\201/client.py" "b/\344\273\243\347\240\201/client.py" index 7800981..982acc4 100644 --- "a/\344\273\243\347\240\201/client.py" +++ "b/\344\273\243\347\240\201/client.py" @@ -10,46 +10,46 @@ logging.basicConfig( format='%(asctime)s [%(levelname)s] %(message)s' ) -logger = logging.getLogger(__name__) +日志 = logging.getLogger(__name__) 各识别码 = 唯一识别码() def 匹配服务识别码(设备: BLEDevice, adv: AdvertisementData): if 各识别码.服务识别码.lower() in adv.service_uuids: - logger.info(f"Found matching device: {设备.name} ({设备.address})") + 日志.info(f"Found matching device: {设备.name} ({设备.address})") return True return False def 处理通知(sender, 数据): - logger.info(f"Received data: {数据.decode('utf-8')}") + 日志.info(f"Received data: {数据.decode('utf-8')}") async def main(): try: # Search for devices and check if they match the UUID 设备 = await BleakScanner.find_device_by_filter(匹配服务识别码, timeout=20) - logger.info("Device search completed.") + 日志.info("Device search completed.") # Create a BleakClient instance and connect, then perform read/write operations async with BleakClient(设备) as 客户端: - logger.info("Connected to the device.") + 日志.info("Connected to the device.") 服务 = 客户端.services.get_service(各识别码.服务识别码) - logger.info(f"Service {服务} retrieved.") + 日志.info(f"Service {服务} retrieved.") # Receive Bluetooth serial port information 特征 = 服务.get_characteristic(各识别码.特征识别码) - logger.info(f"Characteristic {特征} retrieved.") + 日志.info(f"Characteristic {特征} retrieved.") await 客户端.start_notify(特征, 处理通知) - logger.info("Notification started.") + 日志.info("Notification started.") await 客户端.write_gatt_char(特征, "吃了吗".encode("utf-8")) - logger.info("Data written to characteristic.") + 日志.info("Data written to characteristic.") except AttributeError: - logger.error("No matching device found.") + 日志.error("No matching device found.") except Exception as e: - logger.error(f"An unexpected error occurred: {e}") + 日志.error(f"An unexpected error occurred: {e}") if __name__ == "__main__": diff --git "a/\344\273\243\347\240\201/server.py" "b/\344\273\243\347\240\201/server.py" index 0b15784..5571e66 100644 --- "a/\344\273\243\347\240\201/server.py" +++ "b/\344\273\243\347\240\201/server.py" @@ -20,35 +20,35 @@ logging.basicConfig( handlers=[logging.FileHandler("debug.log"),logging.StreamHandler()] ) -logger = logging.getLogger(__name__) +日志 = logging.getLogger(__name__) 各识别码 = 唯一识别码() # NOTE: Some systems require different synchronization methods. -trigger: Union[asyncio.Event, threading.Event] +触发器: Union[asyncio.Event, threading.Event] if sys.platform in ["darwin", "win32"]: - trigger = threading.Event() + 触发器 = threading.Event() else: - trigger = asyncio.Event() + 触发器 = asyncio.Event() async def run(loop): - trigger.clear() - logger.info("Starting server...") + 触发器.clear() + 日志.info("Starting server...") # Instantiate the server my_service_name = "Test Service" - server = BlessServer(name=my_service_name, loop=loop) + 服务器 = BlessServer(name=my_service_name, loop=loop) def write_request(characteristic: BlessGATTCharacteristic, value: Any, **kwargs): - logger.info(f"Received data: {value.decode('utf-8')}") + 日志.info(f"Received data: {value.decode('utf-8')}") characteristic.value = '我吃了'.encode('utf-8') - server.update_value(各识别码.服务识别码, 各识别码.特征识别码) + 服务器.update_value(各识别码.服务识别码, 各识别码.特征识别码) - server.write_request_func = write_request + 服务器.write_request_func = write_request # Add Service - await server.add_new_service(各识别码.服务识别码) - logger.info("Service added.") + await 服务器.add_new_service(各识别码.服务识别码) + 日志.info("Service added.") # Add a Characteristic to the service char_flags = ( @@ -56,26 +56,26 @@ async def run(loop): | GATTCharacteristicProperties.notify ) permissions = GATTAttributePermissions.readable | GATTAttributePermissions.writeable - await server.add_new_characteristic( + await 服务器.add_new_characteristic( 各识别码.服务识别码, 各识别码.特征识别码, char_flags, None, permissions ) - logger.info("Characteristic added.") + 日志.info("Characteristic added.") - await server.start() - logger.info("Server started.") + await 服务器.start() + 日志.info("Server started.") - if trigger.__module__ == "threading": + if 触发器.__module__ == "threading": # noinspection PyAsyncCall - trigger.wait() + 触发器.wait() else: - await trigger.wait() + await 触发器.wait() - await server.stop() - logger.info("Server stopped.") + await 服务器.stop() + 日志.info("Server stopped.") try: loop = asyncio.get_event_loop() loop.run_until_complete(run(loop)) except Exception as e: - logger.error(f"An error occurred: {e}") \ No newline at end of file + 日志.error(f"An error occurred: {e}") \ No newline at end of file -- Gitee From ea9ff880c3a43d32144a2f1af8904870a3534722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E7=83=9C?= Date: Fri, 2 Aug 2024 10:15:18 -0700 Subject: [PATCH 3/5] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E8=B0=83=E8=AF=95=E4=BF=A1=E6=81=AF;=E7=BB=A7?= =?UTF-8?q?=E7=BB=AD=E4=B8=AD=E6=96=87=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\344\273\243\347\240\201/client.py" | 4 ++-- "\344\273\243\347\240\201/server.py" | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git "a/\344\273\243\347\240\201/client.py" "b/\344\273\243\347\240\201/client.py" index 982acc4..bc00cf6 100644 --- "a/\344\273\243\347\240\201/client.py" +++ "b/\344\273\243\347\240\201/client.py" @@ -24,7 +24,7 @@ def 匹配服务识别码(设备: BLEDevice, adv: AdvertisementData): def 处理通知(sender, 数据): 日志.info(f"Received data: {数据.decode('utf-8')}") -async def main(): +async def 中(): try: # Search for devices and check if they match the UUID 设备 = await BleakScanner.find_device_by_filter(匹配服务识别码, timeout=20) @@ -53,4 +53,4 @@ async def main(): if __name__ == "__main__": - asyncio.run(main()) \ No newline at end of file + asyncio.run(中()) \ No newline at end of file diff --git "a/\344\273\243\347\240\201/server.py" "b/\344\273\243\347\240\201/server.py" index 5571e66..e46e6d4 100644 --- "a/\344\273\243\347\240\201/server.py" +++ "b/\344\273\243\347\240\201/server.py" @@ -32,7 +32,7 @@ else: 触发器 = asyncio.Event() -async def run(loop): +async def 中(loop): 触发器.clear() 日志.info("Starting server...") # Instantiate the server @@ -43,6 +43,7 @@ async def run(loop): 日志.info(f"Received data: {value.decode('utf-8')}") characteristic.value = '我吃了'.encode('utf-8') 服务器.update_value(各识别码.服务识别码, 各识别码.特征识别码) + 日志.info("Updated!") 服务器.write_request_func = write_request @@ -75,7 +76,7 @@ async def run(loop): try: loop = asyncio.get_event_loop() - loop.run_until_complete(run(loop)) + loop.run_until_complete(中(loop)) except Exception as e: 日志.error(f"An error occurred: {e}") \ No newline at end of file -- Gitee From 67e3f6318e325a1bd76d031e8e2eaa1712d13baf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E7=83=9C?= Date: Fri, 2 Aug 2024 12:07:14 -0700 Subject: [PATCH 4/5] =?UTF-8?q?=E6=95=B4=E7=90=86=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + "\344\273\243\347\240\201/README.md" | 4 +- "\344\273\243\347\240\201/server.py" | 3 ++ ...55\345\257\271\347\205\247\350\241\250.md" | 47 ++++++++++--------- 4 files changed, 31 insertions(+), 24 deletions(-) rename "\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250" => "\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250.md" (90%) diff --git a/.gitignore b/.gitignore index cfdaefd..9af5cde 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ 临时 **/__pycache__ +**/debug.log \ No newline at end of file diff --git "a/\344\273\243\347\240\201/README.md" "b/\344\273\243\347\240\201/README.md" index 8f32cef..c5bb300 100644 --- "a/\344\273\243\347\240\201/README.md" +++ "b/\344\273\243\347\240\201/README.md" @@ -22,9 +22,9 @@ | 服务端运行系统 | 客户端运行系统 | 测试结果 | |-------------------|----------|-------| -| Win10 | Win11 | 【待测】 | | Win11 | Win10 | 成功 | -| Win11 | Mac (型号?)14.5 | 成功 | +| Win10 | Win11 | 【待测】 | +| Win11 | Mac 14.5 | 成功 | | Win11 | Win11 外设属性否 | 【待测】成功发送一次,之后客户端启动发送失败 | | Win11 外设属性否 | | 【待测】服务端启动失败,报错“设备不支持命令功能” | diff --git "a/\344\273\243\347\240\201/server.py" "b/\344\273\243\347\240\201/server.py" index e46e6d4..b6d77f1 100644 --- "a/\344\273\243\347\240\201/server.py" +++ "b/\344\273\243\347\240\201/server.py" @@ -41,6 +41,9 @@ async def 中(loop): def write_request(characteristic: BlessGATTCharacteristic, value: Any, **kwargs): 日志.info(f"Received data: {value.decode('utf-8')}") + + # [蓝牙核心规范(V5.2)7.6-深入详解之GATT(1)](https://bbs.huaweicloud.com/blogs/detail/309098) + # “属性协议”部分描述了GATT协议包的各个部分与长度限制,其中属性值的大小限制为 512b characteristic.value = '我吃了'.encode('utf-8') 服务器.update_value(各识别码.服务识别码, 各识别码.特征识别码) 日志.info("Updated!") diff --git "a/\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250" "b/\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250.md" similarity index 90% rename from "\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250" rename to "\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250.md" index 8567fd9..4091b00 100644 --- "a/\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250" +++ "b/\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250.md" @@ -1,23 +1,26 @@ -char_flags | 特征标志 -characteristic | 特征 -client | 客户端 -data | 数据 -device | 设备 -event | 事件 -handle | 处理 -loop | 循环 -match | 匹配 -my_service_name | 我的服务名称 -my_service_uuid | 我的服务UUID -my_char_uuid | 我的特征UUID -notify, notification | 通知 -permissions | 权限 -read | 读取 -read_request | 读取请求 -request | 请求 -server | 服务器 -service | 服务 -trigger | 触发器 -UUID | 通用唯一识别码 -write | 写入 +| 英文 | 中文 | +| ------ | ------ | +char_flags | 特征标志 +characteristic | 特征 +client | 客户端 +data | 数据 +device | 设备 +event | 事件 +handle | 处理 +loop | 循环 +match | 匹配 +my_service_name | 我的服务名称 +my_service_uuid | 我的服务UUID +my_char_uuid | 我的特征UUID +notify, notification | 通知 +permissions | 权限 +read | 读取 +read_request | 读取请求 +request | 请求 +sender | ? +server | 服务器 +service | 服务 +trigger | 触发器 +UUID | 通用唯一识别码 +write | 写入 write_request | 写入请求 \ No newline at end of file -- Gitee From 42d955bbe8644163e05e255729ec608f0d67ed25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E7=83=9C?= Date: Fri, 2 Aug 2024 12:17:16 -0700 Subject: [PATCH 5/5] =?UTF-8?q?=E8=AE=B0=E8=B4=A6;=20=E6=9C=AF=E8=AF=AD?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\350\257\255\345\257\271\347\205\247\350\241\250.md" | 2 ++ .../\346\200\273\350\264\246.beancount" | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git "a/\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250.md" "b/\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250.md" index 4091b00..65530a8 100644 --- "a/\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250.md" +++ "b/\344\273\243\347\240\201/\350\213\261\350\257\255\346\234\257\350\257\255\345\257\271\347\205\247\350\241\250.md" @@ -1,3 +1,5 @@ +请按字母顺序 + | 英文 | 中文 | | ------ | ------ | char_flags | 特征标志 diff --git "a/\346\224\266\346\224\257\350\264\246\346\234\254/\346\200\273\350\264\246.beancount" "b/\346\224\266\346\224\257\350\264\246\346\234\254/\346\200\273\350\264\246.beancount" index 55eb4b1..87605b4 100644 --- "a/\346\224\266\346\224\257\350\264\246\346\234\254/\346\200\273\350\264\246.beancount" +++ "b/\346\224\266\346\224\257\350\264\246\346\234\254/\346\200\273\350\264\246.beancount" @@ -32,4 +32,10 @@ option "operating_currency" "CNY" ; The main currencies you use ** https://gitee.com/zhishi/share-content-using-bluetooth/issues/IAFNAL 2024-07-09 * "【技术调研】两个系统间双向传输字符串 " Assets:Budget:总预算 -188.00 CNY - Assets:Budget:Gitee悬赏 188.00 CNY \ No newline at end of file + Assets:Budget:Gitee悬赏 188.00 CNY + +2024-07-30 open Expenses:Bounty:贡献者ycy20090311 + +2024-08-01 * "通过 Gitee 悬赏任务:【技术调研】两个系统间双向传输字符串" + Expenses:Bounty:贡献者ycy20090311 188.00 CNY + Assets:Budget:Gitee悬赏 -188.00 CNY \ No newline at end of file -- Gitee