locka99 / opcua

A client and server implementation of the OPC UA specification written in Rust
Mozilla Public License 2.0
476 stars 129 forks source link

multiple simultaneous subscriptions do not work #204

Open lovasoa opened 2 years ago

lovasoa commented 2 years ago

While working on subscription handling on the server, I noticed multiple simultaneous subscriptions do not work.

running the simple-server from this repo with two instances of the simple-client leads the following results:

client 1

Data change from server:
Item "ns=2;s=v1", Value = Int32(21)
Item "ns=2;s=v3", Value = String(UAString { value: Some("Hello World times 1") })
Item "ns=2;s=v2", Value = Boolean(false)
Item "ns=2;s=v4", Value = Double(-0.6513571038210482)
Data change from server:
Item "ns=2;s=v4", Value = Double(-0.8974740229864405)
Item "ns=2;s=v1", Value = Int32(28)
Item "ns=2;s=v3", Value = String(UAString { value: Some("Hello World times 2") })
Item "ns=2;s=v2", Value = Boolean(true)
Data change from server:
Item "ns=2;s=v3", Value = String(UAString { value: Some("Hello World times 3") })
Item "ns=2;s=v1", Value = Int32(35)
Item "ns=2;s=v2", Value = Boolean(false)
Item "ns=2;s=v4", Value = Double(0.14276713114744893)
Data change from server:
Item "ns=2;s=v3", Value = String(UAString { value: Some("Hello World times 5") })
Item "ns=2;s=v2", Value = Boolean(true)
Item "ns=2;s=v1", Value = Int32(42)
Item "ns=2;s=v4", Value = Double(0.9941660338363008)
Data change from server:
Item "ns=2;s=v4", Value = Double(0.4097956738525492)
Item "ns=2;s=v3", Value = String(UAString { value: Some("Hello World times 7") })
Item "ns=2;s=v1", Value = Int32(48)
Data change from server:
Item "ns=2;s=v3", Value = String(UAString { value: Some("Hello World times 9") })
Item "ns=2;s=v2", Value = Boolean(false)
Item "ns=2;s=v4", Value = Double(-0.7816075748252528)
Item "ns=2;s=v1", Value = Int32(55)
Data change from server:
Item "ns=2;s=v2", Value = Boolean(true)
Item "ns=2;s=v3", Value = String(UAString { value: Some("Hello World times 11") })
Item "ns=2;s=v4", Value = Double(-0.7985514730335248)
Item "ns=2;s=v1", Value = Int32(62)
Data change from server:
Item "ns=2;s=v4", Value = Double(0.3257001705814321)
Item "ns=2;s=v1", Value = Int32(69)
Item "ns=2;s=v3", Value = String(UAString { value: Some("Hello World times 13") })
Item "ns=2;s=v2", Value = Boolean(false)

client 2

Created a subscription with id = 2
Data change from server:
Item "ns=2;s=v4", Value = Double(0.38036026366956954)
Item "ns=2;s=v3", Value = String(UAString { value: Some("Hello World times 4") })
Item "ns=2;s=v1", Value = Int32(36)
Item "ns=2;s=v2", Value = Boolean(true)
Data change from server:
Item "ns=2;s=v2", Value = Boolean(false)
Item "ns=2;s=v3", Value = String(UAString { value: Some("Hello World times 6") })
Item "ns=2;s=v1", Value = Int32(43)
Item "ns=2;s=v4", Value = Double(0.997063454504975)
Data change from server:
Item "ns=2;s=v4", Value = Double(0.23527782216732945)
Item "ns=2;s=v3", Value = String(UAString { value: Some("Hello World times 8") })
Item "ns=2;s=v1", Value = Int32(49)
Data change from server:
Item "ns=2;s=v4", Value = Double(-0.8828820336562604)
Item "ns=2;s=v3", Value = String(UAString { value: Some("Hello World times 10") })
Item "ns=2;s=v2", Value = Boolean(true)
Item "ns=2;s=v1", Value = Int32(56)
Data change from server:
Item "ns=2;s=v2", Value = Boolean(false)
Item "ns=2;s=v1", Value = Int32(63)
Item "ns=2;s=v3", Value = String(UAString { value: Some("Hello World times 12") })
Item "ns=2;s=v4", Value = Double(-0.6744054888270351)

Both clients should see all updates (seeing all the consecutive values of "hello world", just as when there is a single client), but they actually "steal" publish responses from each other.