protobin 0.0.8__tar.gz → 0.0.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: protobin
3
- Version: 0.0.8
3
+ Version: 0.0.9
4
4
  Summary: Python library for encode and decode data in protobin format
5
5
  Project-URL: Homepage, https://github.com/drmelectronic/protobin-python
6
6
  Project-URL: Bug Tracker, https://github.com/drmelectronic/protobin-python/issues
@@ -61,6 +61,8 @@ class Protocol:
61
61
  def load_format(self, js):
62
62
  self.formats = {}
63
63
  for k in js.keys():
64
+ if js[k]['header'] in self.headers:
65
+ raise KeyError(f'El header "{js[k]['header']}" ya está en uso en "{self.headers[js[k]["header"]]}"')
64
66
  self.formats[k] = Format(name=k, format=js[k], server=self.server)
65
67
  self.headers[js[k]['header']] = k
66
68
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "protobin"
7
- version = "0.0.8"
7
+ version = "0.0.9"
8
8
  authors = [
9
9
  { name="Daniel Robles", email="drm.electronic@gmail.com" },
10
10
  ]
@@ -2,7 +2,7 @@
2
2
  "login": {
3
3
  "header": "T",
4
4
  "device": {
5
- "serial": {"bytes": 0, "type": "string"}
5
+ "serial": {"type": "string"}
6
6
  },
7
7
  "server": {
8
8
  "id": {"bytes": 2, "type": "id"},
@@ -31,7 +31,7 @@
31
31
  "direction": {"bytes": 1, "type": "bool"},
32
32
  "state": {"bytes": 1, "type": "char"},
33
33
  "sales": {"bytes": 3, "type": "unsigned"},
34
- "events": {"bytes": 3, "type": "array", "array": {
34
+ "events": {"type": "array", "array": {
35
35
  "id": {"bytes": 2, "type": "unsigned"},
36
36
  "value": {"bytes": 1, "type": "unsigned"}}
37
37
  }
@@ -0,0 +1,87 @@
1
+
2
+ login:
3
+ header: T
4
+ device:
5
+ serial:
6
+ type: string
7
+ server:
8
+ id:
9
+ bytes: 2
10
+ type: id
11
+ bus_number:
12
+ bytes: 2
13
+ type: id
14
+ route:
15
+ bytes: 1
16
+ type: id
17
+ direction:
18
+ bytes: 1
19
+ type: bool
20
+ geofence:
21
+ bytes: 2
22
+ type: id
23
+ state:
24
+ bytes: 1
25
+ type: char
26
+ trip:
27
+ bytes: 4
28
+ type: id
29
+ driver:
30
+ bytes: 4
31
+ type: id
32
+ report:
33
+ header: P
34
+ device:
35
+ positions:
36
+ array:
37
+ busstop:
38
+ bytes: 2
39
+ type: id
40
+ lat:
41
+ bytes: 4
42
+ decimals: 6
43
+ type: float
44
+ lng:
45
+ bytes: 4
46
+ decimals: 6
47
+ type: float
48
+ mark:
49
+ bytes: 2
50
+ type: id
51
+ speed:
52
+ bytes: 1
53
+ type: unsigned
54
+ time:
55
+ bytes: 6
56
+ type: datetime
57
+ bytes: 19
58
+ type: array
59
+ trip:
60
+ bytes: 4
61
+ type: unsigned
62
+ route:
63
+ bytes: 1
64
+ type: unsigned
65
+ direction:
66
+ bytes: 1
67
+ type: bool
68
+ state:
69
+ bytes: 1
70
+ type: char
71
+ sales:
72
+ bytes: 3
73
+ type: unsigned
74
+ events:
75
+ array:
76
+ id:
77
+ bytes: 2
78
+ type: unsigned
79
+ value:
80
+ bytes: 1
81
+ type: unsigned
82
+ bytes: 3
83
+ type: array
84
+ server:
85
+ positions:
86
+ bytes: 1
87
+ type: unsigned
@@ -271,12 +271,6 @@ class AdvancedTest(unittest.TestCase):
271
271
  self.assertEqual(DATA, recv)
272
272
  self.assertEqual(name, 'report')
273
273
 
274
- # def test_file_yaml(self):
275
- # protocol = Protocol(file='demo.yaml')
276
- # binary = protocol.encode(DATA, 'report')
277
- # h, recv = protocol.decode(binary)
278
- # self.assertEqual(h, 'P')
279
-
280
274
  def test_json(self):
281
275
  protocol = Protocol(js={'medida':
282
276
  {'header': 'M',
@@ -295,65 +289,131 @@ class AdvancedTest(unittest.TestCase):
295
289
  self.assertEqual(data, recv)
296
290
 
297
291
  def test_new_yaml(self):
298
- ym = yaml.full_load("""report:
299
- positions:
300
- bytes: 19
301
- type: array
302
- array:
303
- time:
304
- bytes: 6
305
- type: datetime
306
- lng:
307
- bytes: 4
308
- decimals: 6
309
- type: float
310
- lat:
311
- bytes: 4
312
- decimals: 6
313
- type: float
314
- speed:
315
- bytes: 1
316
- type: unsigned
317
- mark:
318
- bytes: 2
319
- type: unsigned
320
- busstop:
321
- bytes: 2
322
- type: unsigned
323
- trip:
324
- bytes: 4
325
- type: unsigned
326
- route:
327
- bytes: 1
328
- type: unsigned
329
- direction:
330
- bytes: 1
331
- type: bool
332
- state:
333
- bytes: 1
334
- type: char
335
- sales:
336
- bytes: 3
337
- type: unsigned
338
- events:
339
- bytes: 3
340
- type: array
341
- array:
342
- id:
343
- bytes: 2
344
- type: unsigned
345
- value:
346
- bytes: 1
347
- type: unsigned
292
+ ym = yaml.full_load("""
293
+ login:
294
+ device:
295
+ serial:
296
+ type: string
297
+ header: T
298
+ server:
299
+ bus_number:
300
+ bytes: 2
301
+ type: id
302
+ direction:
303
+ bytes: 1
304
+ type: bool
305
+ driver:
306
+ bytes: 4
307
+ type: id
308
+ geofence:
309
+ bytes: 2
310
+ type: id
311
+ id:
312
+ bytes: 2
313
+ type: id
314
+ route:
315
+ bytes: 1
316
+ type: id
317
+ state:
318
+ bytes: 1
319
+ type: char
320
+ trip:
321
+ bytes: 4
322
+ type: id
323
+ report:
324
+ device:
325
+ direction:
326
+ bytes: 1
327
+ type: bool
328
+ events:
329
+ array:
330
+ id:
331
+ bytes: 2
332
+ type: unsigned
333
+ value:
334
+ bytes: 1
335
+ type: unsigned
336
+ bytes: 3
337
+ type: array
338
+ positions:
339
+ array:
340
+ busstop:
341
+ bytes: 2
342
+ type: id
343
+ lat:
344
+ bytes: 4
345
+ decimals: 6
346
+ type: float
347
+ lng:
348
+ bytes: 4
349
+ decimals: 6
350
+ type: float
351
+ mark:
352
+ bytes: 2
353
+ type: id
354
+ speed:
355
+ bytes: 1
356
+ type: unsigned
357
+ time:
358
+ bytes: 6
359
+ type: datetime
360
+ bytes: 19
361
+ type: array
362
+ route:
363
+ bytes: 1
364
+ type: unsigned
365
+ sales:
366
+ bytes: 3
367
+ type: unsigned
368
+ state:
369
+ bytes: 1
370
+ type: char
371
+ trip:
372
+ bytes: 4
373
+ type: unsigned
374
+ header: P
375
+ server:
376
+ positions:
377
+ bytes: 1
378
+ type: unsigned
348
379
  """)
349
380
  js = json.dumps(ym, indent=2)
350
381
 
351
382
  def test_convert_json_to_yaml(self):
352
- protocol = Protocol(file='demo.json', server=True)
383
+ with open('demo.json', 'r') as f:
384
+ js = json.loads(f.read())
385
+ ym = yaml.dump(js)
386
+ print(ym)
353
387
 
354
388
  def test_login(self):
355
389
  device = Protocol(file='demo.json', server=False)
356
390
  server = Protocol(file='demo.json', server=True)
391
+
392
+ data = {'serial': '15984316545'}
393
+ binary = device.encode(data, 'login')
394
+ print('client', binary)
395
+ header, recv = server.decode(binary)
396
+ self.assertEqual(header, 'login')
397
+ self.assertEqual(data, recv)
398
+ data = {
399
+ 'id': 43,
400
+ 'bus_number': 18,
401
+ 'route': 2,
402
+ 'direction': True,
403
+ 'geofence': None,
404
+ 'state': 'R',
405
+ 'trip': 5681121,
406
+ 'driver': 1432
407
+ }
408
+ binary = server.encode(data, 'login')
409
+ print('server', binary)
410
+ header, recv = device.decode(binary)
411
+ self.assertEqual(header, 'login')
412
+ self.assertEqual(data, recv)
413
+
414
+ def test_file_yaml(self):
415
+ device = Protocol(file='demo.yaml', server=False)
416
+ server = Protocol(file='demo.yaml', server=True)
357
417
  data = {'serial': '15984316545'}
358
418
  binary = device.encode(data, 'login')
359
419
  header, recv = server.decode(binary)
@@ -373,3 +433,46 @@ class AdvancedTest(unittest.TestCase):
373
433
  header, recv = device.decode(binary)
374
434
  self.assertEqual(header, 'login')
375
435
  self.assertEqual(data, recv)
436
+
437
+ def test_file_json_yaml(self):
438
+ device = Protocol(file='demo.json', server=False)
439
+ server = Protocol(file='demo.yaml', server=True)
440
+ data = {'serial': '15984316545'}
441
+ binary = device.encode(data, 'login')
442
+ header, recv = server.decode(binary)
443
+ self.assertEqual(header, 'login')
444
+ self.assertEqual(data, recv)
445
+ data = {
446
+ 'id': 43,
447
+ 'bus_number': 18,
448
+ 'route': 2,
449
+ 'direction': True,
450
+ 'geofence': None,
451
+ 'state': 'R',
452
+ 'trip': 5681121,
453
+ 'driver': 1432
454
+ }
455
+ binary = server.encode(data, 'login')
456
+ header, recv = device.decode(binary)
457
+ self.assertEqual(header, 'login')
458
+ self.assertEqual(data, recv)
459
+
460
+ def test_error_header(self):
461
+ with self.assertRaises(KeyError) as er:
462
+ Protocol(js={
463
+ 'array': {
464
+ "header": "A",
465
+ "fields": {
466
+ 'test': {'bytes': 0, 'type': 'array', 'array': {
467
+ 'test': {'bytes': 0, 'type': 'string'}
468
+ }}}
469
+ },
470
+ 'bits': {
471
+ "header": "B",
472
+ "fields": {'test': {'type': 'bits'}}
473
+ },
474
+ 'bits_fixed': {
475
+ "header": "B",
476
+ "fields": {'test': {'type': 'bits', 'length': 7}}
477
+ }
478
+ })
@@ -1,624 +0,0 @@
1
- report:
2
- header: P
3
- format:
4
- positions:
5
- bytes: 19
6
- type: array
7
- array:
8
- time:
9
- bytes: 6
10
- type: datetime
11
- lng:
12
- bytes: 4
13
- decimals: 6
14
- type: float
15
- lat:
16
- bytes: 4
17
- decimals: 6
18
- type: float
19
- speed:
20
- bytes: 1
21
- type: unsigned
22
- mark:
23
- bytes: 2
24
- type: unsigned
25
- busstop:
26
- bytes: 2
27
- type: unsigned
28
- trip:
29
- bytes: 4
30
- type: unsigned
31
- route:
32
- bytes: 1
33
- type: unsigned
34
- direction:
35
- bytes: 1
36
- type: bool
37
- state:
38
- bytes: 1
39
- type: char
40
- sales:
41
- bytes: 3
42
- type: unsigned
43
- events:
44
- bytes: 3
45
- type: array
46
- array:
47
- id:
48
- bytes: 2
49
- type: unsigned
50
- value:
51
- bytes: 1
52
- type: unsigned
53
-
54
- ask_schedule:
55
- id:
56
- bytes: 4
57
- type: unsigned
58
- inicio:
59
- bytes: 6
60
- type: datetime
61
- controles:
62
- type: array
63
- array:
64
- geocerca:
65
- bytes: 2
66
- type: unsigned
67
- tiempo:
68
- bytes: 1
69
- type: signed
70
- volada:
71
- bytes: 1
72
- type: signed
73
-
74
- ask_trip:
75
- - bytes: 4
76
- key: salida
77
- type: unsigned
78
- backward_datero:
79
- - bytes: 2
80
- key: geocerca
81
- type: unsigned
82
- - bytes: 1
83
- key: i
84
- type: unsigned
85
- - bytes: 1
86
- key: delta
87
- type: unsigned
88
- - bytes: 2
89
- key: padron
90
- type: unsigned
91
- - bytes: 0
92
- key: id
93
- type: string
94
- busstop:
95
- - bytes: 2
96
- key: id
97
- type: unsigned
98
- - bytes: 1
99
- key: orden
100
- type: unsigned
101
- - bytes: 4
102
- decimals: 6
103
- key: longitud
104
- type: float
105
- - bytes: 4
106
- decimals: 6
107
- key: latitud
108
- type: float
109
- - bytes: 2
110
- key: radio
111
- type: unsigned
112
- - bytes: 1
113
- key: ruta
114
- type: unsigned
115
- - bytes: 1
116
- keys:
117
- - liquidar
118
- - lado
119
- - terminal
120
- - activo
121
- type: flags
122
- - bytes: 14
123
- key: nombre
124
- type: string
125
- - bytes: 1
126
- key: velocidad
127
- type: unsigned
128
- - array:
129
- - bytes: 2
130
- key: boleto
131
- type: unsigned
132
- - bytes: 2
133
- key: fin
134
- type: unsigned
135
- bytes: 0
136
- key: tarifas
137
- type: array
138
- - bytes: 6
139
- key: timestamp
140
- type: datetime
141
- command:
142
- - bytes: 1
143
- key: comando
144
- type: char
145
- - bytes: 0
146
- key: id
147
- type: string
148
- - bytes: 0
149
- key: value
150
- type: string
151
- error:
152
- - bytes: 0
153
- key: error
154
- type: string
155
- fare:
156
- - bytes: 2
157
- key: id
158
- type: unsigned
159
- - bytes: 7
160
- key: color
161
- type: string
162
- - bytes: 1
163
- key: orden
164
- type: unsigned
165
- - bytes: 13
166
- key: nombre
167
- type: string
168
- - bytes: 1
169
- keys:
170
- - activo
171
- - reintegro
172
- type: flags
173
- - bytes: 1
174
- keys:
175
- - lunes
176
- - martes
177
- - miercoles
178
- - jueves
179
- - viernes
180
- - sabado
181
- - domingo
182
- - feriado
183
- type: flags
184
- - bytes: 2
185
- key: ruta
186
- type: unsigned
187
- - bytes: 2
188
- decimals: 2
189
- key: tarifa
190
- type: float
191
- - bytes: 6
192
- key: timestamp
193
- type: datetime
194
- finalize_sales:
195
- - bytes: 4
196
- key: sesion
197
- type: unsigned
198
- - bytes: 2
199
- key: unidad
200
- type: unsigned
201
- - bytes: 6
202
- key: fin
203
- type: datetime
204
- - bytes: 4
205
- key: produccion
206
- type: unsigned
207
- - bytes: 4
208
- key: primero
209
- type: unsigned
210
- - bytes: 4
211
- key: ultimo
212
- type: unsigned
213
- finalize_sales_response:
214
- - bytes: 1
215
- key: error
216
- type: bool
217
- - bytes: 0
218
- key: title
219
- type: string
220
- - bytes: 0
221
- key: mensaje
222
- type: string
223
- - bytes: 4
224
- key: id
225
- type: unsigned
226
- forward_datero:
227
- - bytes: 2
228
- key: geocerca
229
- type: unsigned
230
- - bytes: 4
231
- key: salida
232
- type: unsigned
233
- - bytes: 6
234
- key: hora
235
- type: datetime
236
- - array:
237
- - bytes: 2
238
- key: padron
239
- type: unsigned
240
- - bytes: 1
241
- key: delta
242
- type: unsigned
243
- bytes: 0
244
- key: dateros
245
- type: array
246
- geocerca:
247
- - bytes: 2
248
- key: id
249
- type: unsigned
250
- - bytes: 1
251
- key: orden
252
- type: unsigned
253
- - bytes: 4
254
- decimals: 6
255
- key: longitud
256
- type: float
257
- - bytes: 4
258
- decimals: 6
259
- key: latitud
260
- type: float
261
- - bytes: 2
262
- key: radio
263
- type: unsigned
264
- - bytes: 1
265
- key: ruta
266
- type: unsigned
267
- - bytes: 1
268
- keys:
269
- - lado
270
- - control
271
- - datear
272
- - activo
273
- type: flags
274
- - bytes: 15
275
- key: nombre
276
- type: string
277
- - bytes: 6
278
- key: timestamp
279
- type: datetime
280
- login:
281
- - bytes: 0
282
- key: serial
283
- type: string
284
- login_device:
285
- - bytes: 2
286
- key: id
287
- type: unsigned
288
- - bytes: 2
289
- key: padron
290
- type: unsigned
291
- - bytes: 1
292
- key: ruta
293
- type: unsigned
294
- - bytes: 1
295
- key: lado
296
- type: bool
297
- - bytes: 2
298
- key: geocerca
299
- type: unsigned
300
- - bytes: 1
301
- key: estado
302
- type: char
303
- - bytes: 4
304
- key: salida
305
- type: unsigned
306
- - bytes: 4
307
- key: conductor
308
- type: unsigned
309
- - bytes: 1
310
- key: orden
311
- type: unsigned
312
- - bytes: 1
313
- key: logueado
314
- type: bool
315
- - bytes: 6
316
- key: data
317
- type: datetime
318
- - bytes: 2
319
- key: programada
320
- type: time
321
- message:
322
- - bytes: 4
323
- key: id
324
- type: unsigned
325
- - bytes: 0
326
- key: texto
327
- type: string
328
- message_response:
329
- - bytes: 4
330
- key: id
331
- type: unsigned
332
- - bytes: 1
333
- key: read
334
- type: bool
335
- new_ip:
336
- - bytes: 0
337
- key: ip
338
- type: string
339
- operation:
340
- - bytes: 0
341
- key: id
342
- type: string
343
- - bytes: 0
344
- key: section
345
- type: string
346
- - bytes: 0
347
- key: key
348
- type: string
349
- - bytes: 0
350
- key: value
351
- type: string
352
- operation_response:
353
- - bytes: 0
354
- key: id
355
- type: string
356
- parameter:
357
- - bytes: 0
358
- key: id
359
- type: string
360
- - bytes: 0
361
- key: nombre
362
- type: string
363
- - bytes: 0
364
- key: valor
365
- type: string
366
- position_response:
367
- - bytes: 1
368
- key: reportes
369
- type: unsigned
370
- - array:
371
- - bytes: 2
372
- key: id
373
- type: unsigned
374
- bytes: 0
375
- key: ids
376
- type: array
377
- remaining_data:
378
- - bytes: 4
379
- key: faltantes
380
- type: unsigned
381
- - bytes: 1
382
- key: tabla
383
- type: char
384
- route:
385
- - bytes: 2
386
- key: id
387
- type: unsigned
388
- - bytes: 0
389
- key: codigo
390
- type: string
391
- - bytes: 6
392
- key: timestamp
393
- type: datetime
394
- route_settings:
395
- - bytes: 2
396
- key: id
397
- type: unsigned
398
- - bytes: 0
399
- key: nombre
400
- type: string
401
- - bytes: 1
402
- key: ruta
403
- type: unsigned
404
- - bytes: 0
405
- key: tipo
406
- type: string
407
- - bytes: 0
408
- key: data
409
- type: string
410
- - bytes: 6
411
- key: timestamp
412
- type: datetime
413
- schedule:
414
- - bytes: 4
415
- key: salida
416
- type: unsigned
417
- - array:
418
- - bytes: 2
419
- key: geocerca
420
- type: unsigned
421
- bytes: 0
422
- key: controles
423
- type: array
424
- settings:
425
- - bytes: 2
426
- key: id
427
- type: unsigned
428
- - bytes: 0
429
- key: nombre
430
- type: string
431
- - bytes: 0
432
- key: tipo
433
- type: string
434
- - bytes: 0
435
- key: data
436
- type: string
437
- - bytes: 6
438
- key: timestamp
439
- type: datetime
440
- start_sales:
441
- - bytes: 0
442
- key: clave
443
- type: string
444
- - bytes: 0
445
- key: dni
446
- type: string
447
- - bytes: 1
448
- key: lado
449
- type: bool
450
- - bytes: 1
451
- key: ruta
452
- type: unsigned
453
- - bytes: 2
454
- key: unidad
455
- type: unsigned
456
- start_sales_response:
457
- - bytes: 1
458
- key: error
459
- type: bool
460
- - bytes: 0
461
- key: title
462
- type: string
463
- - bytes: 0
464
- key: mensaje
465
- type: string
466
- - array:
467
- - bytes: 4
468
- key: id
469
- type: unsigned
470
- - bytes: 2
471
- key: conductor_id
472
- type: unsigned
473
- - bytes: 0
474
- key: conductor_codigo
475
- type: string
476
- - bytes: 1
477
- keys:
478
- - activo
479
- - castigado
480
- - conductor
481
- - vencido
482
- type: flags
483
- - bytes: 1
484
- key: ruta
485
- type: unsigned
486
- - bytes: 1
487
- key: lado
488
- type: bool
489
- - bytes: 6
490
- key: inicio
491
- type: datetime
492
- bytes: 0
493
- key: sesiones
494
- type: array
495
- tickets:
496
- - array:
497
- - bytes: 2
498
- key: boleto
499
- type: unsigned
500
- - bytes: 2
501
- key: conductor
502
- type: unsigned
503
- - bytes: 4
504
- key: correlativo
505
- type: unsigned
506
- - bytes: 3
507
- key: dia
508
- type: date
509
- - bytes: 2
510
- key: fin
511
- type: unsigned
512
- - bytes: 6
513
- key: hora
514
- type: datetime
515
- - bytes: 4
516
- key: inicio
517
- type: unsigned
518
- - bytes: 2
519
- key: inspector
520
- type: unsigned
521
- - bytes: 1
522
- key: medio_pago
523
- type: unsigned
524
- - bytes: 4
525
- key: numero
526
- type: unsigned
527
- - bytes: 2
528
- key: precio
529
- type: unsigned
530
- - bytes: 1
531
- key: ruta
532
- type: unsigned
533
- - bytes: 4
534
- key: sesion
535
- type: unsigned
536
- - bytes: 2
537
- key: unidad
538
- type: unsigned
539
- - bytes: 0
540
- key: tarjeta
541
- type: string
542
- bytes: 0
543
- key: tickets
544
- type: array
545
- tickets_response:
546
- - array:
547
- - bytes: 4
548
- key: correlativo
549
- type: unsigned
550
- - bytes: 0
551
- key: id
552
- type: string
553
- bytes: 0
554
- key: tickets
555
- type: array
556
- timestamp:
557
- - bytes: 6
558
- key: timestamp
559
- type: timestamp
560
- timestamp_us:
561
- - bytes: 8
562
- key: timestamp
563
- type: timestamp
564
- trip:
565
- - bytes: 4
566
- key: id
567
- type: unsigned
568
- - bytes: 1
569
- key: ruta
570
- type: unsigned
571
- - bytes: 1
572
- key: lado
573
- type: bool
574
- - bytes: 6
575
- key: inicio
576
- type: datetime
577
- - bytes: 1
578
- key: estado
579
- type: char
580
- - bytes: 1
581
- key: frecuencia
582
- type: unsigned
583
- - bytes: 4
584
- key: conductor
585
- type: unsigned
586
- - bytes: 2
587
- key: geocerca
588
- type: unsigned
589
- - array:
590
- - bytes: 2
591
- key: geocerca
592
- type: unsigned
593
- - bytes: 1
594
- key: tiempo
595
- type: signed
596
- - bytes: 1
597
- key: volada
598
- type: signed
599
- bytes: 0
600
- key: controles
601
- type: array
602
- - bytes: 0
603
- key: marcados
604
- type: bits
605
- user_route:
606
- - bytes: 2
607
- key: id
608
- type: unsigned
609
- - bytes: 9
610
- key: celular
611
- type: string
612
- - bytes: 14
613
- key: nombre
614
- type: string
615
- - array:
616
- - bytes: 1
617
- key: ruta
618
- type: unsigned
619
- bytes: 1
620
- key: rutas
621
- type: array
622
- - bytes: 6
623
- key: timestamp
624
- type: datetime
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes