samedi 16 novembre 2024

Première analyse réseau

Pour analyser le trafic entre le RaspberryPi de l'Origin et la tablette (ou le mobile) il y a deux méthodes. Comme on connaît la clé du réseau wifi utilisé, et que l'on maîtrise quand la tablette et l'Origin se connectent à ce réseau wifi, ça ouvre la porte au décryptage du trafic wifi puisque on pourra enregistrer le 4-way handshake. L'autre méthode consiste à faire jouer le rôle de point d’accès à un ordinateur sur le quel on exécutera Wireshark ou tcpdump et on connectera la tablette à ce point d’accès.

La connexion initiale de la tablette à l'Origin s’effectue en 3 étapes :
1.    Recherche de l’IP de l’Origin avec mDNS (UDP:5353) et DNS (UDP:53)
J'ai déjà fait un post expliquant comment l'Origin s'annonce sur le réseau afin d’être découvrable par la tablette
2.    Connexion à l'Origin en HTTP (TCP:80)
3.    Bascule en WebSocket (TCP:80) 

Une fois la session Web Socket active les échanges se font principalement en JSON.

Certains enregistrements json sont mono-ligne (tous les champs sur la même ligne) d’autres sont multi lignes (un champ par ligne). Dans tous les cas les champs sont par ordre alphabétique.


Voici trois exemples du type d'information échangé:

{
"CameraID": "Origin178-4fc43ba3672a7e18",
"CameraModel": "Origin178",
"Command": "GetCameraInfo",
"DefaultIso": 200,
"Destination": "OriginMobileApp",
"ErrorCode": 0,
"ErrorMessage": "",
"ExpiredAt": 0,
"FirmwareVersion": "2023_10_11",
"FpgaVersion": "(1, 24-4-24-128) (2, unknown)",
"HasCooling": true,
"HasHeating": false,
"IsColor": true,
"MaxBinning": 2,
"MaxBlueBalance": 255,
"MaxExposure": 3600.0,
"MaxGreenBalance": 255,
"MaxImageHeight": 2048,
"MaxImageWidth": 3056,
"MaxIso": 2173,
"MaxRedBalance": 255,
"MinExposure": 1e-06,
"MinIso": 23,
"PixelSize": 2.4,
"SdkVersion": "V20250929_11",
"SequenceID": 11,
"Source": "Camera",
"Type": "Response"
}

{
"BatteryCurrent": 0.0,
"BatteryLevel": "HIGH",
"BatteryTemperature": 101.0,
"BatteryVoltage": 10.457297325134277,
"BoostVoltage": 13.79226016998291,
"ChargerStatus": "CHARGING",
"Command": "GetStatus",
"Date": "15 11 2024",
"Destination": "OriginMobileApp",
"Enc0": 3.7450702829239286e-07,
"Enc1": 6.283184932672558,
"ErrorCode": 0,
"ErrorMessage": "",
"ExpiredAt": 0,
"IsAligned": false,
"IsGotoOver": true,
"IsTracking": false,
"Latitude": 0.8692544420780012,
"Longitude": 0.039016385945245734,
"NumAlignRefs": 0,
"SequenceID": 17,
"Source": "Mount",
"Time": "13:46:25",
"TimeZone": "Europe/Paris",
"Type": "Response"
}

{
"AmbientTemperature": 27.79400062561035,
"CameraTemperature": 34.3,
"Command": "GetStatus",
"CpuFanOn": true,
"CpuTemperature": 51.608001708984375,
"Destination": "All",
"DewPoint": 15.87399959564209,
"ExpiredAt": 1731612040000,

"FrontCellTemperature": 25.551000595092773,
"Humidity": 47.999998927116394,
"OtaFanOn": true,
"Recalibrating": false,
"SequenceID": 27847,
"Source": "Environment",
"Type": "Notification"

Ces enregistrements json ont des champs communs et des champs spécifiques.

Les champs communs actuellement identifiés sont:

  • Source
    Elle désigne quel module de l'Origin a émit le paquet: Camera, DewHeater, Disk, Environment, FactoryCalibrationController, Focuser, LedRing, LiveStream, Mount, Network, System, TaskController etc…

  • Destination
    semble ne prendre que deux valeurs: All ou OriginMobileApp.

  • Command
    La valeur dépend de la source. En voici quelques exemples:
    GetBrightnessLevel, GetCameraInfo, GetCaptureParameters, GetEnableManual, GetFocuserAdvancedSettings, GetForceDirectConnect, GetModel, GetMountConfig, GetPositionLimits, GetSensors, GetSerialNumber, GetStatus, GetUpdateChannel, GetVersion, HasInternetConnection, HasUpdateAvailable, NewImageReady, RunInitialize, SetRegulatoryDomain etc…

  • Type
    semble ne prendre que deux valeurs: Notification ou Response.

  •  SequenceID
    un entier

  • ExpiredAt
    Unix epoch en ms, mais les ms sont toujours à 000

Les (nombreux) champs spécifiques dépendent de la source et de la commande. Exemples:

  • SerialNumber
  • BitDepth
  • MaxImageWidth
  • HasOtaSurfaceTemperature
  • ImageLocation
  • etc… 

La prochaine étape sera de comprendre méthodiquement quelles actions au niveau de l'application mobile provoquent quels échanges avec l'Origin. Mais, à première vue, cela ressemble à la logique de BUS entre des modules déjà utilisée pour la gestion des montures Nexstar.