1*cfb92d14SAndroid Build Coastguard Worker#!/usr/bin/env python 2*cfb92d14SAndroid Build Coastguard Worker# 3*cfb92d14SAndroid Build Coastguard Worker# Copyright (c) 2018, The OpenThread Authors. 4*cfb92d14SAndroid Build Coastguard Worker# All rights reserved. 5*cfb92d14SAndroid Build Coastguard Worker# 6*cfb92d14SAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 7*cfb92d14SAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are met: 8*cfb92d14SAndroid Build Coastguard Worker# 1. Redistributions of source code must retain the above copyright 9*cfb92d14SAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer. 10*cfb92d14SAndroid Build Coastguard Worker# 2. Redistributions in binary form must reproduce the above copyright 11*cfb92d14SAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer in the 12*cfb92d14SAndroid Build Coastguard Worker# documentation and/or other materials provided with the distribution. 13*cfb92d14SAndroid Build Coastguard Worker# 3. Neither the name of the copyright holder nor the 14*cfb92d14SAndroid Build Coastguard Worker# names of its contributors may be used to endorse or promote products 15*cfb92d14SAndroid Build Coastguard Worker# derived from this software without specific prior written permission. 16*cfb92d14SAndroid Build Coastguard Worker# 17*cfb92d14SAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18*cfb92d14SAndroid Build Coastguard Worker# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*cfb92d14SAndroid Build Coastguard Worker# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*cfb92d14SAndroid Build Coastguard Worker# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21*cfb92d14SAndroid Build Coastguard Worker# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22*cfb92d14SAndroid Build Coastguard Worker# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*cfb92d14SAndroid Build Coastguard Worker# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*cfb92d14SAndroid Build Coastguard Worker# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25*cfb92d14SAndroid Build Coastguard Worker# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26*cfb92d14SAndroid Build Coastguard Worker# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27*cfb92d14SAndroid Build Coastguard Worker# POSSIBILITY OF SUCH DAMAGE. 28*cfb92d14SAndroid Build Coastguard Worker""" 29*cfb92d14SAndroid Build Coastguard Worker>> Thread Host Controller Interface 30*cfb92d14SAndroid Build Coastguard Worker>> Device : OpenThread_WpanCtl THCI 31*cfb92d14SAndroid Build Coastguard Worker>> Class : OpenThread_WpanCtl 32*cfb92d14SAndroid Build Coastguard Worker""" 33*cfb92d14SAndroid Build Coastguard Worker 34*cfb92d14SAndroid Build Coastguard Workerimport re 35*cfb92d14SAndroid Build Coastguard Workerimport time 36*cfb92d14SAndroid Build Coastguard Workerimport socket 37*cfb92d14SAndroid Build Coastguard Workerimport logging 38*cfb92d14SAndroid Build Coastguard Workerfrom Queue import Queue 39*cfb92d14SAndroid Build Coastguard Worker 40*cfb92d14SAndroid Build Coastguard Workerimport serial 41*cfb92d14SAndroid Build Coastguard Workerfrom IThci import IThci 42*cfb92d14SAndroid Build Coastguard Workerfrom GRLLibs.UtilityModules.Test import Thread_Device_Role, Device_Data_Requirement, MacType 43*cfb92d14SAndroid Build Coastguard Workerfrom GRLLibs.UtilityModules.enums import PlatformDiagnosticPacket_Direction, PlatformDiagnosticPacket_Type 44*cfb92d14SAndroid Build Coastguard Workerfrom GRLLibs.UtilityModules.ModuleHelper import ModuleHelper 45*cfb92d14SAndroid Build Coastguard Workerfrom GRLLibs.ThreadPacket.PlatformPackets import PlatformDiagnosticPacket, PlatformPackets 46*cfb92d14SAndroid Build Coastguard Workerfrom GRLLibs.UtilityModules.Plugins.AES_CMAC import Thread_PBKDF2 47*cfb92d14SAndroid Build Coastguard Worker"""regex: used to split lines""" 48*cfb92d14SAndroid Build Coastguard WorkerLINESEPX = re.compile(r'\r\n|\n') 49*cfb92d14SAndroid Build Coastguard Worker 50*cfb92d14SAndroid Build Coastguard Worker 51*cfb92d14SAndroid Build Coastguard Workerclass OpenThread_WpanCtl(IThci): 52*cfb92d14SAndroid Build Coastguard Worker LOWEST_POSSIBLE_PARTATION_ID = 0x1 53*cfb92d14SAndroid Build Coastguard Worker LINK_QUALITY_CHANGE_TIME = 100 54*cfb92d14SAndroid Build Coastguard Worker 55*cfb92d14SAndroid Build Coastguard Worker # Used for reference firmware version control for Test Harness. 56*cfb92d14SAndroid Build Coastguard Worker # This variable will be updated to match the OpenThread reference firmware 57*cfb92d14SAndroid Build Coastguard Worker # officially released. 58*cfb92d14SAndroid Build Coastguard Worker firmwarePrefix = 'OPENTHREAD/' 59*cfb92d14SAndroid Build Coastguard Worker 60*cfb92d14SAndroid Build Coastguard Worker def __init__(self, **kwargs): 61*cfb92d14SAndroid Build Coastguard Worker """initialize the serial port and default network parameters 62*cfb92d14SAndroid Build Coastguard Worker Args: 63*cfb92d14SAndroid Build Coastguard Worker **kwargs: Arbitrary keyword arguments 64*cfb92d14SAndroid Build Coastguard Worker Includes 'EUI' and 'SerialPort' 65*cfb92d14SAndroid Build Coastguard Worker """ 66*cfb92d14SAndroid Build Coastguard Worker try: 67*cfb92d14SAndroid Build Coastguard Worker self.UIStatusMsg = '' 68*cfb92d14SAndroid Build Coastguard Worker self.mac = kwargs.get('EUI') 69*cfb92d14SAndroid Build Coastguard Worker self.handle = None 70*cfb92d14SAndroid Build Coastguard Worker self.AutoDUTEnable = False 71*cfb92d14SAndroid Build Coastguard Worker self._is_net = False # whether device is through ser2net 72*cfb92d14SAndroid Build Coastguard Worker self.logStatus = {'stop': 'stop', 'running': 'running', 'pauseReq': 'pauseReq', 'paused': 'paused'} 73*cfb92d14SAndroid Build Coastguard Worker self.logThreadStatus = self.logStatus['stop'] 74*cfb92d14SAndroid Build Coastguard Worker # connection type 'ip' stands for SSH 75*cfb92d14SAndroid Build Coastguard Worker self.connectType = (kwargs.get('Param5')).strip().lower() if kwargs.get('Param5') is not None else 'usb' 76*cfb92d14SAndroid Build Coastguard Worker # comma separated CLI prompt, wpanctl cmd prefix, Wpan interface 77*cfb92d14SAndroid Build Coastguard Worker (self.prompt, self.wpan_cmd_prefix, 78*cfb92d14SAndroid Build Coastguard Worker self.wpan_interface) = (kwargs.get('Param8').strip().split(',') 79*cfb92d14SAndroid Build Coastguard Worker if kwargs.get('Param8') else ['#', 'wpanctl', 'wpan0']) 80*cfb92d14SAndroid Build Coastguard Worker self.wpan_cmd_prefix += ' ' 81*cfb92d14SAndroid Build Coastguard Worker # comma separated setting commands 82*cfb92d14SAndroid Build Coastguard Worker self.precmd = (kwargs.get('Param9')).strip().split(',') if kwargs.get('Param9') else [] 83*cfb92d14SAndroid Build Coastguard Worker if self.connectType == 'ip': 84*cfb92d14SAndroid Build Coastguard Worker self.dutIpv4 = kwargs.get('TelnetIP') 85*cfb92d14SAndroid Build Coastguard Worker self.dutPort = kwargs.get('TelnetPort') 86*cfb92d14SAndroid Build Coastguard Worker self.port = self.dutIpv4 + ':' + self.dutPort 87*cfb92d14SAndroid Build Coastguard Worker # username for SSH 88*cfb92d14SAndroid Build Coastguard Worker self.username = kwargs.get('Param6').strip() if kwargs.get('Param6') else None 89*cfb92d14SAndroid Build Coastguard Worker # password for SSH 90*cfb92d14SAndroid Build Coastguard Worker self.password = kwargs.get('Param7').strip() if kwargs.get('Param7') else None 91*cfb92d14SAndroid Build Coastguard Worker else: 92*cfb92d14SAndroid Build Coastguard Worker self.port = kwargs.get('SerialPort') 93*cfb92d14SAndroid Build Coastguard Worker self.intialize() 94*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 95*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('initialize() Error: ' + str(e)) 96*cfb92d14SAndroid Build Coastguard Worker 97*cfb92d14SAndroid Build Coastguard Worker def __del__(self): 98*cfb92d14SAndroid Build Coastguard Worker """close the serial port connection""" 99*cfb92d14SAndroid Build Coastguard Worker try: 100*cfb92d14SAndroid Build Coastguard Worker self.closeConnection() 101*cfb92d14SAndroid Build Coastguard Worker self.deviceConnected = False 102*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 103*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('delete() Error: ' + str(e)) 104*cfb92d14SAndroid Build Coastguard Worker 105*cfb92d14SAndroid Build Coastguard Worker def _expect(self, expected, times=50): 106*cfb92d14SAndroid Build Coastguard Worker """Find the `expected` line within `times` trials. 107*cfb92d14SAndroid Build Coastguard Worker 108*cfb92d14SAndroid Build Coastguard Worker Args: 109*cfb92d14SAndroid Build Coastguard Worker expected str: the expected string 110*cfb92d14SAndroid Build Coastguard Worker times int: number of trials 111*cfb92d14SAndroid Build Coastguard Worker """ 112*cfb92d14SAndroid Build Coastguard Worker print('[%s] Expecting [%s]' % (self.port, expected)) 113*cfb92d14SAndroid Build Coastguard Worker 114*cfb92d14SAndroid Build Coastguard Worker retry_times = 10 115*cfb92d14SAndroid Build Coastguard Worker while times > 0 and retry_times > 0: 116*cfb92d14SAndroid Build Coastguard Worker line = self._readline() 117*cfb92d14SAndroid Build Coastguard Worker print('[%s] Got line [%s]' % (self.port, line)) 118*cfb92d14SAndroid Build Coastguard Worker 119*cfb92d14SAndroid Build Coastguard Worker if line == expected: 120*cfb92d14SAndroid Build Coastguard Worker print('[%s] Expected [%s]' % (self.port, expected)) 121*cfb92d14SAndroid Build Coastguard Worker return 122*cfb92d14SAndroid Build Coastguard Worker 123*cfb92d14SAndroid Build Coastguard Worker if not line: 124*cfb92d14SAndroid Build Coastguard Worker retry_times -= 1 125*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.1) 126*cfb92d14SAndroid Build Coastguard Worker 127*cfb92d14SAndroid Build Coastguard Worker times -= 1 128*cfb92d14SAndroid Build Coastguard Worker 129*cfb92d14SAndroid Build Coastguard Worker raise Exception('failed to find expected string[%s]' % expected) 130*cfb92d14SAndroid Build Coastguard Worker 131*cfb92d14SAndroid Build Coastguard Worker def _read(self, size=512): 132*cfb92d14SAndroid Build Coastguard Worker logging.info('%s: reading', self.port) 133*cfb92d14SAndroid Build Coastguard Worker if self._is_net: 134*cfb92d14SAndroid Build Coastguard Worker return self.handle.recv(size) 135*cfb92d14SAndroid Build Coastguard Worker else: 136*cfb92d14SAndroid Build Coastguard Worker return self.handle.read(size) 137*cfb92d14SAndroid Build Coastguard Worker 138*cfb92d14SAndroid Build Coastguard Worker def _write(self, data): 139*cfb92d14SAndroid Build Coastguard Worker logging.info('%s: writing', self.port) 140*cfb92d14SAndroid Build Coastguard Worker if self._is_net: 141*cfb92d14SAndroid Build Coastguard Worker self.handle.sendall(data) 142*cfb92d14SAndroid Build Coastguard Worker else: 143*cfb92d14SAndroid Build Coastguard Worker self.handle.write(data) 144*cfb92d14SAndroid Build Coastguard Worker 145*cfb92d14SAndroid Build Coastguard Worker def _readline(self): 146*cfb92d14SAndroid Build Coastguard Worker """Read exactly one line from the device 147*cfb92d14SAndroid Build Coastguard Worker 148*cfb92d14SAndroid Build Coastguard Worker Returns: 149*cfb92d14SAndroid Build Coastguard Worker None on no data 150*cfb92d14SAndroid Build Coastguard Worker """ 151*cfb92d14SAndroid Build Coastguard Worker logging.info('%s: reading line', self.port) 152*cfb92d14SAndroid Build Coastguard Worker if len(self._lines) > 1: 153*cfb92d14SAndroid Build Coastguard Worker return self._lines.pop(0) 154*cfb92d14SAndroid Build Coastguard Worker 155*cfb92d14SAndroid Build Coastguard Worker tail = '' 156*cfb92d14SAndroid Build Coastguard Worker if len(self._lines): 157*cfb92d14SAndroid Build Coastguard Worker tail = self._lines.pop() 158*cfb92d14SAndroid Build Coastguard Worker 159*cfb92d14SAndroid Build Coastguard Worker try: 160*cfb92d14SAndroid Build Coastguard Worker tail += self._read() 161*cfb92d14SAndroid Build Coastguard Worker except socket.error: 162*cfb92d14SAndroid Build Coastguard Worker logging.exception('%s: No new data', self.port) 163*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.1) 164*cfb92d14SAndroid Build Coastguard Worker 165*cfb92d14SAndroid Build Coastguard Worker self._lines += LINESEPX.split(tail) 166*cfb92d14SAndroid Build Coastguard Worker if len(self._lines) > 1: 167*cfb92d14SAndroid Build Coastguard Worker return self._lines.pop(0) 168*cfb92d14SAndroid Build Coastguard Worker 169*cfb92d14SAndroid Build Coastguard Worker def _sendline(self, line): 170*cfb92d14SAndroid Build Coastguard Worker """Send exactly one line to the device 171*cfb92d14SAndroid Build Coastguard Worker 172*cfb92d14SAndroid Build Coastguard Worker Args: 173*cfb92d14SAndroid Build Coastguard Worker line str: data send to device 174*cfb92d14SAndroid Build Coastguard Worker """ 175*cfb92d14SAndroid Build Coastguard Worker logging.info('%s: sending line', self.port) 176*cfb92d14SAndroid Build Coastguard Worker # clear buffer 177*cfb92d14SAndroid Build Coastguard Worker self._lines = [] 178*cfb92d14SAndroid Build Coastguard Worker try: 179*cfb92d14SAndroid Build Coastguard Worker self._read() 180*cfb92d14SAndroid Build Coastguard Worker except socket.error: 181*cfb92d14SAndroid Build Coastguard Worker logging.debug('%s: Nothing cleared', self.port) 182*cfb92d14SAndroid Build Coastguard Worker 183*cfb92d14SAndroid Build Coastguard Worker print('sending [%s]' % line) 184*cfb92d14SAndroid Build Coastguard Worker self._write(line + '\r\n') 185*cfb92d14SAndroid Build Coastguard Worker self._lines = [] 186*cfb92d14SAndroid Build Coastguard Worker # wait for write to complete 187*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.1) 188*cfb92d14SAndroid Build Coastguard Worker 189*cfb92d14SAndroid Build Coastguard Worker def __sendCommand(self, cmd): 190*cfb92d14SAndroid Build Coastguard Worker """send specific command to reference unit over serial port 191*cfb92d14SAndroid Build Coastguard Worker 192*cfb92d14SAndroid Build Coastguard Worker Args: 193*cfb92d14SAndroid Build Coastguard Worker cmd: OpenThread_WpanCtl command string 194*cfb92d14SAndroid Build Coastguard Worker 195*cfb92d14SAndroid Build Coastguard Worker Returns: 196*cfb92d14SAndroid Build Coastguard Worker Fail: Failed to send the command to reference unit and parse it 197*cfb92d14SAndroid Build Coastguard Worker Value: successfully retrieve the desired value from reference unit 198*cfb92d14SAndroid Build Coastguard Worker Error: some errors occur, indicates by the followed specific error number 199*cfb92d14SAndroid Build Coastguard Worker """ 200*cfb92d14SAndroid Build Coastguard Worker logging.info('%s: sendCommand[%s]', self.port, cmd) 201*cfb92d14SAndroid Build Coastguard Worker if self.logThreadStatus == self.logStatus['running']: 202*cfb92d14SAndroid Build Coastguard Worker self.logThreadStatus = self.logStatus['pauseReq'] 203*cfb92d14SAndroid Build Coastguard Worker while self.logThreadStatus not in (self.logStatus['paused'], self.logStatus['stop']): 204*cfb92d14SAndroid Build Coastguard Worker pass 205*cfb92d14SAndroid Build Coastguard Worker 206*cfb92d14SAndroid Build Coastguard Worker ssh_stdin = None 207*cfb92d14SAndroid Build Coastguard Worker ssh_stdout = None 208*cfb92d14SAndroid Build Coastguard Worker ssh_stderr = None 209*cfb92d14SAndroid Build Coastguard Worker try: 210*cfb92d14SAndroid Build Coastguard Worker # command retransmit times 211*cfb92d14SAndroid Build Coastguard Worker retry_times = 3 212*cfb92d14SAndroid Build Coastguard Worker while retry_times > 0: 213*cfb92d14SAndroid Build Coastguard Worker retry_times -= 1 214*cfb92d14SAndroid Build Coastguard Worker try: 215*cfb92d14SAndroid Build Coastguard Worker if self._is_net: 216*cfb92d14SAndroid Build Coastguard Worker ssh_stdin, ssh_stdout, ssh_stderr = self.handle.exec_command(cmd) 217*cfb92d14SAndroid Build Coastguard Worker else: 218*cfb92d14SAndroid Build Coastguard Worker self._sendline(cmd) 219*cfb92d14SAndroid Build Coastguard Worker self._expect(cmd) 220*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 221*cfb92d14SAndroid Build Coastguard Worker logging.exception('%s: failed to send command[%s]: %s', self.port, cmd, str(e)) 222*cfb92d14SAndroid Build Coastguard Worker if retry_times == 0: 223*cfb92d14SAndroid Build Coastguard Worker raise 224*cfb92d14SAndroid Build Coastguard Worker else: 225*cfb92d14SAndroid Build Coastguard Worker break 226*cfb92d14SAndroid Build Coastguard Worker 227*cfb92d14SAndroid Build Coastguard Worker line = None 228*cfb92d14SAndroid Build Coastguard Worker response = [] 229*cfb92d14SAndroid Build Coastguard Worker retry_times = 20 230*cfb92d14SAndroid Build Coastguard Worker stdout_lines = [] 231*cfb92d14SAndroid Build Coastguard Worker stderr_lines = [] 232*cfb92d14SAndroid Build Coastguard Worker if self._is_net: 233*cfb92d14SAndroid Build Coastguard Worker stdout_lines = ssh_stdout.readlines() 234*cfb92d14SAndroid Build Coastguard Worker stderr_lines = ssh_stderr.readlines() 235*cfb92d14SAndroid Build Coastguard Worker if stderr_lines: 236*cfb92d14SAndroid Build Coastguard Worker for stderr_line in stderr_lines: 237*cfb92d14SAndroid Build Coastguard Worker if re.search(r'Not\s+Found|failed\s+with\s+error', stderr_line.strip(), re.M | re.I): 238*cfb92d14SAndroid Build Coastguard Worker print('Command failed: %s' % stderr_line) 239*cfb92d14SAndroid Build Coastguard Worker return 'Fail' 240*cfb92d14SAndroid Build Coastguard Worker print('Got line: %s' % stderr_line) 241*cfb92d14SAndroid Build Coastguard Worker logging.info('%s: the read line is[%s]', self.port, stderr_line) 242*cfb92d14SAndroid Build Coastguard Worker response.append(str(stderr_line.strip())) 243*cfb92d14SAndroid Build Coastguard Worker elif stdout_lines: 244*cfb92d14SAndroid Build Coastguard Worker for stdout_line in stdout_lines: 245*cfb92d14SAndroid Build Coastguard Worker logging.info('%s: the read line is[%s]', self.port, stdout_line) 246*cfb92d14SAndroid Build Coastguard Worker if re.search(r'Not\s+Found|failed\s+with\s+error', stdout_line.strip(), re.M | re.I): 247*cfb92d14SAndroid Build Coastguard Worker print('Command failed') 248*cfb92d14SAndroid Build Coastguard Worker return 'Fail' 249*cfb92d14SAndroid Build Coastguard Worker print('Got line: ' + stdout_line) 250*cfb92d14SAndroid Build Coastguard Worker logging.info('%s: send command[%s] done!', self.port, cmd) 251*cfb92d14SAndroid Build Coastguard Worker response.append(str(stdout_line.strip())) 252*cfb92d14SAndroid Build Coastguard Worker response.append(self.prompt) 253*cfb92d14SAndroid Build Coastguard Worker return response 254*cfb92d14SAndroid Build Coastguard Worker else: 255*cfb92d14SAndroid Build Coastguard Worker while retry_times > 0: 256*cfb92d14SAndroid Build Coastguard Worker line = self._readline() 257*cfb92d14SAndroid Build Coastguard Worker print('read line: %s' % line) 258*cfb92d14SAndroid Build Coastguard Worker logging.info('%s: the read line is[%s]', self.port, line) 259*cfb92d14SAndroid Build Coastguard Worker if line: 260*cfb92d14SAndroid Build Coastguard Worker response.append(line) 261*cfb92d14SAndroid Build Coastguard Worker if re.match(self.prompt, line): 262*cfb92d14SAndroid Build Coastguard Worker break 263*cfb92d14SAndroid Build Coastguard Worker elif re.search(r'Not\s+Found|failed\s+with\s+error', line, re.M | re.I): 264*cfb92d14SAndroid Build Coastguard Worker print('Command failed') 265*cfb92d14SAndroid Build Coastguard Worker return 'Fail' 266*cfb92d14SAndroid Build Coastguard Worker 267*cfb92d14SAndroid Build Coastguard Worker retry_times -= 1 268*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.1) 269*cfb92d14SAndroid Build Coastguard Worker 270*cfb92d14SAndroid Build Coastguard Worker if retry_times == 0: 271*cfb92d14SAndroid Build Coastguard Worker raise Exception('%s: failed to find end of response' % self.port) 272*cfb92d14SAndroid Build Coastguard Worker logging.info('%s: send command[%s] done!', self.port, cmd) 273*cfb92d14SAndroid Build Coastguard Worker return response 274*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 275*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('sendCommand() Error: ' + str(e)) 276*cfb92d14SAndroid Build Coastguard Worker raise 277*cfb92d14SAndroid Build Coastguard Worker 278*cfb92d14SAndroid Build Coastguard Worker def __stripValue(self, value): 279*cfb92d14SAndroid Build Coastguard Worker """strip the special characters in the value 280*cfb92d14SAndroid Build Coastguard Worker 281*cfb92d14SAndroid Build Coastguard Worker Args: 282*cfb92d14SAndroid Build Coastguard Worker value: value string 283*cfb92d14SAndroid Build Coastguard Worker 284*cfb92d14SAndroid Build Coastguard Worker Returns: 285*cfb92d14SAndroid Build Coastguard Worker value string without special characters 286*cfb92d14SAndroid Build Coastguard Worker """ 287*cfb92d14SAndroid Build Coastguard Worker if isinstance(value, str): 288*cfb92d14SAndroid Build Coastguard Worker if (value[0] == '"' and value[-1] == '"') or (value[0] == '[' and value[-1] == ']'): 289*cfb92d14SAndroid Build Coastguard Worker return value[1:-1] 290*cfb92d14SAndroid Build Coastguard Worker return value 291*cfb92d14SAndroid Build Coastguard Worker 292*cfb92d14SAndroid Build Coastguard Worker def __padIp6Addr(self, ip6Addr): 293*cfb92d14SAndroid Build Coastguard Worker segments = ip6Addr.split(':') 294*cfb92d14SAndroid Build Coastguard Worker empty = None 295*cfb92d14SAndroid Build Coastguard Worker for i, element in enumerate(segments): 296*cfb92d14SAndroid Build Coastguard Worker if empty is None and len(element) == 0: 297*cfb92d14SAndroid Build Coastguard Worker empty = i 298*cfb92d14SAndroid Build Coastguard Worker elif len(element) < 4: 299*cfb92d14SAndroid Build Coastguard Worker segments[i] = '0' * (4 - len(element)) + element 300*cfb92d14SAndroid Build Coastguard Worker 301*cfb92d14SAndroid Build Coastguard Worker if empty is not None: 302*cfb92d14SAndroid Build Coastguard Worker segments = segments[:empty] + ['0000'] * (8 - len(segments) + 1) + segments[empty + 1:] 303*cfb92d14SAndroid Build Coastguard Worker 304*cfb92d14SAndroid Build Coastguard Worker return ':'.join(segments) 305*cfb92d14SAndroid Build Coastguard Worker 306*cfb92d14SAndroid Build Coastguard Worker def __setDeviceMode(self, mode): 307*cfb92d14SAndroid Build Coastguard Worker """set thread device mode: 308*cfb92d14SAndroid Build Coastguard Worker 309*cfb92d14SAndroid Build Coastguard Worker Args: 310*cfb92d14SAndroid Build Coastguard Worker mode: thread device mode. 11=rdn, 9=rn 311*cfb92d14SAndroid Build Coastguard Worker r: rx-on-when-idle 312*cfb92d14SAndroid Build Coastguard Worker s: secure IEEE 802.15.4 data request 313*cfb92d14SAndroid Build Coastguard Worker d: full thread device 314*cfb92d14SAndroid Build Coastguard Worker n: full network data 315*cfb92d14SAndroid Build Coastguard Worker 316*cfb92d14SAndroid Build Coastguard Worker Returns: 317*cfb92d14SAndroid Build Coastguard Worker True: successful to set the device mode 318*cfb92d14SAndroid Build Coastguard Worker False: fail to set the device mode 319*cfb92d14SAndroid Build Coastguard Worker """ 320*cfb92d14SAndroid Build Coastguard Worker print('call __setDeviceMode') 321*cfb92d14SAndroid Build Coastguard Worker 322*cfb92d14SAndroid Build Coastguard Worker try: 323*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Thread:DeviceMode %d' % mode 324*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 325*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 326*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setDeviceMode() Error: ' + str(e)) 327*cfb92d14SAndroid Build Coastguard Worker 328*cfb92d14SAndroid Build Coastguard Worker def __setRouterUpgradeThreshold(self, iThreshold): 329*cfb92d14SAndroid Build Coastguard Worker """set router upgrade threshold 330*cfb92d14SAndroid Build Coastguard Worker 331*cfb92d14SAndroid Build Coastguard Worker Args: 332*cfb92d14SAndroid Build Coastguard Worker iThreshold: the number of active routers on the Thread network 333*cfb92d14SAndroid Build Coastguard Worker partition below which a REED may decide to become a Router. 334*cfb92d14SAndroid Build Coastguard Worker 335*cfb92d14SAndroid Build Coastguard Worker Returns: 336*cfb92d14SAndroid Build Coastguard Worker True: successful to set the ROUTER_UPGRADE_THRESHOLD 337*cfb92d14SAndroid Build Coastguard Worker False: fail to set ROUTER_UPGRADE_THRESHOLD 338*cfb92d14SAndroid Build Coastguard Worker """ 339*cfb92d14SAndroid Build Coastguard Worker print('call __setRouterUpgradeThreshold') 340*cfb92d14SAndroid Build Coastguard Worker try: 341*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Thread:RouterUpgradeThreshold %s' % str(iThreshold) 342*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 343*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 344*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setRouterUpgradeThreshold() Error: ' + str(e)) 345*cfb92d14SAndroid Build Coastguard Worker 346*cfb92d14SAndroid Build Coastguard Worker def __setRouterDowngradeThreshold(self, iThreshold): 347*cfb92d14SAndroid Build Coastguard Worker """set router downgrade threshold 348*cfb92d14SAndroid Build Coastguard Worker 349*cfb92d14SAndroid Build Coastguard Worker Args: 350*cfb92d14SAndroid Build Coastguard Worker iThreshold: the number of active routers on the Thread network 351*cfb92d14SAndroid Build Coastguard Worker partition above which an active router may decide to 352*cfb92d14SAndroid Build Coastguard Worker become a child. 353*cfb92d14SAndroid Build Coastguard Worker 354*cfb92d14SAndroid Build Coastguard Worker Returns: 355*cfb92d14SAndroid Build Coastguard Worker True: successful to set the ROUTER_DOWNGRADE_THRESHOLD 356*cfb92d14SAndroid Build Coastguard Worker False: fail to set ROUTER_DOWNGRADE_THRESHOLD 357*cfb92d14SAndroid Build Coastguard Worker """ 358*cfb92d14SAndroid Build Coastguard Worker print('call __setRouterDowngradeThreshold') 359*cfb92d14SAndroid Build Coastguard Worker try: 360*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Thread:RouterDowngradeThreshold %s' % str(iThreshold) 361*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 362*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 363*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setRouterDowngradeThreshold() Error: ' + str(e)) 364*cfb92d14SAndroid Build Coastguard Worker 365*cfb92d14SAndroid Build Coastguard Worker def __setRouterSelectionJitter(self, iRouterJitter): 366*cfb92d14SAndroid Build Coastguard Worker """set ROUTER_SELECTION_JITTER parameter for REED to upgrade to Router 367*cfb92d14SAndroid Build Coastguard Worker 368*cfb92d14SAndroid Build Coastguard Worker Args: 369*cfb92d14SAndroid Build Coastguard Worker iRouterJitter: a random period prior to request Router ID for REED 370*cfb92d14SAndroid Build Coastguard Worker 371*cfb92d14SAndroid Build Coastguard Worker Returns: 372*cfb92d14SAndroid Build Coastguard Worker True: successful to set the ROUTER_SELECTION_JITTER 373*cfb92d14SAndroid Build Coastguard Worker False: fail to set ROUTER_SELECTION_JITTER 374*cfb92d14SAndroid Build Coastguard Worker """ 375*cfb92d14SAndroid Build Coastguard Worker print('call _setRouterSelectionJitter') 376*cfb92d14SAndroid Build Coastguard Worker try: 377*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Thread:RouterSelectionJitter %s' % str(iRouterJitter) 378*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd) != 'Fail' 379*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 380*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setRouterSelectionJitter() Error: ' + str(e)) 381*cfb92d14SAndroid Build Coastguard Worker 382*cfb92d14SAndroid Build Coastguard Worker def __setAddressfilterMode(self, mode): 383*cfb92d14SAndroid Build Coastguard Worker """set address filter mode 384*cfb92d14SAndroid Build Coastguard Worker 385*cfb92d14SAndroid Build Coastguard Worker Returns: 386*cfb92d14SAndroid Build Coastguard Worker True: successful to set address filter mode. 387*cfb92d14SAndroid Build Coastguard Worker False: fail to set address filter mode. 388*cfb92d14SAndroid Build Coastguard Worker """ 389*cfb92d14SAndroid Build Coastguard Worker print('call setAddressFilterMode() %s' % mode) 390*cfb92d14SAndroid Build Coastguard Worker try: 391*cfb92d14SAndroid Build Coastguard Worker if mode in ('allowlist', 'denylist'): 392*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop MAC:' + mode.capitalize() + ':Enabled 1' 393*cfb92d14SAndroid Build Coastguard Worker elif mode == 'disable': 394*cfb92d14SAndroid Build Coastguard Worker if self._addressfilterMode != 'disable': 395*cfb92d14SAndroid Build Coastguard Worker assert self._addressfilterMode in ('allowlist', 'denylist'), self._addressfilterMode 396*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop MAC:' + self._addressfilterMode.capitalize() + ':Enabled 0' 397*cfb92d14SAndroid Build Coastguard Worker else: 398*cfb92d14SAndroid Build Coastguard Worker return True 399*cfb92d14SAndroid Build Coastguard Worker else: 400*cfb92d14SAndroid Build Coastguard Worker assert False, 'unknown address filter mode: %s' % mode 401*cfb92d14SAndroid Build Coastguard Worker 402*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(cmd)[0] != 'Fail': 403*cfb92d14SAndroid Build Coastguard Worker self._addressfilterMode = mode 404*cfb92d14SAndroid Build Coastguard Worker return True 405*cfb92d14SAndroid Build Coastguard Worker return False 406*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 407*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('__setAddressFilterMode() Error: ' + str(e)) 408*cfb92d14SAndroid Build Coastguard Worker 409*cfb92d14SAndroid Build Coastguard Worker def __startOpenThreadWpan(self): 410*cfb92d14SAndroid Build Coastguard Worker """start OpenThreadWpan 411*cfb92d14SAndroid Build Coastguard Worker 412*cfb92d14SAndroid Build Coastguard Worker Returns: 413*cfb92d14SAndroid Build Coastguard Worker True: successful to start OpenThreadWpan up 414*cfb92d14SAndroid Build Coastguard Worker False: fail to start OpenThreadWpan 415*cfb92d14SAndroid Build Coastguard Worker """ 416*cfb92d14SAndroid Build Coastguard Worker print('call startOpenThreadWpan') 417*cfb92d14SAndroid Build Coastguard Worker try: 418*cfb92d14SAndroid Build Coastguard Worker 419*cfb92d14SAndroid Build Coastguard Worker # restore allowlist/denylist address filter mode if rejoin after 420*cfb92d14SAndroid Build Coastguard Worker # reset 421*cfb92d14SAndroid Build Coastguard Worker if self.isPowerDown: 422*cfb92d14SAndroid Build Coastguard Worker if self._addressfilterMode == 'allowlist': 423*cfb92d14SAndroid Build Coastguard Worker if self.__setAddressfilterMode('allowlist'): 424*cfb92d14SAndroid Build Coastguard Worker for addr in self._addressfilterSet: 425*cfb92d14SAndroid Build Coastguard Worker self.addAllowMAC(addr) 426*cfb92d14SAndroid Build Coastguard Worker elif self._addressfilterMode == 'denylist': 427*cfb92d14SAndroid Build Coastguard Worker if self.__setAddressfilterMode('denylist'): 428*cfb92d14SAndroid Build Coastguard Worker for addr in self._addressfilterSet: 429*cfb92d14SAndroid Build Coastguard Worker self.addBlockedMAC(addr) 430*cfb92d14SAndroid Build Coastguard Worker time.sleep(1) 431*cfb92d14SAndroid Build Coastguard Worker if ModuleHelper.LeaderDutChannelFound: 432*cfb92d14SAndroid Build Coastguard Worker self.channel = ModuleHelper.Default_Channel 433*cfb92d14SAndroid Build Coastguard Worker nodeType = 'router' 434*cfb92d14SAndroid Build Coastguard Worker startType = 'join' 435*cfb92d14SAndroid Build Coastguard Worker if self.deviceRole == Thread_Device_Role.Leader: 436*cfb92d14SAndroid Build Coastguard Worker nodeType = 'router' 437*cfb92d14SAndroid Build Coastguard Worker startType = 'form' 438*cfb92d14SAndroid Build Coastguard Worker elif self.deviceRole == Thread_Device_Role.Router: 439*cfb92d14SAndroid Build Coastguard Worker nodeType = 'router' 440*cfb92d14SAndroid Build Coastguard Worker elif self.deviceRole == Thread_Device_Role.SED: 441*cfb92d14SAndroid Build Coastguard Worker nodeType = 'sed' 442*cfb92d14SAndroid Build Coastguard Worker elif self.deviceRole == Thread_Device_Role.EndDevice: 443*cfb92d14SAndroid Build Coastguard Worker nodeType = 'end' 444*cfb92d14SAndroid Build Coastguard Worker elif self.deviceRole == Thread_Device_Role.REED: 445*cfb92d14SAndroid Build Coastguard Worker nodeType = 'router' 446*cfb92d14SAndroid Build Coastguard Worker elif self.deviceRole == Thread_Device_Role.EndDevice_FED: 447*cfb92d14SAndroid Build Coastguard Worker nodeType = 'router' 448*cfb92d14SAndroid Build Coastguard Worker elif self.deviceRole == Thread_Device_Role.EndDevice_MED: 449*cfb92d14SAndroid Build Coastguard Worker nodeType = 'end' 450*cfb92d14SAndroid Build Coastguard Worker else: 451*cfb92d14SAndroid Build Coastguard Worker pass 452*cfb92d14SAndroid Build Coastguard Worker 453*cfb92d14SAndroid Build Coastguard Worker if self.deviceRole in [Thread_Device_Role.Leader, Thread_Device_Role.Router, Thread_Device_Role.REED]: 454*cfb92d14SAndroid Build Coastguard Worker self.__setRouterSelectionJitter(1) 455*cfb92d14SAndroid Build Coastguard Worker 456*cfb92d14SAndroid Build Coastguard Worker if startType == 'form': 457*cfb92d14SAndroid Build Coastguard Worker startCmd = self.wpan_cmd_prefix + '%s "%s" -c %s -T %s ' % ( 458*cfb92d14SAndroid Build Coastguard Worker startType, 459*cfb92d14SAndroid Build Coastguard Worker self.networkName, 460*cfb92d14SAndroid Build Coastguard Worker str(self.channel), 461*cfb92d14SAndroid Build Coastguard Worker nodeType, 462*cfb92d14SAndroid Build Coastguard Worker ) 463*cfb92d14SAndroid Build Coastguard Worker else: 464*cfb92d14SAndroid Build Coastguard Worker startCmd = self.wpan_cmd_prefix + '%s "%s" -p %s -c %s -T %s ' % ( 465*cfb92d14SAndroid Build Coastguard Worker startType, 466*cfb92d14SAndroid Build Coastguard Worker self.networkName, 467*cfb92d14SAndroid Build Coastguard Worker str(hex(self.panId)), 468*cfb92d14SAndroid Build Coastguard Worker str(self.channel), 469*cfb92d14SAndroid Build Coastguard Worker nodeType, 470*cfb92d14SAndroid Build Coastguard Worker ) 471*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(startCmd)[0] != 'Fail': 472*cfb92d14SAndroid Build Coastguard Worker if self.__isOpenThreadWpanRunning(): 473*cfb92d14SAndroid Build Coastguard Worker self.isPowerDown = False 474*cfb92d14SAndroid Build Coastguard Worker if self.hasActiveDatasetToCommit: 475*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'setprop Dataset:Command SetActive')[0] == 'Fail': 476*cfb92d14SAndroid Build Coastguard Worker raise Exception('failed to commit active dataset') 477*cfb92d14SAndroid Build Coastguard Worker else: 478*cfb92d14SAndroid Build Coastguard Worker self.hasActiveDatasetToCommit = False 479*cfb92d14SAndroid Build Coastguard Worker 480*cfb92d14SAndroid Build Coastguard Worker return True 481*cfb92d14SAndroid Build Coastguard Worker else: 482*cfb92d14SAndroid Build Coastguard Worker return False 483*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 484*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('startOpenThreadWpan() Error: ' + str(e)) 485*cfb92d14SAndroid Build Coastguard Worker 486*cfb92d14SAndroid Build Coastguard Worker def __stopOpenThreadWpan(self): 487*cfb92d14SAndroid Build Coastguard Worker """stop OpenThreadWpan 488*cfb92d14SAndroid Build Coastguard Worker 489*cfb92d14SAndroid Build Coastguard Worker Returns: 490*cfb92d14SAndroid Build Coastguard Worker True: successfully stop OpenThreadWpan 491*cfb92d14SAndroid Build Coastguard Worker False: failed to stop OpenThreadWpan 492*cfb92d14SAndroid Build Coastguard Worker """ 493*cfb92d14SAndroid Build Coastguard Worker print('call stopOpenThreadWpan') 494*cfb92d14SAndroid Build Coastguard Worker try: 495*cfb92d14SAndroid Build Coastguard Worker if (self.__sendCommand(self.wpan_cmd_prefix + 'leave')[0] != 'Fail' and 496*cfb92d14SAndroid Build Coastguard Worker self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase')[0] != 'Fail'): 497*cfb92d14SAndroid Build Coastguard Worker return True 498*cfb92d14SAndroid Build Coastguard Worker else: 499*cfb92d14SAndroid Build Coastguard Worker return False 500*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 501*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('stopOpenThreadWpan() Error: ' + str(e)) 502*cfb92d14SAndroid Build Coastguard Worker 503*cfb92d14SAndroid Build Coastguard Worker def __isOpenThreadWpanRunning(self): 504*cfb92d14SAndroid Build Coastguard Worker """check whether or not OpenThreadWpan is running 505*cfb92d14SAndroid Build Coastguard Worker 506*cfb92d14SAndroid Build Coastguard Worker Returns: 507*cfb92d14SAndroid Build Coastguard Worker True: OpenThreadWpan is running 508*cfb92d14SAndroid Build Coastguard Worker False: OpenThreadWpan is not running 509*cfb92d14SAndroid Build Coastguard Worker """ 510*cfb92d14SAndroid Build Coastguard Worker print('call __isOpenThreadWpanRunning') 511*cfb92d14SAndroid Build Coastguard Worker if self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:State')[0]) == 'associated': 512*cfb92d14SAndroid Build Coastguard Worker print('*****OpenThreadWpan is running') 513*cfb92d14SAndroid Build Coastguard Worker return True 514*cfb92d14SAndroid Build Coastguard Worker else: 515*cfb92d14SAndroid Build Coastguard Worker print('*****Wrong OpenThreadWpan state') 516*cfb92d14SAndroid Build Coastguard Worker return False 517*cfb92d14SAndroid Build Coastguard Worker 518*cfb92d14SAndroid Build Coastguard Worker # rloc16 might be hex string or integer, need to return actual allocated 519*cfb92d14SAndroid Build Coastguard Worker # router id 520*cfb92d14SAndroid Build Coastguard Worker def __convertRlocToRouterId(self, xRloc16): 521*cfb92d14SAndroid Build Coastguard Worker """mapping Rloc16 to router id 522*cfb92d14SAndroid Build Coastguard Worker 523*cfb92d14SAndroid Build Coastguard Worker Args: 524*cfb92d14SAndroid Build Coastguard Worker xRloc16: hex rloc16 short address 525*cfb92d14SAndroid Build Coastguard Worker 526*cfb92d14SAndroid Build Coastguard Worker Returns: 527*cfb92d14SAndroid Build Coastguard Worker actual router id allocated by leader 528*cfb92d14SAndroid Build Coastguard Worker """ 529*cfb92d14SAndroid Build Coastguard Worker routerList = [] 530*cfb92d14SAndroid Build Coastguard Worker routerList = self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Thread:RouterTable') 531*cfb92d14SAndroid Build Coastguard Worker print(routerList) 532*cfb92d14SAndroid Build Coastguard Worker print(xRloc16) 533*cfb92d14SAndroid Build Coastguard Worker 534*cfb92d14SAndroid Build Coastguard Worker for line in routerList: 535*cfb92d14SAndroid Build Coastguard Worker if re.match(r'\[|\]', line): 536*cfb92d14SAndroid Build Coastguard Worker continue 537*cfb92d14SAndroid Build Coastguard Worker if re.match(self.prompt, line, re.M | re.I): 538*cfb92d14SAndroid Build Coastguard Worker break 539*cfb92d14SAndroid Build Coastguard Worker router = [] 540*cfb92d14SAndroid Build Coastguard Worker router = self.__stripValue(line).split(',') 541*cfb92d14SAndroid Build Coastguard Worker 542*cfb92d14SAndroid Build Coastguard Worker for item in router: 543*cfb92d14SAndroid Build Coastguard Worker if 'RouterId' in item: 544*cfb92d14SAndroid Build Coastguard Worker routerid = item.split(':')[1] 545*cfb92d14SAndroid Build Coastguard Worker elif 'RLOC16' in line: 546*cfb92d14SAndroid Build Coastguard Worker rloc16 = line.split(':')[1] 547*cfb92d14SAndroid Build Coastguard Worker else: 548*cfb92d14SAndroid Build Coastguard Worker pass 549*cfb92d14SAndroid Build Coastguard Worker 550*cfb92d14SAndroid Build Coastguard Worker # process input rloc16 551*cfb92d14SAndroid Build Coastguard Worker if isinstance(xRloc16, str): 552*cfb92d14SAndroid Build Coastguard Worker rloc16 = '0x' + rloc16 553*cfb92d14SAndroid Build Coastguard Worker if rloc16 == xRloc16: 554*cfb92d14SAndroid Build Coastguard Worker return routerid 555*cfb92d14SAndroid Build Coastguard Worker elif isinstance(xRloc16, int): 556*cfb92d14SAndroid Build Coastguard Worker if int(rloc16, 16) == xRloc16: 557*cfb92d14SAndroid Build Coastguard Worker return routerid 558*cfb92d14SAndroid Build Coastguard Worker else: 559*cfb92d14SAndroid Build Coastguard Worker pass 560*cfb92d14SAndroid Build Coastguard Worker 561*cfb92d14SAndroid Build Coastguard Worker return None 562*cfb92d14SAndroid Build Coastguard Worker 563*cfb92d14SAndroid Build Coastguard Worker def __convertIp6PrefixStringToIp6Address(self, strIp6Prefix): 564*cfb92d14SAndroid Build Coastguard Worker """convert IPv6 prefix string to IPv6 dotted-quad format 565*cfb92d14SAndroid Build Coastguard Worker for example: 566*cfb92d14SAndroid Build Coastguard Worker 2001000000000000 -> 2001:0000:0000:0000:: 567*cfb92d14SAndroid Build Coastguard Worker 568*cfb92d14SAndroid Build Coastguard Worker Args: 569*cfb92d14SAndroid Build Coastguard Worker strIp6Prefix: IPv6 address string 570*cfb92d14SAndroid Build Coastguard Worker 571*cfb92d14SAndroid Build Coastguard Worker Returns: 572*cfb92d14SAndroid Build Coastguard Worker IPv6 address dotted-quad format 573*cfb92d14SAndroid Build Coastguard Worker """ 574*cfb92d14SAndroid Build Coastguard Worker prefix1 = strIp6Prefix.rstrip('L') 575*cfb92d14SAndroid Build Coastguard Worker prefix2 = self.__lstrip0x(prefix1) 576*cfb92d14SAndroid Build Coastguard Worker hexPrefix = str(prefix2).ljust(16, '0') 577*cfb92d14SAndroid Build Coastguard Worker hexIter = iter(hexPrefix) 578*cfb92d14SAndroid Build Coastguard Worker finalMac = ':'.join(a + b + c + d for a, b, c, d in zip(hexIter, hexIter, hexIter, hexIter)) 579*cfb92d14SAndroid Build Coastguard Worker prefix = str(finalMac) 580*cfb92d14SAndroid Build Coastguard Worker strIp6Prefix = prefix[:19] 581*cfb92d14SAndroid Build Coastguard Worker return strIp6Prefix + '::' 582*cfb92d14SAndroid Build Coastguard Worker 583*cfb92d14SAndroid Build Coastguard Worker def __convertLongToHex(self, iValue, fillZeros=None): 584*cfb92d14SAndroid Build Coastguard Worker """convert a long hex integer to string 585*cfb92d14SAndroid Build Coastguard Worker remove '0x' and 'L' return string 586*cfb92d14SAndroid Build Coastguard Worker 587*cfb92d14SAndroid Build Coastguard Worker Args: 588*cfb92d14SAndroid Build Coastguard Worker iValue: long integer in hex format 589*cfb92d14SAndroid Build Coastguard Worker fillZeros: pad string with zeros on the left to specified width 590*cfb92d14SAndroid Build Coastguard Worker 591*cfb92d14SAndroid Build Coastguard Worker Returns: 592*cfb92d14SAndroid Build Coastguard Worker string of this long integer without '0x' and 'L' 593*cfb92d14SAndroid Build Coastguard Worker """ 594*cfb92d14SAndroid Build Coastguard Worker fmt = '%x' 595*cfb92d14SAndroid Build Coastguard Worker if fillZeros is not None: 596*cfb92d14SAndroid Build Coastguard Worker fmt = '%%0%dx' % fillZeros 597*cfb92d14SAndroid Build Coastguard Worker 598*cfb92d14SAndroid Build Coastguard Worker return fmt % iValue 599*cfb92d14SAndroid Build Coastguard Worker 600*cfb92d14SAndroid Build Coastguard Worker def __convertChannelMask(self, channelsArray): 601*cfb92d14SAndroid Build Coastguard Worker """convert channelsArray to bitmask format 602*cfb92d14SAndroid Build Coastguard Worker 603*cfb92d14SAndroid Build Coastguard Worker Args: 604*cfb92d14SAndroid Build Coastguard Worker channelsArray: channel array (i.e. [21, 22]) 605*cfb92d14SAndroid Build Coastguard Worker 606*cfb92d14SAndroid Build Coastguard Worker Returns: 607*cfb92d14SAndroid Build Coastguard Worker bitmask format corresponding to a given channel array 608*cfb92d14SAndroid Build Coastguard Worker """ 609*cfb92d14SAndroid Build Coastguard Worker maskSet = 0 610*cfb92d14SAndroid Build Coastguard Worker 611*cfb92d14SAndroid Build Coastguard Worker for eachChannel in channelsArray: 612*cfb92d14SAndroid Build Coastguard Worker mask = 1 << eachChannel 613*cfb92d14SAndroid Build Coastguard Worker maskSet = maskSet | mask 614*cfb92d14SAndroid Build Coastguard Worker 615*cfb92d14SAndroid Build Coastguard Worker return maskSet 616*cfb92d14SAndroid Build Coastguard Worker 617*cfb92d14SAndroid Build Coastguard Worker def __ChannelMaskListToStr(self, channelList): 618*cfb92d14SAndroid Build Coastguard Worker """convert a channel list to a string 619*cfb92d14SAndroid Build Coastguard Worker 620*cfb92d14SAndroid Build Coastguard Worker Args: 621*cfb92d14SAndroid Build Coastguard Worker channelList: channel list (i.e. [21, 22, 23]) 622*cfb92d14SAndroid Build Coastguard Worker 623*cfb92d14SAndroid Build Coastguard Worker Returns: 624*cfb92d14SAndroid Build Coastguard Worker a comma separated channel string (i.e. '21, 22, 23') 625*cfb92d14SAndroid Build Coastguard Worker """ 626*cfb92d14SAndroid Build Coastguard Worker chan_mask_range = '' 627*cfb92d14SAndroid Build Coastguard Worker if isinstance(channelList, list): 628*cfb92d14SAndroid Build Coastguard Worker if len(channelList): 629*cfb92d14SAndroid Build Coastguard Worker chan_mask_range = ','.join(str(chan) for chan in channelList) 630*cfb92d14SAndroid Build Coastguard Worker else: 631*cfb92d14SAndroid Build Coastguard Worker print('empty list') 632*cfb92d14SAndroid Build Coastguard Worker else: 633*cfb92d14SAndroid Build Coastguard Worker print('not a valid channel list: %s' % channelList) 634*cfb92d14SAndroid Build Coastguard Worker 635*cfb92d14SAndroid Build Coastguard Worker return chan_mask_range 636*cfb92d14SAndroid Build Coastguard Worker 637*cfb92d14SAndroid Build Coastguard Worker def __setChannelMask(self, channelMask): 638*cfb92d14SAndroid Build Coastguard Worker print('call _setChannelMask') 639*cfb92d14SAndroid Build Coastguard Worker try: 640*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop NCP:ChannelMask %s' % channelMask 641*cfb92d14SAndroid Build Coastguard Worker datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:ChannelMaskPage0 %s' % channelMask 642*cfb92d14SAndroid Build Coastguard Worker self.hasActiveDatasetToCommit = True 643*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail' 644*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 645*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setChannelMask() Error: ' + str(e)) 646*cfb92d14SAndroid Build Coastguard Worker 647*cfb92d14SAndroid Build Coastguard Worker def __setSecurityPolicy(self, securityPolicySecs, securityPolicyFlags): 648*cfb92d14SAndroid Build Coastguard Worker print('call _setSecurityPolicy') 649*cfb92d14SAndroid Build Coastguard Worker try: 650*cfb92d14SAndroid Build Coastguard Worker cmd1 = self.wpan_cmd_prefix + 'setprop Dataset:SecPolicy:KeyRotation %s' % str(securityPolicySecs) 651*cfb92d14SAndroid Build Coastguard Worker if securityPolicyFlags == 'onrc': 652*cfb92d14SAndroid Build Coastguard Worker cmd2 = self.wpan_cmd_prefix + 'setprop Dataset:SecPolicy:Flags 0xf7' 653*cfb92d14SAndroid Build Coastguard Worker else: 654*cfb92d14SAndroid Build Coastguard Worker print('unknown policy flag :' + securityPolicyFlags) 655*cfb92d14SAndroid Build Coastguard Worker return False 656*cfb92d14SAndroid Build Coastguard Worker self.hasActiveDatasetToCommit = True 657*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd1) != 'Fail' and self.__sendCommand(cmd2) != 'Fail' 658*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 659*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setSecurityPolicy() Error: ' + str(e)) 660*cfb92d14SAndroid Build Coastguard Worker 661*cfb92d14SAndroid Build Coastguard Worker def __setKeySwitchGuardTime(self, iKeySwitchGuardTime): 662*cfb92d14SAndroid Build Coastguard Worker """ set the Key switch guard time 663*cfb92d14SAndroid Build Coastguard Worker 664*cfb92d14SAndroid Build Coastguard Worker Args: 665*cfb92d14SAndroid Build Coastguard Worker iKeySwitchGuardTime: key switch guard time 666*cfb92d14SAndroid Build Coastguard Worker 667*cfb92d14SAndroid Build Coastguard Worker Returns: 668*cfb92d14SAndroid Build Coastguard Worker True: successful to set key switch guard time 669*cfb92d14SAndroid Build Coastguard Worker False: fail to set key switch guard time 670*cfb92d14SAndroid Build Coastguard Worker """ 671*cfb92d14SAndroid Build Coastguard Worker print('%s call setKeySwitchGuardTime' % self.port) 672*cfb92d14SAndroid Build Coastguard Worker print(iKeySwitchGuardTime) 673*cfb92d14SAndroid Build Coastguard Worker try: 674*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Network:KeySwitchGuardTime %s' % str(iKeySwitchGuardTime) 675*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(cmd)[0] != 'Fail': 676*cfb92d14SAndroid Build Coastguard Worker time.sleep(1) 677*cfb92d14SAndroid Build Coastguard Worker return True 678*cfb92d14SAndroid Build Coastguard Worker else: 679*cfb92d14SAndroid Build Coastguard Worker return False 680*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 681*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setKeySwitchGuardTime() Error; ' + str(e)) 682*cfb92d14SAndroid Build Coastguard Worker 683*cfb92d14SAndroid Build Coastguard Worker def __getCommissionerSessionId(self): 684*cfb92d14SAndroid Build Coastguard Worker """ get the commissioner session id allocated from Leader """ 685*cfb92d14SAndroid Build Coastguard Worker print('%s call getCommissionerSessionId' % self.port) 686*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Commissioner:SessionId')[0] 687*cfb92d14SAndroid Build Coastguard Worker 688*cfb92d14SAndroid Build Coastguard Worker def __getJoinerState(self): 689*cfb92d14SAndroid Build Coastguard Worker """ get joiner state """ 690*cfb92d14SAndroid Build Coastguard Worker maxDuration = 150 # seconds 691*cfb92d14SAndroid Build Coastguard Worker t_end = time.time() + maxDuration 692*cfb92d14SAndroid Build Coastguard Worker while time.time() < t_end: 693*cfb92d14SAndroid Build Coastguard Worker joinerState = self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:State')[0]) 694*cfb92d14SAndroid Build Coastguard Worker if joinerState == 'offline:commissioned': 695*cfb92d14SAndroid Build Coastguard Worker return True 696*cfb92d14SAndroid Build Coastguard Worker elif joinerState == 'associating:credentials-needed': 697*cfb92d14SAndroid Build Coastguard Worker return False 698*cfb92d14SAndroid Build Coastguard Worker else: 699*cfb92d14SAndroid Build Coastguard Worker time.sleep(5) 700*cfb92d14SAndroid Build Coastguard Worker continue 701*cfb92d14SAndroid Build Coastguard Worker return False 702*cfb92d14SAndroid Build Coastguard Worker 703*cfb92d14SAndroid Build Coastguard Worker def _connect(self): 704*cfb92d14SAndroid Build Coastguard Worker if self.connectType == 'usb': 705*cfb92d14SAndroid Build Coastguard Worker print('My port is %s' % self.port) 706*cfb92d14SAndroid Build Coastguard Worker try: 707*cfb92d14SAndroid Build Coastguard Worker self.handle = serial.Serial(self.port, 115200, timeout=0.2) 708*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 709*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('open serial error ' + str(e)) 710*cfb92d14SAndroid Build Coastguard Worker 711*cfb92d14SAndroid Build Coastguard Worker try: 712*cfb92d14SAndroid Build Coastguard Worker attempts = 0 713*cfb92d14SAndroid Build Coastguard Worker user_prompted = False 714*cfb92d14SAndroid Build Coastguard Worker pwd_prompted = False 715*cfb92d14SAndroid Build Coastguard Worker while attempts < 10 or pwd_prompted: 716*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.5) 717*cfb92d14SAndroid Build Coastguard Worker attempts = attempts + 1 718*cfb92d14SAndroid Build Coastguard Worker print('attempts...%d' % attempts) 719*cfb92d14SAndroid Build Coastguard Worker 720*cfb92d14SAndroid Build Coastguard Worker input_data = self.handle.read(self.handle.inWaiting()) 721*cfb92d14SAndroid Build Coastguard Worker 722*cfb92d14SAndroid Build Coastguard Worker if not input_data: 723*cfb92d14SAndroid Build Coastguard Worker if not user_prompted: 724*cfb92d14SAndroid Build Coastguard Worker self.handle.write('\n') 725*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.5) 726*cfb92d14SAndroid Build Coastguard Worker continue 727*cfb92d14SAndroid Build Coastguard Worker 728*cfb92d14SAndroid Build Coastguard Worker if 'login' in input_data: 729*cfb92d14SAndroid Build Coastguard Worker self.handle.write(self.username + '\n') 730*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.3) 731*cfb92d14SAndroid Build Coastguard Worker print('user prompted') 732*cfb92d14SAndroid Build Coastguard Worker user_prompted = True 733*cfb92d14SAndroid Build Coastguard Worker 734*cfb92d14SAndroid Build Coastguard Worker elif 'Password' in input_data: 735*cfb92d14SAndroid Build Coastguard Worker print('password prompted') 736*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.3) 737*cfb92d14SAndroid Build Coastguard Worker self.handle.write(self.password + '\n') 738*cfb92d14SAndroid Build Coastguard Worker pwd_prompted = True 739*cfb92d14SAndroid Build Coastguard Worker 740*cfb92d14SAndroid Build Coastguard Worker elif self.prompt in input_data: 741*cfb92d14SAndroid Build Coastguard Worker print('login success (serial)') 742*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.3) 743*cfb92d14SAndroid Build Coastguard Worker self.deviceConnected = True 744*cfb92d14SAndroid Build Coastguard Worker for precmd in self.precmd: 745*cfb92d14SAndroid Build Coastguard Worker self.handle.write(precmd + '\n') 746*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.3) 747*cfb92d14SAndroid Build Coastguard Worker time.sleep(1) 748*cfb92d14SAndroid Build Coastguard Worker break 749*cfb92d14SAndroid Build Coastguard Worker if not self.deviceConnected: 750*cfb92d14SAndroid Build Coastguard Worker raise Exception('login fail') 751*cfb92d14SAndroid Build Coastguard Worker else: 752*cfb92d14SAndroid Build Coastguard Worker self._is_net = False 753*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 754*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('connect to serial Error: ' + str(e)) 755*cfb92d14SAndroid Build Coastguard Worker 756*cfb92d14SAndroid Build Coastguard Worker elif self.connectType == 'ip': 757*cfb92d14SAndroid Build Coastguard Worker print('My IP: %s Port: %s' % (self.dutIpv4, self.dutPort)) 758*cfb92d14SAndroid Build Coastguard Worker try: 759*cfb92d14SAndroid Build Coastguard Worker import paramiko 760*cfb92d14SAndroid Build Coastguard Worker 761*cfb92d14SAndroid Build Coastguard Worker if not self.password: 762*cfb92d14SAndroid Build Coastguard Worker transport = paramiko.Transport((self.dutIpv4, int(self.dutPort))) 763*cfb92d14SAndroid Build Coastguard Worker transport.start_client() 764*cfb92d14SAndroid Build Coastguard Worker transport.auth_none(self.username) 765*cfb92d14SAndroid Build Coastguard Worker self.handle = paramiko.SSHClient() 766*cfb92d14SAndroid Build Coastguard Worker self.handle.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 767*cfb92d14SAndroid Build Coastguard Worker self.handle._transport = transport 768*cfb92d14SAndroid Build Coastguard Worker else: 769*cfb92d14SAndroid Build Coastguard Worker self.handle = paramiko.SSHClient() 770*cfb92d14SAndroid Build Coastguard Worker self.handle.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 771*cfb92d14SAndroid Build Coastguard Worker self.handle.connect(self.dutIpv4, 772*cfb92d14SAndroid Build Coastguard Worker port=int(self.dutPort), 773*cfb92d14SAndroid Build Coastguard Worker username=self.username, 774*cfb92d14SAndroid Build Coastguard Worker password=self.password) 775*cfb92d14SAndroid Build Coastguard Worker print('login success (ssh)') 776*cfb92d14SAndroid Build Coastguard Worker self.deviceConnected = True 777*cfb92d14SAndroid Build Coastguard Worker for precmd in self.precmd: 778*cfb92d14SAndroid Build Coastguard Worker self.handle.exec_command(precmd + '\n') 779*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.5) 780*cfb92d14SAndroid Build Coastguard Worker self._is_net = True 781*cfb92d14SAndroid Build Coastguard Worker 782*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 783*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('connect to ssh Error: ' + str(e)) 784*cfb92d14SAndroid Build Coastguard Worker else: 785*cfb92d14SAndroid Build Coastguard Worker raise Exception('Unknown port schema') 786*cfb92d14SAndroid Build Coastguard Worker 787*cfb92d14SAndroid Build Coastguard Worker def closeConnection(self): 788*cfb92d14SAndroid Build Coastguard Worker """close current serial port connection""" 789*cfb92d14SAndroid Build Coastguard Worker print('%s call closeConnection' % self.port) 790*cfb92d14SAndroid Build Coastguard Worker try: 791*cfb92d14SAndroid Build Coastguard Worker if self.handle: 792*cfb92d14SAndroid Build Coastguard Worker self.handle.close() 793*cfb92d14SAndroid Build Coastguard Worker self.handle = None 794*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 795*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('closeConnection() Error: ' + str(e)) 796*cfb92d14SAndroid Build Coastguard Worker 797*cfb92d14SAndroid Build Coastguard Worker def intialize(self): 798*cfb92d14SAndroid Build Coastguard Worker """initialize the serial port with baudrate, timeout parameters""" 799*cfb92d14SAndroid Build Coastguard Worker print('%s call intialize' % self.port) 800*cfb92d14SAndroid Build Coastguard Worker try: 801*cfb92d14SAndroid Build Coastguard Worker # init serial port 802*cfb92d14SAndroid Build Coastguard Worker self.deviceConnected = False 803*cfb92d14SAndroid Build Coastguard Worker self._connect() 804*cfb92d14SAndroid Build Coastguard Worker 805*cfb92d14SAndroid Build Coastguard Worker if self.deviceConnected: 806*cfb92d14SAndroid Build Coastguard Worker self.UIStatusMsg = self.getVersionNumber() 807*cfb92d14SAndroid Build Coastguard Worker if self.firmwarePrefix not in self.UIStatusMsg: 808*cfb92d14SAndroid Build Coastguard Worker self.deviceConnected = False 809*cfb92d14SAndroid Build Coastguard Worker self.UIStatusMsg = ('Firmware Not Matching Expecting ' + self.firmwarePrefix + ' Now is ' + 810*cfb92d14SAndroid Build Coastguard Worker self.UIStatusMsg) 811*cfb92d14SAndroid Build Coastguard Worker raise Exception('Err: OpenThread device Firmware not matching..') 812*cfb92d14SAndroid Build Coastguard Worker self.__sendCommand(self.wpan_cmd_prefix + 'leave') 813*cfb92d14SAndroid Build Coastguard Worker self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase') 814*cfb92d14SAndroid Build Coastguard Worker else: 815*cfb92d14SAndroid Build Coastguard Worker raise Exception('Err: Device not connected ..') 816*cfb92d14SAndroid Build Coastguard Worker 817*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 818*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('intialize() Error: ' + str(e)) 819*cfb92d14SAndroid Build Coastguard Worker 820*cfb92d14SAndroid Build Coastguard Worker def setNetworkName(self, networkName='GRL'): 821*cfb92d14SAndroid Build Coastguard Worker """set Thread Network name 822*cfb92d14SAndroid Build Coastguard Worker 823*cfb92d14SAndroid Build Coastguard Worker Args: 824*cfb92d14SAndroid Build Coastguard Worker networkName: the networkname string to be set 825*cfb92d14SAndroid Build Coastguard Worker 826*cfb92d14SAndroid Build Coastguard Worker Returns: 827*cfb92d14SAndroid Build Coastguard Worker True: successful to set the Thread Networkname 828*cfb92d14SAndroid Build Coastguard Worker False: fail to set the Thread Networkname 829*cfb92d14SAndroid Build Coastguard Worker """ 830*cfb92d14SAndroid Build Coastguard Worker print('%s call setNetworkName' % self.port) 831*cfb92d14SAndroid Build Coastguard Worker assert '"' not in networkName 832*cfb92d14SAndroid Build Coastguard Worker 833*cfb92d14SAndroid Build Coastguard Worker try: 834*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop -s Network:Name "%s"' % networkName 835*cfb92d14SAndroid Build Coastguard Worker datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkName "%s"' % networkName 836*cfb92d14SAndroid Build Coastguard Worker self.hasActiveDatasetToCommit = True 837*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail' 838*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 839*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setNetworkName() Error: ' + str(e)) 840*cfb92d14SAndroid Build Coastguard Worker 841*cfb92d14SAndroid Build Coastguard Worker def setChannel(self, channel=15): 842*cfb92d14SAndroid Build Coastguard Worker """set channel of Thread device operates on. 843*cfb92d14SAndroid Build Coastguard Worker 844*cfb92d14SAndroid Build Coastguard Worker Args: 845*cfb92d14SAndroid Build Coastguard Worker channel: 846*cfb92d14SAndroid Build Coastguard Worker (0 - 10: Reserved) 847*cfb92d14SAndroid Build Coastguard Worker (11 - 26: 2.4GHz channels) 848*cfb92d14SAndroid Build Coastguard Worker (27 - 65535: Reserved) 849*cfb92d14SAndroid Build Coastguard Worker 850*cfb92d14SAndroid Build Coastguard Worker Returns: 851*cfb92d14SAndroid Build Coastguard Worker True: successful to set the channel 852*cfb92d14SAndroid Build Coastguard Worker False: fail to set the channel 853*cfb92d14SAndroid Build Coastguard Worker """ 854*cfb92d14SAndroid Build Coastguard Worker print('%s call setChannel' % self.port) 855*cfb92d14SAndroid Build Coastguard Worker 856*cfb92d14SAndroid Build Coastguard Worker try: 857*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop NCP:Channel %s' % channel 858*cfb92d14SAndroid Build Coastguard Worker datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:Channel %s' % channel 859*cfb92d14SAndroid Build Coastguard Worker self.hasActiveDatasetToCommit = True 860*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail' 861*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 862*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setChannel() Error: ' + str(e)) 863*cfb92d14SAndroid Build Coastguard Worker 864*cfb92d14SAndroid Build Coastguard Worker def getChannel(self): 865*cfb92d14SAndroid Build Coastguard Worker """get current channel""" 866*cfb92d14SAndroid Build Coastguard Worker print('%s call getChannel' % self.port) 867*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:Channel')[0] 868*cfb92d14SAndroid Build Coastguard Worker 869*cfb92d14SAndroid Build Coastguard Worker def setMAC(self, xEUI): 870*cfb92d14SAndroid Build Coastguard Worker """set the extended address of Thread device 871*cfb92d14SAndroid Build Coastguard Worker 872*cfb92d14SAndroid Build Coastguard Worker Args: 873*cfb92d14SAndroid Build Coastguard Worker xEUI: extended address in hex format 874*cfb92d14SAndroid Build Coastguard Worker 875*cfb92d14SAndroid Build Coastguard Worker Returns: 876*cfb92d14SAndroid Build Coastguard Worker True: successful to set the extended address 877*cfb92d14SAndroid Build Coastguard Worker False: fail to set the extended address 878*cfb92d14SAndroid Build Coastguard Worker """ 879*cfb92d14SAndroid Build Coastguard Worker print('%s call setMAC' % self.port) 880*cfb92d14SAndroid Build Coastguard Worker 881*cfb92d14SAndroid Build Coastguard Worker address64 = '' 882*cfb92d14SAndroid Build Coastguard Worker try: 883*cfb92d14SAndroid Build Coastguard Worker if not isinstance(xEUI, str): 884*cfb92d14SAndroid Build Coastguard Worker address64 = self.__convertLongToHex(xEUI, 16) 885*cfb92d14SAndroid Build Coastguard Worker else: 886*cfb92d14SAndroid Build Coastguard Worker address64 = xEUI 887*cfb92d14SAndroid Build Coastguard Worker 888*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop NCP:MACAddress %s' % address64 889*cfb92d14SAndroid Build Coastguard Worker 890*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(cmd)[0] != 'Fail': 891*cfb92d14SAndroid Build Coastguard Worker self.mac = address64 892*cfb92d14SAndroid Build Coastguard Worker return True 893*cfb92d14SAndroid Build Coastguard Worker else: 894*cfb92d14SAndroid Build Coastguard Worker return False 895*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 896*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setMAC() Error: ' + str(e)) 897*cfb92d14SAndroid Build Coastguard Worker 898*cfb92d14SAndroid Build Coastguard Worker def getMAC(self, bType=MacType.RandomMac): 899*cfb92d14SAndroid Build Coastguard Worker """get one specific type of MAC address 900*cfb92d14SAndroid Build Coastguard Worker currently OpenThreadWpan only supports Random MAC address 901*cfb92d14SAndroid Build Coastguard Worker 902*cfb92d14SAndroid Build Coastguard Worker Args: 903*cfb92d14SAndroid Build Coastguard Worker bType: indicate which kind of MAC address is required 904*cfb92d14SAndroid Build Coastguard Worker 905*cfb92d14SAndroid Build Coastguard Worker Returns: 906*cfb92d14SAndroid Build Coastguard Worker specific type of MAC address 907*cfb92d14SAndroid Build Coastguard Worker """ 908*cfb92d14SAndroid Build Coastguard Worker print('%s call getMAC' % self.port) 909*cfb92d14SAndroid Build Coastguard Worker 910*cfb92d14SAndroid Build Coastguard Worker # if power down happens, return extended address assigned previously 911*cfb92d14SAndroid Build Coastguard Worker if self.isPowerDown: 912*cfb92d14SAndroid Build Coastguard Worker macAddr64 = self.mac 913*cfb92d14SAndroid Build Coastguard Worker else: 914*cfb92d14SAndroid Build Coastguard Worker if bType == MacType.FactoryMac: 915*cfb92d14SAndroid Build Coastguard Worker macAddr64 = self.__stripValue( 916*cfb92d14SAndroid Build Coastguard Worker self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:HardwareAddress')[0]) 917*cfb92d14SAndroid Build Coastguard Worker elif bType == MacType.HashMac: 918*cfb92d14SAndroid Build Coastguard Worker macAddr64 = self.__stripValue( 919*cfb92d14SAndroid Build Coastguard Worker self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:MACAddress')[0]) 920*cfb92d14SAndroid Build Coastguard Worker else: 921*cfb92d14SAndroid Build Coastguard Worker macAddr64 = self.__stripValue( 922*cfb92d14SAndroid Build Coastguard Worker self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:ExtendedAddress')[0]) 923*cfb92d14SAndroid Build Coastguard Worker 924*cfb92d14SAndroid Build Coastguard Worker return int(macAddr64, 16) 925*cfb92d14SAndroid Build Coastguard Worker 926*cfb92d14SAndroid Build Coastguard Worker def getLL64(self): 927*cfb92d14SAndroid Build Coastguard Worker """get link local unicast IPv6 address""" 928*cfb92d14SAndroid Build Coastguard Worker print('%s call getLL64' % self.port) 929*cfb92d14SAndroid Build Coastguard Worker return self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v IPv6:LinkLocalAddress')[0]) 930*cfb92d14SAndroid Build Coastguard Worker 931*cfb92d14SAndroid Build Coastguard Worker def getMLEID(self): 932*cfb92d14SAndroid Build Coastguard Worker """get mesh local endpoint identifier address""" 933*cfb92d14SAndroid Build Coastguard Worker print('%s call getMLEID' % self.port) 934*cfb92d14SAndroid Build Coastguard Worker return self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v IPv6:MeshLocalAddress')[0]) 935*cfb92d14SAndroid Build Coastguard Worker 936*cfb92d14SAndroid Build Coastguard Worker def getRloc16(self): 937*cfb92d14SAndroid Build Coastguard Worker """get rloc16 short address""" 938*cfb92d14SAndroid Build Coastguard Worker print('%s call getRloc16' % self.port) 939*cfb92d14SAndroid Build Coastguard Worker rloc16 = self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Thread:RLOC16')[0] 940*cfb92d14SAndroid Build Coastguard Worker return int(rloc16, 16) 941*cfb92d14SAndroid Build Coastguard Worker 942*cfb92d14SAndroid Build Coastguard Worker def getRloc(self): 943*cfb92d14SAndroid Build Coastguard Worker """get router locator unicast IPv6 address""" 944*cfb92d14SAndroid Build Coastguard Worker print('%s call getRloc' % self.port) 945*cfb92d14SAndroid Build Coastguard Worker prefix = self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v IPv6:MeshLocalPrefix')[0]) 946*cfb92d14SAndroid Build Coastguard Worker mlprefix = prefix.split('/')[0] 947*cfb92d14SAndroid Build Coastguard Worker rloc16 = self.__lstrip0x(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Thread:RLOC16')[0]) 948*cfb92d14SAndroid Build Coastguard Worker 949*cfb92d14SAndroid Build Coastguard Worker print('prefix: %s' % prefix) 950*cfb92d14SAndroid Build Coastguard Worker print('mlprefix: %s ' % mlprefix) 951*cfb92d14SAndroid Build Coastguard Worker print('rloc16: %s' % rloc16) 952*cfb92d14SAndroid Build Coastguard Worker 953*cfb92d14SAndroid Build Coastguard Worker rloc = self.__padIp6Addr(mlprefix + '00ff:fe00:' + rloc16) 954*cfb92d14SAndroid Build Coastguard Worker print('rloc: %s' % rloc) 955*cfb92d14SAndroid Build Coastguard Worker return rloc 956*cfb92d14SAndroid Build Coastguard Worker 957*cfb92d14SAndroid Build Coastguard Worker def getGlobal(self): 958*cfb92d14SAndroid Build Coastguard Worker """get global unicast IPv6 address set 959*cfb92d14SAndroid Build Coastguard Worker if configuring multiple entries 960*cfb92d14SAndroid Build Coastguard Worker """ 961*cfb92d14SAndroid Build Coastguard Worker print('%s call getGlobal' % self.port) 962*cfb92d14SAndroid Build Coastguard Worker globalAddrs = [] 963*cfb92d14SAndroid Build Coastguard Worker 964*cfb92d14SAndroid Build Coastguard Worker mleid = self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v IPv6:MeshLocalAddress')[0]) 965*cfb92d14SAndroid Build Coastguard Worker 966*cfb92d14SAndroid Build Coastguard Worker mleid = ModuleHelper.GetFullIpv6Address(mleid).lower() 967*cfb92d14SAndroid Build Coastguard Worker 968*cfb92d14SAndroid Build Coastguard Worker addrs = self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v IPv6:AllAddresses') 969*cfb92d14SAndroid Build Coastguard Worker 970*cfb92d14SAndroid Build Coastguard Worker # find rloc address firstly as a reference for current mesh local prefix as for some TCs, 971*cfb92d14SAndroid Build Coastguard Worker # mesh local prefix may be updated through pending dataset management. 972*cfb92d14SAndroid Build Coastguard Worker for ip6AddrItem in addrs: 973*cfb92d14SAndroid Build Coastguard Worker if re.match(r'\[|\]', ip6AddrItem): 974*cfb92d14SAndroid Build Coastguard Worker continue 975*cfb92d14SAndroid Build Coastguard Worker if re.match(self.prompt, ip6AddrItem, re.M | re.I): 976*cfb92d14SAndroid Build Coastguard Worker break 977*cfb92d14SAndroid Build Coastguard Worker ip6AddrItem = ip6AddrItem.strip() 978*cfb92d14SAndroid Build Coastguard Worker ip6Addr = self.__stripValue(ip6AddrItem).split(' ')[0] 979*cfb92d14SAndroid Build Coastguard Worker 980*cfb92d14SAndroid Build Coastguard Worker fullIp = ModuleHelper.GetFullIpv6Address(ip6Addr).lower() 981*cfb92d14SAndroid Build Coastguard Worker 982*cfb92d14SAndroid Build Coastguard Worker print('fullip %s' % fullIp) 983*cfb92d14SAndroid Build Coastguard Worker 984*cfb92d14SAndroid Build Coastguard Worker if fullIp.startswith('fe80'): 985*cfb92d14SAndroid Build Coastguard Worker continue 986*cfb92d14SAndroid Build Coastguard Worker 987*cfb92d14SAndroid Build Coastguard Worker if fullIp.startswith(mleid[0:19]): 988*cfb92d14SAndroid Build Coastguard Worker continue 989*cfb92d14SAndroid Build Coastguard Worker 990*cfb92d14SAndroid Build Coastguard Worker print('global') 991*cfb92d14SAndroid Build Coastguard Worker globalAddrs.append(fullIp) 992*cfb92d14SAndroid Build Coastguard Worker 993*cfb92d14SAndroid Build Coastguard Worker return globalAddrs 994*cfb92d14SAndroid Build Coastguard Worker 995*cfb92d14SAndroid Build Coastguard Worker def setNetworkKey(self, key): 996*cfb92d14SAndroid Build Coastguard Worker """set Thread network key 997*cfb92d14SAndroid Build Coastguard Worker 998*cfb92d14SAndroid Build Coastguard Worker Args: 999*cfb92d14SAndroid Build Coastguard Worker key: Thread network key used in secure the MLE/802.15.4 packet 1000*cfb92d14SAndroid Build Coastguard Worker 1001*cfb92d14SAndroid Build Coastguard Worker Returns: 1002*cfb92d14SAndroid Build Coastguard Worker True: successful to set the Thread network key 1003*cfb92d14SAndroid Build Coastguard Worker False: fail to set the Thread network key 1004*cfb92d14SAndroid Build Coastguard Worker """ 1005*cfb92d14SAndroid Build Coastguard Worker networkKey = '' 1006*cfb92d14SAndroid Build Coastguard Worker print('%s call setNetworkKey' % self.port) 1007*cfb92d14SAndroid Build Coastguard Worker 1008*cfb92d14SAndroid Build Coastguard Worker try: 1009*cfb92d14SAndroid Build Coastguard Worker if not isinstance(key, str): 1010*cfb92d14SAndroid Build Coastguard Worker networkKey = self.__convertLongToHex(key, 32) 1011*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Network:Key %s' % networkKey 1012*cfb92d14SAndroid Build Coastguard Worker datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkKey %s' % networkKey 1013*cfb92d14SAndroid Build Coastguard Worker else: 1014*cfb92d14SAndroid Build Coastguard Worker networkKey = key 1015*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Network:Key %s' % networkKey 1016*cfb92d14SAndroid Build Coastguard Worker datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkKey %s' % networkKey 1017*cfb92d14SAndroid Build Coastguard Worker 1018*cfb92d14SAndroid Build Coastguard Worker self.networkKey = networkKey 1019*cfb92d14SAndroid Build Coastguard Worker self.hasActiveDatasetToCommit = True 1020*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail' 1021*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1022*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setNetworkkey() Error: ' + str(e)) 1023*cfb92d14SAndroid Build Coastguard Worker 1024*cfb92d14SAndroid Build Coastguard Worker def addBlockedMAC(self, xEUI): 1025*cfb92d14SAndroid Build Coastguard Worker """add a given extended address to the denylist entry 1026*cfb92d14SAndroid Build Coastguard Worker 1027*cfb92d14SAndroid Build Coastguard Worker Args: 1028*cfb92d14SAndroid Build Coastguard Worker xEUI: extended address in hex format 1029*cfb92d14SAndroid Build Coastguard Worker 1030*cfb92d14SAndroid Build Coastguard Worker Returns: 1031*cfb92d14SAndroid Build Coastguard Worker True: successful to add a given extended address to the denylist entry 1032*cfb92d14SAndroid Build Coastguard Worker False: fail to add a given extended address to the denylist entry 1033*cfb92d14SAndroid Build Coastguard Worker """ 1034*cfb92d14SAndroid Build Coastguard Worker print('%s call addBlockedMAC' % self.port) 1035*cfb92d14SAndroid Build Coastguard Worker print(xEUI) 1036*cfb92d14SAndroid Build Coastguard Worker if isinstance(xEUI, str): 1037*cfb92d14SAndroid Build Coastguard Worker macAddr = xEUI 1038*cfb92d14SAndroid Build Coastguard Worker else: 1039*cfb92d14SAndroid Build Coastguard Worker macAddr = self.__convertLongToHex(xEUI) 1040*cfb92d14SAndroid Build Coastguard Worker 1041*cfb92d14SAndroid Build Coastguard Worker try: 1042*cfb92d14SAndroid Build Coastguard Worker # if blocked device is itself 1043*cfb92d14SAndroid Build Coastguard Worker if macAddr == self.mac: 1044*cfb92d14SAndroid Build Coastguard Worker print('block device itself') 1045*cfb92d14SAndroid Build Coastguard Worker return True 1046*cfb92d14SAndroid Build Coastguard Worker 1047*cfb92d14SAndroid Build Coastguard Worker if self._addressfilterMode != 'denylist': 1048*cfb92d14SAndroid Build Coastguard Worker self.__setAddressfilterMode('denylist') 1049*cfb92d14SAndroid Build Coastguard Worker 1050*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'insert MAC:Denylist:Entries %s' % macAddr 1051*cfb92d14SAndroid Build Coastguard Worker ret = self.__sendCommand(cmd)[0] != 'Fail' 1052*cfb92d14SAndroid Build Coastguard Worker 1053*cfb92d14SAndroid Build Coastguard Worker self._addressfilterSet.add(macAddr) 1054*cfb92d14SAndroid Build Coastguard Worker print('current denylist entries:') 1055*cfb92d14SAndroid Build Coastguard Worker for addr in self._addressfilterSet: 1056*cfb92d14SAndroid Build Coastguard Worker print(addr) 1057*cfb92d14SAndroid Build Coastguard Worker 1058*cfb92d14SAndroid Build Coastguard Worker return ret 1059*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1060*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('addBlockedMAC() Error: ' + str(e)) 1061*cfb92d14SAndroid Build Coastguard Worker 1062*cfb92d14SAndroid Build Coastguard Worker def addAllowMAC(self, xEUI): 1063*cfb92d14SAndroid Build Coastguard Worker """add a given extended address to the allowlist addressfilter 1064*cfb92d14SAndroid Build Coastguard Worker 1065*cfb92d14SAndroid Build Coastguard Worker Args: 1066*cfb92d14SAndroid Build Coastguard Worker xEUI: a given extended address in hex format 1067*cfb92d14SAndroid Build Coastguard Worker 1068*cfb92d14SAndroid Build Coastguard Worker Returns: 1069*cfb92d14SAndroid Build Coastguard Worker True: successful to add a given extended address to the allowlist entry 1070*cfb92d14SAndroid Build Coastguard Worker False: fail to add a given extended address to the allowlist entry 1071*cfb92d14SAndroid Build Coastguard Worker """ 1072*cfb92d14SAndroid Build Coastguard Worker print('%s call addAllowMAC' % self.port) 1073*cfb92d14SAndroid Build Coastguard Worker print(xEUI) 1074*cfb92d14SAndroid Build Coastguard Worker if isinstance(xEUI, str): 1075*cfb92d14SAndroid Build Coastguard Worker macAddr = xEUI 1076*cfb92d14SAndroid Build Coastguard Worker else: 1077*cfb92d14SAndroid Build Coastguard Worker macAddr = self.__convertLongToHex(xEUI) 1078*cfb92d14SAndroid Build Coastguard Worker 1079*cfb92d14SAndroid Build Coastguard Worker try: 1080*cfb92d14SAndroid Build Coastguard Worker if self._addressfilterMode != 'allowlist': 1081*cfb92d14SAndroid Build Coastguard Worker self.__setAddressfilterMode('allowlist') 1082*cfb92d14SAndroid Build Coastguard Worker 1083*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'insert MAC:Allowlist:Entries %s' % macAddr 1084*cfb92d14SAndroid Build Coastguard Worker ret = self.__sendCommand(cmd)[0] != 'Fail' 1085*cfb92d14SAndroid Build Coastguard Worker 1086*cfb92d14SAndroid Build Coastguard Worker self._addressfilterSet.add(macAddr) 1087*cfb92d14SAndroid Build Coastguard Worker print('current allowlist entries:') 1088*cfb92d14SAndroid Build Coastguard Worker for addr in self._addressfilterSet: 1089*cfb92d14SAndroid Build Coastguard Worker print(addr) 1090*cfb92d14SAndroid Build Coastguard Worker return ret 1091*cfb92d14SAndroid Build Coastguard Worker 1092*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1093*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('addAllowMAC() Error: ' + str(e)) 1094*cfb92d14SAndroid Build Coastguard Worker 1095*cfb92d14SAndroid Build Coastguard Worker def clearBlockList(self): 1096*cfb92d14SAndroid Build Coastguard Worker """clear all entries in denylist table 1097*cfb92d14SAndroid Build Coastguard Worker 1098*cfb92d14SAndroid Build Coastguard Worker Returns: 1099*cfb92d14SAndroid Build Coastguard Worker True: successful to clear the denylist 1100*cfb92d14SAndroid Build Coastguard Worker False: fail to clear the denylist 1101*cfb92d14SAndroid Build Coastguard Worker """ 1102*cfb92d14SAndroid Build Coastguard Worker print('%s call clearBlockList' % self.port) 1103*cfb92d14SAndroid Build Coastguard Worker 1104*cfb92d14SAndroid Build Coastguard Worker # remove all entries in denylist 1105*cfb92d14SAndroid Build Coastguard Worker try: 1106*cfb92d14SAndroid Build Coastguard Worker print('clearing denylist entries:') 1107*cfb92d14SAndroid Build Coastguard Worker for addr in self._addressfilterSet: 1108*cfb92d14SAndroid Build Coastguard Worker print(addr) 1109*cfb92d14SAndroid Build Coastguard Worker 1110*cfb92d14SAndroid Build Coastguard Worker # disable denylist 1111*cfb92d14SAndroid Build Coastguard Worker if self.__setAddressfilterMode('disable'): 1112*cfb92d14SAndroid Build Coastguard Worker # clear ops 1113*cfb92d14SAndroid Build Coastguard Worker for addr in self._addressfilterSet: 1114*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'remove MAC:Denylist:Entries ' + addr 1115*cfb92d14SAndroid Build Coastguard Worker self.__sendCommand(cmd) 1116*cfb92d14SAndroid Build Coastguard Worker 1117*cfb92d14SAndroid Build Coastguard Worker self._addressfilterSet.clear() 1118*cfb92d14SAndroid Build Coastguard Worker return True 1119*cfb92d14SAndroid Build Coastguard Worker 1120*cfb92d14SAndroid Build Coastguard Worker return False 1121*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1122*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('clearBlockList() Error: ' + str(e)) 1123*cfb92d14SAndroid Build Coastguard Worker 1124*cfb92d14SAndroid Build Coastguard Worker def clearAllowList(self): 1125*cfb92d14SAndroid Build Coastguard Worker """clear all entries in allowlist table 1126*cfb92d14SAndroid Build Coastguard Worker 1127*cfb92d14SAndroid Build Coastguard Worker Returns: 1128*cfb92d14SAndroid Build Coastguard Worker True: successful to clear the allowlist 1129*cfb92d14SAndroid Build Coastguard Worker False: fail to clear the allowlist 1130*cfb92d14SAndroid Build Coastguard Worker """ 1131*cfb92d14SAndroid Build Coastguard Worker print('%s call clearAllowList' % self.port) 1132*cfb92d14SAndroid Build Coastguard Worker 1133*cfb92d14SAndroid Build Coastguard Worker # remove all entries in allowlist 1134*cfb92d14SAndroid Build Coastguard Worker try: 1135*cfb92d14SAndroid Build Coastguard Worker print('clearing allowlist entries:') 1136*cfb92d14SAndroid Build Coastguard Worker for addr in self._addressfilterSet: 1137*cfb92d14SAndroid Build Coastguard Worker print(addr) 1138*cfb92d14SAndroid Build Coastguard Worker 1139*cfb92d14SAndroid Build Coastguard Worker # disable allowlist 1140*cfb92d14SAndroid Build Coastguard Worker if self.__setAddressfilterMode('disable'): 1141*cfb92d14SAndroid Build Coastguard Worker # clear ops 1142*cfb92d14SAndroid Build Coastguard Worker for addr in self._addressfilterSet: 1143*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'remove MAC:Allowlist:Entries ' + addr 1144*cfb92d14SAndroid Build Coastguard Worker self.__sendCommand(cmd) 1145*cfb92d14SAndroid Build Coastguard Worker 1146*cfb92d14SAndroid Build Coastguard Worker self._addressfilterSet.clear() 1147*cfb92d14SAndroid Build Coastguard Worker return True 1148*cfb92d14SAndroid Build Coastguard Worker 1149*cfb92d14SAndroid Build Coastguard Worker return False 1150*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1151*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('clearAllowList() Error: ' + str(e)) 1152*cfb92d14SAndroid Build Coastguard Worker 1153*cfb92d14SAndroid Build Coastguard Worker def getDeviceRole(self): 1154*cfb92d14SAndroid Build Coastguard Worker """get current device role in Thread Network""" 1155*cfb92d14SAndroid Build Coastguard Worker print('%s call getDeviceRole' % self.port) 1156*cfb92d14SAndroid Build Coastguard Worker return self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Network:NodeType')[0]) 1157*cfb92d14SAndroid Build Coastguard Worker 1158*cfb92d14SAndroid Build Coastguard Worker def joinNetwork(self, eRoleId): 1159*cfb92d14SAndroid Build Coastguard Worker """make device ready to join the Thread Network with a given role 1160*cfb92d14SAndroid Build Coastguard Worker 1161*cfb92d14SAndroid Build Coastguard Worker Args: 1162*cfb92d14SAndroid Build Coastguard Worker eRoleId: a given device role id 1163*cfb92d14SAndroid Build Coastguard Worker 1164*cfb92d14SAndroid Build Coastguard Worker Returns: 1165*cfb92d14SAndroid Build Coastguard Worker True: ready to set Thread Network parameter for joining desired Network 1166*cfb92d14SAndroid Build Coastguard Worker """ 1167*cfb92d14SAndroid Build Coastguard Worker print('%s call joinNetwork' % self.port) 1168*cfb92d14SAndroid Build Coastguard Worker print(eRoleId) 1169*cfb92d14SAndroid Build Coastguard Worker 1170*cfb92d14SAndroid Build Coastguard Worker self.deviceRole = eRoleId 1171*cfb92d14SAndroid Build Coastguard Worker mode = 15 1172*cfb92d14SAndroid Build Coastguard Worker try: 1173*cfb92d14SAndroid Build Coastguard Worker if ModuleHelper.LeaderDutChannelFound: 1174*cfb92d14SAndroid Build Coastguard Worker self.channel = ModuleHelper.Default_Channel 1175*cfb92d14SAndroid Build Coastguard Worker 1176*cfb92d14SAndroid Build Coastguard Worker # FIXME: when Harness call setNetworkDataRequirement()? 1177*cfb92d14SAndroid Build Coastguard Worker # only sleep end device requires stable networkdata now 1178*cfb92d14SAndroid Build Coastguard Worker if eRoleId == Thread_Device_Role.Leader: 1179*cfb92d14SAndroid Build Coastguard Worker print('join as leader') 1180*cfb92d14SAndroid Build Coastguard Worker # rdn 1181*cfb92d14SAndroid Build Coastguard Worker mode = 15 1182*cfb92d14SAndroid Build Coastguard Worker if self.AutoDUTEnable is False: 1183*cfb92d14SAndroid Build Coastguard Worker # set ROUTER_DOWNGRADE_THRESHOLD 1184*cfb92d14SAndroid Build Coastguard Worker self.__setRouterDowngradeThreshold(33) 1185*cfb92d14SAndroid Build Coastguard Worker elif eRoleId == Thread_Device_Role.Router: 1186*cfb92d14SAndroid Build Coastguard Worker print('join as router') 1187*cfb92d14SAndroid Build Coastguard Worker # rdn 1188*cfb92d14SAndroid Build Coastguard Worker mode = 15 1189*cfb92d14SAndroid Build Coastguard Worker if self.AutoDUTEnable is False: 1190*cfb92d14SAndroid Build Coastguard Worker # set ROUTER_DOWNGRADE_THRESHOLD 1191*cfb92d14SAndroid Build Coastguard Worker self.__setRouterDowngradeThreshold(33) 1192*cfb92d14SAndroid Build Coastguard Worker elif eRoleId == Thread_Device_Role.SED: 1193*cfb92d14SAndroid Build Coastguard Worker print('join as sleepy end device') 1194*cfb92d14SAndroid Build Coastguard Worker # s 1195*cfb92d14SAndroid Build Coastguard Worker mode = 4 1196*cfb92d14SAndroid Build Coastguard Worker self.__setPollPeriod(self.__sedPollPeriod) 1197*cfb92d14SAndroid Build Coastguard Worker elif eRoleId == Thread_Device_Role.EndDevice: 1198*cfb92d14SAndroid Build Coastguard Worker print('join as end device') 1199*cfb92d14SAndroid Build Coastguard Worker # rn 1200*cfb92d14SAndroid Build Coastguard Worker mode = 13 1201*cfb92d14SAndroid Build Coastguard Worker elif eRoleId == Thread_Device_Role.REED: 1202*cfb92d14SAndroid Build Coastguard Worker print('join as REED') 1203*cfb92d14SAndroid Build Coastguard Worker # rdn 1204*cfb92d14SAndroid Build Coastguard Worker mode = 15 1205*cfb92d14SAndroid Build Coastguard Worker # set ROUTER_UPGRADE_THRESHOLD 1206*cfb92d14SAndroid Build Coastguard Worker self.__setRouterUpgradeThreshold(0) 1207*cfb92d14SAndroid Build Coastguard Worker elif eRoleId == Thread_Device_Role.EndDevice_FED: 1208*cfb92d14SAndroid Build Coastguard Worker # always remain an ED, never request to be a router 1209*cfb92d14SAndroid Build Coastguard Worker print('join as FED') 1210*cfb92d14SAndroid Build Coastguard Worker # rdn 1211*cfb92d14SAndroid Build Coastguard Worker mode = 15 1212*cfb92d14SAndroid Build Coastguard Worker # set ROUTER_UPGRADE_THRESHOLD 1213*cfb92d14SAndroid Build Coastguard Worker self.__setRouterUpgradeThreshold(0) 1214*cfb92d14SAndroid Build Coastguard Worker elif eRoleId == Thread_Device_Role.EndDevice_MED: 1215*cfb92d14SAndroid Build Coastguard Worker print('join as MED') 1216*cfb92d14SAndroid Build Coastguard Worker # rn 1217*cfb92d14SAndroid Build Coastguard Worker mode = 13 1218*cfb92d14SAndroid Build Coastguard Worker else: 1219*cfb92d14SAndroid Build Coastguard Worker pass 1220*cfb92d14SAndroid Build Coastguard Worker 1221*cfb92d14SAndroid Build Coastguard Worker # set Thread device mode with a given role 1222*cfb92d14SAndroid Build Coastguard Worker self.__setDeviceMode(mode) 1223*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.1) 1224*cfb92d14SAndroid Build Coastguard Worker # start OpenThreadWpan 1225*cfb92d14SAndroid Build Coastguard Worker self.__startOpenThreadWpan() 1226*cfb92d14SAndroid Build Coastguard Worker time.sleep(3) 1227*cfb92d14SAndroid Build Coastguard Worker return True 1228*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1229*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('joinNetwork() Error: ' + str(e)) 1230*cfb92d14SAndroid Build Coastguard Worker 1231*cfb92d14SAndroid Build Coastguard Worker def getNetworkFragmentID(self): 1232*cfb92d14SAndroid Build Coastguard Worker """get current partition id of Thread Network Partition from LeaderData 1233*cfb92d14SAndroid Build Coastguard Worker 1234*cfb92d14SAndroid Build Coastguard Worker Returns: 1235*cfb92d14SAndroid Build Coastguard Worker The Thread network Partition Id 1236*cfb92d14SAndroid Build Coastguard Worker """ 1237*cfb92d14SAndroid Build Coastguard Worker print('%s call getNetworkFragmentID' % self.port) 1238*cfb92d14SAndroid Build Coastguard Worker if not self.____isOpenThreadWpanRunning(): 1239*cfb92d14SAndroid Build Coastguard Worker print('OpenThreadWpan is not running') 1240*cfb92d14SAndroid Build Coastguard Worker return None 1241*cfb92d14SAndroid Build Coastguard Worker 1242*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Network:PartitionId')[0] 1243*cfb92d14SAndroid Build Coastguard Worker 1244*cfb92d14SAndroid Build Coastguard Worker def getParentAddress(self): 1245*cfb92d14SAndroid Build Coastguard Worker """get Thread device's parent extended address and rloc16 short address 1246*cfb92d14SAndroid Build Coastguard Worker 1247*cfb92d14SAndroid Build Coastguard Worker Returns: 1248*cfb92d14SAndroid Build Coastguard Worker The extended address of parent in hex format 1249*cfb92d14SAndroid Build Coastguard Worker """ 1250*cfb92d14SAndroid Build Coastguard Worker print('%s call getParentAddress' % self.port) 1251*cfb92d14SAndroid Build Coastguard Worker parentInfo = [] 1252*cfb92d14SAndroid Build Coastguard Worker parentInfo = self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 1253*cfb92d14SAndroid Build Coastguard Worker 'getprop -v Thread:Parent')).split(' ') 1254*cfb92d14SAndroid Build Coastguard Worker 1255*cfb92d14SAndroid Build Coastguard Worker return parentInfo[0] 1256*cfb92d14SAndroid Build Coastguard Worker 1257*cfb92d14SAndroid Build Coastguard Worker def powerDown(self): 1258*cfb92d14SAndroid Build Coastguard Worker """power down the OpenThreadWpan""" 1259*cfb92d14SAndroid Build Coastguard Worker print('%s call powerDown' % self.port) 1260*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'setprop Daemon:AutoAssociateAfterReset false')[0] != 'Fail': 1261*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.5) 1262*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'reset')[0] != 'Fail': 1263*cfb92d14SAndroid Build Coastguard Worker self.isPowerDown = True 1264*cfb92d14SAndroid Build Coastguard Worker return True 1265*cfb92d14SAndroid Build Coastguard Worker else: 1266*cfb92d14SAndroid Build Coastguard Worker return False 1267*cfb92d14SAndroid Build Coastguard Worker else: 1268*cfb92d14SAndroid Build Coastguard Worker return False 1269*cfb92d14SAndroid Build Coastguard Worker 1270*cfb92d14SAndroid Build Coastguard Worker def powerUp(self): 1271*cfb92d14SAndroid Build Coastguard Worker """power up the Thread device""" 1272*cfb92d14SAndroid Build Coastguard Worker print('%s call powerUp' % self.port) 1273*cfb92d14SAndroid Build Coastguard Worker if not self.handle: 1274*cfb92d14SAndroid Build Coastguard Worker self._connect() 1275*cfb92d14SAndroid Build Coastguard Worker 1276*cfb92d14SAndroid Build Coastguard Worker self.isPowerDown = False 1277*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'attach')[0] != 'Fail': 1278*cfb92d14SAndroid Build Coastguard Worker time.sleep(3) 1279*cfb92d14SAndroid Build Coastguard Worker else: 1280*cfb92d14SAndroid Build Coastguard Worker return False 1281*cfb92d14SAndroid Build Coastguard Worker 1282*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'setprop Daemon:AutoAssociateAfterReset true')[0] == 'Fail': 1283*cfb92d14SAndroid Build Coastguard Worker return False 1284*cfb92d14SAndroid Build Coastguard Worker 1285*cfb92d14SAndroid Build Coastguard Worker if self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:State')[0]) != 'associated': 1286*cfb92d14SAndroid Build Coastguard Worker print('powerUp failed') 1287*cfb92d14SAndroid Build Coastguard Worker return False 1288*cfb92d14SAndroid Build Coastguard Worker else: 1289*cfb92d14SAndroid Build Coastguard Worker return True 1290*cfb92d14SAndroid Build Coastguard Worker 1291*cfb92d14SAndroid Build Coastguard Worker def reboot(self): 1292*cfb92d14SAndroid Build Coastguard Worker """reset and rejoin to Thread Network without any timeout 1293*cfb92d14SAndroid Build Coastguard Worker 1294*cfb92d14SAndroid Build Coastguard Worker Returns: 1295*cfb92d14SAndroid Build Coastguard Worker True: successful to reset and rejoin the Thread Network 1296*cfb92d14SAndroid Build Coastguard Worker False: fail to reset and rejoin the Thread Network 1297*cfb92d14SAndroid Build Coastguard Worker """ 1298*cfb92d14SAndroid Build Coastguard Worker print('%s call reboot' % self.port) 1299*cfb92d14SAndroid Build Coastguard Worker try: 1300*cfb92d14SAndroid Build Coastguard Worker self._sendline(self.wpan_cmd_prefix + 'reset') 1301*cfb92d14SAndroid Build Coastguard Worker self.isPowerDown = True 1302*cfb92d14SAndroid Build Coastguard Worker 1303*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:State')[0] != 'associated': 1304*cfb92d14SAndroid Build Coastguard Worker print('[FAIL] reboot') 1305*cfb92d14SAndroid Build Coastguard Worker return False 1306*cfb92d14SAndroid Build Coastguard Worker else: 1307*cfb92d14SAndroid Build Coastguard Worker return True 1308*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1309*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('reboot() Error: ' + str(e)) 1310*cfb92d14SAndroid Build Coastguard Worker 1311*cfb92d14SAndroid Build Coastguard Worker def ping(self, destination, length=20): 1312*cfb92d14SAndroid Build Coastguard Worker """ send ICMPv6 echo request with a given length to a unicast destination 1313*cfb92d14SAndroid Build Coastguard Worker address 1314*cfb92d14SAndroid Build Coastguard Worker 1315*cfb92d14SAndroid Build Coastguard Worker Args: 1316*cfb92d14SAndroid Build Coastguard Worker destination: the unicast destination address of ICMPv6 echo request 1317*cfb92d14SAndroid Build Coastguard Worker length: the size of ICMPv6 echo request payload 1318*cfb92d14SAndroid Build Coastguard Worker """ 1319*cfb92d14SAndroid Build Coastguard Worker print('%s call ping' % self.port) 1320*cfb92d14SAndroid Build Coastguard Worker print('destination: %s' % destination) 1321*cfb92d14SAndroid Build Coastguard Worker try: 1322*cfb92d14SAndroid Build Coastguard Worker cmd = 'ping %s -c 1 -s %s -I %s' % (destination, str(length), self.wpan_interface) 1323*cfb92d14SAndroid Build Coastguard Worker if self._is_net: 1324*cfb92d14SAndroid Build Coastguard Worker self.handle.exec_command(cmd) 1325*cfb92d14SAndroid Build Coastguard Worker else: 1326*cfb92d14SAndroid Build Coastguard Worker self._sendline(cmd) 1327*cfb92d14SAndroid Build Coastguard Worker self._expect(cmd) 1328*cfb92d14SAndroid Build Coastguard Worker # wait echo reply 1329*cfb92d14SAndroid Build Coastguard Worker time.sleep(1) 1330*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1331*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('ping() Error: ' + str(e)) 1332*cfb92d14SAndroid Build Coastguard Worker 1333*cfb92d14SAndroid Build Coastguard Worker def multicast_Ping(self, destination, length=20): 1334*cfb92d14SAndroid Build Coastguard Worker """send ICMPv6 echo request with a given length to a multicast destination 1335*cfb92d14SAndroid Build Coastguard Worker address 1336*cfb92d14SAndroid Build Coastguard Worker 1337*cfb92d14SAndroid Build Coastguard Worker Args: 1338*cfb92d14SAndroid Build Coastguard Worker destination: the multicast destination address of ICMPv6 echo request 1339*cfb92d14SAndroid Build Coastguard Worker length: the size of ICMPv6 echo request payload 1340*cfb92d14SAndroid Build Coastguard Worker """ 1341*cfb92d14SAndroid Build Coastguard Worker print('%s call multicast_Ping' % self.port) 1342*cfb92d14SAndroid Build Coastguard Worker print('destination: %s' % destination) 1343*cfb92d14SAndroid Build Coastguard Worker try: 1344*cfb92d14SAndroid Build Coastguard Worker cmd = 'ping %s -c 1 -s %s -I %s' % (destination, str(length), self.wpan_interface) 1345*cfb92d14SAndroid Build Coastguard Worker if self._is_net: 1346*cfb92d14SAndroid Build Coastguard Worker self.handle.exec_command(cmd) 1347*cfb92d14SAndroid Build Coastguard Worker else: 1348*cfb92d14SAndroid Build Coastguard Worker self._sendline(cmd) 1349*cfb92d14SAndroid Build Coastguard Worker self._expect(cmd) 1350*cfb92d14SAndroid Build Coastguard Worker # wait echo reply 1351*cfb92d14SAndroid Build Coastguard Worker time.sleep(1) 1352*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1353*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('multicast_ping() Error: ' + str(e)) 1354*cfb92d14SAndroid Build Coastguard Worker 1355*cfb92d14SAndroid Build Coastguard Worker def getVersionNumber(self): 1356*cfb92d14SAndroid Build Coastguard Worker """get OpenThreadWpan stack firmware version number""" 1357*cfb92d14SAndroid Build Coastguard Worker print('%s call getVersionNumber' % self.port) 1358*cfb92d14SAndroid Build Coastguard Worker versionStr = self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:Version')[0] 1359*cfb92d14SAndroid Build Coastguard Worker 1360*cfb92d14SAndroid Build Coastguard Worker return self.__stripValue(versionStr) 1361*cfb92d14SAndroid Build Coastguard Worker 1362*cfb92d14SAndroid Build Coastguard Worker def setPANID(self, xPAN): 1363*cfb92d14SAndroid Build Coastguard Worker """set Thread Network PAN ID 1364*cfb92d14SAndroid Build Coastguard Worker 1365*cfb92d14SAndroid Build Coastguard Worker Args: 1366*cfb92d14SAndroid Build Coastguard Worker xPAN: a given PAN ID in hex format 1367*cfb92d14SAndroid Build Coastguard Worker 1368*cfb92d14SAndroid Build Coastguard Worker Returns: 1369*cfb92d14SAndroid Build Coastguard Worker True: successful to set the Thread Network PAN ID 1370*cfb92d14SAndroid Build Coastguard Worker False: fail to set the Thread Network PAN ID 1371*cfb92d14SAndroid Build Coastguard Worker """ 1372*cfb92d14SAndroid Build Coastguard Worker print('%s call setPANID' % self.port) 1373*cfb92d14SAndroid Build Coastguard Worker print(xPAN) 1374*cfb92d14SAndroid Build Coastguard Worker panid = '' 1375*cfb92d14SAndroid Build Coastguard Worker try: 1376*cfb92d14SAndroid Build Coastguard Worker if not isinstance(xPAN, str): 1377*cfb92d14SAndroid Build Coastguard Worker panid = str(hex(xPAN)) 1378*cfb92d14SAndroid Build Coastguard Worker print(panid) 1379*cfb92d14SAndroid Build Coastguard Worker 1380*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop -s Network:PANID %s' % panid 1381*cfb92d14SAndroid Build Coastguard Worker datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:PanId %s' % panid 1382*cfb92d14SAndroid Build Coastguard Worker self.hasActiveDatasetToCommit = True 1383*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail' 1384*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1385*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setPANID() Error: ' + str(e)) 1386*cfb92d14SAndroid Build Coastguard Worker 1387*cfb92d14SAndroid Build Coastguard Worker def reset(self): 1388*cfb92d14SAndroid Build Coastguard Worker """factory reset""" 1389*cfb92d14SAndroid Build Coastguard Worker print('%s call reset' % self.port) 1390*cfb92d14SAndroid Build Coastguard Worker try: 1391*cfb92d14SAndroid Build Coastguard Worker if self._is_net: 1392*cfb92d14SAndroid Build Coastguard Worker self.__sendCommand(self.wpan_cmd_prefix + 'leave') 1393*cfb92d14SAndroid Build Coastguard Worker else: 1394*cfb92d14SAndroid Build Coastguard Worker self._sendline(self.wpan_cmd_prefix + 'leave') 1395*cfb92d14SAndroid Build Coastguard Worker 1396*cfb92d14SAndroid Build Coastguard Worker self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase') 1397*cfb92d14SAndroid Build Coastguard Worker time.sleep(2) 1398*cfb92d14SAndroid Build Coastguard Worker if not self._is_net: 1399*cfb92d14SAndroid Build Coastguard Worker self._read() 1400*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1401*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('reset() Error: ' + str(e)) 1402*cfb92d14SAndroid Build Coastguard Worker 1403*cfb92d14SAndroid Build Coastguard Worker def removeRouter(self, xRouterId): 1404*cfb92d14SAndroid Build Coastguard Worker """kick router with a given router id from the Thread Network 1405*cfb92d14SAndroid Build Coastguard Worker 1406*cfb92d14SAndroid Build Coastguard Worker Args: 1407*cfb92d14SAndroid Build Coastguard Worker xRouterId: a given router id in hex format 1408*cfb92d14SAndroid Build Coastguard Worker 1409*cfb92d14SAndroid Build Coastguard Worker Returns: 1410*cfb92d14SAndroid Build Coastguard Worker True: successful to remove the router from the Thread Network 1411*cfb92d14SAndroid Build Coastguard Worker False: fail to remove the router from the Thread Network 1412*cfb92d14SAndroid Build Coastguard Worker """ 1413*cfb92d14SAndroid Build Coastguard Worker print('%s call removeRouter' % self.port) 1414*cfb92d14SAndroid Build Coastguard Worker print(xRouterId) 1415*cfb92d14SAndroid Build Coastguard Worker routerId = '' 1416*cfb92d14SAndroid Build Coastguard Worker routerId = self.__convertRlocToRouterId(xRouterId) 1417*cfb92d14SAndroid Build Coastguard Worker print(routerId) 1418*cfb92d14SAndroid Build Coastguard Worker 1419*cfb92d14SAndroid Build Coastguard Worker if routerId is None: 1420*cfb92d14SAndroid Build Coastguard Worker print('no matched xRouterId') 1421*cfb92d14SAndroid Build Coastguard Worker return False 1422*cfb92d14SAndroid Build Coastguard Worker 1423*cfb92d14SAndroid Build Coastguard Worker try: 1424*cfb92d14SAndroid Build Coastguard Worker cmd = 'releaserouterid %s' % routerId 1425*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 1426*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1427*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('removeRouter() Error: ' + str(e)) 1428*cfb92d14SAndroid Build Coastguard Worker 1429*cfb92d14SAndroid Build Coastguard Worker def setDefaultValues(self): 1430*cfb92d14SAndroid Build Coastguard Worker """set default mandatory Thread Network parameter value""" 1431*cfb92d14SAndroid Build Coastguard Worker print('%s call setDefaultValues' % self.port) 1432*cfb92d14SAndroid Build Coastguard Worker 1433*cfb92d14SAndroid Build Coastguard Worker # initialize variables 1434*cfb92d14SAndroid Build Coastguard Worker self.networkName = ModuleHelper.Default_NwkName 1435*cfb92d14SAndroid Build Coastguard Worker assert '"' not in self.networkName 1436*cfb92d14SAndroid Build Coastguard Worker self.networkKey = ModuleHelper.Default_NwkKey 1437*cfb92d14SAndroid Build Coastguard Worker self.channel = ModuleHelper.Default_Channel 1438*cfb92d14SAndroid Build Coastguard Worker self.channelMask = '0x7fff800' # (0xffff << 11) 1439*cfb92d14SAndroid Build Coastguard Worker self.panId = ModuleHelper.Default_PanId 1440*cfb92d14SAndroid Build Coastguard Worker self.xpanId = ModuleHelper.Default_XpanId 1441*cfb92d14SAndroid Build Coastguard Worker self.meshLocalPrefix = ModuleHelper.Default_MLPrefix 1442*cfb92d14SAndroid Build Coastguard Worker # OT only accept hex format PSKc for now 1443*cfb92d14SAndroid Build Coastguard Worker self.pskc = '00000000000000000000000000000000' 1444*cfb92d14SAndroid Build Coastguard Worker self.securityPolicySecs = ModuleHelper.Default_SecurityPolicy 1445*cfb92d14SAndroid Build Coastguard Worker self.securityPolicyFlags = 'onrc' 1446*cfb92d14SAndroid Build Coastguard Worker self.activetimestamp = ModuleHelper.Default_ActiveTimestamp 1447*cfb92d14SAndroid Build Coastguard Worker # self.sedPollingRate = ModuleHelper.Default_Harness_SED_Polling_Rate 1448*cfb92d14SAndroid Build Coastguard Worker self.__sedPollPeriod = 3 * 1000 # in milliseconds 1449*cfb92d14SAndroid Build Coastguard Worker self.deviceRole = None 1450*cfb92d14SAndroid Build Coastguard Worker self.provisioningUrl = '' 1451*cfb92d14SAndroid Build Coastguard Worker self.hasActiveDatasetToCommit = False 1452*cfb92d14SAndroid Build Coastguard Worker self.logThread = Queue() 1453*cfb92d14SAndroid Build Coastguard Worker self.logThreadStatus = self.logStatus['stop'] 1454*cfb92d14SAndroid Build Coastguard Worker # indicate Thread device requests full or stable network data 1455*cfb92d14SAndroid Build Coastguard Worker self.networkDataRequirement = '' 1456*cfb92d14SAndroid Build Coastguard Worker # indicate if Thread device experiences a power down event 1457*cfb92d14SAndroid Build Coastguard Worker self.isPowerDown = False 1458*cfb92d14SAndroid Build Coastguard Worker # indicate AddressFilter mode ['disable', 'allowlist', 'denylist'] 1459*cfb92d14SAndroid Build Coastguard Worker self._addressfilterMode = 'disable' 1460*cfb92d14SAndroid Build Coastguard Worker self._addressfilterSet = set() # cache filter entries 1461*cfb92d14SAndroid Build Coastguard Worker # indicate if Thread device is an active commissioner 1462*cfb92d14SAndroid Build Coastguard Worker self.isActiveCommissioner = False 1463*cfb92d14SAndroid Build Coastguard Worker self._lines = None # buffered lines read from device 1464*cfb92d14SAndroid Build Coastguard Worker 1465*cfb92d14SAndroid Build Coastguard Worker # initialize device configuration 1466*cfb92d14SAndroid Build Coastguard Worker try: 1467*cfb92d14SAndroid Build Coastguard Worker self.setMAC(self.mac) 1468*cfb92d14SAndroid Build Coastguard Worker self.__setChannelMask(self.channelMask) 1469*cfb92d14SAndroid Build Coastguard Worker self.__setSecurityPolicy(self.securityPolicySecs, self.securityPolicyFlags) 1470*cfb92d14SAndroid Build Coastguard Worker self.setChannel(self.channel) 1471*cfb92d14SAndroid Build Coastguard Worker self.setPANID(self.panId) 1472*cfb92d14SAndroid Build Coastguard Worker self.setXpanId(self.xpanId) 1473*cfb92d14SAndroid Build Coastguard Worker self.setNetworkName(self.networkName) 1474*cfb92d14SAndroid Build Coastguard Worker self.setNetworkKey(self.networkKey) 1475*cfb92d14SAndroid Build Coastguard Worker self.setMLPrefix(self.meshLocalPrefix) 1476*cfb92d14SAndroid Build Coastguard Worker self.setPSKc(self.pskc) 1477*cfb92d14SAndroid Build Coastguard Worker self.setActiveTimestamp(self.activetimestamp) 1478*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1479*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setDefaultValue() Error: ' + str(e)) 1480*cfb92d14SAndroid Build Coastguard Worker 1481*cfb92d14SAndroid Build Coastguard Worker def getDeviceConncetionStatus(self): 1482*cfb92d14SAndroid Build Coastguard Worker """check if serial port connection is ready or not""" 1483*cfb92d14SAndroid Build Coastguard Worker print('%s call getDeviceConnectionStatus' % self.port) 1484*cfb92d14SAndroid Build Coastguard Worker return self.deviceConnected 1485*cfb92d14SAndroid Build Coastguard Worker 1486*cfb92d14SAndroid Build Coastguard Worker def setPollingRate(self, iPollingRate): 1487*cfb92d14SAndroid Build Coastguard Worker """set data polling rate for sleepy end device 1488*cfb92d14SAndroid Build Coastguard Worker 1489*cfb92d14SAndroid Build Coastguard Worker Args: 1490*cfb92d14SAndroid Build Coastguard Worker iPollingRate: data poll period of sleepy end device (in seconds) 1491*cfb92d14SAndroid Build Coastguard Worker 1492*cfb92d14SAndroid Build Coastguard Worker Returns: 1493*cfb92d14SAndroid Build Coastguard Worker True: successful to set the data polling rate for sleepy end device 1494*cfb92d14SAndroid Build Coastguard Worker False: fail to set the data polling rate for sleepy end device 1495*cfb92d14SAndroid Build Coastguard Worker """ 1496*cfb92d14SAndroid Build Coastguard Worker print('%s call setPollingRate' % self.port) 1497*cfb92d14SAndroid Build Coastguard Worker 1498*cfb92d14SAndroid Build Coastguard Worker iPollingRate = int(iPollingRate * 1000) 1499*cfb92d14SAndroid Build Coastguard Worker print(iPollingRate) 1500*cfb92d14SAndroid Build Coastguard Worker 1501*cfb92d14SAndroid Build Coastguard Worker if self.__sedPollPeriod != iPollingRate: 1502*cfb92d14SAndroid Build Coastguard Worker self.__sedPollPeriod = iPollingRate 1503*cfb92d14SAndroid Build Coastguard Worker 1504*cfb92d14SAndroid Build Coastguard Worker # apply immediately 1505*cfb92d14SAndroid Build Coastguard Worker if self.__isOpenThreadWpanRunning(): 1506*cfb92d14SAndroid Build Coastguard Worker return self.__setPollPeriod(self.__sedPollPeriod) 1507*cfb92d14SAndroid Build Coastguard Worker 1508*cfb92d14SAndroid Build Coastguard Worker return True 1509*cfb92d14SAndroid Build Coastguard Worker 1510*cfb92d14SAndroid Build Coastguard Worker def __setPollPeriod(self, iPollPeriod): 1511*cfb92d14SAndroid Build Coastguard Worker """set data poll period for sleepy end device 1512*cfb92d14SAndroid Build Coastguard Worker 1513*cfb92d14SAndroid Build Coastguard Worker Args: 1514*cfb92d14SAndroid Build Coastguard Worker iPollPeriod: data poll period of sleepy end device (in milliseconds) 1515*cfb92d14SAndroid Build Coastguard Worker 1516*cfb92d14SAndroid Build Coastguard Worker Returns: 1517*cfb92d14SAndroid Build Coastguard Worker True: successful to set the data poll period for sleepy end device 1518*cfb92d14SAndroid Build Coastguard Worker False: fail to set the data poll period for sleepy end device 1519*cfb92d14SAndroid Build Coastguard Worker """ 1520*cfb92d14SAndroid Build Coastguard Worker try: 1521*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop NCP:SleepyPollInterval %s' % str(iPollPeriod) 1522*cfb92d14SAndroid Build Coastguard Worker print(cmd) 1523*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 1524*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1525*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('__setPollingRate() Error: ' + str(e)) 1526*cfb92d14SAndroid Build Coastguard Worker 1527*cfb92d14SAndroid Build Coastguard Worker def setLinkQuality(self, EUIadr, LinkQuality): 1528*cfb92d14SAndroid Build Coastguard Worker """set custom LinkQualityIn for all receiving messages from the specified EUIadr 1529*cfb92d14SAndroid Build Coastguard Worker 1530*cfb92d14SAndroid Build Coastguard Worker Args: 1531*cfb92d14SAndroid Build Coastguard Worker EUIadr: a given extended address 1532*cfb92d14SAndroid Build Coastguard Worker LinkQuality: a given custom link quality 1533*cfb92d14SAndroid Build Coastguard Worker link quality/link margin mapping table 1534*cfb92d14SAndroid Build Coastguard Worker 3: 21 - 255 (dB) 1535*cfb92d14SAndroid Build Coastguard Worker 2: 11 - 20 (dB) 1536*cfb92d14SAndroid Build Coastguard Worker 1: 3 - 9 (dB) 1537*cfb92d14SAndroid Build Coastguard Worker 0: 0 - 2 (dB) 1538*cfb92d14SAndroid Build Coastguard Worker 1539*cfb92d14SAndroid Build Coastguard Worker Returns: 1540*cfb92d14SAndroid Build Coastguard Worker True: successful to set the link quality 1541*cfb92d14SAndroid Build Coastguard Worker False: fail to set the link quality 1542*cfb92d14SAndroid Build Coastguard Worker 1543*cfb92d14SAndroid Build Coastguard Worker @todo: required if as reference device 1544*cfb92d14SAndroid Build Coastguard Worker """ 1545*cfb92d14SAndroid Build Coastguard Worker 1546*cfb92d14SAndroid Build Coastguard Worker def setOutBoundLinkQuality(self, LinkQuality): 1547*cfb92d14SAndroid Build Coastguard Worker """set custom LinkQualityIn for all receiving messages from the any address 1548*cfb92d14SAndroid Build Coastguard Worker 1549*cfb92d14SAndroid Build Coastguard Worker Args: 1550*cfb92d14SAndroid Build Coastguard Worker LinkQuality: a given custom link quality 1551*cfb92d14SAndroid Build Coastguard Worker link quality/link margin mapping table 1552*cfb92d14SAndroid Build Coastguard Worker 3: 21 - 255 (dB) 1553*cfb92d14SAndroid Build Coastguard Worker 2: 11 - 20 (dB) 1554*cfb92d14SAndroid Build Coastguard Worker 1: 3 - 9 (dB) 1555*cfb92d14SAndroid Build Coastguard Worker 0: 0 - 2 (dB) 1556*cfb92d14SAndroid Build Coastguard Worker 1557*cfb92d14SAndroid Build Coastguard Worker Returns: 1558*cfb92d14SAndroid Build Coastguard Worker True: successful to set the link quality 1559*cfb92d14SAndroid Build Coastguard Worker False: fail to set the link quality 1560*cfb92d14SAndroid Build Coastguard Worker 1561*cfb92d14SAndroid Build Coastguard Worker @todo: required if as reference device 1562*cfb92d14SAndroid Build Coastguard Worker """ 1563*cfb92d14SAndroid Build Coastguard Worker 1564*cfb92d14SAndroid Build Coastguard Worker def removeRouterPrefix(self, prefixEntry): 1565*cfb92d14SAndroid Build Coastguard Worker """remove the configured prefix on a border router 1566*cfb92d14SAndroid Build Coastguard Worker 1567*cfb92d14SAndroid Build Coastguard Worker Args: 1568*cfb92d14SAndroid Build Coastguard Worker prefixEntry: a on-mesh prefix entry 1569*cfb92d14SAndroid Build Coastguard Worker 1570*cfb92d14SAndroid Build Coastguard Worker Returns: 1571*cfb92d14SAndroid Build Coastguard Worker True: successful to remove the prefix entry from border router 1572*cfb92d14SAndroid Build Coastguard Worker False: fail to remove the prefix entry from border router 1573*cfb92d14SAndroid Build Coastguard Worker 1574*cfb92d14SAndroid Build Coastguard Worker @todo: required if as reference device 1575*cfb92d14SAndroid Build Coastguard Worker """ 1576*cfb92d14SAndroid Build Coastguard Worker 1577*cfb92d14SAndroid Build Coastguard Worker def resetAndRejoin(self, timeout): 1578*cfb92d14SAndroid Build Coastguard Worker """reset and join back Thread Network with a given timeout delay 1579*cfb92d14SAndroid Build Coastguard Worker 1580*cfb92d14SAndroid Build Coastguard Worker Args: 1581*cfb92d14SAndroid Build Coastguard Worker timeout: a timeout interval before rejoin Thread Network 1582*cfb92d14SAndroid Build Coastguard Worker 1583*cfb92d14SAndroid Build Coastguard Worker Returns: 1584*cfb92d14SAndroid Build Coastguard Worker True: successful to reset and rejoin Thread Network 1585*cfb92d14SAndroid Build Coastguard Worker False: fail to reset and rejoin the Thread Network 1586*cfb92d14SAndroid Build Coastguard Worker """ 1587*cfb92d14SAndroid Build Coastguard Worker print('%s call resetAndRejoin' % self.port) 1588*cfb92d14SAndroid Build Coastguard Worker print(timeout) 1589*cfb92d14SAndroid Build Coastguard Worker try: 1590*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'setprop Daemon:AutoAssociateAfterReset false')[0] != 'Fail': 1591*cfb92d14SAndroid Build Coastguard Worker time.sleep(0.5) 1592*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'reset')[0] != 'Fail': 1593*cfb92d14SAndroid Build Coastguard Worker self.isPowerDown = True 1594*cfb92d14SAndroid Build Coastguard Worker else: 1595*cfb92d14SAndroid Build Coastguard Worker return False 1596*cfb92d14SAndroid Build Coastguard Worker else: 1597*cfb92d14SAndroid Build Coastguard Worker return False 1598*cfb92d14SAndroid Build Coastguard Worker time.sleep(timeout) 1599*cfb92d14SAndroid Build Coastguard Worker 1600*cfb92d14SAndroid Build Coastguard Worker if self.deviceRole == Thread_Device_Role.SED: 1601*cfb92d14SAndroid Build Coastguard Worker self.__setPollPeriod(self.__sedPollPeriod) 1602*cfb92d14SAndroid Build Coastguard Worker 1603*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'attach')[0] != 'Fail': 1604*cfb92d14SAndroid Build Coastguard Worker time.sleep(3) 1605*cfb92d14SAndroid Build Coastguard Worker else: 1606*cfb92d14SAndroid Build Coastguard Worker return False 1607*cfb92d14SAndroid Build Coastguard Worker 1608*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'setprop Daemon:AutoAssociateAfterReset true')[0] == 'Fail': 1609*cfb92d14SAndroid Build Coastguard Worker return False 1610*cfb92d14SAndroid Build Coastguard Worker 1611*cfb92d14SAndroid Build Coastguard Worker if self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:State')[0]) != 'associated': 1612*cfb92d14SAndroid Build Coastguard Worker print('[FAIL] reset and rejoin') 1613*cfb92d14SAndroid Build Coastguard Worker return False 1614*cfb92d14SAndroid Build Coastguard Worker return True 1615*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1616*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('resetAndRejoin() Error: ' + str(e)) 1617*cfb92d14SAndroid Build Coastguard Worker 1618*cfb92d14SAndroid Build Coastguard Worker def configBorderRouter(self, 1619*cfb92d14SAndroid Build Coastguard Worker P_Prefix, 1620*cfb92d14SAndroid Build Coastguard Worker P_stable=1, 1621*cfb92d14SAndroid Build Coastguard Worker P_default=1, 1622*cfb92d14SAndroid Build Coastguard Worker P_slaac_preferred=0, 1623*cfb92d14SAndroid Build Coastguard Worker P_Dhcp=0, 1624*cfb92d14SAndroid Build Coastguard Worker P_preference=0, 1625*cfb92d14SAndroid Build Coastguard Worker P_on_mesh=1, 1626*cfb92d14SAndroid Build Coastguard Worker P_nd_dns=0): 1627*cfb92d14SAndroid Build Coastguard Worker """configure the border router with a given prefix entry parameters 1628*cfb92d14SAndroid Build Coastguard Worker 1629*cfb92d14SAndroid Build Coastguard Worker Args: 1630*cfb92d14SAndroid Build Coastguard Worker P_Prefix: IPv6 prefix that is available on the Thread Network 1631*cfb92d14SAndroid Build Coastguard Worker P_stable: true if the default router is expected to be stable network data 1632*cfb92d14SAndroid Build Coastguard Worker P_default: true if border router offers the default route for P_Prefix 1633*cfb92d14SAndroid Build Coastguard Worker P_slaac_preferred: true if allowing auto-configure address using P_Prefix 1634*cfb92d14SAndroid Build Coastguard Worker P_Dhcp: is true if border router is a DHCPv6 Agent 1635*cfb92d14SAndroid Build Coastguard Worker P_preference: is two-bit signed integer indicating router preference 1636*cfb92d14SAndroid Build Coastguard Worker P_on_mesh: is true if P_Prefix is considered to be on-mesh 1637*cfb92d14SAndroid Build Coastguard Worker P_nd_dns: is true if border router is able to supply DNS information obtained via ND 1638*cfb92d14SAndroid Build Coastguard Worker 1639*cfb92d14SAndroid Build Coastguard Worker Returns: 1640*cfb92d14SAndroid Build Coastguard Worker True: successful to configure the border router with a given prefix entry 1641*cfb92d14SAndroid Build Coastguard Worker False: fail to configure the border router with a given prefix entry 1642*cfb92d14SAndroid Build Coastguard Worker """ 1643*cfb92d14SAndroid Build Coastguard Worker print('%s call configBorderRouter' % self.port) 1644*cfb92d14SAndroid Build Coastguard Worker prefix = self.__convertIp6PrefixStringToIp6Address(str(P_Prefix)) 1645*cfb92d14SAndroid Build Coastguard Worker print(prefix) 1646*cfb92d14SAndroid Build Coastguard Worker try: 1647*cfb92d14SAndroid Build Coastguard Worker parameter = '' 1648*cfb92d14SAndroid Build Coastguard Worker 1649*cfb92d14SAndroid Build Coastguard Worker if P_slaac_preferred == 1: 1650*cfb92d14SAndroid Build Coastguard Worker parameter += ' -a -f' 1651*cfb92d14SAndroid Build Coastguard Worker 1652*cfb92d14SAndroid Build Coastguard Worker if P_stable == 1: 1653*cfb92d14SAndroid Build Coastguard Worker parameter += ' -s' 1654*cfb92d14SAndroid Build Coastguard Worker 1655*cfb92d14SAndroid Build Coastguard Worker if P_default == 1: 1656*cfb92d14SAndroid Build Coastguard Worker parameter += ' -r' 1657*cfb92d14SAndroid Build Coastguard Worker 1658*cfb92d14SAndroid Build Coastguard Worker if P_Dhcp == 1: 1659*cfb92d14SAndroid Build Coastguard Worker parameter += ' -d' 1660*cfb92d14SAndroid Build Coastguard Worker 1661*cfb92d14SAndroid Build Coastguard Worker if P_on_mesh == 1: 1662*cfb92d14SAndroid Build Coastguard Worker parameter += ' -o' 1663*cfb92d14SAndroid Build Coastguard Worker 1664*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'add-prefix %s %s -P %d' % (prefix, parameter, P_preference) 1665*cfb92d14SAndroid Build Coastguard Worker print(parameter) 1666*cfb92d14SAndroid Build Coastguard Worker print(cmd) 1667*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(cmd)[0] != 'Fail': 1668*cfb92d14SAndroid Build Coastguard Worker return True 1669*cfb92d14SAndroid Build Coastguard Worker else: 1670*cfb92d14SAndroid Build Coastguard Worker return False 1671*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1672*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('configBorderRouter() Error: ' + str(e)) 1673*cfb92d14SAndroid Build Coastguard Worker 1674*cfb92d14SAndroid Build Coastguard Worker def setNetworkIDTimeout(self, iNwkIDTimeOut): 1675*cfb92d14SAndroid Build Coastguard Worker """set networkid timeout for OpenThreadWpan 1676*cfb92d14SAndroid Build Coastguard Worker 1677*cfb92d14SAndroid Build Coastguard Worker Args: 1678*cfb92d14SAndroid Build Coastguard Worker iNwkIDTimeOut: a given NETWORK_ID_TIMEOUT 1679*cfb92d14SAndroid Build Coastguard Worker 1680*cfb92d14SAndroid Build Coastguard Worker Returns: 1681*cfb92d14SAndroid Build Coastguard Worker True: successful to set NETWORK_ID_TIMEOUT 1682*cfb92d14SAndroid Build Coastguard Worker False: fail to set NETWORK_ID_TIMEOUT 1683*cfb92d14SAndroid Build Coastguard Worker 1684*cfb92d14SAndroid Build Coastguard Worker @todo: required if as reference device 1685*cfb92d14SAndroid Build Coastguard Worker """ 1686*cfb92d14SAndroid Build Coastguard Worker 1687*cfb92d14SAndroid Build Coastguard Worker def setKeepAliveTimeOut(self, iTimeOut): 1688*cfb92d14SAndroid Build Coastguard Worker """set keep alive timeout for device 1689*cfb92d14SAndroid Build Coastguard Worker has been deprecated and also set SED polling rate 1690*cfb92d14SAndroid Build Coastguard Worker 1691*cfb92d14SAndroid Build Coastguard Worker Args: 1692*cfb92d14SAndroid Build Coastguard Worker iTimeOut: data poll period for sleepy end device 1693*cfb92d14SAndroid Build Coastguard Worker 1694*cfb92d14SAndroid Build Coastguard Worker Returns: 1695*cfb92d14SAndroid Build Coastguard Worker True: successful to set the data poll period for SED 1696*cfb92d14SAndroid Build Coastguard Worker False: fail to set the data poll period for SED 1697*cfb92d14SAndroid Build Coastguard Worker """ 1698*cfb92d14SAndroid Build Coastguard Worker print('%s call setKeepAliveTimeOut' % self.port) 1699*cfb92d14SAndroid Build Coastguard Worker print(iTimeOut) 1700*cfb92d14SAndroid Build Coastguard Worker try: 1701*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop NCP:SleepyPollInterval %s' % str(iTimeOut * 1000) 1702*cfb92d14SAndroid Build Coastguard Worker print(cmd) 1703*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 1704*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1705*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setKeepAliveTimeOut() Error: ' + str(e)) 1706*cfb92d14SAndroid Build Coastguard Worker 1707*cfb92d14SAndroid Build Coastguard Worker def setKeySequenceCounter(self, iKeySequenceValue): 1708*cfb92d14SAndroid Build Coastguard Worker """ set the Key sequence counter corresponding to Thread network key 1709*cfb92d14SAndroid Build Coastguard Worker 1710*cfb92d14SAndroid Build Coastguard Worker Args: 1711*cfb92d14SAndroid Build Coastguard Worker iKeySequenceValue: key sequence value 1712*cfb92d14SAndroid Build Coastguard Worker 1713*cfb92d14SAndroid Build Coastguard Worker Returns: 1714*cfb92d14SAndroid Build Coastguard Worker True: successful to set the key sequence 1715*cfb92d14SAndroid Build Coastguard Worker False: fail to set the key sequence 1716*cfb92d14SAndroid Build Coastguard Worker """ 1717*cfb92d14SAndroid Build Coastguard Worker print('%s call setKeySequenceCounter' % self.port) 1718*cfb92d14SAndroid Build Coastguard Worker print(iKeySequenceValue) 1719*cfb92d14SAndroid Build Coastguard Worker try: 1720*cfb92d14SAndroid Build Coastguard Worker # avoid key switch guard timer protection for reference device 1721*cfb92d14SAndroid Build Coastguard Worker self.__setKeySwitchGuardTime(0) 1722*cfb92d14SAndroid Build Coastguard Worker 1723*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Network:KeyIndex %s' % str(iKeySequenceValue) 1724*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(cmd)[0] != 'Fail': 1725*cfb92d14SAndroid Build Coastguard Worker time.sleep(1) 1726*cfb92d14SAndroid Build Coastguard Worker return True 1727*cfb92d14SAndroid Build Coastguard Worker else: 1728*cfb92d14SAndroid Build Coastguard Worker return False 1729*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1730*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setKeySequenceCounter() Error: ' + str(e)) 1731*cfb92d14SAndroid Build Coastguard Worker 1732*cfb92d14SAndroid Build Coastguard Worker def getKeySequenceCounter(self): 1733*cfb92d14SAndroid Build Coastguard Worker """get current Thread Network key sequence""" 1734*cfb92d14SAndroid Build Coastguard Worker print('%s call getKeySequenceCounter' % self.port) 1735*cfb92d14SAndroid Build Coastguard Worker keySequence = '' 1736*cfb92d14SAndroid Build Coastguard Worker keySequence = self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Network:KeyIndex')[0] 1737*cfb92d14SAndroid Build Coastguard Worker return keySequence 1738*cfb92d14SAndroid Build Coastguard Worker 1739*cfb92d14SAndroid Build Coastguard Worker def incrementKeySequenceCounter(self, iIncrementValue=1): 1740*cfb92d14SAndroid Build Coastguard Worker """increment the key sequence with a given value 1741*cfb92d14SAndroid Build Coastguard Worker 1742*cfb92d14SAndroid Build Coastguard Worker Args: 1743*cfb92d14SAndroid Build Coastguard Worker iIncrementValue: specific increment value to be added 1744*cfb92d14SAndroid Build Coastguard Worker 1745*cfb92d14SAndroid Build Coastguard Worker Returns: 1746*cfb92d14SAndroid Build Coastguard Worker True: successful to increment the key sequence with a given value 1747*cfb92d14SAndroid Build Coastguard Worker False: fail to increment the key sequence with a given value 1748*cfb92d14SAndroid Build Coastguard Worker """ 1749*cfb92d14SAndroid Build Coastguard Worker print('%s call incrementKeySequenceCounter' % self.port) 1750*cfb92d14SAndroid Build Coastguard Worker print(iIncrementValue) 1751*cfb92d14SAndroid Build Coastguard Worker currentKeySeq = '' 1752*cfb92d14SAndroid Build Coastguard Worker try: 1753*cfb92d14SAndroid Build Coastguard Worker # avoid key switch guard timer protection for reference device 1754*cfb92d14SAndroid Build Coastguard Worker self.__setKeySwitchGuardTime(0) 1755*cfb92d14SAndroid Build Coastguard Worker 1756*cfb92d14SAndroid Build Coastguard Worker currentKeySeq = self.getKeySequenceCounter() 1757*cfb92d14SAndroid Build Coastguard Worker keySequence = int(currentKeySeq, 10) + iIncrementValue 1758*cfb92d14SAndroid Build Coastguard Worker print(keySequence) 1759*cfb92d14SAndroid Build Coastguard Worker return self.setKeySequenceCounter(keySequence) 1760*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1761*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('incrementKeySequenceCounter() Error: ' + str(e)) 1762*cfb92d14SAndroid Build Coastguard Worker 1763*cfb92d14SAndroid Build Coastguard Worker def setNetworkDataRequirement(self, eDataRequirement): 1764*cfb92d14SAndroid Build Coastguard Worker """set whether the Thread device requires the full network data 1765*cfb92d14SAndroid Build Coastguard Worker or only requires the stable network data 1766*cfb92d14SAndroid Build Coastguard Worker 1767*cfb92d14SAndroid Build Coastguard Worker Args: 1768*cfb92d14SAndroid Build Coastguard Worker eDataRequirement: is true if requiring the full network data 1769*cfb92d14SAndroid Build Coastguard Worker 1770*cfb92d14SAndroid Build Coastguard Worker Returns: 1771*cfb92d14SAndroid Build Coastguard Worker True: successful to set the network requirement 1772*cfb92d14SAndroid Build Coastguard Worker """ 1773*cfb92d14SAndroid Build Coastguard Worker print('%s call setNetworkDataRequirement' % self.port) 1774*cfb92d14SAndroid Build Coastguard Worker print(eDataRequirement) 1775*cfb92d14SAndroid Build Coastguard Worker 1776*cfb92d14SAndroid Build Coastguard Worker if eDataRequirement == Device_Data_Requirement.ALL_DATA: 1777*cfb92d14SAndroid Build Coastguard Worker self.networkDataRequirement = 'n' 1778*cfb92d14SAndroid Build Coastguard Worker return True 1779*cfb92d14SAndroid Build Coastguard Worker 1780*cfb92d14SAndroid Build Coastguard Worker def configExternalRouter(self, P_Prefix, P_stable, R_Preference=0): 1781*cfb92d14SAndroid Build Coastguard Worker """configure border router with a given external route prefix entry 1782*cfb92d14SAndroid Build Coastguard Worker 1783*cfb92d14SAndroid Build Coastguard Worker Args: 1784*cfb92d14SAndroid Build Coastguard Worker P_Prefix: IPv6 prefix for the route 1785*cfb92d14SAndroid Build Coastguard Worker P_Stable: is true if the external route prefix is stable network data 1786*cfb92d14SAndroid Build Coastguard Worker R_Preference: a two-bit signed integer indicating Router preference 1787*cfb92d14SAndroid Build Coastguard Worker 1: high 1788*cfb92d14SAndroid Build Coastguard Worker 0: medium 1789*cfb92d14SAndroid Build Coastguard Worker -1: low 1790*cfb92d14SAndroid Build Coastguard Worker 1791*cfb92d14SAndroid Build Coastguard Worker Returns: 1792*cfb92d14SAndroid Build Coastguard Worker True: successful to configure the border router with a given external route prefix 1793*cfb92d14SAndroid Build Coastguard Worker False: fail to configure the border router with a given external route prefix 1794*cfb92d14SAndroid Build Coastguard Worker """ 1795*cfb92d14SAndroid Build Coastguard Worker print('%s call configExternalRouter' % self.port) 1796*cfb92d14SAndroid Build Coastguard Worker print(P_Prefix) 1797*cfb92d14SAndroid Build Coastguard Worker prefix = self.__convertIp6PrefixStringToIp6Address(str(P_Prefix)) 1798*cfb92d14SAndroid Build Coastguard Worker try: 1799*cfb92d14SAndroid Build Coastguard Worker if P_stable: 1800*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'add-route %s -l 64 -p %d' % (prefix, R_Preference) 1801*cfb92d14SAndroid Build Coastguard Worker else: 1802*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'add-route %s -l 64 -p %d -n' % (prefix, R_Preference) 1803*cfb92d14SAndroid Build Coastguard Worker print(cmd) 1804*cfb92d14SAndroid Build Coastguard Worker 1805*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(cmd)[0] != 'Fail': 1806*cfb92d14SAndroid Build Coastguard Worker return True 1807*cfb92d14SAndroid Build Coastguard Worker else: 1808*cfb92d14SAndroid Build Coastguard Worker return False 1809*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1810*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('configExternalRouter() Error: ' + str(e)) 1811*cfb92d14SAndroid Build Coastguard Worker 1812*cfb92d14SAndroid Build Coastguard Worker def getNeighbouringRouters(self): 1813*cfb92d14SAndroid Build Coastguard Worker """get neighboring routers information 1814*cfb92d14SAndroid Build Coastguard Worker 1815*cfb92d14SAndroid Build Coastguard Worker Returns: 1816*cfb92d14SAndroid Build Coastguard Worker neighboring routers' extended address 1817*cfb92d14SAndroid Build Coastguard Worker 1818*cfb92d14SAndroid Build Coastguard Worker @todo: required if as reference device 1819*cfb92d14SAndroid Build Coastguard Worker """ 1820*cfb92d14SAndroid Build Coastguard Worker 1821*cfb92d14SAndroid Build Coastguard Worker def getChildrenInfo(self): 1822*cfb92d14SAndroid Build Coastguard Worker """get all children information 1823*cfb92d14SAndroid Build Coastguard Worker 1824*cfb92d14SAndroid Build Coastguard Worker Returns: 1825*cfb92d14SAndroid Build Coastguard Worker children's extended address 1826*cfb92d14SAndroid Build Coastguard Worker 1827*cfb92d14SAndroid Build Coastguard Worker @todo: required if as reference device 1828*cfb92d14SAndroid Build Coastguard Worker """ 1829*cfb92d14SAndroid Build Coastguard Worker 1830*cfb92d14SAndroid Build Coastguard Worker def setXpanId(self, xPanId): 1831*cfb92d14SAndroid Build Coastguard Worker """set extended PAN ID of Thread Network 1832*cfb92d14SAndroid Build Coastguard Worker 1833*cfb92d14SAndroid Build Coastguard Worker Args: 1834*cfb92d14SAndroid Build Coastguard Worker xPanId: extended PAN ID in hex format 1835*cfb92d14SAndroid Build Coastguard Worker 1836*cfb92d14SAndroid Build Coastguard Worker Returns: 1837*cfb92d14SAndroid Build Coastguard Worker True: successful to set the extended PAN ID 1838*cfb92d14SAndroid Build Coastguard Worker False: fail to set the extended PAN ID 1839*cfb92d14SAndroid Build Coastguard Worker """ 1840*cfb92d14SAndroid Build Coastguard Worker xpanid = '' 1841*cfb92d14SAndroid Build Coastguard Worker print('%s call setXpanId' % self.port) 1842*cfb92d14SAndroid Build Coastguard Worker print(xPanId) 1843*cfb92d14SAndroid Build Coastguard Worker try: 1844*cfb92d14SAndroid Build Coastguard Worker if not isinstance(xPanId, str): 1845*cfb92d14SAndroid Build Coastguard Worker xpanid = self.__convertLongToHex(xPanId, 16) 1846*cfb92d14SAndroid Build Coastguard Worker 1847*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Network:XPANID %s' % xpanid 1848*cfb92d14SAndroid Build Coastguard Worker datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:ExtendedPanId %s' % xpanid 1849*cfb92d14SAndroid Build Coastguard Worker else: 1850*cfb92d14SAndroid Build Coastguard Worker xpanid = xPanId 1851*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Network:XPANID %s' % xpanid 1852*cfb92d14SAndroid Build Coastguard Worker datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:ExtendedPanId %s' % xpanid 1853*cfb92d14SAndroid Build Coastguard Worker 1854*cfb92d14SAndroid Build Coastguard Worker self.xpanId = xpanid 1855*cfb92d14SAndroid Build Coastguard Worker self.hasActiveDatasetToCommit = True 1856*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail' 1857*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1858*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setXpanId() Error: ' + str(e)) 1859*cfb92d14SAndroid Build Coastguard Worker 1860*cfb92d14SAndroid Build Coastguard Worker def getNeighbouringDevices(self): 1861*cfb92d14SAndroid Build Coastguard Worker """gets the neighboring devices' extended address to compute the DUT 1862*cfb92d14SAndroid Build Coastguard Worker extended address automatically 1863*cfb92d14SAndroid Build Coastguard Worker 1864*cfb92d14SAndroid Build Coastguard Worker Returns: 1865*cfb92d14SAndroid Build Coastguard Worker A list including extended address of neighboring routers, parent 1866*cfb92d14SAndroid Build Coastguard Worker as well as children 1867*cfb92d14SAndroid Build Coastguard Worker """ 1868*cfb92d14SAndroid Build Coastguard Worker print('%s call getNeighbouringDevices' % self.port) 1869*cfb92d14SAndroid Build Coastguard Worker neighbourList = [] 1870*cfb92d14SAndroid Build Coastguard Worker 1871*cfb92d14SAndroid Build Coastguard Worker # get parent info 1872*cfb92d14SAndroid Build Coastguard Worker parentAddr = self.getParentAddress() 1873*cfb92d14SAndroid Build Coastguard Worker if parentAddr != 0: 1874*cfb92d14SAndroid Build Coastguard Worker neighbourList.append(parentAddr) 1875*cfb92d14SAndroid Build Coastguard Worker 1876*cfb92d14SAndroid Build Coastguard Worker # get ED/SED children info 1877*cfb92d14SAndroid Build Coastguard Worker childNeighbours = self.getChildrenInfo() 1878*cfb92d14SAndroid Build Coastguard Worker if childNeighbours is not None and len(childNeighbours) > 0: 1879*cfb92d14SAndroid Build Coastguard Worker for entry in childNeighbours: 1880*cfb92d14SAndroid Build Coastguard Worker neighbourList.append(entry) 1881*cfb92d14SAndroid Build Coastguard Worker 1882*cfb92d14SAndroid Build Coastguard Worker # get neighboring routers info 1883*cfb92d14SAndroid Build Coastguard Worker routerNeighbours = self.getNeighbouringRouters() 1884*cfb92d14SAndroid Build Coastguard Worker if routerNeighbours is not None and len(routerNeighbours) > 0: 1885*cfb92d14SAndroid Build Coastguard Worker for entry in routerNeighbours: 1886*cfb92d14SAndroid Build Coastguard Worker neighbourList.append(entry) 1887*cfb92d14SAndroid Build Coastguard Worker 1888*cfb92d14SAndroid Build Coastguard Worker print(neighbourList) 1889*cfb92d14SAndroid Build Coastguard Worker return neighbourList 1890*cfb92d14SAndroid Build Coastguard Worker 1891*cfb92d14SAndroid Build Coastguard Worker def setPartationId(self, partationId): 1892*cfb92d14SAndroid Build Coastguard Worker """set Thread Network Partition ID 1893*cfb92d14SAndroid Build Coastguard Worker 1894*cfb92d14SAndroid Build Coastguard Worker Args: 1895*cfb92d14SAndroid Build Coastguard Worker partitionId: partition id to be set by leader 1896*cfb92d14SAndroid Build Coastguard Worker 1897*cfb92d14SAndroid Build Coastguard Worker Returns: 1898*cfb92d14SAndroid Build Coastguard Worker True: successful to set the Partition ID 1899*cfb92d14SAndroid Build Coastguard Worker False: fail to set the Partition ID 1900*cfb92d14SAndroid Build Coastguard Worker """ 1901*cfb92d14SAndroid Build Coastguard Worker print('%s call setPartationId' % self.port) 1902*cfb92d14SAndroid Build Coastguard Worker print(partationId) 1903*cfb92d14SAndroid Build Coastguard Worker 1904*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Network:PartitionId %s' % (str(hex(partationId)).rstrip('L')) 1905*cfb92d14SAndroid Build Coastguard Worker print(cmd) 1906*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 1907*cfb92d14SAndroid Build Coastguard Worker 1908*cfb92d14SAndroid Build Coastguard Worker def getGUA(self, filterByPrefix=None): 1909*cfb92d14SAndroid Build Coastguard Worker """get expected global unicast IPv6 address of OpenThreadWpan 1910*cfb92d14SAndroid Build Coastguard Worker 1911*cfb92d14SAndroid Build Coastguard Worker note: existing filterByPrefix are string of in lowercase. e.g. 1912*cfb92d14SAndroid Build Coastguard Worker '2001' or '2001:0db8:0001:0000". 1913*cfb92d14SAndroid Build Coastguard Worker 1914*cfb92d14SAndroid Build Coastguard Worker Args: 1915*cfb92d14SAndroid Build Coastguard Worker filterByPrefix: a given expected global IPv6 prefix to be matched 1916*cfb92d14SAndroid Build Coastguard Worker 1917*cfb92d14SAndroid Build Coastguard Worker Returns: 1918*cfb92d14SAndroid Build Coastguard Worker a global IPv6 address 1919*cfb92d14SAndroid Build Coastguard Worker """ 1920*cfb92d14SAndroid Build Coastguard Worker print('%s call getGUA' % self.port) 1921*cfb92d14SAndroid Build Coastguard Worker print(filterByPrefix) 1922*cfb92d14SAndroid Build Coastguard Worker globalAddrs = [] 1923*cfb92d14SAndroid Build Coastguard Worker try: 1924*cfb92d14SAndroid Build Coastguard Worker # get global addrs set if multiple 1925*cfb92d14SAndroid Build Coastguard Worker globalAddrs = self.getGlobal() 1926*cfb92d14SAndroid Build Coastguard Worker 1927*cfb92d14SAndroid Build Coastguard Worker if filterByPrefix is None: 1928*cfb92d14SAndroid Build Coastguard Worker return self.globalAddrs[0] 1929*cfb92d14SAndroid Build Coastguard Worker else: 1930*cfb92d14SAndroid Build Coastguard Worker for fullIp in globalAddrs: 1931*cfb92d14SAndroid Build Coastguard Worker if fullIp.startswith(filterByPrefix): 1932*cfb92d14SAndroid Build Coastguard Worker print('target global %s' % fullIp) 1933*cfb92d14SAndroid Build Coastguard Worker return fullIp 1934*cfb92d14SAndroid Build Coastguard Worker print('no global address matched') 1935*cfb92d14SAndroid Build Coastguard Worker return str(globalAddrs[0]) 1936*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1937*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('getGUA() Error: ' + str(e)) 1938*cfb92d14SAndroid Build Coastguard Worker return e 1939*cfb92d14SAndroid Build Coastguard Worker 1940*cfb92d14SAndroid Build Coastguard Worker def getShortAddress(self): 1941*cfb92d14SAndroid Build Coastguard Worker """get Rloc16 short address of Thread device""" 1942*cfb92d14SAndroid Build Coastguard Worker print('%s call getShortAddress' % self.port) 1943*cfb92d14SAndroid Build Coastguard Worker return self.getRloc16() 1944*cfb92d14SAndroid Build Coastguard Worker 1945*cfb92d14SAndroid Build Coastguard Worker def getULA64(self): 1946*cfb92d14SAndroid Build Coastguard Worker """get mesh local EID of Thread device""" 1947*cfb92d14SAndroid Build Coastguard Worker print('%s call getULA64' % self.port) 1948*cfb92d14SAndroid Build Coastguard Worker return self.getMLEID() 1949*cfb92d14SAndroid Build Coastguard Worker 1950*cfb92d14SAndroid Build Coastguard Worker def setMLPrefix(self, sMeshLocalPrefix): 1951*cfb92d14SAndroid Build Coastguard Worker """set mesh local prefix""" 1952*cfb92d14SAndroid Build Coastguard Worker print('%s call setMLPrefix' % self.port) 1953*cfb92d14SAndroid Build Coastguard Worker try: 1954*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop IPv6:MeshLocalPrefix %s' % sMeshLocalPrefix 1955*cfb92d14SAndroid Build Coastguard Worker datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:MeshLocalPrefix %s' % sMeshLocalPrefix 1956*cfb92d14SAndroid Build Coastguard Worker self.hasActiveDatasetToCommit = True 1957*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail' 1958*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 1959*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setMLPrefix() Error: ' + str(e)) 1960*cfb92d14SAndroid Build Coastguard Worker 1961*cfb92d14SAndroid Build Coastguard Worker def getML16(self): 1962*cfb92d14SAndroid Build Coastguard Worker """get mesh local 16 unicast address (Rloc)""" 1963*cfb92d14SAndroid Build Coastguard Worker print('%s call getML16' % self.port) 1964*cfb92d14SAndroid Build Coastguard Worker return self.getRloc() 1965*cfb92d14SAndroid Build Coastguard Worker 1966*cfb92d14SAndroid Build Coastguard Worker def downgradeToDevice(self): 1967*cfb92d14SAndroid Build Coastguard Worker pass 1968*cfb92d14SAndroid Build Coastguard Worker 1969*cfb92d14SAndroid Build Coastguard Worker def upgradeToRouter(self): 1970*cfb92d14SAndroid Build Coastguard Worker pass 1971*cfb92d14SAndroid Build Coastguard Worker 1972*cfb92d14SAndroid Build Coastguard Worker def forceSetSlaac(self, slaacAddress): 1973*cfb92d14SAndroid Build Coastguard Worker """@todo : required if as reference device""" 1974*cfb92d14SAndroid Build Coastguard Worker 1975*cfb92d14SAndroid Build Coastguard Worker def setSleepyNodePollTime(self): 1976*cfb92d14SAndroid Build Coastguard Worker pass 1977*cfb92d14SAndroid Build Coastguard Worker 1978*cfb92d14SAndroid Build Coastguard Worker def enableAutoDUTObjectFlag(self): 1979*cfb92d14SAndroid Build Coastguard Worker """set AutoDUTenable flag""" 1980*cfb92d14SAndroid Build Coastguard Worker print('%s call enableAutoDUTObjectFlag' % self.port) 1981*cfb92d14SAndroid Build Coastguard Worker self.AutoDUTEnable = True 1982*cfb92d14SAndroid Build Coastguard Worker 1983*cfb92d14SAndroid Build Coastguard Worker def getChildTimeoutValue(self): 1984*cfb92d14SAndroid Build Coastguard Worker """get child timeout""" 1985*cfb92d14SAndroid Build Coastguard Worker print('%s call getChildTimeoutValue' % self.port) 1986*cfb92d14SAndroid Build Coastguard Worker childTimeout = self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Thread:ChildTimeout')[0] 1987*cfb92d14SAndroid Build Coastguard Worker return int(childTimeout) 1988*cfb92d14SAndroid Build Coastguard Worker 1989*cfb92d14SAndroid Build Coastguard Worker def diagnosticGet(self, strDestinationAddr, listTLV_ids=[]): 1990*cfb92d14SAndroid Build Coastguard Worker """@todo : required if as reference device""" 1991*cfb92d14SAndroid Build Coastguard Worker 1992*cfb92d14SAndroid Build Coastguard Worker def diagnosticQuery(self, strDestinationAddr, listTLV_ids=[]): 1993*cfb92d14SAndroid Build Coastguard Worker """@todo : required if as reference device""" 1994*cfb92d14SAndroid Build Coastguard Worker self.diagnosticGet(strDestinationAddr, listTLV_ids) 1995*cfb92d14SAndroid Build Coastguard Worker 1996*cfb92d14SAndroid Build Coastguard Worker def diagnosticReset(self, strDestinationAddr, listTLV_ids=[]): 1997*cfb92d14SAndroid Build Coastguard Worker """@todo : required if as reference device""" 1998*cfb92d14SAndroid Build Coastguard Worker 1999*cfb92d14SAndroid Build Coastguard Worker def startNativeCommissioner(self, strPSKc='GRLPASSPHRASE'): 2000*cfb92d14SAndroid Build Coastguard Worker # TODO: Support the whole Native Commissioner functionality 2001*cfb92d14SAndroid Build Coastguard Worker # Currently it only aims to trigger a Discovery Request message to pass 2002*cfb92d14SAndroid Build Coastguard Worker # Certification test 5.8.4 2003*cfb92d14SAndroid Build Coastguard Worker print('%s call startNativeCommissioner' % self.port) 2004*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'joiner --start %s' % (strPSKc) 2005*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2006*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(cmd)[0] != 'Fail': 2007*cfb92d14SAndroid Build Coastguard Worker return True 2008*cfb92d14SAndroid Build Coastguard Worker else: 2009*cfb92d14SAndroid Build Coastguard Worker return False 2010*cfb92d14SAndroid Build Coastguard Worker 2011*cfb92d14SAndroid Build Coastguard Worker def startCollapsedCommissioner(self): 2012*cfb92d14SAndroid Build Coastguard Worker """start Collapsed Commissioner 2013*cfb92d14SAndroid Build Coastguard Worker 2014*cfb92d14SAndroid Build Coastguard Worker Returns: 2015*cfb92d14SAndroid Build Coastguard Worker True: successful to start Commissioner 2016*cfb92d14SAndroid Build Coastguard Worker False: fail to start Commissioner 2017*cfb92d14SAndroid Build Coastguard Worker """ 2018*cfb92d14SAndroid Build Coastguard Worker print('%s call startCollapsedCommissioner' % self.port) 2019*cfb92d14SAndroid Build Coastguard Worker startCmd = self.wpan_cmd_prefix + 'form "%s" -c %s -T router' % (self.networkName, str(self.channel)) 2020*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(startCmd) != 'Fail': 2021*cfb92d14SAndroid Build Coastguard Worker time.sleep(2) 2022*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'commissioner start' 2023*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2024*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(cmd)[0] != 'Fail': 2025*cfb92d14SAndroid Build Coastguard Worker self.isActiveCommissioner = True 2026*cfb92d14SAndroid Build Coastguard Worker time.sleep(20) # time for petition process 2027*cfb92d14SAndroid Build Coastguard Worker return True 2028*cfb92d14SAndroid Build Coastguard Worker return False 2029*cfb92d14SAndroid Build Coastguard Worker 2030*cfb92d14SAndroid Build Coastguard Worker def setJoinKey(self, strPSKc): 2031*cfb92d14SAndroid Build Coastguard Worker pass 2032*cfb92d14SAndroid Build Coastguard Worker 2033*cfb92d14SAndroid Build Coastguard Worker def scanJoiner(self, xEUI='*', strPSKd='THREADJPAKETEST'): 2034*cfb92d14SAndroid Build Coastguard Worker """scan Joiner 2035*cfb92d14SAndroid Build Coastguard Worker 2036*cfb92d14SAndroid Build Coastguard Worker Args: 2037*cfb92d14SAndroid Build Coastguard Worker xEUI: Joiner's EUI-64 2038*cfb92d14SAndroid Build Coastguard Worker strPSKd: Joiner's PSKd for commissioning 2039*cfb92d14SAndroid Build Coastguard Worker 2040*cfb92d14SAndroid Build Coastguard Worker Returns: 2041*cfb92d14SAndroid Build Coastguard Worker True: successful to add Joiner's steering data 2042*cfb92d14SAndroid Build Coastguard Worker False: fail to add Joiner's steering data 2043*cfb92d14SAndroid Build Coastguard Worker """ 2044*cfb92d14SAndroid Build Coastguard Worker print('%s call scanJoiner' % self.port) 2045*cfb92d14SAndroid Build Coastguard Worker if not isinstance(xEUI, str): 2046*cfb92d14SAndroid Build Coastguard Worker eui64 = self.__convertLongToHex(xEUI, 16) 2047*cfb92d14SAndroid Build Coastguard Worker else: 2048*cfb92d14SAndroid Build Coastguard Worker eui64 = xEUI 2049*cfb92d14SAndroid Build Coastguard Worker 2050*cfb92d14SAndroid Build Coastguard Worker # long timeout value to avoid automatic joiner removal (in seconds) 2051*cfb92d14SAndroid Build Coastguard Worker timeout = 500 2052*cfb92d14SAndroid Build Coastguard Worker 2053*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'commissioner joiner-add "%s" %s %s' % (eui64, str(timeout), strPSKd) 2054*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2055*cfb92d14SAndroid Build Coastguard Worker if not self.isActiveCommissioner: 2056*cfb92d14SAndroid Build Coastguard Worker self.startCollapsedCommissioner() 2057*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(cmd)[0] != 'Fail': 2058*cfb92d14SAndroid Build Coastguard Worker return True 2059*cfb92d14SAndroid Build Coastguard Worker else: 2060*cfb92d14SAndroid Build Coastguard Worker return False 2061*cfb92d14SAndroid Build Coastguard Worker 2062*cfb92d14SAndroid Build Coastguard Worker def setProvisioningUrl(self, strURL='grl.com'): 2063*cfb92d14SAndroid Build Coastguard Worker """set provisioning Url 2064*cfb92d14SAndroid Build Coastguard Worker 2065*cfb92d14SAndroid Build Coastguard Worker Args: 2066*cfb92d14SAndroid Build Coastguard Worker strURL: Provisioning Url string 2067*cfb92d14SAndroid Build Coastguard Worker 2068*cfb92d14SAndroid Build Coastguard Worker Returns: 2069*cfb92d14SAndroid Build Coastguard Worker True: successful to set provisioning Url 2070*cfb92d14SAndroid Build Coastguard Worker False: fail to set provisioning Url 2071*cfb92d14SAndroid Build Coastguard Worker """ 2072*cfb92d14SAndroid Build Coastguard Worker print('%s call setProvisioningUrl' % self.port) 2073*cfb92d14SAndroid Build Coastguard Worker self.provisioningUrl = strURL 2074*cfb92d14SAndroid Build Coastguard Worker if self.deviceRole == Thread_Device_Role.Commissioner: 2075*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Commissioner:ProvisioningUrl %s' % (strURL) 2076*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2077*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 2078*cfb92d14SAndroid Build Coastguard Worker return True 2079*cfb92d14SAndroid Build Coastguard Worker 2080*cfb92d14SAndroid Build Coastguard Worker def allowCommission(self): 2081*cfb92d14SAndroid Build Coastguard Worker """start commissioner candidate petition process 2082*cfb92d14SAndroid Build Coastguard Worker 2083*cfb92d14SAndroid Build Coastguard Worker Returns: 2084*cfb92d14SAndroid Build Coastguard Worker True: successful to start commissioner candidate petition process 2085*cfb92d14SAndroid Build Coastguard Worker False: fail to start commissioner candidate petition process 2086*cfb92d14SAndroid Build Coastguard Worker """ 2087*cfb92d14SAndroid Build Coastguard Worker print('%s call allowCommission' % self.port) 2088*cfb92d14SAndroid Build Coastguard Worker try: 2089*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'commissioner start' 2090*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2091*cfb92d14SAndroid Build Coastguard Worker if self.isActiveCommissioner: 2092*cfb92d14SAndroid Build Coastguard Worker return True 2093*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(cmd)[0] != 'Fail': 2094*cfb92d14SAndroid Build Coastguard Worker self.isActiveCommissioner = True 2095*cfb92d14SAndroid Build Coastguard Worker time.sleep(40) # time for petition process and at least one keep alive 2096*cfb92d14SAndroid Build Coastguard Worker return True 2097*cfb92d14SAndroid Build Coastguard Worker else: 2098*cfb92d14SAndroid Build Coastguard Worker return False 2099*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 2100*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('allowcommission() error: ' + str(e)) 2101*cfb92d14SAndroid Build Coastguard Worker 2102*cfb92d14SAndroid Build Coastguard Worker def joinCommissioned(self, strPSKd='THREADJPAKETEST', waitTime=20): 2103*cfb92d14SAndroid Build Coastguard Worker """start joiner 2104*cfb92d14SAndroid Build Coastguard Worker 2105*cfb92d14SAndroid Build Coastguard Worker Args: 2106*cfb92d14SAndroid Build Coastguard Worker strPSKd: Joiner's PSKd 2107*cfb92d14SAndroid Build Coastguard Worker 2108*cfb92d14SAndroid Build Coastguard Worker Returns: 2109*cfb92d14SAndroid Build Coastguard Worker True: successful to start joiner 2110*cfb92d14SAndroid Build Coastguard Worker False: fail to start joiner 2111*cfb92d14SAndroid Build Coastguard Worker """ 2112*cfb92d14SAndroid Build Coastguard Worker print('%s call joinCommissioned' % self.port) 2113*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'joiner --start %s %s' % (strPSKd, self.provisioningUrl) 2114*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2115*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(cmd)[0] != 'Fail': 2116*cfb92d14SAndroid Build Coastguard Worker if self.__getJoinerState(): 2117*cfb92d14SAndroid Build Coastguard Worker self.__sendCommand(self.wpan_cmd_prefix + 'joiner --attach') 2118*cfb92d14SAndroid Build Coastguard Worker time.sleep(30) 2119*cfb92d14SAndroid Build Coastguard Worker return True 2120*cfb92d14SAndroid Build Coastguard Worker else: 2121*cfb92d14SAndroid Build Coastguard Worker return False 2122*cfb92d14SAndroid Build Coastguard Worker else: 2123*cfb92d14SAndroid Build Coastguard Worker return False 2124*cfb92d14SAndroid Build Coastguard Worker 2125*cfb92d14SAndroid Build Coastguard Worker def getCommissioningLogs(self): 2126*cfb92d14SAndroid Build Coastguard Worker """get Commissioning logs 2127*cfb92d14SAndroid Build Coastguard Worker 2128*cfb92d14SAndroid Build Coastguard Worker Returns: 2129*cfb92d14SAndroid Build Coastguard Worker Commissioning logs 2130*cfb92d14SAndroid Build Coastguard Worker """ 2131*cfb92d14SAndroid Build Coastguard Worker rawLogs = self.logThread.get() 2132*cfb92d14SAndroid Build Coastguard Worker ProcessedLogs = [] 2133*cfb92d14SAndroid Build Coastguard Worker payload = [] 2134*cfb92d14SAndroid Build Coastguard Worker while not rawLogs.empty(): 2135*cfb92d14SAndroid Build Coastguard Worker rawLogEach = rawLogs.get() 2136*cfb92d14SAndroid Build Coastguard Worker print(rawLogEach) 2137*cfb92d14SAndroid Build Coastguard Worker if '[THCI]' not in rawLogEach: 2138*cfb92d14SAndroid Build Coastguard Worker continue 2139*cfb92d14SAndroid Build Coastguard Worker 2140*cfb92d14SAndroid Build Coastguard Worker EncryptedPacket = PlatformDiagnosticPacket() 2141*cfb92d14SAndroid Build Coastguard Worker infoList = rawLogEach.split('[THCI]')[1].split(']')[0].split('|') 2142*cfb92d14SAndroid Build Coastguard Worker for eachInfo in infoList: 2143*cfb92d14SAndroid Build Coastguard Worker print(eachInfo) 2144*cfb92d14SAndroid Build Coastguard Worker info = eachInfo.split('=') 2145*cfb92d14SAndroid Build Coastguard Worker infoType = info[0].strip() 2146*cfb92d14SAndroid Build Coastguard Worker infoValue = info[1].strip() 2147*cfb92d14SAndroid Build Coastguard Worker if 'direction' in infoType: 2148*cfb92d14SAndroid Build Coastguard Worker EncryptedPacket.Direction = (PlatformDiagnosticPacket_Direction.IN 2149*cfb92d14SAndroid Build Coastguard Worker if 'recv' in infoValue else PlatformDiagnosticPacket_Direction.OUT if 2150*cfb92d14SAndroid Build Coastguard Worker 'send' in infoValue else PlatformDiagnosticPacket_Direction.UNKNOWN) 2151*cfb92d14SAndroid Build Coastguard Worker elif 'type' in infoType: 2152*cfb92d14SAndroid Build Coastguard Worker EncryptedPacket.Type = (PlatformDiagnosticPacket_Type.JOIN_FIN_req if 'JOIN_FIN.req' in infoValue 2153*cfb92d14SAndroid Build Coastguard Worker else PlatformDiagnosticPacket_Type.JOIN_FIN_rsp if 'JOIN_FIN.rsp' 2154*cfb92d14SAndroid Build Coastguard Worker in infoValue else PlatformDiagnosticPacket_Type.JOIN_ENT_req if 2155*cfb92d14SAndroid Build Coastguard Worker 'JOIN_ENT.ntf' in infoValue else PlatformDiagnosticPacket_Type.JOIN_ENT_rsp 2156*cfb92d14SAndroid Build Coastguard Worker if 'JOIN_ENT.rsp' in infoValue else PlatformDiagnosticPacket_Type.UNKNOWN) 2157*cfb92d14SAndroid Build Coastguard Worker elif 'len' in infoType: 2158*cfb92d14SAndroid Build Coastguard Worker bytesInEachLine = 16 2159*cfb92d14SAndroid Build Coastguard Worker EncryptedPacket.TLVsLength = int(infoValue) 2160*cfb92d14SAndroid Build Coastguard Worker payloadLineCount = (int(infoValue) + bytesInEachLine - 1) / bytesInEachLine 2161*cfb92d14SAndroid Build Coastguard Worker while payloadLineCount > 0: 2162*cfb92d14SAndroid Build Coastguard Worker payloadLineCount = payloadLineCount - 1 2163*cfb92d14SAndroid Build Coastguard Worker payloadLine = rawLogs.get() 2164*cfb92d14SAndroid Build Coastguard Worker payloadSplit = payloadLine.split('|') 2165*cfb92d14SAndroid Build Coastguard Worker for block in range(1, 3): 2166*cfb92d14SAndroid Build Coastguard Worker payloadBlock = payloadSplit[block] 2167*cfb92d14SAndroid Build Coastguard Worker payloadValues = payloadBlock.split(' ') 2168*cfb92d14SAndroid Build Coastguard Worker for num in range(1, 9): 2169*cfb92d14SAndroid Build Coastguard Worker if '..' not in payloadValues[num]: 2170*cfb92d14SAndroid Build Coastguard Worker payload.append(int(payloadValues[num], 16)) 2171*cfb92d14SAndroid Build Coastguard Worker 2172*cfb92d14SAndroid Build Coastguard Worker EncryptedPacket.TLVs = PlatformPackets.read(EncryptedPacket.Type, payload) if payload != [] else [] 2173*cfb92d14SAndroid Build Coastguard Worker 2174*cfb92d14SAndroid Build Coastguard Worker ProcessedLogs.append(EncryptedPacket) 2175*cfb92d14SAndroid Build Coastguard Worker return ProcessedLogs 2176*cfb92d14SAndroid Build Coastguard Worker 2177*cfb92d14SAndroid Build Coastguard Worker def MGMT_ED_SCAN(self, sAddr, xCommissionerSessionId, listChannelMask, xCount, xPeriod, xScanDuration): 2178*cfb92d14SAndroid Build Coastguard Worker """send MGMT_ED_SCAN message to a given destinaition. 2179*cfb92d14SAndroid Build Coastguard Worker 2180*cfb92d14SAndroid Build Coastguard Worker Args: 2181*cfb92d14SAndroid Build Coastguard Worker sAddr: IPv6 destination address for this message 2182*cfb92d14SAndroid Build Coastguard Worker xCommissionerSessionId: commissioner session id 2183*cfb92d14SAndroid Build Coastguard Worker listChannelMask: a channel array to indicate which channels to be scanned 2184*cfb92d14SAndroid Build Coastguard Worker xCount: number of IEEE 802.15.4 ED Scans (milliseconds) 2185*cfb92d14SAndroid Build Coastguard Worker xPeriod: Period between successive IEEE802.15.4 ED Scans (milliseconds) 2186*cfb92d14SAndroid Build Coastguard Worker xScanDuration: IEEE 802.15.4 ScanDuration to use when performing an IEEE 802.15.4 ED Scan (milliseconds) 2187*cfb92d14SAndroid Build Coastguard Worker 2188*cfb92d14SAndroid Build Coastguard Worker Returns: 2189*cfb92d14SAndroid Build Coastguard Worker True: successful to send MGMT_ED_SCAN message. 2190*cfb92d14SAndroid Build Coastguard Worker False: fail to send MGMT_ED_SCAN message 2191*cfb92d14SAndroid Build Coastguard Worker """ 2192*cfb92d14SAndroid Build Coastguard Worker print('%s call MGMT_ED_SCAN' % self.port) 2193*cfb92d14SAndroid Build Coastguard Worker channelMask = '' 2194*cfb92d14SAndroid Build Coastguard Worker channelMask = self.__ChannelMaskListToStr(listChannelMask) 2195*cfb92d14SAndroid Build Coastguard Worker try: 2196*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'commissioner energy-scan %s %s %s %s %s' % ( 2197*cfb92d14SAndroid Build Coastguard Worker channelMask, 2198*cfb92d14SAndroid Build Coastguard Worker xCount, 2199*cfb92d14SAndroid Build Coastguard Worker xPeriod, 2200*cfb92d14SAndroid Build Coastguard Worker xScanDuration, 2201*cfb92d14SAndroid Build Coastguard Worker sAddr, 2202*cfb92d14SAndroid Build Coastguard Worker ) 2203*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2204*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd) != 'Fail' 2205*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 2206*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('MGMT_ED_SCAN() error: ' + str(e)) 2207*cfb92d14SAndroid Build Coastguard Worker 2208*cfb92d14SAndroid Build Coastguard Worker def MGMT_PANID_QUERY(self, sAddr, xCommissionerSessionId, listChannelMask, xPanId): 2209*cfb92d14SAndroid Build Coastguard Worker """send MGMT_PANID_QUERY message to a given destination 2210*cfb92d14SAndroid Build Coastguard Worker 2211*cfb92d14SAndroid Build Coastguard Worker Args: 2212*cfb92d14SAndroid Build Coastguard Worker xPanId: a given PAN ID to check the conflicts 2213*cfb92d14SAndroid Build Coastguard Worker 2214*cfb92d14SAndroid Build Coastguard Worker Returns: 2215*cfb92d14SAndroid Build Coastguard Worker True: successful to send MGMT_PANID_QUERY message. 2216*cfb92d14SAndroid Build Coastguard Worker False: fail to send MGMT_PANID_QUERY message. 2217*cfb92d14SAndroid Build Coastguard Worker """ 2218*cfb92d14SAndroid Build Coastguard Worker print('%s call MGMT_PANID_QUERY' % self.port) 2219*cfb92d14SAndroid Build Coastguard Worker panid = '' 2220*cfb92d14SAndroid Build Coastguard Worker channelMask = '' 2221*cfb92d14SAndroid Build Coastguard Worker channelMask = self.__ChannelMaskListToStr(listChannelMask) 2222*cfb92d14SAndroid Build Coastguard Worker 2223*cfb92d14SAndroid Build Coastguard Worker if not isinstance(xPanId, str): 2224*cfb92d14SAndroid Build Coastguard Worker panid = str(hex(xPanId)) 2225*cfb92d14SAndroid Build Coastguard Worker 2226*cfb92d14SAndroid Build Coastguard Worker try: 2227*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'commissioner pan-id-query %s %s %s' % (panid, channelMask, sAddr) 2228*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2229*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd) != 'Fail' 2230*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 2231*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('MGMT_PANID_QUERY() error: ' + str(e)) 2232*cfb92d14SAndroid Build Coastguard Worker 2233*cfb92d14SAndroid Build Coastguard Worker def MGMT_ANNOUNCE_BEGIN(self, sAddr, xCommissionerSessionId, listChannelMask, xCount, xPeriod): 2234*cfb92d14SAndroid Build Coastguard Worker """send MGMT_ANNOUNCE_BEGIN message to a given destination 2235*cfb92d14SAndroid Build Coastguard Worker 2236*cfb92d14SAndroid Build Coastguard Worker Returns: 2237*cfb92d14SAndroid Build Coastguard Worker True: successful to send MGMT_ANNOUNCE_BEGIN message. 2238*cfb92d14SAndroid Build Coastguard Worker False: fail to send MGMT_ANNOUNCE_BEGIN message. 2239*cfb92d14SAndroid Build Coastguard Worker """ 2240*cfb92d14SAndroid Build Coastguard Worker print('%s call MGMT_ANNOUNCE_BEGIN' % self.port) 2241*cfb92d14SAndroid Build Coastguard Worker channelMask = '' 2242*cfb92d14SAndroid Build Coastguard Worker channelMask = self.__ChannelMaskListToStr(listChannelMask) 2243*cfb92d14SAndroid Build Coastguard Worker try: 2244*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'commissioner announce-begin %s %s %s %s' % ( 2245*cfb92d14SAndroid Build Coastguard Worker channelMask, 2246*cfb92d14SAndroid Build Coastguard Worker xCount, 2247*cfb92d14SAndroid Build Coastguard Worker xPeriod, 2248*cfb92d14SAndroid Build Coastguard Worker sAddr, 2249*cfb92d14SAndroid Build Coastguard Worker ) 2250*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2251*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd) != 'Fail' 2252*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 2253*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('MGMT_ANNOUNCE_BEGIN() error: ' + str(e)) 2254*cfb92d14SAndroid Build Coastguard Worker 2255*cfb92d14SAndroid Build Coastguard Worker def MGMT_ACTIVE_GET(self, Addr='', TLVs=[]): 2256*cfb92d14SAndroid Build Coastguard Worker """send MGMT_ACTIVE_GET command 2257*cfb92d14SAndroid Build Coastguard Worker 2258*cfb92d14SAndroid Build Coastguard Worker Returns: 2259*cfb92d14SAndroid Build Coastguard Worker True: successful to send MGMT_ACTIVE_GET 2260*cfb92d14SAndroid Build Coastguard Worker False: fail to send MGMT_ACTIVE_GET 2261*cfb92d14SAndroid Build Coastguard Worker """ 2262*cfb92d14SAndroid Build Coastguard Worker print('%s call MGMT_ACTIVE_GET' % self.port) 2263*cfb92d14SAndroid Build Coastguard Worker try: 2264*cfb92d14SAndroid Build Coastguard Worker 2265*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'dataset mgmt-get-active' 2266*cfb92d14SAndroid Build Coastguard Worker 2267*cfb92d14SAndroid Build Coastguard Worker if len(TLVs) != 0: 2268*cfb92d14SAndroid Build Coastguard Worker tlvs = ''.join('%02x' % tlv for tlv in TLVs) 2269*cfb92d14SAndroid Build Coastguard Worker setTLVCmd = self.wpan_cmd_prefix + 'setprop Dataset:RawTlvs ' + tlvs 2270*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setTLVCmd)[0] == 'Fail': 2271*cfb92d14SAndroid Build Coastguard Worker return False 2272*cfb92d14SAndroid Build Coastguard Worker else: 2273*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase')[0] == 'Fail': 2274*cfb92d14SAndroid Build Coastguard Worker return False 2275*cfb92d14SAndroid Build Coastguard Worker 2276*cfb92d14SAndroid Build Coastguard Worker if Addr != '': 2277*cfb92d14SAndroid Build Coastguard Worker setAddressCmd = self.wpan_cmd_prefix + 'setprop Dataset:DestIpAddress ' + Addr 2278*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setAddressCmd)[0] == 'Fail': 2279*cfb92d14SAndroid Build Coastguard Worker return False 2280*cfb92d14SAndroid Build Coastguard Worker 2281*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2282*cfb92d14SAndroid Build Coastguard Worker 2283*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 2284*cfb92d14SAndroid Build Coastguard Worker 2285*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 2286*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('MGMT_ACTIVE_GET() Error: ' + str(e)) 2287*cfb92d14SAndroid Build Coastguard Worker 2288*cfb92d14SAndroid Build Coastguard Worker def MGMT_ACTIVE_SET( 2289*cfb92d14SAndroid Build Coastguard Worker self, 2290*cfb92d14SAndroid Build Coastguard Worker sAddr='', 2291*cfb92d14SAndroid Build Coastguard Worker xCommissioningSessionId=None, 2292*cfb92d14SAndroid Build Coastguard Worker listActiveTimestamp=None, 2293*cfb92d14SAndroid Build Coastguard Worker listChannelMask=None, 2294*cfb92d14SAndroid Build Coastguard Worker xExtendedPanId=None, 2295*cfb92d14SAndroid Build Coastguard Worker sNetworkName=None, 2296*cfb92d14SAndroid Build Coastguard Worker sPSKc=None, 2297*cfb92d14SAndroid Build Coastguard Worker listSecurityPolicy=None, 2298*cfb92d14SAndroid Build Coastguard Worker xChannel=None, 2299*cfb92d14SAndroid Build Coastguard Worker sMeshLocalPrefix=None, 2300*cfb92d14SAndroid Build Coastguard Worker xMasterKey=None, 2301*cfb92d14SAndroid Build Coastguard Worker xPanId=None, 2302*cfb92d14SAndroid Build Coastguard Worker xTmfPort=None, 2303*cfb92d14SAndroid Build Coastguard Worker xSteeringData=None, 2304*cfb92d14SAndroid Build Coastguard Worker xBorderRouterLocator=None, 2305*cfb92d14SAndroid Build Coastguard Worker BogusTLV=None, 2306*cfb92d14SAndroid Build Coastguard Worker xDelayTimer=None, 2307*cfb92d14SAndroid Build Coastguard Worker ): 2308*cfb92d14SAndroid Build Coastguard Worker """send MGMT_ACTIVE_SET command 2309*cfb92d14SAndroid Build Coastguard Worker 2310*cfb92d14SAndroid Build Coastguard Worker Returns: 2311*cfb92d14SAndroid Build Coastguard Worker True: successful to send MGMT_ACTIVE_SET 2312*cfb92d14SAndroid Build Coastguard Worker False: fail to send MGMT_ACTIVE_SET 2313*cfb92d14SAndroid Build Coastguard Worker """ 2314*cfb92d14SAndroid Build Coastguard Worker print('%s call MGMT_ACTIVE_SET' % self.port) 2315*cfb92d14SAndroid Build Coastguard Worker try: 2316*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'dataset mgmt-set-active' 2317*cfb92d14SAndroid Build Coastguard Worker 2318*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase')[0] == 'Fail': 2319*cfb92d14SAndroid Build Coastguard Worker return False 2320*cfb92d14SAndroid Build Coastguard Worker 2321*cfb92d14SAndroid Build Coastguard Worker if listActiveTimestamp is not None: 2322*cfb92d14SAndroid Build Coastguard Worker sActiveTimestamp = '%016x' % listActiveTimestamp[0] 2323*cfb92d14SAndroid Build Coastguard Worker setActiveTimeCmd = self.wpan_cmd_prefix + 'setprop Dataset:ActiveTimestamp ' + sActiveTimestamp 2324*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setActiveTimeCmd)[0] == 'Fail': 2325*cfb92d14SAndroid Build Coastguard Worker return False 2326*cfb92d14SAndroid Build Coastguard Worker 2327*cfb92d14SAndroid Build Coastguard Worker if xExtendedPanId is not None: 2328*cfb92d14SAndroid Build Coastguard Worker xpanid = self.__convertLongToHex(xExtendedPanId, 16) 2329*cfb92d14SAndroid Build Coastguard Worker setExtendedPanIdCmd = self.wpan_cmd_prefix + 'setprop Dataset:ExtendedPanId ' + xpanid 2330*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setExtendedPanIdCmd)[0] == 'Fail': 2331*cfb92d14SAndroid Build Coastguard Worker return False 2332*cfb92d14SAndroid Build Coastguard Worker 2333*cfb92d14SAndroid Build Coastguard Worker if sNetworkName is not None: 2334*cfb92d14SAndroid Build Coastguard Worker setNetworkNameCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkName ' + str(sNetworkName) 2335*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setNetworkNameCmd)[0] == 'Fail': 2336*cfb92d14SAndroid Build Coastguard Worker return False 2337*cfb92d14SAndroid Build Coastguard Worker 2338*cfb92d14SAndroid Build Coastguard Worker if xChannel is not None: 2339*cfb92d14SAndroid Build Coastguard Worker setChannelCmd = self.wpan_cmd_prefix + 'setprop Dataset:Channel ' + str(xChannel) 2340*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setChannelCmd)[0] == 'Fail': 2341*cfb92d14SAndroid Build Coastguard Worker return False 2342*cfb92d14SAndroid Build Coastguard Worker 2343*cfb92d14SAndroid Build Coastguard Worker if sMeshLocalPrefix is not None: 2344*cfb92d14SAndroid Build Coastguard Worker setMLPrefixCmd = self.wpan_cmd_prefix + 'setprop Dataset:MeshLocalPrefix ' + str(sMeshLocalPrefix) 2345*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setMLPrefixCmd)[0] == 'Fail': 2346*cfb92d14SAndroid Build Coastguard Worker return False 2347*cfb92d14SAndroid Build Coastguard Worker 2348*cfb92d14SAndroid Build Coastguard Worker if xMasterKey is not None: 2349*cfb92d14SAndroid Build Coastguard Worker key = self.__convertLongToHex(xMasterKey, 32) 2350*cfb92d14SAndroid Build Coastguard Worker setNetworkKeyCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkKey ' + key 2351*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setNetworkKeyCmd)[0] == 'Fail': 2352*cfb92d14SAndroid Build Coastguard Worker return False 2353*cfb92d14SAndroid Build Coastguard Worker 2354*cfb92d14SAndroid Build Coastguard Worker if xPanId is not None: 2355*cfb92d14SAndroid Build Coastguard Worker setPanIdCmd = self.wpan_cmd_prefix + 'setprop Dataset:PanId ' + str(xPanId) 2356*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setPanIdCmd)[0] == 'Fail': 2357*cfb92d14SAndroid Build Coastguard Worker return False 2358*cfb92d14SAndroid Build Coastguard Worker 2359*cfb92d14SAndroid Build Coastguard Worker if listChannelMask is not None: 2360*cfb92d14SAndroid Build Coastguard Worker setChannelMaskCmd = (self.wpan_cmd_prefix + 'setprop Dataset:ChannelMaskPage0 ' + '0x' + 2361*cfb92d14SAndroid Build Coastguard Worker self.__convertLongToHex(self.__convertChannelMask(listChannelMask))) 2362*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setChannelMaskCmd)[0] == 'Fail': 2363*cfb92d14SAndroid Build Coastguard Worker return False 2364*cfb92d14SAndroid Build Coastguard Worker 2365*cfb92d14SAndroid Build Coastguard Worker if (sPSKc is not None or listSecurityPolicy is not None or xCommissioningSessionId is not None or 2366*cfb92d14SAndroid Build Coastguard Worker xTmfPort is not None or xSteeringData is not None or xBorderRouterLocator is not None or 2367*cfb92d14SAndroid Build Coastguard Worker BogusTLV is not None): 2368*cfb92d14SAndroid Build Coastguard Worker setRawTLVCmd = self.wpan_cmd_prefix + 'setprop Dataset:RawTlvs ' 2369*cfb92d14SAndroid Build Coastguard Worker 2370*cfb92d14SAndroid Build Coastguard Worker if sPSKc is not None: 2371*cfb92d14SAndroid Build Coastguard Worker setRawTLVCmd += '0410' 2372*cfb92d14SAndroid Build Coastguard Worker stretchedPskc = Thread_PBKDF2.get(sPSKc, ModuleHelper.Default_XpanId, ModuleHelper.Default_NwkName) 2373*cfb92d14SAndroid Build Coastguard Worker pskc = '%x' % stretchedPskc 2374*cfb92d14SAndroid Build Coastguard Worker 2375*cfb92d14SAndroid Build Coastguard Worker if len(pskc) < 32: 2376*cfb92d14SAndroid Build Coastguard Worker pskc = pskc.zfill(32) 2377*cfb92d14SAndroid Build Coastguard Worker 2378*cfb92d14SAndroid Build Coastguard Worker setRawTLVCmd += pskc 2379*cfb92d14SAndroid Build Coastguard Worker 2380*cfb92d14SAndroid Build Coastguard Worker if listSecurityPolicy is not None: 2381*cfb92d14SAndroid Build Coastguard Worker setRawTLVCmd += '0c03' 2382*cfb92d14SAndroid Build Coastguard Worker 2383*cfb92d14SAndroid Build Coastguard Worker rotationTime = 0 2384*cfb92d14SAndroid Build Coastguard Worker policyBits = 0 2385*cfb92d14SAndroid Build Coastguard Worker 2386*cfb92d14SAndroid Build Coastguard Worker # previous passing way listSecurityPolicy=[True, True, 3600, 2387*cfb92d14SAndroid Build Coastguard Worker # False, False, True] 2388*cfb92d14SAndroid Build Coastguard Worker if len(listSecurityPolicy) == 6: 2389*cfb92d14SAndroid Build Coastguard Worker rotationTime = listSecurityPolicy[2] 2390*cfb92d14SAndroid Build Coastguard Worker 2391*cfb92d14SAndroid Build Coastguard Worker # the last three reserved bits must be 1 2392*cfb92d14SAndroid Build Coastguard Worker policyBits = 0b00000111 2393*cfb92d14SAndroid Build Coastguard Worker 2394*cfb92d14SAndroid Build Coastguard Worker if listSecurityPolicy[0]: 2395*cfb92d14SAndroid Build Coastguard Worker policyBits = policyBits | 0b10000000 2396*cfb92d14SAndroid Build Coastguard Worker if listSecurityPolicy[1]: 2397*cfb92d14SAndroid Build Coastguard Worker policyBits = policyBits | 0b01000000 2398*cfb92d14SAndroid Build Coastguard Worker if listSecurityPolicy[3]: 2399*cfb92d14SAndroid Build Coastguard Worker policyBits = policyBits | 0b00100000 2400*cfb92d14SAndroid Build Coastguard Worker if listSecurityPolicy[4]: 2401*cfb92d14SAndroid Build Coastguard Worker policyBits = policyBits | 0b00010000 2402*cfb92d14SAndroid Build Coastguard Worker if listSecurityPolicy[5]: 2403*cfb92d14SAndroid Build Coastguard Worker policyBits = policyBits | 0b00001000 2404*cfb92d14SAndroid Build Coastguard Worker else: 2405*cfb92d14SAndroid Build Coastguard Worker # new passing way listSecurityPolicy=[3600, 0b11001111] 2406*cfb92d14SAndroid Build Coastguard Worker rotationTime = listSecurityPolicy[0] 2407*cfb92d14SAndroid Build Coastguard Worker policyBits = listSecurityPolicy[1] 2408*cfb92d14SAndroid Build Coastguard Worker 2409*cfb92d14SAndroid Build Coastguard Worker policy = str(hex(rotationTime))[2:] 2410*cfb92d14SAndroid Build Coastguard Worker 2411*cfb92d14SAndroid Build Coastguard Worker if len(policy) < 4: 2412*cfb92d14SAndroid Build Coastguard Worker policy = policy.zfill(4) 2413*cfb92d14SAndroid Build Coastguard Worker 2414*cfb92d14SAndroid Build Coastguard Worker setRawTLVCmd += policy 2415*cfb92d14SAndroid Build Coastguard Worker 2416*cfb92d14SAndroid Build Coastguard Worker setRawTLVCmd += str(hex(policyBits))[2:] 2417*cfb92d14SAndroid Build Coastguard Worker 2418*cfb92d14SAndroid Build Coastguard Worker if xCommissioningSessionId is not None: 2419*cfb92d14SAndroid Build Coastguard Worker setRawTLVCmd += '0b02' 2420*cfb92d14SAndroid Build Coastguard Worker sessionid = str(hex(xCommissioningSessionId))[2:] 2421*cfb92d14SAndroid Build Coastguard Worker 2422*cfb92d14SAndroid Build Coastguard Worker if len(sessionid) < 4: 2423*cfb92d14SAndroid Build Coastguard Worker sessionid = sessionid.zfill(4) 2424*cfb92d14SAndroid Build Coastguard Worker 2425*cfb92d14SAndroid Build Coastguard Worker setRawTLVCmd += sessionid 2426*cfb92d14SAndroid Build Coastguard Worker 2427*cfb92d14SAndroid Build Coastguard Worker if xBorderRouterLocator is not None: 2428*cfb92d14SAndroid Build Coastguard Worker setRawTLVCmd += '0902' 2429*cfb92d14SAndroid Build Coastguard Worker locator = str(hex(xBorderRouterLocator))[2:] 2430*cfb92d14SAndroid Build Coastguard Worker 2431*cfb92d14SAndroid Build Coastguard Worker if len(locator) < 4: 2432*cfb92d14SAndroid Build Coastguard Worker locator = locator.zfill(4) 2433*cfb92d14SAndroid Build Coastguard Worker 2434*cfb92d14SAndroid Build Coastguard Worker setRawTLVCmd += locator 2435*cfb92d14SAndroid Build Coastguard Worker 2436*cfb92d14SAndroid Build Coastguard Worker if xSteeringData is not None: 2437*cfb92d14SAndroid Build Coastguard Worker steeringData = self.__convertLongToHex(xSteeringData) 2438*cfb92d14SAndroid Build Coastguard Worker setRawTLVCmd += '08' + str(len(steeringData) / 2).zfill(2) 2439*cfb92d14SAndroid Build Coastguard Worker setRawTLVCmd += steeringData 2440*cfb92d14SAndroid Build Coastguard Worker 2441*cfb92d14SAndroid Build Coastguard Worker if BogusTLV is not None: 2442*cfb92d14SAndroid Build Coastguard Worker setRawTLVCmd += '8202aa55' 2443*cfb92d14SAndroid Build Coastguard Worker 2444*cfb92d14SAndroid Build Coastguard Worker print(setRawTLVCmd) 2445*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2446*cfb92d14SAndroid Build Coastguard Worker 2447*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setRawTLVCmd)[0] == 'Fail': 2448*cfb92d14SAndroid Build Coastguard Worker return False 2449*cfb92d14SAndroid Build Coastguard Worker 2450*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 2451*cfb92d14SAndroid Build Coastguard Worker 2452*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 2453*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('MGMT_ACTIVE_SET() Error: ' + str(e)) 2454*cfb92d14SAndroid Build Coastguard Worker 2455*cfb92d14SAndroid Build Coastguard Worker def MGMT_PENDING_GET(self, Addr='', TLVs=[]): 2456*cfb92d14SAndroid Build Coastguard Worker """send MGMT_PENDING_GET command 2457*cfb92d14SAndroid Build Coastguard Worker 2458*cfb92d14SAndroid Build Coastguard Worker Returns: 2459*cfb92d14SAndroid Build Coastguard Worker True: successful to send MGMT_PENDING_GET 2460*cfb92d14SAndroid Build Coastguard Worker False: fail to send MGMT_PENDING_GET 2461*cfb92d14SAndroid Build Coastguard Worker """ 2462*cfb92d14SAndroid Build Coastguard Worker print('%s call MGMT_PENDING_GET' % self.port) 2463*cfb92d14SAndroid Build Coastguard Worker try: 2464*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'dataset mgmt-get-pending' 2465*cfb92d14SAndroid Build Coastguard Worker 2466*cfb92d14SAndroid Build Coastguard Worker if len(TLVs) != 0: 2467*cfb92d14SAndroid Build Coastguard Worker tlvs = ''.join('%02x' % tlv for tlv in TLVs) 2468*cfb92d14SAndroid Build Coastguard Worker setTLVCmd = self.wpan_cmd_prefix + 'setprop Dataset:RawTlvs ' + tlvs 2469*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setTLVCmd)[0] == 'Fail': 2470*cfb92d14SAndroid Build Coastguard Worker return False 2471*cfb92d14SAndroid Build Coastguard Worker else: 2472*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase')[0] == 'Fail': 2473*cfb92d14SAndroid Build Coastguard Worker return False 2474*cfb92d14SAndroid Build Coastguard Worker 2475*cfb92d14SAndroid Build Coastguard Worker if Addr != '': 2476*cfb92d14SAndroid Build Coastguard Worker setAddressCmd = self.wpan_cmd_prefix + 'setprop Dataset:DestIpAddress ' + Addr 2477*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setAddressCmd)[0] == 'Fail': 2478*cfb92d14SAndroid Build Coastguard Worker return False 2479*cfb92d14SAndroid Build Coastguard Worker 2480*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2481*cfb92d14SAndroid Build Coastguard Worker 2482*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 2483*cfb92d14SAndroid Build Coastguard Worker 2484*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 2485*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('MGMT_PENDING_GET() Error: ' + str(e)) 2486*cfb92d14SAndroid Build Coastguard Worker 2487*cfb92d14SAndroid Build Coastguard Worker def MGMT_PENDING_SET( 2488*cfb92d14SAndroid Build Coastguard Worker self, 2489*cfb92d14SAndroid Build Coastguard Worker sAddr='', 2490*cfb92d14SAndroid Build Coastguard Worker xCommissionerSessionId=None, 2491*cfb92d14SAndroid Build Coastguard Worker listPendingTimestamp=None, 2492*cfb92d14SAndroid Build Coastguard Worker listActiveTimestamp=None, 2493*cfb92d14SAndroid Build Coastguard Worker xDelayTimer=None, 2494*cfb92d14SAndroid Build Coastguard Worker xChannel=None, 2495*cfb92d14SAndroid Build Coastguard Worker xPanId=None, 2496*cfb92d14SAndroid Build Coastguard Worker xMasterKey=None, 2497*cfb92d14SAndroid Build Coastguard Worker sMeshLocalPrefix=None, 2498*cfb92d14SAndroid Build Coastguard Worker sNetworkName=None, 2499*cfb92d14SAndroid Build Coastguard Worker ): 2500*cfb92d14SAndroid Build Coastguard Worker """send MGMT_PENDING_SET command 2501*cfb92d14SAndroid Build Coastguard Worker 2502*cfb92d14SAndroid Build Coastguard Worker Returns: 2503*cfb92d14SAndroid Build Coastguard Worker True: successful to send MGMT_PENDING_SET 2504*cfb92d14SAndroid Build Coastguard Worker False: fail to send MGMT_PENDING_SET 2505*cfb92d14SAndroid Build Coastguard Worker """ 2506*cfb92d14SAndroid Build Coastguard Worker print('%s call MGMT_PENDING_SET' % self.port) 2507*cfb92d14SAndroid Build Coastguard Worker try: 2508*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'dataset mgmt-set-pending' 2509*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase')[0] == 'Fail': 2510*cfb92d14SAndroid Build Coastguard Worker return False 2511*cfb92d14SAndroid Build Coastguard Worker 2512*cfb92d14SAndroid Build Coastguard Worker if listPendingTimestamp is not None: 2513*cfb92d14SAndroid Build Coastguard Worker sActiveTimestamp = '%016x' % listPendingTimestamp[0] 2514*cfb92d14SAndroid Build Coastguard Worker setPendingTimeCmd = self.wpan_cmd_prefix + 'setprop Dataset:PendingTimestamp ' + sActiveTimestamp 2515*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setPendingTimeCmd)[0] == 'Fail': 2516*cfb92d14SAndroid Build Coastguard Worker return False 2517*cfb92d14SAndroid Build Coastguard Worker 2518*cfb92d14SAndroid Build Coastguard Worker if listActiveTimestamp is not None: 2519*cfb92d14SAndroid Build Coastguard Worker sActiveTimestamp = '%016x' % listActiveTimestamp[0] 2520*cfb92d14SAndroid Build Coastguard Worker setActiveTimeCmd = self.wpan_cmd_prefix + 'setprop Dataset:ActiveTimestamp ' + sActiveTimestamp 2521*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setActiveTimeCmd)[0] == 'Fail': 2522*cfb92d14SAndroid Build Coastguard Worker return False 2523*cfb92d14SAndroid Build Coastguard Worker 2524*cfb92d14SAndroid Build Coastguard Worker if xDelayTimer is not None: 2525*cfb92d14SAndroid Build Coastguard Worker setDelayTimerCmd = self.wpan_cmd_prefix + 'setprop Dataset:Delay ' + str(xDelayTimer) 2526*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setDelayTimerCmd)[0] == 'Fail': 2527*cfb92d14SAndroid Build Coastguard Worker return False 2528*cfb92d14SAndroid Build Coastguard Worker 2529*cfb92d14SAndroid Build Coastguard Worker if sNetworkName is not None: 2530*cfb92d14SAndroid Build Coastguard Worker setNetworkNameCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkName ' + str(sNetworkName) 2531*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setNetworkNameCmd)[0] == 'Fail': 2532*cfb92d14SAndroid Build Coastguard Worker return False 2533*cfb92d14SAndroid Build Coastguard Worker 2534*cfb92d14SAndroid Build Coastguard Worker if xChannel is not None: 2535*cfb92d14SAndroid Build Coastguard Worker setChannelCmd = self.wpan_cmd_prefix + 'setprop Dataset:Channel ' + str(xChannel) 2536*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setChannelCmd)[0] == 'Fail': 2537*cfb92d14SAndroid Build Coastguard Worker return False 2538*cfb92d14SAndroid Build Coastguard Worker 2539*cfb92d14SAndroid Build Coastguard Worker if sMeshLocalPrefix is not None: 2540*cfb92d14SAndroid Build Coastguard Worker setMLPrefixCmd = self.wpan_cmd_prefix + 'setprop Dataset:MeshLocalPrefix ' + str(sMeshLocalPrefix) 2541*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setMLPrefixCmd)[0] == 'Fail': 2542*cfb92d14SAndroid Build Coastguard Worker return False 2543*cfb92d14SAndroid Build Coastguard Worker 2544*cfb92d14SAndroid Build Coastguard Worker if xMasterKey is not None: 2545*cfb92d14SAndroid Build Coastguard Worker key = self.__convertLongToHex(xMasterKey, 32) 2546*cfb92d14SAndroid Build Coastguard Worker setNetworkKeyCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkKey ' + key 2547*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setNetworkKeyCmd)[0] == 'Fail': 2548*cfb92d14SAndroid Build Coastguard Worker return False 2549*cfb92d14SAndroid Build Coastguard Worker 2550*cfb92d14SAndroid Build Coastguard Worker if xPanId is not None: 2551*cfb92d14SAndroid Build Coastguard Worker setPanIdCmd = self.wpan_cmd_prefix + 'setprop Dataset:PanId ' + str(xPanId) 2552*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(setPanIdCmd)[0] == 'Fail': 2553*cfb92d14SAndroid Build Coastguard Worker return False 2554*cfb92d14SAndroid Build Coastguard Worker 2555*cfb92d14SAndroid Build Coastguard Worker if xCommissionerSessionId is not None: 2556*cfb92d14SAndroid Build Coastguard Worker print('not handle xCommissionerSessionId') 2557*cfb92d14SAndroid Build Coastguard Worker 2558*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2559*cfb92d14SAndroid Build Coastguard Worker 2560*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 2561*cfb92d14SAndroid Build Coastguard Worker 2562*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 2563*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('MGMT_PENDING_SET() Error: ' + str(e)) 2564*cfb92d14SAndroid Build Coastguard Worker 2565*cfb92d14SAndroid Build Coastguard Worker def MGMT_COMM_GET(self, Addr='ff02::1', TLVs=[]): 2566*cfb92d14SAndroid Build Coastguard Worker """send MGMT_COMM_GET command 2567*cfb92d14SAndroid Build Coastguard Worker 2568*cfb92d14SAndroid Build Coastguard Worker Returns: 2569*cfb92d14SAndroid Build Coastguard Worker True: successful to send MGMT_COMM_GET 2570*cfb92d14SAndroid Build Coastguard Worker False: fail to send MGMT_COMM_GET 2571*cfb92d14SAndroid Build Coastguard Worker """ 2572*cfb92d14SAndroid Build Coastguard Worker print('%s call MGMT_COMM_GET' % self.port) 2573*cfb92d14SAndroid Build Coastguard Worker try: 2574*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'commissioner mgmt-get ' 2575*cfb92d14SAndroid Build Coastguard Worker print('TLVs:') 2576*cfb92d14SAndroid Build Coastguard Worker print(TLVs) 2577*cfb92d14SAndroid Build Coastguard Worker 2578*cfb92d14SAndroid Build Coastguard Worker if len(TLVs) != 0: 2579*cfb92d14SAndroid Build Coastguard Worker tlvs = ''.join('%02x' % tlv for tlv in TLVs) 2580*cfb92d14SAndroid Build Coastguard Worker cmd += tlvs 2581*cfb92d14SAndroid Build Coastguard Worker 2582*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2583*cfb92d14SAndroid Build Coastguard Worker 2584*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 2585*cfb92d14SAndroid Build Coastguard Worker 2586*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 2587*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('MGMT_COMM_GET() Error: ' + str(e)) 2588*cfb92d14SAndroid Build Coastguard Worker 2589*cfb92d14SAndroid Build Coastguard Worker def MGMT_COMM_SET( 2590*cfb92d14SAndroid Build Coastguard Worker self, 2591*cfb92d14SAndroid Build Coastguard Worker Addr='ff02::1', 2592*cfb92d14SAndroid Build Coastguard Worker xCommissionerSessionID=None, 2593*cfb92d14SAndroid Build Coastguard Worker xSteeringData=None, 2594*cfb92d14SAndroid Build Coastguard Worker xBorderRouterLocator=None, 2595*cfb92d14SAndroid Build Coastguard Worker xChannelTlv=None, 2596*cfb92d14SAndroid Build Coastguard Worker ExceedMaxPayload=False, 2597*cfb92d14SAndroid Build Coastguard Worker ): 2598*cfb92d14SAndroid Build Coastguard Worker """send MGMT_COMM_SET command 2599*cfb92d14SAndroid Build Coastguard Worker 2600*cfb92d14SAndroid Build Coastguard Worker Returns: 2601*cfb92d14SAndroid Build Coastguard Worker True: successful to send MGMT_COMM_SET 2602*cfb92d14SAndroid Build Coastguard Worker False: fail to send MGMT_COMM_SET 2603*cfb92d14SAndroid Build Coastguard Worker """ 2604*cfb92d14SAndroid Build Coastguard Worker print('%s call MGMT_COMM_SET' % self.port) 2605*cfb92d14SAndroid Build Coastguard Worker try: 2606*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'commissioner mgmt-set ' 2607*cfb92d14SAndroid Build Coastguard Worker print('-------------------------------') 2608*cfb92d14SAndroid Build Coastguard Worker print(xCommissionerSessionID) 2609*cfb92d14SAndroid Build Coastguard Worker print(xSteeringData) 2610*cfb92d14SAndroid Build Coastguard Worker print(str(xSteeringData) + ' ' + str(hex(xSteeringData)[2:])) 2611*cfb92d14SAndroid Build Coastguard Worker print(xBorderRouterLocator) 2612*cfb92d14SAndroid Build Coastguard Worker print(xChannelTlv) 2613*cfb92d14SAndroid Build Coastguard Worker print(ExceedMaxPayload) 2614*cfb92d14SAndroid Build Coastguard Worker print('-------------------------------') 2615*cfb92d14SAndroid Build Coastguard Worker 2616*cfb92d14SAndroid Build Coastguard Worker if xCommissionerSessionID is not None: 2617*cfb92d14SAndroid Build Coastguard Worker # use assigned session id 2618*cfb92d14SAndroid Build Coastguard Worker cmd += '0b02' + str(xCommissionerSessionID) 2619*cfb92d14SAndroid Build Coastguard Worker elif xCommissionerSessionID is None: 2620*cfb92d14SAndroid Build Coastguard Worker # use original session id 2621*cfb92d14SAndroid Build Coastguard Worker if self.isActiveCommissioner is True: 2622*cfb92d14SAndroid Build Coastguard Worker cmd += '0b02' + self.__lstrip0x(self.__getCommissionerSessionId()) 2623*cfb92d14SAndroid Build Coastguard Worker else: 2624*cfb92d14SAndroid Build Coastguard Worker pass 2625*cfb92d14SAndroid Build Coastguard Worker 2626*cfb92d14SAndroid Build Coastguard Worker if xSteeringData is not None: 2627*cfb92d14SAndroid Build Coastguard Worker cmd += '08' + str(len(hex(xSteeringData)[2:])) + str(hex(xSteeringData)[2:]) 2628*cfb92d14SAndroid Build Coastguard Worker 2629*cfb92d14SAndroid Build Coastguard Worker if xBorderRouterLocator is not None: 2630*cfb92d14SAndroid Build Coastguard Worker cmd += '0902' + str(hex(xBorderRouterLocator)) 2631*cfb92d14SAndroid Build Coastguard Worker 2632*cfb92d14SAndroid Build Coastguard Worker if xChannelTlv is not None: 2633*cfb92d14SAndroid Build Coastguard Worker cmd += '000300' + '%04x' % xChannelTlv 2634*cfb92d14SAndroid Build Coastguard Worker 2635*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2636*cfb92d14SAndroid Build Coastguard Worker 2637*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 2638*cfb92d14SAndroid Build Coastguard Worker 2639*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 2640*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('MGMT_COMM_SET() Error: ' + str(e)) 2641*cfb92d14SAndroid Build Coastguard Worker 2642*cfb92d14SAndroid Build Coastguard Worker def setActiveDataset(self, listActiveDataset=[]): 2643*cfb92d14SAndroid Build Coastguard Worker print('%s call setActiveDataset' % self.port) 2644*cfb92d14SAndroid Build Coastguard Worker 2645*cfb92d14SAndroid Build Coastguard Worker def setCommisionerMode(self): 2646*cfb92d14SAndroid Build Coastguard Worker print('%s call setCommissionerMode' % self.port) 2647*cfb92d14SAndroid Build Coastguard Worker 2648*cfb92d14SAndroid Build Coastguard Worker def setPSKc(self, strPSKc): 2649*cfb92d14SAndroid Build Coastguard Worker print('%s call setPSKc' % self.port) 2650*cfb92d14SAndroid Build Coastguard Worker try: 2651*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Network:PSKc %s' % strPSKc 2652*cfb92d14SAndroid Build Coastguard Worker datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:PSKc %s' % strPSKc 2653*cfb92d14SAndroid Build Coastguard Worker self.hasActiveDatasetToCommit = True 2654*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail' 2655*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 2656*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setPSKc() Error: ' + str(e)) 2657*cfb92d14SAndroid Build Coastguard Worker 2658*cfb92d14SAndroid Build Coastguard Worker def setActiveTimestamp(self, xActiveTimestamp): 2659*cfb92d14SAndroid Build Coastguard Worker print('%s call setActiveTimestamp' % self.port) 2660*cfb92d14SAndroid Build Coastguard Worker try: 2661*cfb92d14SAndroid Build Coastguard Worker sActiveTimestamp = str(xActiveTimestamp) 2662*cfb92d14SAndroid Build Coastguard Worker if len(sActiveTimestamp) < 16: 2663*cfb92d14SAndroid Build Coastguard Worker sActiveTimestamp = sActiveTimestamp.zfill(16) 2664*cfb92d14SAndroid Build Coastguard Worker self.activetimestamp = sActiveTimestamp 2665*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'setprop Dataset:ActiveTimestamp %s' % sActiveTimestamp 2666*cfb92d14SAndroid Build Coastguard Worker self.hasActiveDatasetToCommit = True 2667*cfb92d14SAndroid Build Coastguard Worker return self.__sendCommand(cmd)[0] != 'Fail' 2668*cfb92d14SAndroid Build Coastguard Worker except Exception as e: 2669*cfb92d14SAndroid Build Coastguard Worker ModuleHelper.WriteIntoDebugLogger('setActiveTimestamp() Error: ' + str(e)) 2670*cfb92d14SAndroid Build Coastguard Worker 2671*cfb92d14SAndroid Build Coastguard Worker def setUdpJoinerPort(self, portNumber): 2672*cfb92d14SAndroid Build Coastguard Worker """set Joiner UDP Port 2673*cfb92d14SAndroid Build Coastguard Worker 2674*cfb92d14SAndroid Build Coastguard Worker Args: 2675*cfb92d14SAndroid Build Coastguard Worker portNumber: Joiner UDP Port number 2676*cfb92d14SAndroid Build Coastguard Worker 2677*cfb92d14SAndroid Build Coastguard Worker Returns: 2678*cfb92d14SAndroid Build Coastguard Worker True: successful to set Joiner UDP Port 2679*cfb92d14SAndroid Build Coastguard Worker False: fail to set Joiner UDP Port 2680*cfb92d14SAndroid Build Coastguard Worker 2681*cfb92d14SAndroid Build Coastguard Worker @todo : required if as reference device 2682*cfb92d14SAndroid Build Coastguard Worker """ 2683*cfb92d14SAndroid Build Coastguard Worker 2684*cfb92d14SAndroid Build Coastguard Worker def commissionerUnregister(self): 2685*cfb92d14SAndroid Build Coastguard Worker """stop commissioner 2686*cfb92d14SAndroid Build Coastguard Worker 2687*cfb92d14SAndroid Build Coastguard Worker Returns: 2688*cfb92d14SAndroid Build Coastguard Worker True: successful to stop commissioner 2689*cfb92d14SAndroid Build Coastguard Worker False: fail to stop commissioner 2690*cfb92d14SAndroid Build Coastguard Worker """ 2691*cfb92d14SAndroid Build Coastguard Worker print('%s call commissionerUnregister' % self.port) 2692*cfb92d14SAndroid Build Coastguard Worker cmd = self.wpan_cmd_prefix + 'commissioner stop' 2693*cfb92d14SAndroid Build Coastguard Worker print(cmd) 2694*cfb92d14SAndroid Build Coastguard Worker if self.__sendCommand(cmd)[0] != 'Fail': 2695*cfb92d14SAndroid Build Coastguard Worker self.isActiveCommissioner = False 2696*cfb92d14SAndroid Build Coastguard Worker return True 2697*cfb92d14SAndroid Build Coastguard Worker else: 2698*cfb92d14SAndroid Build Coastguard Worker return False 2699*cfb92d14SAndroid Build Coastguard Worker 2700*cfb92d14SAndroid Build Coastguard Worker def sendBeacons(self, sAddr, xCommissionerSessionId, listChannelMask, xPanId): 2701*cfb92d14SAndroid Build Coastguard Worker print('%s call sendBeacons' % self.port) 2702*cfb92d14SAndroid Build Coastguard Worker self._sendline(self.wpan_cmd_prefix + 'scan') 2703*cfb92d14SAndroid Build Coastguard Worker return True 2704*cfb92d14SAndroid Build Coastguard Worker 2705*cfb92d14SAndroid Build Coastguard Worker def updateRouterStatus(self): 2706*cfb92d14SAndroid Build Coastguard Worker """force update to router as if there is child id request 2707*cfb92d14SAndroid Build Coastguard Worker @todo : required if as reference device 2708*cfb92d14SAndroid Build Coastguard Worker """ 2709*cfb92d14SAndroid Build Coastguard Worker 2710*cfb92d14SAndroid Build Coastguard Worker def setRouterThresholdValues(self, upgradeThreshold, downgradeThreshold): 2711*cfb92d14SAndroid Build Coastguard Worker print('%s call setRouterThresholdValues' % self.port) 2712*cfb92d14SAndroid Build Coastguard Worker self.__setRouterUpgradeThreshold(upgradeThreshold) 2713*cfb92d14SAndroid Build Coastguard Worker self.__setRouterDowngradeThreshold(downgradeThreshold) 2714*cfb92d14SAndroid Build Coastguard Worker 2715*cfb92d14SAndroid Build Coastguard Worker def setMinDelayTimer(self, iSeconds): 2716*cfb92d14SAndroid Build Coastguard Worker pass 2717*cfb92d14SAndroid Build Coastguard Worker 2718*cfb92d14SAndroid Build Coastguard Worker def ValidateDeviceFirmware(self): 2719*cfb92d14SAndroid Build Coastguard Worker print('%s call ValidateDeviceFirmware' % self.port) 2720*cfb92d14SAndroid Build Coastguard Worker if 'OPENTHREAD' in self.UIStatusMsg: 2721*cfb92d14SAndroid Build Coastguard Worker return True 2722*cfb92d14SAndroid Build Coastguard Worker else: 2723*cfb92d14SAndroid Build Coastguard Worker return False 2724*cfb92d14SAndroid Build Coastguard Worker 2725*cfb92d14SAndroid Build Coastguard Worker @staticmethod 2726*cfb92d14SAndroid Build Coastguard Worker def __lstrip0x(s): 2727*cfb92d14SAndroid Build Coastguard Worker """strip 0x at the beginning of a hex string if it exists 2728*cfb92d14SAndroid Build Coastguard Worker 2729*cfb92d14SAndroid Build Coastguard Worker Args: 2730*cfb92d14SAndroid Build Coastguard Worker s: hex string 2731*cfb92d14SAndroid Build Coastguard Worker 2732*cfb92d14SAndroid Build Coastguard Worker Returns: 2733*cfb92d14SAndroid Build Coastguard Worker hex string with leading 0x stripped 2734*cfb92d14SAndroid Build Coastguard Worker """ 2735*cfb92d14SAndroid Build Coastguard Worker if s.startswith('0x'): 2736*cfb92d14SAndroid Build Coastguard Worker s = s[2:] 2737*cfb92d14SAndroid Build Coastguard Worker 2738*cfb92d14SAndroid Build Coastguard Worker return s 2739