mqtt切换为远程服务器部署,优化简单指令解析时长
This commit is contained in:
@@ -42,10 +42,22 @@ class _FakeMqttClient:
|
||||
self.on_message = None
|
||||
self.subscriptions: list[tuple[str, int]] = []
|
||||
self.published: list[tuple[str, str, int, bool]] = []
|
||||
self.websocket_options: list[dict[str, object]] = []
|
||||
self.credentials: tuple[str, str | None] | None = None
|
||||
self.tls_configured = False
|
||||
|
||||
def reconnect_delay_set(self, **_kwargs) -> None:
|
||||
return None
|
||||
|
||||
def ws_set_options(self, **kwargs: object) -> None:
|
||||
self.websocket_options.append(kwargs)
|
||||
|
||||
def username_pw_set(self, username: str, password: str | None) -> None:
|
||||
self.credentials = (username, password)
|
||||
|
||||
def tls_set(self) -> None:
|
||||
self.tls_configured = True
|
||||
|
||||
def connect_async(self, host: str, port: int, keepalive: int) -> None:
|
||||
self.connection = (host, port, keepalive)
|
||||
|
||||
@@ -89,6 +101,8 @@ def _settings():
|
||||
"password": None,
|
||||
"tls_enabled": False,
|
||||
"feedback_timeout_ms": 100,
|
||||
"transport": "tcp",
|
||||
"websocket_path": "/mqtt",
|
||||
}
|
||||
values["public_info"] = lambda: {
|
||||
"enabled": True,
|
||||
@@ -109,9 +123,31 @@ class MqttCanPayloadTests(unittest.TestCase):
|
||||
self.assertEqual(settings.condition_topic, "n7/n7-headunit/can/state")
|
||||
self.assertEqual(settings.control_topic, "n7/n7-headunit/can/command")
|
||||
self.assertFalse(settings.approval_required)
|
||||
self.assertEqual(settings.transport, "tcp")
|
||||
self.assertEqual(settings.websocket_path, "/mqtt")
|
||||
self.assertEqual(info["state_contract"], "n7-can-signals/v1")
|
||||
self.assertEqual(info["control_contract"], "n7-headunit-can-command/v1")
|
||||
|
||||
def test_websocket_transport_settings_are_loaded_from_environment(self) -> None:
|
||||
with patch.dict(
|
||||
"os.environ",
|
||||
{
|
||||
"COGNITIVE_AGENT_VEHICLE_MQTT_HOST": "mqtt.example.test",
|
||||
"COGNITIVE_AGENT_VEHICLE_MQTT_PORT": "443",
|
||||
"COGNITIVE_AGENT_VEHICLE_MQTT_TRANSPORT": "websocket",
|
||||
"COGNITIVE_AGENT_VEHICLE_MQTT_WEBSOCKET_PATH": "/mqtt",
|
||||
"COGNITIVE_AGENT_VEHICLE_MQTT_TLS": "true",
|
||||
},
|
||||
clear=True,
|
||||
):
|
||||
settings = VehicleMqttSettings.from_env()
|
||||
|
||||
self.assertTrue(settings.adapter_configured)
|
||||
self.assertEqual(settings.transport, "websockets")
|
||||
self.assertEqual(settings.websocket_path, "/mqtt")
|
||||
self.assertTrue(settings.tls_enabled)
|
||||
self.assertEqual(settings.public_info()["transport"], "websockets")
|
||||
|
||||
def test_explicit_shared_approval_policy_still_locks_mqtt_control(self) -> None:
|
||||
with patch.dict(
|
||||
"os.environ",
|
||||
@@ -461,6 +497,29 @@ class MqttCanTransportTests(unittest.TestCase):
|
||||
def tearDown(self) -> None:
|
||||
self.transport.close()
|
||||
|
||||
def test_websocket_client_applies_transport_path_authentication_and_tls(self) -> None:
|
||||
client = _FakeMqttClient()
|
||||
settings = _settings()
|
||||
settings.transport = "websockets"
|
||||
settings.websocket_path = "/mqtt"
|
||||
settings.username = "n7web"
|
||||
settings.password = "secret"
|
||||
settings.tls_enabled = True
|
||||
transport = MqttCanTransport(settings)
|
||||
|
||||
with patch("paho.mqtt.client.Client", return_value=client) as constructor:
|
||||
transport.start()
|
||||
try:
|
||||
self.assertEqual(
|
||||
constructor.call_args.kwargs["transport"], "websockets"
|
||||
)
|
||||
self.assertEqual(client.websocket_options, [{"path": "/mqtt"}])
|
||||
self.assertEqual(client.credentials, ("n7web", "secret"))
|
||||
self.assertTrue(client.tls_configured)
|
||||
self.assertEqual(client.connection, ("127.0.0.1", 1883, 30))
|
||||
finally:
|
||||
transport.close()
|
||||
|
||||
def test_condition_frames_use_existing_decoder_and_snapshot_contract(self) -> None:
|
||||
self.client.emit(
|
||||
"n7/n7-headunit/can/state",
|
||||
|
||||
Reference in New Issue
Block a user