mirror of
https://github.com/google/bumble.git
synced 2026-05-09 04:08:02 +00:00
make grpc channels injectable
This commit is contained in:
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@@ -39,10 +39,12 @@
|
|||||||
"libusb",
|
"libusb",
|
||||||
"MITM",
|
"MITM",
|
||||||
"NDIS",
|
"NDIS",
|
||||||
|
"netsim",
|
||||||
"NONBLOCK",
|
"NONBLOCK",
|
||||||
"NONCONN",
|
"NONCONN",
|
||||||
"OXIMETER",
|
"OXIMETER",
|
||||||
"popleft",
|
"popleft",
|
||||||
|
"protobuf",
|
||||||
"psms",
|
"psms",
|
||||||
"pyee",
|
"pyee",
|
||||||
"pyusb",
|
"pyusb",
|
||||||
|
|||||||
@@ -18,12 +18,13 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import atexit
|
import atexit
|
||||||
import logging
|
import logging
|
||||||
import grpc.aio
|
|
||||||
import os
|
import os
|
||||||
import pathlib
|
import pathlib
|
||||||
import sys
|
import sys
|
||||||
from typing import Dict, Optional
|
from typing import Dict, Optional
|
||||||
|
|
||||||
|
import grpc.aio
|
||||||
|
|
||||||
from .common import (
|
from .common import (
|
||||||
ParserSource,
|
ParserSource,
|
||||||
PumpedTransport,
|
PumpedTransport,
|
||||||
@@ -33,8 +34,8 @@ from .common import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
# pylint: disable=no-name-in-module
|
# pylint: disable=no-name-in-module
|
||||||
from .grpc_protobuf.packet_streamer_pb2_grpc import PacketStreamerStub
|
|
||||||
from .grpc_protobuf.packet_streamer_pb2_grpc import (
|
from .grpc_protobuf.packet_streamer_pb2_grpc import (
|
||||||
|
PacketStreamerStub,
|
||||||
PacketStreamerServicer,
|
PacketStreamerServicer,
|
||||||
add_PacketStreamerServicer_to_server,
|
add_PacketStreamerServicer_to_server,
|
||||||
)
|
)
|
||||||
@@ -43,6 +44,7 @@ from .grpc_protobuf.hci_packet_pb2 import HCIPacket
|
|||||||
from .grpc_protobuf.startup_pb2 import Chip, ChipInfo
|
from .grpc_protobuf.startup_pb2 import Chip, ChipInfo
|
||||||
from .grpc_protobuf.common_pb2 import ChipKind
|
from .grpc_protobuf.common_pb2 import ChipKind
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
# Logging
|
# Logging
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
@@ -273,8 +275,36 @@ async def open_android_netsim_controller_transport(
|
|||||||
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
async def open_android_netsim_host_transport(
|
async def open_android_netsim_host_transport_with_address(
|
||||||
server_host: Optional[str], server_port: int, options: Dict[str, str]
|
server_host: Optional[str],
|
||||||
|
server_port: int,
|
||||||
|
options: Optional[Dict[str, str]] = None,
|
||||||
|
):
|
||||||
|
if server_host == '_' or not server_host:
|
||||||
|
server_host = 'localhost'
|
||||||
|
|
||||||
|
if not server_port:
|
||||||
|
# Look for the gRPC config in a .ini file
|
||||||
|
instance_number = int(options.get('instance', "0"))
|
||||||
|
server_host = 'localhost'
|
||||||
|
server_port = find_grpc_port(instance_number)
|
||||||
|
if not server_port:
|
||||||
|
raise RuntimeError('gRPC server port not found')
|
||||||
|
|
||||||
|
# Connect to the gRPC server
|
||||||
|
server_address = f'{server_host}:{server_port}'
|
||||||
|
logger.debug(f'Connecting to gRPC server at {server_address}')
|
||||||
|
channel = grpc.aio.insecure_channel(server_address)
|
||||||
|
|
||||||
|
return await open_android_netsim_host_transport_with_channel(
|
||||||
|
channel,
|
||||||
|
options,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
async def open_android_netsim_host_transport_with_channel(
|
||||||
|
channel, options: Optional[Dict[str, str]] = None
|
||||||
):
|
):
|
||||||
# Wrapper for I/O operations
|
# Wrapper for I/O operations
|
||||||
class HciDevice:
|
class HciDevice:
|
||||||
@@ -294,10 +324,12 @@ async def open_android_netsim_host_transport(
|
|||||||
async def read(self):
|
async def read(self):
|
||||||
response = await self.hci_device.read()
|
response = await self.hci_device.read()
|
||||||
response_type = response.WhichOneof('response_type')
|
response_type = response.WhichOneof('response_type')
|
||||||
|
|
||||||
if response_type == 'error':
|
if response_type == 'error':
|
||||||
logger.warning(f'received error: {response.error}')
|
logger.warning(f'received error: {response.error}')
|
||||||
raise RuntimeError(response.error)
|
raise RuntimeError(response.error)
|
||||||
elif response_type == 'hci_packet':
|
|
||||||
|
if response_type == 'hci_packet':
|
||||||
return (
|
return (
|
||||||
bytes([response.hci_packet.packet_type])
|
bytes([response.hci_packet.packet_type])
|
||||||
+ response.hci_packet.packet
|
+ response.hci_packet.packet
|
||||||
@@ -312,24 +344,8 @@ async def open_android_netsim_host_transport(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
name = options.get('name', DEFAULT_NAME)
|
name = DEFAULT_NAME if options is None else options.get('name', DEFAULT_NAME)
|
||||||
manufacturer = DEFAULT_MANUFACTURER
|
manufacturer = DEFAULT_MANUFACTURER
|
||||||
instance_number = int(options.get('instance', "0"))
|
|
||||||
|
|
||||||
if server_host == '_' or not server_host:
|
|
||||||
server_host = 'localhost'
|
|
||||||
|
|
||||||
if not server_port:
|
|
||||||
# Look for the gRPC config in a .ini file
|
|
||||||
server_host = 'localhost'
|
|
||||||
server_port = find_grpc_port(instance_number)
|
|
||||||
if not server_port:
|
|
||||||
raise RuntimeError('gRPC server port not found')
|
|
||||||
|
|
||||||
# Connect to the gRPC server
|
|
||||||
server_address = f'{server_host}:{server_port}'
|
|
||||||
logger.debug(f'Connecting to gRPC server at {server_address}')
|
|
||||||
channel = grpc.aio.insecure_channel(server_address)
|
|
||||||
|
|
||||||
# Connect as a host
|
# Connect as a host
|
||||||
service = PacketStreamerStub(channel)
|
service = PacketStreamerStub(channel)
|
||||||
@@ -420,7 +436,9 @@ async def open_android_netsim_transport(spec: Optional[str]) -> Transport:
|
|||||||
|
|
||||||
mode = options.get('mode', 'host')
|
mode = options.get('mode', 'host')
|
||||||
if mode == 'host':
|
if mode == 'host':
|
||||||
return await open_android_netsim_host_transport(host, port, options)
|
return await open_android_netsim_host_transport_with_address(
|
||||||
|
host, port, options
|
||||||
|
)
|
||||||
if mode == 'controller':
|
if mode == 'controller':
|
||||||
if host is None:
|
if host is None:
|
||||||
raise ValueError('<host>:<port> missing')
|
raise ValueError('<host>:<port> missing')
|
||||||
|
|||||||
Reference in New Issue
Block a user