Skip to content

Commit 96468f8

Browse files
committed
fixed ROS Bridge reading large buffers.
1 parent 543bf87 commit 96468f8

File tree

3 files changed

+31
-14
lines changed

3 files changed

+31
-14
lines changed

Runtime/Scripts/ROS/ROSBridge/ZOROSBridgeConnection.cs

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,7 @@ public async void ServiceResponse<T>(T response_message, string service, bool re
709709

710710

711711
/// <summary>
712-
///
712+
/// Call ROS service.
713713
/// </summary>
714714
/// <param name="calling_message">The calling message</param>
715715
/// <param name="service">Service name</param>
@@ -752,20 +752,33 @@ public async void CallService<T, R>(T calling_message, string service, string id
752752

753753
private async Task ClientReadAsync() {
754754
Debug.Log("INFO: ZOROSBridgeConnection::ClientReadAsync Start");
755-
byte[] buffer = new byte[1024 * 100]; // BUGBUG: hardwired buffer. TODO: handle when we get messages larger then the buffer!
755+
const int bufferSize = 1024;
756+
byte[] buffer = new byte[bufferSize];
757+
756758

757759
while (_isConnected) {
758760
int bytesRead = -1;
761+
int totalBytes = 0;
759762
try {
760763

761-
bytesRead = await _tcpClient.GetStream().ReadAsync(buffer, 0, buffer.Length);
762-
// Debug.Log("INFO: ReadAsync read byte count" + bytesRead.ToString());
763-
if (bytesRead > 0) {
764+
MemoryStream memoryStream = new MemoryStream();
765+
766+
do {
767+
bytesRead = await _tcpClient.GetStream().ReadAsync(buffer, 0, buffer.Length);
768+
memoryStream.Write(buffer, 0, bytesRead);
769+
totalBytes += bytesRead;
770+
// Debug.Log($"INFO: bytesRead: {bytesRead} totalBytes: {totalBytes}");
771+
} while(_tcpClient.GetStream().DataAvailable);
772+
773+
if (totalBytes > 0) {
774+
775+
byte[] finalBuffer = memoryStream.ToArray();
764776

765777
if (Serialization == SerializationType.JSON) {
778+
766779
// check if we have valid JSON by checking if we have the '{' & '}'
767-
if (buffer[0] == '{' && buffer[bytesRead - 1] == '}') {
768-
string msg = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
780+
if (finalBuffer[0] == '{' && buffer[totalBytes - 1] == '}') {
781+
string msg = System.Text.Encoding.UTF8.GetString(finalBuffer, 0, totalBytes);
769782
JObject msgJSON = JObject.Parse(msg);
770783
string topic = msgJSON["topic"].Value<string>();
771784
foreach (var subscriber in _subscribers[topic]) {
@@ -782,9 +795,8 @@ private async Task ClientReadAsync() {
782795

783796
// TODO: we have to deserialize to JSON because we do not know the type of the object
784797
// coming in. Would be faster to be able to "peek" into the BSON and then deserialize...
785-
MemoryStream memStream = new MemoryStream(buffer);
786-
JObject msgJSON;
787-
using (BsonDataReader reader = new BsonDataReader(memStream)) {
798+
JObject msgJSON = null;
799+
using (BsonDataReader reader = new BsonDataReader(new MemoryStream(finalBuffer))) {
788800
msgJSON = (JObject)JToken.ReadFrom(reader);
789801
}
790802

@@ -827,12 +839,12 @@ private async Task ClientReadAsync() {
827839
await SendJSONStringAsync(JsonConvert.SerializeObject(nextServiceCall));
828840
} else if (Serialization == SerializationType.BSON) {
829841

830-
MemoryStream memoryStream = new MemoryStream();
831-
BsonDataWriter writer = new BsonDataWriter(memoryStream);
842+
MemoryStream bsonMemoryStream = new MemoryStream();
843+
BsonDataWriter writer = new BsonDataWriter(bsonMemoryStream);
832844
JsonSerializer serializer = new JsonSerializer();
833845
serializer.Serialize(writer, nextServiceCall);
834846

835-
await SendBSONAsync(memoryStream);
847+
await SendBSONAsync(bsonMemoryStream);
836848
}
837849
}
838850

Samples~/ZeroSimSamples/Scenes/xArm6_test.unity

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,11 @@ PrefabInstance:
780780
propertyPath: m_Name
781781
value: teapot
782782
objectReference: {fileID: 0}
783+
- target: {fileID: -927199367670048503, guid: 17be92f99b8fb14eaa65adc226ac3fd4,
784+
type: 3}
785+
propertyPath: m_IsActive
786+
value: 0
787+
objectReference: {fileID: 0}
783788
m_RemovedComponents: []
784789
m_SourcePrefab: {fileID: 100100000, guid: 17be92f99b8fb14eaa65adc226ac3fd4, type: 3}
785790
--- !u!1 &733169652 stripped

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "com.fsstudio.zerosim",
3-
"version": "0.0.3",
3+
"version": "0.0.4",
44
"displayName": "ZeroSim",
55
"description": "ZeroSim",
66
"unity": "2020.1",

0 commit comments

Comments
 (0)