Jump to content
The simFlight Network Forums

Recommended Posts

Posted

Partly true. Certain URLs and Ports are secured by Windows. To use them, the account the application is running under needs permission.

You can achieve this is two ways:

1. By running the application as Admin.

2. By giving the required permission to the current user. This is done using the following command: (You can execute this in the command window or in code using a process):

netsh http add urlacl url=[URL TO REGISTER] user=[DOMAIN]\[USER OR GROUP]

e.g. my PC here is call PJH. My user name is Paul. If I want to use the URL http://PJH:2048/fsuipc I would need this command:

netsh http add urlacl url=http://PJH:2048/fsuipc/ user=PJH\Paul

To run this command you need to be running 'as admin'. But once you've given permissions the socket server will be able to work without admin privileges.

Paul

  • Like 1
  • Thanks 1
  • 4 months later...
Posted (edited)

Hello. Any idea on how to achieve a client using python? I tried a simple script but it does not work:

import json
import websocket
from websocket import create_connection

websocket.enableTrace(True)
ws = create_connection("ws://MYIP:8384/fsuipc/")
ws.send(json.dumps({"command":"about.read", "name":"about"}))
result =  ws.recv()
print (result)
ws.close()

If I try that I get this response:

--- request header ---
GET /fsuipc/ HTTP/1.1
Upgrade: websocket
Host: MYIP:8384
Origin: MYIP:8384
Sec-WebSocket-Key: nMbaFYGREah5M2uVaWU/nA==
Sec-WebSocket-Version: 13
Connection: Upgrade


-----------------------
--- response header ---

 

Any suggestion?

Thank you

Francesco

 

Edited by ciccio85
Posted

I've never used Python so I don't think I can help much.

However, the response you're getting back is from the connection request:

ws = create_connection("ws://MYIP:8384/fsuipc/")

Maybe you need to get that response first, then send your 'about' command and get the response from that:

import json
import websocket
from websocket import create_connection

websocket.enableTrace(True)

ws = create_connection("ws://MYIP:8384/fsuipc/")
result =  ws.recv()
print (result)

ws.send(json.dumps({"command":"about.read", "name":"about"}))
result =  ws.recv()
print (result)

ws.close()

Paul

Posted (edited)

Hello, the trick was to add the fsuipc protocol. Here the working script:

 

import json
import websocket
from websocket import create_connection

websocket.enableTrace(True)

ws = create_connection("ws://MYIP/fsuipc/", subprotocols=["fsuipc"])

ws.send(json.dumps({"command":"about.read", "name":"about"}))
result =  ws.recv()
print (result)

ws.close()

 

Edited by ciccio85
  • Like 1
Posted

I have a complete working example that can be used to get the data using Python 3:

 

import websocket
import _thread
import json
import time
import rel

def on_message(ws, message):
    print(message)

def on_error(ws, error):
    print(error)

def on_close(ws, close_status_code, close_msg):
    print("### closed ###")

def on_open(ws):
    print("Opened connection")

request = {
       "command": "about.read",
       "name": "about"
}

request2 = {
    "command": "offsets.declare",
    "name": "myOffsets",
    "offsets": [
            {"name": "altitude", "address": 0x0570, "type": "int", "size": 8},
            {"name": "avionicsMaster", "address": 0x2E80, "type": "uint", "size": 4},
            {"name": "heading", "address": 0x0580, "type": "uint", "size": 4},
            {"name": "aircraftName", "address": 0x3D00, "type": "string", "size": 256}
    ]
}

request3 = {
    "command": 'offsets.read',
    "name": "myOffsets",
    "interval": 100
}

if __name__ == "__main__":
    ws = websocket.WebSocketApp("ws://MYIP:PORT/fsuipc/",
                              subprotocols=["fsuipc"],
                              on_open=on_open,
                              on_message=on_message,
                              on_error=on_error,
                              on_close=on_close)

    ws.run_forever(dispatcher=rel, reconnect=5)

    ws.send(json.dumps(request))
    ws.send(json.dumps(request2))
    ws.send(json.dumps(request3))

    rel.signal(2, rel.abort)  # Keyboard Interrupt
    rel.dispatch()

 

  • Thanks 1
  • 1 year later...
Posted

Hi @Paul Henty

Something seems to have stopped working with FSUIPC WebSocket Server 1.1.2 (have latest FSUIPC 7.4.17 as well). With the Fenix I was previously reading Lvars successfully but now I get no responses after having declared the vars I want to monitor. I receive the response that the declare message was successfully received but I get nothing after that. Also tried the demo at http://fsuipcwebsockets.paulhenty.com/#cmdvarsread - but didn't work there either. Any chance you are able to have a look at that?

Regards,

Allan Jensen

Posted
50 minutes ago, Firefly said:

Something seems to have stopped working with FSUIPC WebSocket Server 1.1.2 (have latest FSUIPC 7.4.17 as well). With the Fenix I was previously reading Lvars successfully but now I get no responses after having declared the vars I want to monitor. I receive the response that the declare message was successfully received but I get nothing after that.

Can you first check that you are not getting a crash in the FSUIPC WASM module - see 

If you list the lvars in FSUIPC (Add-ons->WASM->List Lvars) can you see the lvars you created? If not, try reloading and listing again (Add-ons->WASM->Reload & List Lvars) - does that work?

This should hopefully determine if the issue is in FSUIPC or the WASM/WAPI, or an issue in Paul's WebSocketServer.

 

Posted
6 hours ago, John Dowson said:

Can you first check that you are not getting a crash in the FSUIPC WASM module

Looks like that was the issue. I got it working now a couple of times, even with Fenix at FlyTampa EKCH, so at least the issue seems to not be with the WebSocketServer. Thanks John.

Posted
1 hour ago, Firefly said:

Looks like that was the issue.

Ok - then follow the instructions in that FAQ entry, i.e. set the WASM ini parameter LvarScanDelay to 0.
Once this is set, the lvar scan will only be performed on initial aircraft load. If you create new lvars via FSUIPC with the provided lua function, or if created by writing to offsets, then FSUIPC should automatically perform a rescan/reload. However, if further lvars are created by the aircraft itself, or other add-ons, or using FSUIPC via other means (e.g. via calculator code)m then they will not be known to FSUIPC (or FSUIPC clients) until a rescan/reload is performed.

I am nit sure how you (or Paul's dll) is creating lvars, but if you don't see them (after a short delay from creation, 20ms or so) then you need to explicitly ca;; for a reload - I am sure you can perform this via Paul's dll).

John

 

Posted

Hi in how far is it working now days 24 withe connection in javascript ?

i have only this and never work befor white WebSocket
sorry about my Englice

let URI         = "ws://127.0.0.1:2048/fsuipc/";
webSocket       = new WebSocket(URI);

console.log(webSocket.send('001'));
console.log(webSocket.close(1));

webSocket.onopen = function(event) {
    //"ok " +
    console.log(event);
};

//onmessage
webSocket.onmessage = function(event) {
    //"ok " +
    console.log(event);
};

//onerror
webSocket.onerror = function(event) {
    //"error : " + 
    console.log(event);
};

//onclose
webSocket.onclose = function(event) {
    //"onclose : " + 
    var reasons = (event.reason) ? event.reason : "is closed by server!"
    console.log(event.type + " " + reasons);  
};

 

  • 1 month later...
Posted

Hi @Paul Henty

In the MobiFlight HubHop presets there are not only inputs but also outputs. Many of them are just reading lVars but some have code like this:

(A:FUELSYSTEM PUMP SWITCH:2, Bool)

I don't see in the FSUIPC WebSocket Server documentation any way to read this value out... Is there a way to do that?

 

There are also some variants of lVar reading like this:

(L:A380X_EFIS_L_ACTIVE_OVERLAY) 2 ==

...but that's maybe just that it returns a boolean if the lVar value equals 2?

Allan

Posted
54 minutes ago, Firefly said:

In the MobiFlight HubHop presets there are not only inputs but also outputs. Many of them are just reading lVars but some have code like this:

(A:FUELSYSTEM PUMP SWITCH:2, Bool)

That is just returning the value of the simvar FUELSYSTEM PUMP SWITCH at index 2. In FSUIPC, that value can be found in offset 0x0B05, but only when you have set the ini parameter NumberOfPumps to a value > 1.
In general, it will depend on the output preset definition on how you would read the value in FSUIPC (and FSUIPC clients). For simvars (or A-type variables), you can check to see if it is already in an offset and use that if so, otherwise you can add any simvar to a spare/free FSUIPC offset for both read/write. See the Advanced User guide on how to do this.

1 hour ago, Firefly said:

There are also some variants of lVar reading like this:

(L:A380X_EFIS_L_ACTIVE_OVERLAY) 2 ==

...but that's maybe just that it returns a boolean if the lVar value equals 2?

Yes, that is all that calc code does.

John

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use. Guidelines Privacy Policy We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.