From ecf20d57ae529fd7055d8e2fea6e11e7b1bb0a2c Mon Sep 17 00:00:00 2001 From: Slinger360 Date: Fri, 30 Aug 2019 18:12:36 -0500 Subject: [PATCH] added changesn back --- .gitignore | 2 ++ py9b/command/mfg.py | 24 +++++++++++++ wr_esc_sn.py | 88 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 py9b/command/mfg.py create mode 100644 wr_esc_sn.py diff --git a/.gitignore b/.gitignore index dbe3bf0..d44c10e 100644 --- a/.gitignore +++ b/.gitignore @@ -105,3 +105,5 @@ venv.bak/ # mypy .mypy_cache/ + +ffwupd.py diff --git a/py9b/command/mfg.py b/py9b/command/mfg.py new file mode 100644 index 0000000..556e602 --- /dev/null +++ b/py9b/command/mfg.py @@ -0,0 +1,24 @@ +"""Manufacturer commands""" + +from struct import pack, unpack +from .base import BaseCommand, InvalidResponse + + +class AuthError(Exception): + pass + + +class WriteSN(BaseCommand): + def __init__(self, dev, sn, auth): + super(WriteSN, self).__init__(dst=dev, cmd=0x18, arg=0x10, data=pack("<14sL", sn, auth), has_response=True) + self.dev = dev + + def handle_response(self, response): + if len(response.data)!=0: + raise InvalidResponse("WriteSN {0:X}".format(self.dev)) + if response.arg!=1: + raise AuthError("WriteSN {0:X}".format(self.dev)) + return True + + +__all__=["AuthError", "WriteSN"] diff --git a/wr_esc_sn.py b/wr_esc_sn.py new file mode 100644 index 0000000..2979a1f --- /dev/null +++ b/wr_esc_sn.py @@ -0,0 +1,88 @@ +#!python2-32 +from __future__ import print_function +from sys import exit +from py9b.link.base import LinkOpenException, LinkTimeoutException +from py9b.link.tcp import TCPLink +from py9b.link.ble import BLELink +from py9b.link.serial import SerialLink +from py9b.transport.base import BaseTransport as BT +from py9b.transport.packet import BasePacket as PKT +from py9b.transport.xiaomi import XiaomiTransport +from py9b.transport.ninebot import NinebotTransport +from py9b.command.regio import ReadRegs, WriteRegs +from py9b.command.mfg import WriteSN +from time import sleep + + +#new_sn = "16133/00101234" +#new_sn = "N2GTR1826C1234" + +def CalcSnAuth(oldsn, newsn, uid3): + s = 0 + for i in xrange(0x0E): + s += ord(oldsn[i]) + s *= ord(newsn[i]) + s += uid3+(uid3<<4) + s &= 0xFFFFFFFF + if (s & 0x80000000)!=0: + s = 0x100000000-s + + return s % 1000000 + + +#link = SerialLink(dump=True) +#link = TCPLink() +link = BLELink(dump=True) + +with link: + print("Scanning...") + ports = link.scan() + print(ports) + + #tran = XiaomiTransport(link) + tran = NinebotTransport(link) + + #link.open(("192.168.1.45", 6000)) + link.open(ports[0][1]) + print("Connected") + + print("Pinging...") + for retry in xrange(20): + print(".", end="") + try: + old_sn = tran.execute(ReadRegs(BT.ESC, 0x10, "14s"))[0] + except LinkTimeoutException: + continue + break + else: + exit("Timed out !") + print("") + + + #lock + #tran.execute(WriteRegs(BT.ESC, 0x70, "