Wir haben uns entschlossen, eine große Anzahl ultrakleiner Server ** OpenBlocks ** für IoT-Gateways einzurichten. Web UI, eine dedizierte GUI-Anwendung von Platt Home, ist in der OpenBlocks IoT-Familie installiert. Gemäß den [FAQ] von Platt Home (https://openblocks.plathome.co.jp/products/obs_iot/bx1/faq3.html) können Elemente, die über die Web-Benutzeroberfläche festgelegt werden können, z. B. Netzwerkeinstellungen, über die Web-Benutzeroberfläche festgelegt werden. Es soll gesetzt werden, und es scheint, dass es nicht mit CUI (Linux-Befehl) gesetzt werden sollte. Wenn Sie die scp-Übertragung und Ausführung des Anwendungsprogramms einbeziehen, dauert es 15 Minuten pro Einheit. Ich habe beschlossen, ein Kitting-Skript in Python zu schreiben, da es möglich ist, die Gesamtzahl der Schritte zu reduzieren, indem von Anfang an ein automatisiertes Programm erstellt wird, anstatt lästige GUI-Vorgänge Dutzende Male zu wiederholen. Es hört sich gut an zu sagen, dass die Anzahl der Schritte reduziert ist, aber in Wirklichkeit wollte ich wirklich keine einfache Arbeit machen.
Automatisierte Browseroperationen mit Selenium. Es ist eine einfache Webanwendung, sodass Sie nichts Besonderes tun, indem Sie eine GET-Anfrage stellen, ein Textfeld eingeben oder auf die Schaltfläche Speichern klicken.
Python
"""
OpenBlocks IoT BX1 Kitting Script stage1
"""
__author__ = "MindWood"
__version__ = "1.00"
__date__ = "13 Mar 2020"
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
import sys
admin_id = 'adminUser'
admin_pw = 'adminPass'
passphrase = 'passPhrase'
id_rsa = 'ssh-rsa XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX== mw'
domain = 'example.com'
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(options=options)
driver.implicitly_wait(10)
#Stellen Sie eine Verbindung zur OpenBlocks IoT Web-Benutzeroberfläche her
driver.get('http://192.168.254.254:880')
#Wenn zuerst eine Zustimmungsschaltfläche vorhanden ist, wird diese als das erste zu verwendende Gerät beurteilt
ar = driver.find_elements_by_id('eula_agree')
if len(ar) == 0:
#Anmeldebildschirm
driver.find_element_by_name('name').send_keys(admin_id)
driver.find_element_by_name('password').send_keys(admin_pw)
driver.find_element_by_name('_act').click() #Einloggen
else:
#Administratorkontoeinstellungen und Zustimmungsbildschirm
driver.find_element_by_id('eula_agree').click() #Genau
time.sleep(1)
driver.find_element_by_name('_name').send_keys(admin_id)
driver.find_element_by_name('_password').send_keys(admin_pw)
driver.find_element_by_name('_password_confirm').send_keys(admin_pw)
driver.find_element_by_id('save').click() #sparen
time.sleep(1)
#System>>Serienbildschirm
driver.get('http://192.168.254.254:880/system/serial.php')
sq = driver.find_element_by_class_name('sq') #Seriennummer abrufen
serial_num = sq.find_element_by_xpath('pre').text.strip()
print('Ordnungsnummer[' + serial_num + ']')
#Bedienung>>Grundbildschirm
driver.get('http://192.168.254.254:880/apps/m2miot/basic.php')
time.sleep(1)
driver.find_element_by_id('enable_bluetooth').click() #Bluetooth-Berechtigung
driver.find_element_by_id('save').click() #sparen
time.sleep(1)
#Bedienung>>Statusbildschirm
driver.get('http://192.168.254.254:880/apps/m2miot/status.php')
time.sleep(1)
sq = driver.find_element_by_class_name('sq')
hcconfig = sq.find_element_by_xpath('pre').text
p = hcconfig.find('BD Address: ')
bd_adrs = hcconfig[p+12:p+29].replace(':', '') #BD-Adresserfassung
print('BD-Adresse[' + bd_adrs + ']')
#System>>Bildschirm filtern
driver.get('http://192.168.254.254:880/system/ipfilter.php')
time.sleep(1)
this_checkbox = driver.find_element_by_id('filter_hold_true')
if not this_checkbox.is_selected(): this_checkbox.click() #Wenn nicht aktiviert, überprüfen Sie
driver.find_element_by_id('mode_ssh_true').click() #SSH aktiviert
driver.find_element_by_id('save').click() #sparen
time.sleep(1)
#System>>SSH-bezogener Bildschirm
driver.get('http://192.168.254.254:880/system/sshd_config.php')
time.sleep(1)
driver.find_element_by_id('deny_passwd_login').click() #Passwortauthentifizierung verboten
elm = driver.find_element_by_id('pubkey')
elm.clear()
elm.send_keys(id_rsa)
driver.find_element_by_id('save').click() #sparen
time.sleep(1)
#System>>Mein Seitenbildschirm
driver.get('http://192.168.254.254:880/system/mypage.php')
time.sleep(1)
driver.find_element_by_id('password').send_keys(admin_pw)
driver.find_element_by_id('save').click() #sparen
time.sleep(1)
#Netzwerk>>Grundbildschirm
driver.get('http://192.168.254.254:880/network/basic.php')
time.sleep(1)
elm = driver.find_element_by_id('domainname')
elm.clear()
elm.send_keys(domain) #Domain
elm = driver.find_element_by_id('wlan0_ssid')
elm.clear()
ssid = serial_num + '_MindWood'
elm.send_keys(ssid) # SSID
elm = driver.find_element_by_id('wlan0_passphrase')
elm.clear()
elm.send_keys(passphrase) #Passphrase
driver.find_element_by_id('enable_ppp0').click() #Verwenden Sie PPP
time.sleep(1)
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)') #Scrollen Sie zur untersten Zeile
time.sleep(1)
#Nur-Daten-SIM-Einstellungen für SORACOM
driver.find_element_by_id('ppp0_apn').send_keys('soracom.io') # APN
driver.find_element_by_id('ppp0_user').send_keys('sora') #Nutzername
driver.find_element_by_id('ppp0_pass').send_keys('sora') #Passwort
driver.find_element_by_id('ppp0_autotype_false').click() #Stellen Sie keine automatische Verbindung her
driver.find_element_by_id('ppp0_set_reconnect_false').click() #Schließen Sie die Verbindung nicht regelmäßig an
driver.find_element_by_id('save').click() #sparen
time.sleep(1)
#System>>Passwortbildschirm
driver.get('http://192.168.254.254:880/system/passwd.php')
time.sleep(1)
driver.find_element_by_id('password').send_keys(admin_pw)
driver.find_element_by_id('password_confirm').send_keys(admin_pw)
driver.find_element_by_id('save').click() #sparen
#Instandhaltung>>Bildschirm neu starten
driver.get('http://192.168.254.254:880/maintenance/shutdown.php')
time.sleep(1)
sq = driver.find_element_by_class_name('sq')
sq.find_element_by_xpath('//input[@onclick="pre_reboot()"]').click() #Starten Sie neu
driver.find_element_by_id('reboot_btn').click() #Lauf
time.sleep(2)
alert = driver.switch_to.alert
alert.accept() #Antworten Sie mit OK, um eine Warnung zu erhalten
sys.exit()
Mit den Paketen paramiko und scp haben wir die Übertragung und Ausführung der Application Deployment Shell automatisiert. Wenn Sie versuchen, dies manuell zu tun, ist das Einstellen des Schlüssels mühsam.
Python
"""
OpenBlocks IoT BX1 Kitting Script stage2
"""
__author__ = "MindWood"
__version__ = "1.00"
__date__ = "13 Mar 2020"
import paramiko
import scp
import time
def exec_cmd(cmd, ssh):
"""Befehl mit ssh ausführen"""
print('# ' + cmd)
stdin, stdout, stderr = ssh.exec_command(cmd)
for out_line in stdout:
print(out_line.strip('\n'))
for err_line in stderr:
print(err_line.strip('\n'))
with paramiko.SSHClient() as ssh:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
pkey = paramiko.RSAKey.from_private_key_file('bx1_rsa.key')
ssh.connect(hostname='192.168.254.254', port=22, username='root', password='adminPass', pkey=pkey)
exec_cmd('rm -f write_firmware.sh; ls -l', ssh)
with scp.SCPClient(ssh.get_transport()) as scp:
scp.put('write_firmware.sh', 'write_firmware.sh')
time.sleep(1)
exec_cmd('chmod 755 write_firmware.sh; ./write_firmware.sh', ssh)
time.sleep(2)
exec_cmd('reboot', ssh)
Wenn Sie dies hilfreich finden!
Recommended Posts