SUR CETTE PAGE
Importation BLE (cas d’usage)
Lisez et suivez cet exemple pour importer des ressources Bluetooth Low Energy (BLE) et leur attribuer des noms utiles et descriptifs à l’aide de scripts Python et d’API.
Lorsque vous configurez et activez des services de géolocalisation avec la visibilité des actifs par Juniper Mist, les administrateurs comme vous peuvent voir tous les clients et actifs BLE. Vous pouvez également voir leur emplacement précis, directement sur un plan d’étage ou une carte intérieure.
Pour les sites qui utilisent des étiquettes de ressources BLE, il est pratique de suivre ces appareils en leur donnant des noms facilement lisibles qui fournissent un certain contexte. Vous pouvez ajouter et afficher ces noms individuellement dans le portail Juniper Mist, mais si vous avez beaucoup de ressources à gérer, il peut être assez long de le faire un par un. Un moyen plus simple de le faire consiste à exécuter un script pour importer des ressources BLE et leur attribuer un nom en masse.
Pour ce cas d’usage, vous devez :
-
Activez la visibilité des actifs dans les paramètres du site pour chaque site.
-
Assurez-vous que vous disposez d’une licence active pour la visibilité des actifs.
-
Assurez-vous d’avoir placé des points d’accès compatibles sur le plan du bâtiment.
Ce cas d’utilisation implique deux scripts : main.py et mist-client.py. Un troisième fichier, un fichier CSV appelé assets.csv, contient les ressources BLE et leurs noms correspondants.
Voici l'ordre des étapes à suivre lorsque vous devez importer des ressources BLE :
-
Commencez par mettre à jour le script avec votre jeton d’API Mist, l’identifiant main.py universel unique (UUID) du site Mist et la région (ou le cloud) dans laquelle votre organisation est hébergée.
-
Ensuite, vous ajoutez, supprimez ou inspectez les périphériques BLE et leurs noms dans le assets.csv fichier.
-
Exécutez le main.py script qui utilisera le contenu CSV pour créer les ressources dans Juniper Mist.
Main.py Script
Beaucoup de choses se passent dans les coulisses du main.py scénario. Le script importe les données du fichier CSV et les convertit au format JSON. Ensuite, pour chaque appareil, le script crée une ressource BLE et déclenche le mist-client.py script. Ce mist-client.py script appelle l’API Juniper Mist en effectuant tous les appels nécessaires.
#!/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.
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-host}/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 Script
Le mist_client.py script fonctionne comme un client RESTful classique pour interagir avec l’API Juniper Mist. Le script effectue des appels d’API en fonction de l’entrée du fichier CSV et de la sortie du main.py script. Le mist-client.py script vérifie également les erreurs de la réponse HTTP de l’API et affiche la sortie, comme suit :
#!/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
Dans cet exemple, le assets.csv fichier se trouve dans le même répertoire que les mist_client.py fichiers and main.py . L’exemple suivant montre comment formater le fichier CSV avec le nom de la ressource BLE et son adresse MAC associée :
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
L’automatisation ne se limite pas à l’utilisation d’API RESTful et de Python. D’autres options telles que les API WebSocket et webhook sont disponibles. Vous pouvez explorer ces autres options à des fins d’automatisation.