AUF DIESER SEITE
BLE-Import (Anwendungsfall)
Lesen und folgen Sie diesem Beispiel, um Bluetooth Low Energy (BLE)-Ressourcen zu importieren und ihnen mithilfe von Python-Skripts und APIs nützliche, beschreibende Namen zu geben.
Wenn Sie standortbasierte Services mit Juniper Mist Asset-Sichtbarkeit einrichten und aktivieren, können Administratoren wie Sie alle BLE-Clients und -Ressourcen anzeigen. Sie können auch die genauen Standorte direkt auf einem Grundriss oder einer Karte für den Innenbereich sehen.
Für Standorte, die BLE-Ressourcen-Tags verwenden, ist es praktisch, diese Geräte zu verfolgen, indem Sie ihnen leicht lesbare Namen geben, die etwas Kontext liefern. Sie können diese Namen einzeln im Juniper Mist Portal hinzufügen und anzeigen, aber wenn Sie viele Assets zu verwalten haben, kann es ziemlich zeitaufwändig sein, dies nacheinander zu tun. Eine einfachere Möglichkeit, dies zu tun, besteht darin, ein Skript zum Importieren von BLE-Ressourcen auszuführen und ihnen einen Namen in großen Mengen zuzuweisen.
Für diesen Anwendungsfall müssen Sie:
-
Aktivieren Sie die Asset-Sichtbarkeit in den Site-Einstellungen für jede Site.
-
Stellen Sie sicher, dass Sie über eine aktive Lizenz für Asset-Sichtbarkeit verfügen.
-
Stellen Sie sicher, dass Sie kompatible APs auf dem Grundriss platziert haben.
Dieser Anwendungsfall umfasst zwei Skripte: main.py und mist-client.py. Eine dritte Datei, eine CSV-Datei mit dem Namen assets.csv, enthält die BLE-Ressourcen und ihre entsprechenden Namen.
Im Folgenden finden Sie die Reihenfolge der Schritte, die Sie beim Importieren von BLE-Ressourcen ausführen müssen:
-
Aktualisieren Sie zunächst das main.py Skript mit Ihrem Mist API-Token, Mist Standort Universal Unique Identifier (UUID) und der Region (oder Cloud), in der Ihre Organisation gehostet wird.
-
Als Nächstes fügen Sie die BLE-Geräte und ihre Namen in der assets.csv Datei hinzu, entfernen sie oder überprüfen sie.
-
Führen Sie das main.py Skript aus, das den CSV-Inhalt verwendet, um die Assets in Juniper Mist zu erstellen.
Main.py Skript
Hinter den Kulissen des Drehbuchs main.py passiert eine Menge. Das Skript importiert die Daten aus der CSV-Datei und konvertiert die Daten in das JSON-Format. Anschließend erstellt das Skript für jedes Gerät eine BLE-Ressource und löst das mist-client.py Skript aus. Dieses mist-client.py Skript führt alle erforderlichen Aufrufe an die Juniper Mist-API durch.
#!/usr/bin/python # # main.py # # Update main.py with your Mist API Token and Juniper Mist site UUID. # # Inspect the "assets.csv" file to update the assets being created, then run this exercise to automatically create BLE assets from CSV. import sys, csv, json, re from mist_client import Admin # Import the Juniper Mist client mist_api_token = '' # Your Juniper Mist API token goes here. Documentation: https://api.mist.com/api/v1/docs/Auth#api-token site_id = '' # Your Site ID goes here csv_file = 'assets.csv' # Convert CSV file to JSON object. def csv_to_json(file): csv_rows = [] with open(file) as csvfile: reader = csv.DictReader(csvfile) title = reader.fieldnames for row in reader: csv_rows.extend([ {title[i]: row[title[i]] for i in range(len(title))} ]) return csv_rows # Creates BLE assets using the given CSV file and the Juniper Mist API def create_assets(admin, data): for d in data: try: mac = re.sub(r'[^0-9a-fA-F]', '', d.get('MAC', '')).lower() assert len(mac) == 12 assert mac.isalnum() except: print('Invalid MAC {}, skipping this Asset.'.format(d.get('MAC', '(none)'))) continue # Build the asset payload payload = {'name': d['Name'].strip(), 'mac': mac} # Create the BLE Asset and note the targeted region (or cloud) api_url = 'https://api.mist.com/api/v1/sites/{}/assets'.format(site_id) (success, result) = admin.post(api_url, payload) # Add the new BLE Asset to the return list if result == None: print('Failed to create BLE Asset {}'.format(mac)) else: if success: print('Created BLE Asset \"{}\" ({})'.format(result.get('name', '(unnamed)'), result['mac'])) else: print('BLE Asset \"{}\" already exists with MAC Address {}'.format(d.get('Name', '(unnamed)'), mac)) # Main function if __name__ == '__main__': # Check for required variables if mist_api_token == '': print('Please provide your Mist API token as mist_api_token') sys.exit(1) elif site_id == '': print('Please provide your Mist Site UUID as site_id') sys.exit(1) # Create Mist client admin = Admin(mist_api_token) print() print('Converting file {} to JSON...\n'.format(csv_file)) # Convert CSV to valid JSON data = csv_to_json(csv_file) if data == None or data == []: print('Failed to convert CSV file to JSON. Exiting script.') sys.exit(2) print(json.dumps(data, indent=4, sort_keys=True)) print('\n=====\n') # Create the BLE Assets from CSV file print('Creating BLE Assets...\n') create_assets(admin, data) print()
Mist_client.py-Skript
Das mist_client.py Skript funktioniert wie ein regulärer RESTful-Client für die Interaktion mit der Juniper Mist-API. Das Skript führt API-Aufrufe basierend auf der Eingabe aus der CSV-Datei und der Ausgabe des Skripts main.py durch. Das mist-client.py Skript überprüft auch die HTTP-Antwort von der API und zeigt die Ausgabe wie folgt an:
#!/usr/bin/python # # mist_client.py # # Mist API client session. import json, requests # Mist CRUD operations class Admin(object): def __init__(self, token=''): self.session = requests.Session() self.headers = { 'Content-Type': 'application/json', 'Authorization': 'Token ' + token } def get(self, url): session = self.session headers = self.headers print('GET {}'.format(url)) response = session.get(url, headers=headers) if response.status_code != 200: print('Failed to GET') print('\tURL: {}'.format(url)) print('\tResponse: {} ({})'.format(response.text, response.status_code)) return False return json.loads(response.text) def post(self, url, payload, timeout=60): session = self.session headers = self.headers #print('POST {}'.format(url)) response = session.post(url, headers=headers, json=payload) if response.status_code == 400: return (False, response.text) elif response.status_code != 200: ''' print('Failed to POST') print('\tURL: {}'.format(url)) print('\tPayload: {}'.format(payload)) print('\tResponse: {} ({})'.format(response.text, response.status_code)) ''' return (False, None) return (True, json.loads(response.text))
Assets.csv
In diesem Beispiel befindet sich die assets.csv Datei im selben Verzeichnis wie die mist_client.py main.py und-Dateien. Das folgende Beispiel zeigt, wie die CSV-Datei mit dem Namen der BLE-Ressource und der zugehörigen MAC-Adresse formatiert wird:
Name,MAC Amber Badge,aa:bb:cc:dd:ee:ff Mark Badge,11-22-33-44-55-66 Invalid MAC,xx.yy.zz.xx.yy.zz
Automatisierung geht über die bloße Verwendung von RESTful-APIs und Python hinaus. Andere Optionen wie WebSocket und Webhook-APIs sind verfügbar. Sie können diese anderen Optionen zu Automatisierungszwecken erkunden.