Jump to content

Empfohlene Beiträge

Geschrieben (bearbeitet)

Hallo @Neo,

das einzige große Problem, das ich mit der Schnittstelle momentan habe ist, daß Umlaute und Sonderzeichen als \uxxxx dargestellt werden. Ich habe die Verbindung zum MBS im Visual Studio (VB), ZeroBrane Studio (lua) und mit PuTTY aufgebaut und komme immer zum gleichen Ergebnis.
Da ich mir nicht anders zu helfen wußte, habe ich mir z.B. im Visual Studio einen "Übersetzer" gebastelt...
 

If Result.Contains("\u") Then
  Dim s As String = Result
  Dim b As String
  Dim c As New List(Of String)
  c = Split(s, "\u").ToList
  For i = 0 To c.Count - 1
    b = c(i)
    If i > 0 Then
      Dim h As String = b.Substring(0, 4)
      c(i) = c(i).Replace(h, Char.ConvertFromUtf32(Convert.ToInt32(h, 16)))
    End If
  Next
    Result = String.Join("", c)
End If

... was prinzipiell natürlich nur eine Notlösung ist.

Woran kann das liegen? (ich habe in keinem anderen Programm ein Problem mit Umlauten und Sonderzeichen...) [Windows 11 pro]

Gruß
EASY

Bearbeitet von EASY
Geschrieben

Easy,
nicht visual basic aber dies ist meine connect function 

public static async Task ConnectAsync() {
    try {
        lock (_lock) {
            if (_tcpClient != null && _tcpClient.Connected) {
                return; // Already connected
            }
        }

        _tcpClient = new TcpClient();
        await _tcpClient.ConnectAsync(_host, _port);
        var networkStream = _tcpClient.GetStream();
        _writer = new StreamWriter(networkStream, Encoding.UTF8) { AutoFlush = true };
        _reader = new StreamReader(networkStream, Encoding.UTF8);
    }
    catch (Exception ex) {
        throw new Exception($"Error connecting to server: {ex.Message}", ex);
    }
}
Encoding.UTF8  ist hier der punkt .. Latin1 funktioniert glaube ich auch .. 
Du musst deinem programm sagen was fuer zeichenencoding zu erwarten ist.

gruss
Gmd

 

Geschrieben (bearbeitet)

Hallo,

vor 4 Stunden schrieb gmd:

Encoding.UTF8  ist hier der punkt .. Latin1 funktioniert glaube ich auch .. 
Du musst deinem programm sagen was fuer zeichenencoding zu erwarten ist.

Die Codierung ist (bei mir) leider egal...

    Dim C_Client As Net.Sockets.TcpClient 'Kommando-Client
    Dim C_Stream As NetworkStream         'Kommando-Stream
    Dim C_Write As StreamWriter           'Kommando schreiben
    Dim C_Read, As StreamReader           'Kommando Ergebnis lesen

Public Function Connect(Optional IP As String = "127.0.0.1", Optional Port1 As Integer = 31385) As Boolean
     C_Client = New Net.Sockets.TcpClient
     Try
         C_Client.Connect(IP, Port1)               ' C_Client verbindet sich über IP / Port1
         C_Stream = C_Client.GetStream             ' Stream1 wird auf C_Client verwiesen
         C_Write = New StreamWriter(C_Stream, Encoding.UTF8)     ' Stream1 zum Senden wird deklariert
         C_Read = New StreamReader(C_Stream, Encoding.UTF8)      ' Stream1 zum Empfangen wird deklariert
         Console.WriteLine("Codierung= " & C_Read.CurrentEncoding.ToString)
     Catch ex As Exception
         CE_Error = ex                             'Systemfehlermeldung zwischenspeichern  
         Return False
     End Try
     Return True
 End Function

Console.WriteLine("Codierung= " & C_Read.CurrentEncoding.ToString) liefert Codierung= System.Text.UTF8Encoding (was so sein soll)

Wenn ich nun das Kommando "editor.getSelectedEntities" sende (Objektname "Quäsßter") und mir durch...

Console.WriteLine("Codierung= " & C_Read.CurrentEncoding.ToString)
Console.WriteLine("Result=" & C_Read.ReadLine)
Console.WriteLine("Codierung= " & C_Read.CurrentEncoding.ToString)
Console.WriteLine("Quäsßter")

... das Ergebnis anzeigen lasse, habe ich dieses Resultat...

Zitat

Codierung= System.Text.UTF8Encoding
Result={"jsonrpc":"2.0","result":[{"_class":"entity","name":"Qu\u00E4s\u00DFter"}],"id":1}
Codierung= System.Text.UTF8Encoding
Quäsßter

Console.WriteLine("Codierung= " & C_Read.CurrentEncoding.ToString) liefert Codierung= System.Text.UTF8Encoding...
...liefert das richtige Ergebnis... nur der Antwortstring ist immer noch falsch o.O

und an der Console kann es auch nicht liegen da mit Console.WriteLine("Quäsßter") richtig geschrieben wird...

... bin etwas ratlos:(

Gruß
EASY

Bearbeitet von EASY
Geschrieben

ok, zu spaet fuer heute :) .. kann nicht mehr richtig denken... ich schau mir morgen mall beispiele an wie das bei mir kommt .. Ich hatte beim einlesen von files einiges zu probieren,  ich muss mal explizit umlaute schicken ueber die schnittstelle.. das kann ich ja noch probieren.
Gruss
Gmd

 

Geschrieben (bearbeitet)

Mein response string 

  Name Value Type
  responseJson "{\"jsonrpc\":\"2.0\",\"result\":[{\"_class\":\"entity\",\"name\":\"Qu\\u00E4s\\u00DFter\"}],\"id\":1}" string


genau wie bei dir, das ist das rohformat
und ich mache das

var response = JsonConvert.DeserializeObject<JsonRpcResponse>(responseJson);

if (response != null) {
    if (response.Error != null) {
        ResultMessage = $"Error: {response.Error.Message} (Code: {response.Error.Code})\nRaw Response:\n{responseJson}";
    }
    else if (response.Result == null) {
        ResultMessage = $"Script executed successfully with no return value.\nRaw Response:\n{responseJson}";
    }
    else {
        ResultMessage = $"Response: {response.Result}\nRaw Response:\n{responseJson}";
    }
}
else {
    ResultMessage = $"Failed to parse server response.\nRaw Response:\n{responseJson}";
}

$"{response.Result}"  gibt den richtigen string mit umlauten 
gruss
Gmd
 

Edit: Bevor du fragst welche Library - using Newtonsoft.Json;

Bearbeitet von gmd
Geschrieben (bearbeitet)

Das ist noch wichtig fuer die deserialisation

Das sind meine custom classes die du im obigen code verwendet siehst
 

namespace NLua_Integration.Json_Classes
{
    [JsonConverter(typeof(JsonRpcMessageConverter))]
    public class JsonRpcMessage
    {
        [JsonProperty("jsonrpc")]
        public string JsonRpc { get; set; } = "2.0";

        [JsonProperty("method")]
        public string Method { get; set; }

        [JsonProperty("params")]
        public string Params { get; set; } // Lua script or other parameters

        [JsonProperty("id")]
        public int Id { get; set; }
    }


public class JsonRpcResponse
    {
        [JsonProperty("jsonrpc")]
        public string JsonRpc { get; set; }

        [JsonProperty("result")]
        public object Result { get; set; } // Success result

        [JsonProperty("error")]
        public JsonRpcError Error { get; set; } // Error details

        [JsonProperty("id")]
        public int? Id { get; set; } // Nullable to handle 'null' in the response
    }

    public class JsonRpcError
    {
        [JsonProperty("code")]
        public int Code { get; set; }

        [JsonProperty("message")]
        public string Message { get; set; }

        [JsonProperty("data")]
        public object Data { get; set; } // Optional additional data
    }

}


    public class JsonRpcMessageConverter : JsonConverter<JsonRpcMessage>
    {
        public override void WriteJson(JsonWriter writer, JsonRpcMessage value, JsonSerializer serializer)
        {
            writer.WriteStartObject();

            // Write jsonrpc
            writer.WritePropertyName("jsonrpc");
            writer.WriteValue(value.JsonRpc);

            // Write method
            writer.WritePropertyName("method");
            writer.WriteValue(value.Method);

            // Write params (ensure no extra escaping)
            writer.WritePropertyName("params");
            writer.WriteValue(value.Params); // Ensure proper escaping for the Lua script

            // Write id
            writer.WritePropertyName("id");
            writer.WriteValue(value.Id);

            writer.WriteEndObject();
        }

        public override JsonRpcMessage ReadJson(JsonReader reader, Type objectType, JsonRpcMessage existingValue, bool hasExistingValue, JsonSerializer serializer)
        {
            // Implement if deserialization is needed
            throw new NotImplementedException();
        }
    }

 

Bearbeitet von gmd
Geschrieben (bearbeitet)

Ich kann dir auch mal die source files schicken, wenn das einfacher ist.
Gruss
Gmd

 

json_events.thumb.jpg.10e537f80bd5964dcc445f78397769ee.jpg
in meinem logger sieht man die umlaute encoded
, und wenn sie dann umgewandelt sind
Ich kann die events zerlegen und in eine freundlcihere darstellung umwandeln und die entities extrahieren
und filtern usw.
Wenn du interesse hast schicke ich dir das gerne .. sollte sich leicht transferieren lassen
gruss
Gmd
 

Bearbeitet von gmd
Geschrieben

Hallo @gmd,

vielen Dank für Deine bisherigen Antworten... ich fühle mich momentan etwas überfordert (gleichzeitig bin ich aber auch neugierig geworden, da ich mich auch gerne mit zuerst Unbekanntem beschäftige).

Erst einmal kleine Schritte (für Hobbyprogrammierer wie mich)...

vor 1 Stunde schrieb gmd:

Mein response string 

  Name Value Type
  responseJson "{\"jsonrpc\":\"2.0\",\"result\":[{\"_class\":\"entity\",\"name\":\"Qu\\u00E4s\\u00DFter\"}],\"id\":1}" string


genau wie bei dir, das ist das rohformat

da würde mich einmal Interessieren, was @Neo dazu sagt. Ist das "normal" zu erwarten, oder gibt es da noch eine Verbesserung?

vor 1 Stunde schrieb gmd:

Edit: Bevor du fragst welche Library - using Newtonsoft.Json

... auf die bin ich auch schon gestoßen. Ich muß mich allerdings erst einmal damit beschäftigen, wie ich das in mein Projekt mit einbinden kann...

vor einer Stunde schrieb gmd:

Ich kann die events zerlegen und in eine freundlcihere darstellung umwandeln und die entities extrahieren
und filtern usw.
Wenn du interesse hast schicke ich dir das gerne .. sollte sich leicht transferieren lassen

Da ich neugierig bin, habe ich schon Interesse. Ich weiß nur nicht, ob das etwas viel auf einmal ist und ich erst einmal viel mehr Fragen als Antworten habe...

Gruß
EASY

Geschrieben

Hallo @gmd,

ich muß wohl eigene Wege gehen. Wie es aussieht geht die Library Newtonsoft.Json nicht unter VB.
Wenn ich etwas daraus aufrufe kommt folgende Meldung:

Zitat

... Newtonsoft.Json.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert

:(

Gruß
EASY

Geschrieben (bearbeitet)
3 hours ago, EASY said:

Hallo gmd,

ich muß wohl eigene Wege gehen. Wie es aussieht geht die Library Newtonsoft.Json nicht unter VB.
Wenn ich etwas daraus aufrufe kommt folgende Meldung:

:(

Gruß
EASY

"Nur eigenen Code ist aktiviert."


Die Option "Just My Code" (Nur eigenen Code debuggen) ist in Visual Studio aktiviert.
Dadurch werden externe Bibliotheken wie Newtonsoft.Json ignoriert, und man kann nicht hineinspringen.

Das is nur eine warnung dass du das nicht debuggen kannst, wird aber die funktion nicht beeinflussen. Du kannst die source laden zum debuggen, brauchst du aber nicht wirklich, das VS auf decompiled falls noetig.

 

mycode.thumb.jpg.fe341790db852c23d46f57837f54ab64.jpg

Tools - Options  -> Debugging   deselect Enable Just My Code   warning is ticked, deswegen bekommst du die meldung.

Gruss
Gmd


PS: wir koennen gerne per email oder auch whatsapp communizieren wenn du willst, kein problem, dann belasten wir das forum nicht mit diesen dingen

 

Bearbeitet von gmd
Geschrieben

Hallo @gmd,

Ich verfolge nun schon von Anfang an Deine Aktivitäten hier im MBS. Das ich bis heute nicht verstanden habe, dass das, was Du machst, das MBS nutzerfreundlicher machen könnte, liegt nur an meinem fehlenden Kenntnisstand in Sachen Programmierung. Mal angenommen, Du bist an Deinem Ziel angekommen. Wird dann der Autor der Software vor die Wahl gestellt oder die Alternative haben, eine Version ohne Deinen "Mehrwert" oder wie ich es nennen soll, anzubieten ? Der Nutzer des MBS, also auch ich, denkt ja auch immer an die Kosten einer neuen Version. Es kann allerdings auch sein, das ich mit meiner Frage völlig dabenen liege.

Mit freundlichem Gruß

streit_ross

Geschrieben

Was ich tue sollte Neo ueberhaupt nicht beeinflussen in seiner entwicklungsrichtung, zumindest fuer einige zeit. Was ich tue ist "einfach" ein riesiges plugin und eine experimentelle entwicklung. Weder wird es die kosten des MBS erhoehen noch verringern. 
Wenn durch dies entwicklung und die diskussionen ideen entstehen die unmittelbar fuer das Mbs nuetzlich sind, kann und wird Neo diese aufgreifen und umsetzen.
Wird am ende meine vision wahr, wird das werbung fuer das MBS sein und ein modul welches kostenfrei von jedem verwendet werden kann, falls es jemals dazu kommt 
das ganze installierbar zu machen und mit weniger resourcen auszukommen als bisher. Fuer jetzt ist das ein versuch und wer moechte kann daran teilnehmen, die source ist offen.

Ich hoffe ich habe das verstaendlich formuliert.

Gruss
Gmd
 

Geschrieben
vor 17 Stunden schrieb EASY:

Ist das "normal" zu erwarten, oder gibt es da noch eine Verbesserung?

Das Encodieren von Sonderzeichen ist bei JSON standardisiert (siehe Kapitel 2.5 Strings). Die Antworten von der Steuerschnittstelle sind daher normales JSON. Wie verarbeitest du die JSON-Antworten, nutzt du eine spezielle Bibliothek?

Viele Grüße,

Neo

Geschrieben

Hallo,

vor 8 Stunden schrieb Neo:

Das Encodieren von Sonderzeichen ist bei JSON standardisiert (siehe Kapitel 2.5 Strings). Die Antworten von der Steuerschnittstelle sind daher normales JSON. Wie verarbeitest du die JSON-Antworten, nutzt du eine spezielle Bibliothek?

... Deine Antwort bringt mich nicht so richtig weiter. Wenn ich mir das Kapitel 2.5 durchlese, bin ich offen gestanden nur unwesentlich schlauer:/ (ich bin kein Programmierer9_9)
Ich entnehme Deiner Antwort, daß es eben so ist, daß im string den die Schnittstelle sendet, Sonderzeichen und Umlaute als \uxxxx dargestellt werden... (weil "normales JSON").
Für die Verarbeitung verwende ich keine spezielle Bibliothek. Ich nehme den Antwortstring und da dieser im Aufbau einer gewissen Logik folgt, extrahiere ich mir daraus die für mich notwendigen Informationen...

Gruß
EASY

Geschrieben (bearbeitet)

Hallo @Neo,

Es ist mir gelungen, die Newtonsoft.Json Bibliotek unter VB zum laufen zu bringen. Damit erledigt sich für mich das Problem mit den Umlauten und Sonderzeichen.
Sie werden dort dann richtig dargestellt.

Gruß
EASY

Bearbeitet von EASY

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...