From 7229f5781e4af14d6c939440f151821b2e4b7ef7 Mon Sep 17 00:00:00 2001 From: DavidVentura Date: Wed, 31 Jan 2024 10:58:44 +0100 Subject: [PATCH] add WifiSettingsSet --- datatypes.ts | 1 + impl.ts | 27 ++++++++++++++++++++++++++- scripts/dec.py | 17 ++++++++++------- tests/fn.test.js | 11 ++++++++++- 4 files changed, 47 insertions(+), 9 deletions(-) diff --git a/datatypes.ts b/datatypes.ts index 04d93be..10f5b24 100644 --- a/datatypes.ts +++ b/datatypes.ts @@ -40,6 +40,7 @@ export const ControlCommands = { // CloseSessionAck: 0x3111, DevStatus: 0x0810, // CMD_SYSTEM_STATUS_GET DevStatusAck: 0x0811, + WifiSettingsSet: 0x0160, // CMD_NET_WIFISETTING_SET WifiSettings: 0x0260, // CMD_NET_WIFISETTING_GET WifiSettingsAck: 0x0261, ListWifi: 0x0360, // CMD_NET_WIFI_SCAN diff --git a/impl.ts b/impl.ts index 4aaee08..81b6d2a 100644 --- a/impl.ts +++ b/impl.ts @@ -114,11 +114,36 @@ export const SendVideoResolution = (session: Session, resol: 1 | 2 | 3 | 4): nul }; export const SendReboot = (session: Session): DataView => { - //const dv = new DataView(new Uint8Array(8).fill(0).buffer); let dv = null; return makeDataReadWrite(session, ControlCommands.Reboot, dv); }; +export const SendWifiDetails = (session: Session, ssid: string, password: string, dhcp: boolean): DataView => { + if (!dhcp) { + throw new Error("only DHCP is supported"); + } + let buf = new Uint8Array(0x108).fill(0); + let cmd_payload = new DataView(buf.buffer); + let mask_reversed = "0.255.255.255"; + // unclear which is which )) + let m_ip = "0.0.0.0"; + let m_gw = "0.0.0.0"; + let m_dns1 = "0.0.0.0"; + let m_dns2 = "0.0.0.0"; + + cmd_payload.add(0x14).writeU8(1); // DHCP ? + cmd_payload.add(0x18).writeByteArray(str2byte(ssid)); + cmd_payload.add(0x38).writeByteArray(str2byte(password)); + cmd_payload.add(0xb8).writeByteArray(str2byte(mask_reversed)); + cmd_payload.add(0xc8).writeByteArray(str2byte(m_ip)); + cmd_payload.add(0xd8).writeByteArray(str2byte(m_gw)); + cmd_payload.add(0xe8).writeByteArray(str2byte(m_dns1)); + cmd_payload.add(0xf8).writeByteArray(str2byte(m_dns2)); + + const ret = makeDataReadWrite(session, ControlCommands.WifiSettingsSet, cmd_payload); + return ret; +}; + export const SendUsrChk = (session: Session, username: string, password: string): DataView => { let buf = new Uint8Array(0x20 + 0x80); buf.fill(0); diff --git a/scripts/dec.py b/scripts/dec.py index bd4055d..b178d49 100644 --- a/scripts/dec.py +++ b/scripts/dec.py @@ -19,16 +19,14 @@ data = [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x31, 0x2f, 0x31, 0x2f, 0x31, 0x2f, 0x31, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ] -payload = data[0x14:] - def dec(d): ret = [] - for b in d: + for b in d[0x14:]: if b % 2: ret.append(b - 1) else: ret.append(b + 1) - ret = ret[4:] + ret[:4] + ret = d[:0x14] + ret[-4:] + ret[:-4] return ret def hexdump(dump): @@ -52,11 +50,16 @@ def hexdump(dump): print(" ", end="") for b in line: rep = "." - if chr(b) in string.printable: + if chr(b) in string.digits or chr(b) in string.ascii_letters: rep = chr(b) print(rep, end="") print("") -_dec = dec(payload) -hexdump(_dec) +_dec = dec(data) +hexdump(_dec[0x14:]) +#print([hex(n) for n in _dec]) +print("for test values, DEC") +print("".join([f"{n:02x}" for n in _dec])) +print("for test values, enc") +print("".join([f"{n:02x}" for n in data])) diff --git a/tests/fn.test.js b/tests/fn.test.js index d20b6bf..78f4c65 100644 --- a/tests/fn.test.js +++ b/tests/fn.test.js @@ -5,7 +5,7 @@ import assert from "assert"; import { XqBytesDec, XqBytesEnc } from "../func_replacements.js"; import { createResponseForControlCommand } from "../handlers.js"; import { hexdump } from "../hexdump.js"; -import { SendDevStatus, SendUsrChk } from "../impl.ts"; +import { SendDevStatus, SendUsrChk, SendWifiDetails } from "../impl.ts"; import { placeholderTypes, sprintf } from "../utils.js"; describe("debug_tools", () => { @@ -151,4 +151,13 @@ describe("make packet", () => { const got = SendDevStatus(sess); assert.deepEqual(got.buffer, expected); }); + it("builds a good WifiSettingsSet", () => { + const sess = { outgoingCommandId: 2, ticket: [1, 2, 3, 4] }; + const _expected_str = + "f1d00118d1000002110a01600c010000010203040101010101010101010101010101010100010101726a786f647501010101010101010101010101010101010101010101010101017274716473627360710101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101312f3334342f3334342f333434010101312f312f312f31010101010101010101312f312f312f31010101010101010101312f312f312f31010101010101010101312f312f312f3101010101010101010101010101"; + const expected = hstrToBA(_expected_str); + + const got = SendWifiDetails(sess, "skynet", "supercrap", true); + assert.deepEqual(got.buffer, expected); + }); });