Skip to content

Commit dcea01b

Browse files
committed
Rosbridge client v2 protocol implemented
1 parent 2c354f3 commit dcea01b

30 files changed

+360
-30
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,41 @@
11
namespace RosbridgeNet.Client.Console
22
{
3+
using System;
4+
using System.Net.WebSockets;
5+
using System.Threading;
6+
using RosbridgeNet.RosbridgeClient.Common;
7+
using RosbridgeNet.RosbridgeClient.Common.Interfaces;
8+
using RosbridgeNet.RosbridgeClient.ProtocolV2;
9+
using RosbridgeNet.RosbridgeClient.ProtocolV2.Interfaces;
10+
using RosbridgeNet.RosbridgeClient.ProtocolV2.Wrappers;
11+
312
class Program
413
{
514
static void Main(string[] args)
615
{
16+
Publish();
17+
}
18+
19+
static void Publish()
20+
{
21+
Uri uri = new Uri("ws://localhost:9090");
22+
CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
23+
IClientWebSocket clientWebSocket = new ClientWebSocketWrapper(new ClientWebSocket());
24+
ISocket socket = new Socket(clientWebSocket, uri, cancelTokenSource);
25+
IRosbridgeMessageSerializer messageSerializer = new RosbridgeMessageSerializer();
26+
IRosbridgeMessageDispatcher messageDispatcher = new RosbridgeMessageDispatcher(socket, messageSerializer);
27+
RosPublisher<Twist> publisher = new RosPublisher<Twist>(messageDispatcher, "/turtle1/cmd_vel");
28+
29+
messageDispatcher.StartAsync().ContinueWith((publish) =>
30+
{
31+
publisher.AdvertiseAsync();
32+
33+
});
34+
35+
while (true)
36+
{
37+
publisher.PublishAsync(new Twist() { angular = new Vector() { x = 10, y = 0, z = 0 }, linear = new Vector() { x = 0, y = 0, z = 0 } });
38+
}
739
}
840
}
941
}

samples/RosbridgeNet.Client.Console/RosbridgeNet.Client.Console.csproj

+5
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,9 @@
55
<TargetFramework>netcoreapp2.0</TargetFramework>
66
</PropertyGroup>
77

8+
<ItemGroup>
9+
<ProjectReference Include="..\..\src\RosbridgeNet.RosbridgeClient.Common\RosbridgeNet.RosbridgeClient.Common.csproj" />
10+
<ProjectReference Include="..\..\src\RosbridgeNet.RosbridgeClient.ProtocolV2\RosbridgeNet.RosbridgeClient.ProtocolV2.csproj" />
11+
</ItemGroup>
12+
813
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace RosbridgeNet.Client.Console
2+
{
3+
using RosbridgeNet.RosbridgeClient.Common.Attributes;
4+
5+
[RosMessageType("geometry_msgs/Twist")]
6+
public class Twist
7+
{
8+
public Vector linear { get; set; }
9+
public Vector angular { get; set; }
10+
}
11+
12+
public class Vector
13+
{
14+
public float x { get; set; }
15+
public float y { get; set; }
16+
public float z { get; set; }
17+
}
18+
}

src/RosbridgeNet.RosbridgeClient.Common/RosbridgeMessageDispatcher.cs

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public RosbridgeMessageDispatcher(ISocket socket, IRosbridgeMessageSerializer ro
3030

3131
this.socket = socket;
3232
this.rosbridgeMessageSerializer = rosbridgeMessageSerializer;
33+
this.CurrentState = RosbridgeMessageDispatcherStates.Stopped;
3334
}
3435

3536
public event RosbridgeMessageReceivedHanlder RosbridgeMessageReceived;

src/RosbridgeNet.RosbridgeClient.Common/RosbridgeNet.RosbridgeClient.Common.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netstandard1.0</TargetFramework>
4+
<TargetFramework>netstandard1.3</TargetFramework>
55
</PropertyGroup>
66

77
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
namespace RosbridgeNet.RosbridgeClient.ProtocolV2.Exceptions
2+
{
3+
using System;
4+
5+
public class SocketException : Exception
6+
{
7+
public SocketException()
8+
{
9+
}
10+
11+
public SocketException(string message) : base(message)
12+
{
13+
}
14+
15+
public SocketException(string message, Exception innerException) : base(message, innerException)
16+
{
17+
}
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
namespace RosbridgeNet.RosbridgeClient.ProtocolV2.Interfaces
2+
{
3+
using System;
4+
using System.Net.WebSockets;
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
8+
public interface IClientWebSocket : IDisposable
9+
{
10+
WebSocketState State { get; }
11+
12+
Task ConnectAsync(Uri uri, CancellationToken cancellationToken);
13+
14+
Task CloseAsync(WebSocketCloseStatus closeStatus, string statusDescription,
15+
CancellationToken cancellationToken);
16+
17+
Task<WebSocketReceiveResult> ReceiveAsync(ArraySegment<byte> buffer, CancellationToken cancellationToken);
18+
19+
Task SendAsync(ArraySegment<byte> buffer, WebSocketMessageType messageType, bool endOfMessage,
20+
CancellationToken cancellationToken);
21+
22+
void Abort();
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace RosbridgeNet.RosbridgeClient.ProtocolV2.Interfaces
2+
{
3+
using RosbridgeNet.RosbridgeClient.Common.Interfaces;
4+
using RosbridgeNet.RosbridgeClient.ProtocolV2.RosbridgeMessages.RosOperations;
5+
6+
public interface IRosPublisherV2<TRosMessage> : IRosPublisher<TRosMessage>
7+
where TRosMessage : class, new()
8+
{
9+
RosAdvertiseMessage RosAdvertiseMessage { get; }
10+
11+
RosUnadvertiseMessage RosUnadvertiseMessage { get; }
12+
13+
RosPublishMessage<TRosMessage> RosPublishMessage { get; }
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace RosbridgeNet.RosbridgeClient.ProtocolV2.Interfaces
2+
{
3+
public interface IRosServiceClientV2
4+
{
5+
}
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace RosbridgeNet.RosbridgeClient.ProtocolV2.Interfaces
2+
{
3+
using RosbridgeNet.RosbridgeClient.Common.Interfaces;
4+
using RosbridgeNet.RosbridgeClient.ProtocolV2.RosbridgeMessages.RosOperations;
5+
6+
public interface IRosSubscriberV2<TRosMessage> : IRosSubscriber<TRosMessage> where TRosMessage : class, new()
7+
{
8+
RosSubscribeMessage RosSubscribeMessage { get; }
9+
10+
RosUnsubscribeMessage RosUnsubscribeMessage { get; }
11+
}
12+
}

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosPublisher.cs

+5-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
{
33
using RosbridgeNet.RosbridgeClient.Common.Abstracts;
44
using RosbridgeNet.RosbridgeClient.Common.Interfaces;
5+
using RosbridgeNet.RosbridgeClient.ProtocolV2.Interfaces;
56
using RosbridgeNet.RosbridgeClient.ProtocolV2.RosbridgeMessages.RosOperations;
67

7-
public class RosPublisher<TRosMessage> : RosPublisherBase<TRosMessage> where TRosMessage : class, new()
8+
public sealed class RosPublisher<TRosMessage> : RosPublisherBase<TRosMessage>, IRosPublisherV2<TRosMessage> where TRosMessage : class, new()
89
{
910
public RosPublisher(IRosbridgeMessageDispatcher messageDispatcher, string topic) : base(messageDispatcher, topic)
1011
{
@@ -14,7 +15,9 @@ public RosPublisher(IRosbridgeMessageDispatcher messageDispatcher, string topic)
1415
}
1516

1617
public RosAdvertiseMessage RosAdvertiseMessage { get; private set; }
18+
1719
public RosUnadvertiseMessage RosUnadvertiseMessage { get; private set; }
20+
1821
public RosPublishMessage<TRosMessage> RosPublishMessage { get; private set; }
1922

2023
protected override object CreateAdvertiseMessage()
@@ -40,4 +43,4 @@ protected override object CreatePublishMessage(TRosMessage message)
4043
return this.RosPublishMessage;
4144
}
4245
}
43-
}
46+
}

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosSubscriber.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
using RosbridgeNet.RosbridgeClient.Common.Abstracts;
44
using RosbridgeNet.RosbridgeClient.Common.EventArgs;
55
using RosbridgeNet.RosbridgeClient.Common.Interfaces;
6+
using RosbridgeNet.RosbridgeClient.ProtocolV2.Interfaces;
67
using RosbridgeNet.RosbridgeClient.ProtocolV2.RosbridgeMessages.RosOperations;
78

8-
public class RosSubscriber<TRosMessage> : RosSubscriberBase<TRosMessage> where TRosMessage : class, new()
9+
public sealed class RosSubscriber<TRosMessage> : RosSubscriberBase<TRosMessage>, IRosSubscriberV2<TRosMessage> where TRosMessage : class, new()
910
{
1011
public RosSubscriber(IRosbridgeMessageDispatcher rosbridgeMessageDispatcher, string topic) : base(rosbridgeMessageDispatcher, topic)
1112
{
@@ -14,14 +15,15 @@ public RosSubscriber(IRosbridgeMessageDispatcher rosbridgeMessageDispatcher, str
1415
}
1516

1617
public RosSubscribeMessage RosSubscribeMessage { get; private set; }
18+
1719
public RosUnsubscribeMessage RosUnsubscribeMessage { get; private set; }
1820

1921
protected override object CreateSubscribeMessage()
2022
{
2123
this.RosSubscribeMessage.Topic = this.Topic;
2224
this.RosSubscribeMessage.Type = this.Type;
2325

24-
return RosSubscribeMessage;
26+
return this.RosSubscribeMessage;
2527
}
2628

2729
protected override object CreateUnsubscribeMessage()

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessageSerializer.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using Newtonsoft.Json.Linq;
77
using RosbridgeNet.RosbridgeClient.Common.Interfaces;
88

9-
public class RosbridgeMessageSerializer : IRosbridgeMessageSerializer
9+
public sealed class RosbridgeMessageSerializer : IRosbridgeMessageSerializer
1010
{
1111
private const string EncodingType = "US-ASCII";
1212

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/Authentication/AuthenticateMessage.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using System.Runtime.Serialization;
44

55
[DataContract]
6-
public class AuthenticateMessage : RosbridgeMessageBase
6+
public sealed class AuthenticateMessage : RosbridgeMessageBase
77
{
88
[DataMember(Name = "mac", IsRequired = true)]
99
public string MacAddress { get; set; }

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/Enums/MessageCompressionLevel.cs

+3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
namespace RosbridgeNet.RosbridgeClient.ProtocolV2.RosbridgeMessages.Enums
22
{
33
using System.Runtime.Serialization;
4+
using Newtonsoft.Json;
5+
using Newtonsoft.Json.Converters;
46

57
[DataContract]
8+
[JsonConverter(typeof(StringEnumConverter))]
69
public enum MessageCompressionLevel
710
{
811
[EnumMember(Value = "none")]

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/Enums/StatusMessageLevel.cs

+3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
namespace RosbridgeNet.RosbridgeClient.ProtocolV2.RosbridgeMessages.Enums
22
{
33
using System.Runtime.Serialization;
4+
using Newtonsoft.Json;
5+
using Newtonsoft.Json.Converters;
46

57
[DataContract]
8+
[JsonConverter(typeof(StringEnumConverter))]
69
public enum StatusMessageLevel
710
{
811
[EnumMember(Value = "none")]

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/MessageTransformation/FragmentedMessage.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using System.Runtime.Serialization;
44

55
[DataContract]
6-
public class FragmentedMessage : RosbridgeMessageBase
6+
public sealed class FragmentedMessage : RosbridgeMessageBase
77
{
88
[DataMember(Name = "id", IsRequired = true)]
99
public string Id { get; set; }

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/MessageTransformation/PNGMessage.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using System.Runtime.Serialization;
44

55
[DataContract]
6-
public class PNGMessage : RosbridgeMessageBase
6+
public sealed class PNGMessage : RosbridgeMessageBase
77
{
88
[DataMember(Name = "id", IsRequired = false)]
99
public string Id { get; set; }

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/RosOperations/RosAdvertiseMessage.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using System.Runtime.Serialization;
44

55
[DataContract]
6-
public class RosAdvertiseMessage : RosTopicMessageBase
6+
public sealed class RosAdvertiseMessage : RosTopicMessageBase
77
{
88
[DataMember(Name = "type", IsRequired = true)]
99
public string Type { get; set; }

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/RosOperations/RosCallServiceMessage.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
using RosbridgeNet.RosbridgeClient.ProtocolV2.RosbridgeMessages.Enums;
88

99
[DataContract]
10-
public class RosCallServiceMessage : RosMessageBase
10+
public sealed class RosCallServiceMessage : RosMessageBase
1111
{
1212
[DataMember(Name = "service", IsRequired = true)]
1313
public string Service { get; set; }

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/RosOperations/RosPublishMessage.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using System.Runtime.Serialization;
44

55
[DataContract]
6-
public class RosPublishMessage<TRosMessage> : RosTopicMessageBase where TRosMessage : class, new()
6+
public sealed class RosPublishMessage<TRosMessage> : RosTopicMessageBase where TRosMessage : class, new()
77
{
88
[DataMember(Name = "msg", IsRequired = true)]
99
public TRosMessage Message { get; set; }

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/RosOperations/RosServiceResponseMessage.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
using Newtonsoft.Json.Linq;
55

66
[DataContract]
7-
public class RosServiceResponseMessage : RosMessageBase
7+
public sealed class RosServiceResponseMessage : RosMessageBase
88
{
99
[DataMember(Name = "service", IsRequired = true)]
1010
public string Service { get; set; }

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/RosOperations/RosSubscribeMessage.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using Newtonsoft.Json.Converters;
77

88
[DataContract]
9-
public class RosSubscribeMessage : RosTopicMessageBase
9+
public sealed class RosSubscribeMessage : RosTopicMessageBase
1010
{
1111
[DataMember(Name = "type", IsRequired = false)]
1212
public string Type { get; set; }

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/RosOperations/RosUnadvertiseMessage.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
namespace RosbridgeNet.RosbridgeClient.ProtocolV2.RosbridgeMessages.RosOperations
22
{
3-
public class RosUnadvertiseMessage : RosTopicMessageBase
3+
public sealed class RosUnadvertiseMessage : RosTopicMessageBase
44
{
55
public RosUnadvertiseMessage() : base("unadvertise")
66
{

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/RosOperations/RosUnsubscribeMessage.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
namespace RosbridgeNet.RosbridgeClient.ProtocolV2.RosbridgeMessages.RosOperations
22
{
3-
public class RosUnsubscribeMessage : RosTopicMessageBase
3+
public sealed class RosUnsubscribeMessage : RosTopicMessageBase
44
{
55
public RosUnsubscribeMessage() : base("unsubscribe")
66
{

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/RosbridgeStatus/SetStatusLevelMessage.cs

-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
{
33
using System.Runtime.Serialization;
44
using Enums;
5-
using Newtonsoft.Json;
6-
using Newtonsoft.Json.Converters;
75

86
[DataContract]
97
public class SetStatusLevelMessage : RosbridgeMessageBase
@@ -12,7 +10,6 @@ public class SetStatusLevelMessage : RosbridgeMessageBase
1210
public string Id { get; set; }
1311

1412
[DataMember(Name = "level", IsRequired = true)]
15-
[JsonConverter(typeof(StringEnumConverter))]
1613
public StatusMessageLevel StatusLevel { get; set; }
1714

1815
public SetStatusLevelMessage() : base("set_level")

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeMessages/RosbridgeStatus/StatusLevelMessage.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using System.Runtime.Serialization;
44

55
[DataContract]
6-
public class StatusLevelMessage : SetStatusLevelMessage
6+
public sealed class StatusLevelMessage : SetStatusLevelMessage
77
{
88
[DataMember(Name = "msg", IsRequired = true)]
99
public string Message { get; set; }

src/RosbridgeNet.RosbridgeClient.ProtocolV2/RosbridgeNet.RosbridgeClient.ProtocolV2.csproj

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netstandard1.0</TargetFramework>
4+
<TargetFramework>netstandard1.3</TargetFramework>
55
</PropertyGroup>
66

77
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
88
<LangVersion>6</LangVersion>
99
</PropertyGroup>
1010

11+
<ItemGroup>
12+
<PackageReference Include="System.Net.WebSockets.Client" Version="4.3.2" />
13+
</ItemGroup>
14+
1115
<ItemGroup>
1216
<ProjectReference Include="..\RosbridgeNet.RosbridgeClient.Common\RosbridgeNet.RosbridgeClient.Common.csproj" />
1317
</ItemGroup>

0 commit comments

Comments
 (0)