def changesn(ctx, new_sn, device): from py9b.command.mfg import WriteSNAuth, CalcSNAuth dev = { 'esc': BT.ESC, 'bms': BT.BMS, 'extbms': BT.EXTBMS, }[device] with ctx.obj as tran: old_sn = tran.execute(ReadRegs(dev, 0x10, "14s"))[0].decode() print("Old S/N:", old_sn) uid3 = tran.execute(ReadRegs(dev, 0xDE, "<L"))[0] print("UID3: %08X" % (uid3)) auth = CalcSnAuth(old_sn, new_sn, uid3) # auth = 0 print("Auth: %08X" % (auth)) try: tran.execute(WriteSNAuth(dev, new_sn.encode('utf-8'), auth)) print("OK") except LinkTimeoutException: print("Timeout !") # save config and restart tran.execute(WriteRegs(BT.ESC, 0x78, "<H", 0x01)) time.sleep(3) old_sn = tran.execute(ReadRegs(dev, 0x10, "14s"))[0] print("Current S/N:", old_sn)
def changesn(self, new_sn): from py9b.command.mfg import WriteSN, CalcSNAuth tran = self.conn._tran old_sn = tran.execute(ReadRegs(BT.ESC, 0x10, "14s"))[0].decode() tprint("Old S/N:", old_sn) uid3 = tran.execute(ReadRegs(BT.ESC, 0xDE, "<L"))[0] tprint("UID3: %08X" % (uid3)) auth = CalcSnAuth(old_sn, new_sn, uid3) # auth = 0 tprint("Auth: %08X" % (auth)) try: tran.execute(WriteSN(BT.ESC, new_sn.encode('utf-8'), auth)) tprint("OK") except LinkTimeoutException: tprint("Timeout !") # save config and restart tran.execute(WriteRegs(BT.ESC, 0x78, "<H", 0x01)) time.sleep(3) old_sn = tran.execute(ReadRegs(BT.ESC, 0x10, "14s"))[0] tprint("Current S/N:", old_sn)
def UpdateFirmware(self, tran, dev, fwfile): tprint('update started') tprint('flashing ' + self.fwfilep + ' to ' + self.device) fwfile.seek(0, os.SEEK_END) fw_size = fwfile.tell() fwfile.seek(0) fw_page_size = 0x80 dev = self.devices.get(self.device) for retry in range(self.PING_RETRIES): tprint('Pinging...') try: if dev == BT.BLE: tran.execute(ReadRegs(dev, 0, "13s")) else: tran.execute(ReadRegs(dev, 0x10, "14s")) except LinkTimeoutException: continue break else: tprint("Timed out!") return False tprint("OK") if self.lock: tprint('Locking...') tran.execute(WriteRegs(BT.ESC, 0x70, '<H', 0x0001)) else: tprint('Not Locking...') tprint('Starting...') tran.execute(StartUpdate(dev, fw_size)) tprint('Writing...') page = 0 chk = 0 while fw_size: self.update_progress(page, fw_size // fw_page_size + 1) chunk_sz = min(fw_size, fw_page_size) data = fwfile.read(chunk_sz) chk = self.checksum(chk, data) tran.execute( WriteUpdate(dev, page, data + b'\x00' * (fw_page_size - chunk_sz))) page += 1 fw_size -= chunk_sz tprint('Finalizing...') tran.execute(FinishUpdate(dev, chk ^ 0xFFFFFFFF)) tprint('Reboot') tran.execute(RebootUpdate(dev)) tprint('Done') tprint('update finished') return True
def UpdateFirmware(link, tran, dev, fwfile): fwfile.seek(0, os.SEEK_END) fw_size = fwfile.tell() fwfile.seek(0) fw_page_size = 0x80 print("Pinging...", end="") for retry in range(PING_RETRIES): print(".", end="") try: if dev == BT.BLE: tran.execute(ReadRegs(dev, 0, "13s")) else: tran.execute(ReadRegs(dev, 0x10, "14s")) except LinkTimeoutException: continue break else: print("Timed out !") return False print("OK") if args.interface != "blefleet": print("Locking...") tran.execute(WriteRegs(BT.ESC, 0x70, "<H", 0x0001)) else: print("Not Locking...") print("Starting...") tran.execute(StartUpdate(dev, fw_size)) print("Writing...") pb = ProgressBar(maxval=fw_size // fw_page_size + 1).start() page = 0 chk = 0 while fw_size: pb.update(page) chunk_sz = min(fw_size, fw_page_size) data = fwfile.read(chunk_sz) chk = checksum(chk, data) # tran.execute(WriteUpdate(dev, page, data)) tran.execute( WriteUpdate(dev, page, data + b"\x00" * (fw_page_size - chunk_sz)) ) # TODO: Ninebot wants this padding. Will it work on M365 too? page += 1 fw_size -= chunk_sz pb.finish() print("Finalizing...") tran.execute(FinishUpdate(dev, chk ^ 0xFFFFFFFF)) print("Reboot") tran.execute(RebootUpdate(dev)) print("Done") return True
def UpdateFirmware(self, link, tran, dev, fwfile): print('flashing ' + fwfilep + ' to ' + self.device) fwfile.seek(0, os.SEEK_END) fw_size = fwfile.tell() fwfile.seek(0) fw_page_size = 0x80 dev = self.devices.get(self.device) print('Pinging...') for retry in range(PING_RETRIES): print('.') try: if dev == BT.BLE: tran.execute(ReadRegs(dev, 0, '13s')) else: tran.execute(ReadRegs(dev, 0x10, '14s')) except LinkTimeoutException: continue break else: print('Timed out !') return False print('OK') if self.interface != 'tcpnl': print('Locking...') tran.execute(WriteRegs(BT.ESC, 0x70, '<H', 0x0001)) else: print('Not Locking...') print('Starting...') tran.execute(StartUpdate(dev, fw_size)) print('Writing...') page = 0 chk = 0 while fw_size: chunk_sz = min(fw_size, fw_page_size) data = fwfile.read(chunk_sz) chk = checksum(chk, data) #tran.execute(WriteUpdate(dev, page, data)) tran.execute( WriteUpdate(dev, page, data + b'\x00' * (fw_page_size - chunk_sz))) page += 1 fw_size -= chunk_sz print('Finalizing...') tran.execute(FinishUpdate(dev, chk ^ 0xFFFFFFFF)) print('Reboot') tran.execute(RebootUpdate(dev)) print('Done') return True
def UpdateFirmware(link, tran, dev, fwfile): fwfile.seek(0, os.SEEK_END) fw_size = fwfile.tell() fwfile.seek(0) fw_page_size = 0x80 print('Pinging...', end='') for retry in range(PING_RETRIES): print('.', end='') try: if dev == BT.BLE: tran.execute(ReadRegs(dev, 0, '13s')) else: tran.execute(ReadRegs(dev, 0x10, '14s')) except LinkTimeoutException: continue break else: print('Timed out !') return False print('OK') print('Locking...') tran.execute(WriteRegs(BT.ESC, 0x70, '<H', 0x0001)) print('Starting...') tran.execute(StartUpdate(dev, fw_size)) print('Writing...') pb = ProgressBar(maxval=fw_size // fw_page_size + 1).start() page = 0 chk = 0 while fw_size: pb.update(page) chunk_sz = min(fw_size, fw_page_size) data = fwfile.read(chunk_sz) chk = checksum(chk, data) #tran.execute(WriteUpdate(dev, page, data)) tran.execute( WriteUpdate(dev, page, data + b'\x00' * (fw_page_size - chunk_sz)) ) # TODO: Ninebot wants this padding. Will it work on M365 too? page += 1 fw_size -= chunk_sz pb.finish() print('Finalizing...') tran.execute(FinishUpdate(dev, chk ^ 0xFFFFFFFF)) print('Reboot') tran.execute(RebootUpdate(dev)) print('Done') return True
exit("Timed out !") print("") #lock #tran.execute(WriteRegs(BT.ESC, 0x70, "<H", 0x01)) old_sn = tran.execute(ReadRegs(BT.ESC, 0x10, "14s"))[0] print("Old S/N:", old_sn) uid3 = tran.execute(ReadRegs(BT.ESC, 0xDE, "<L"))[0] print("UID3: %08X" % (uid3)) auth = CalcSnAuth(old_sn, new_sn, uid3) #auth = 0 print("Auth: %08X" % (auth)) try: tran.execute(WriteSN(BT.ESC, new_sn, auth)) print("OK") except LinkTimeoutException: print("Timeout !") # save config and restart tran.execute(WriteRegs(BT.ESC, 0x78, "<H", 0x01)) sleep(3) old_sn = tran.execute(ReadRegs(BT.ESC, 0x10, "14s"))[0] print("Current S/N:", old_sn) link.close()
# 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 # link = SerialLink(dump=True) link = TCPLink() # link = BLELink() with link: print("Scanning...") ports = link.scan() print(ports) # tran = XiaomiTransport(link) tran = NinebotTransport(link) link.open(("127.0.0.20:6000")) # link.open(ports[0][1]) print("Connected") print("Locking...") tran.execute(WriteRegs(BT.ESC, 0x70, "<H", 0x0001)) link.close()
def reboot(self): tran = self.conn._tran tran.execute(WriteRegs(BT.ESC, 0x78, "<H", 0x0001)) tprint('Done')
def unlock(self): tran = self.conn._tran tran.execute(WriteRegs(BT.ESC, 0x71, "<H", 0x0001)) tprint('Done')
def powerdown(self): tran = self.conn._tran tran.execute(WriteRegs(BT.ESC, 0x79, "<H", 0x0001)) tprint('Done')
def reboot(ctx): with ctx.obj as tran: tran.execute(WriteRegs(BT.ESC, 0x78, "<H", 0x0001)) print('Done')
def unlock(ctx): with ctx.obj as tran: tran.execute(WriteRegs(BT.ESC, 0x71, "<H", 0x0001)) print('Done')
def reboot(self): with self.c as tran: tran.execute(WriteRegs(BT.ESC, 0x78, "<H", 0x0001)) tprint('Done')
def unlock(self): with self.c as tran: tran.execute(WriteRegs(BT.ESC, 0x71, "<H", 0x0001)) tprint('Done')
def powerdown(self): with self.c as tran: tran.execute(WriteRegs(BT.ESC, 0x79, "<H", 0x0001)) tprint('Done')
def powerdown(ctx): with ctx.obj as tran: tran.execute(WriteRegs(BT.ESC, 0x79, "<H", 0x0001)) print('Done')
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 #link = SerialLink(dump=True) #link = TCPLink() link = BLELink() 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('Power off...') tran.execute(WriteRegs(BT.ESC, 0x79, '<H', 0x0001)) link.close()