-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdiscover_devices_xbee.py
124 lines (93 loc) · 4.3 KB
/
discover_devices_xbee.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# Sergio Rueda Teruel. 2018
# Este software ha sido desarrollado para el trabajo fin de master de la titulación
# Máster Universitario en Ingeniería de Telecomunicación UOC-URL de la
# Universidad Oberta de Catalunya y lleva por título
# "Diseño de una WSN para la estimación del seeing de la cúpula D080,
# en el Observatorio Astrofísico de Javalambre."
# Para la realización de este código se han utilizado las librerías Python
# que la empresa Digi (Digi International Inc.) proporciona en su página web
# (https://www.digi.com/blog/xbee/introducing-the-official-digi-xbee-python-library/)
# este código está sometido a licencia de Reconocimiento-NoComercial-CompartirIgual
# 3.0 España de Creative Commons.
# Este módulo se utiliza para descubrir equipos remotos conectados a la misma red (PAN ID)
# que el equipo local, es desde este equipo local desde el que se realizan las tareas de
# descubrimiento.
import time, sys, argparse
import read_sys_config
from digi.xbee.models.status import NetworkDiscoveryStatus
from digi.xbee.devices import XBeeDevice
sys.tracebacklimit = 0
# Se admiten parámetros de depuración para la invocacción directa del módulo
# el parámetro -v VERBOSE muestra por consola la evolución del módulo
# discover-devices_xbee -v VERBOSE
parser= argparse.ArgumentParser()
parser.add_argument("-v","--verbose", help="Activates Verbose output")
args=parser.parse_args()
# Parámetros de conexión con el puerto serie al dispositivo local
port = read_sys_config.ReadLocalPortFromFile()
baud_rate = read_sys_config.ReadLocalBaudRateFromFile()
# La variable log será utilizada para ir registrando el avnace de todo el proceso
# y se devolverá en el procedimiento passlog para que pueda ser leída accedida
# por otros módulos
log=""
# Este procedimiento puede ser invocado por otros módulos para ir conociendo el estado
# del proceso de descrubirmiento de nodos en la red
def passlog():
global log
time.sleep(0.2)
return log
# Procedimiento principla que gestiona las tareas de descubrimiento
def main():
global log
state = 0
if args.verbose:
print(" +---------------------------------------------+")
print(" | XBee Discover Devices Module |")
print(" +---------------------------------------------+\n")
local_device = XBeeDevice(port, baud_rate)
try:
log=""
local_device.open()
xbee_network = local_device.get_network()
xbee_network.set_discovery_timeout(15) # 15 segundos
xbee_network.clear()
# Callback para los dispositivos descubiertos
def callback_device_discovered(remote):
global log
log =log+"Device discovered:\n" + "%s" % remote +"\n\n"
if args.verbose:
print("Device discovered: " + "%s" % remote)
# Callback para la finalización del proceso de descubrimiento
def callback_discovery_finished(status):
global log
if status == NetworkDiscoveryStatus.SUCCESS:
log=log+"Discovery process finished successfully.\n"
if args.verbose:
print("Discovery process finished successfully.")
else:
log= "There was an error discovering devices: %s\n" % status.description
if args.verbose:
print("There was an error discovering devices: %s" % status.description)
xbee_network.add_device_discovered_callback(callback_device_discovered)
xbee_network.add_discovery_process_finished_callback(callback_discovery_finished)
xbee_network.start_discovery_process()
log = "\nDiscovering remote XBee devices...\n\n"
if args.verbose:
print("Discovering remote XBee devices...")
while xbee_network.is_discovery_running():
# Actualiza el log para otros módulos
passlog()
time.sleep(0.1)
# Si es invocado por otros módulos devuleve un 1 indicando que ya ha acabado la fase de descubrimiento
state = 1
return state
except:
if local_device.is_open():
local_device.close()
pass
finally:
if local_device is not None and local_device.is_open():
local_device.close()
sys._clear_type_cache()
if __name__ == '__main__':
main()