17
17
18
18
19
19
from collections import deque
20
- import binascii
21
20
import datetime
22
- import logging
23
21
import os
24
22
import serial
25
23
from serial .tools import list_ports
@@ -289,82 +287,29 @@ def _read_and_append_message_receive_buffer(self, socket_identifier, payload_len
289
287
self .close_socket (socket_identifier = socket_identifier )
290
288
291
289
def create_socket (self ):
292
- op = self ._basic_set ('+USOCR' , '6' , strip_val = False )
293
- if op is not None :
294
- self .socket_identifier = int (op )
290
+ raise NotImplementedError ("Modem does not have an AT Socket Mode" )
295
291
296
292
# REQUIRES: The host and port.
297
293
# EFFECTS: Issues an AT command to connect to the specified socket identifier.
298
294
def connect_socket (self , host , port ):
299
- at_command_val = "%d,\" %s\" ,%s" % (self .socket_identifier , host , port )
300
- ok , _ = self .set ('+USOCO' , at_command_val , timeout = 20 )
301
- if ok != ModemResult .OK :
302
- self .logger .error ('Failed to connect socket' )
303
- raise NetworkError ('Failed to connect socket' )
304
- else :
305
- self .logger .info ('Connect socket is successful' )
295
+ raise NotImplementedError ("Modem does not have an AT Socket Mode" )
306
296
307
297
def listen_socket (self , port ):
308
- at_command_val = "%d,%s" % (self .socket_identifier , port )
309
- self .listen_socket_identifier = self .socket_identifier
310
- ok , _ = self .set ('+USOLI' , at_command_val , timeout = 5 )
311
- if ok != ModemResult .OK :
312
- self .logger .error ('Failed to listen socket' )
313
- raise NetworkError ('Failed to listen socket' )
298
+ raise NotImplementedError ("Modem does not have an AT Socket Mode" )
314
299
315
300
def write_socket (self , data ):
316
- self .enable_hex_mode ()
317
- hexdata = binascii .hexlify (data )
318
- # We have to do it in chunks of 510 since 512 is actually too long (CMEE error)
319
- # and we need 2n chars for hexified data
320
- for chunk in self ._chunks (hexdata , 510 ):
321
- value = b'%d,%d,\" %s\" ' % (self .socket_identifier ,
322
- len (binascii .unhexlify (chunk )),
323
- chunk )
324
- ok , _ = self .set ('+USOWR' , value , timeout = 10 )
325
- if ok != ModemResult .OK :
326
- self .logger .error ('Failed to write to socket' )
327
- raise NetworkError ('Failed to write socket' )
328
- self .disable_hex_mode ()
301
+ raise NotImplementedError ("Modem does not have an AT Socket Mode" )
329
302
330
303
def _chunks (self , data , n ):
331
304
"""Yield successive n-sized chunks from lst."""
332
305
for i in range (0 , len (data ), n ):
333
306
yield data [i :i + n ]
334
307
335
308
def read_socket (self , socket_identifier = None , payload_length = None ):
336
-
337
- if socket_identifier is None :
338
- socket_identifier = self .socket_identifier
339
-
340
- if payload_length is None :
341
- payload_length = self .last_read_payload_length
342
-
343
- self .enable_hex_mode ()
344
-
345
- resp = self ._basic_set ('+USORD' , '%d,%d' % (socket_identifier , payload_length ))
346
- if resp is not None :
347
- resp = resp .strip ('"' )
348
- bytedata = binascii .unhexlify (resp )
349
- try :
350
- resp = bytedata .decode ()
351
- except :
352
- # This is some sort of binary data that can't be decoded so just
353
- # return the bytes. We might want to make this happen via parameter
354
- # in the future so it is more deterministic
355
- resp = bytedata
356
-
357
- self .disable_hex_mode ()
358
- return resp
309
+ raise NotImplementedError ("Modem does not have an AT Socket Mode" )
359
310
360
311
def close_socket (self , socket_identifier = None ):
361
-
362
- if socket_identifier is None :
363
- socket_identifier = self .socket_identifier
364
-
365
- ok , r = self .set ('+USOCL' , "%s" % socket_identifier )
366
- if ok != ModemResult .OK :
367
- self .logger .info ('Failed to close socket' )
312
+ raise NotImplementedError ("Modem does not have an AT Socket Mode" )
368
313
369
314
def debugwrite (self , x , hide = False ):
370
315
if not hide :
@@ -672,40 +617,13 @@ def is_registered(self):
672
617
pass
673
618
674
619
def _is_pdp_context_active (self ):
675
- if not self .is_registered ():
676
- return False
677
-
678
- ok , r = self .set ('+UPSND' , '0,8' )
679
- if ok == ModemResult .OK :
680
- try :
681
- pdpstatus = int (r .lstrip ('UPSND: ' ).split (',' )[2 ])
682
- # 1: PDP active
683
- return pdpstatus == 1
684
- except (IndexError , ValueError ) as e :
685
- self .logger .error (repr (e ))
686
620
return False
687
621
688
622
def _set_up_pdp_context (self ):
689
- if self ._is_pdp_context_active (): return True
690
- self .logger .info ('Setting up PDP context' )
691
- self .set ('+UPSD' , f'0,1,\" { self ._apn } \" ' )
692
- self .set ('+UPSD' , '0,7,\" 0.0.0.0\" ' )
693
- ok , _ = self .set ('+UPSDA' , '0,3' , timeout = 30 )
694
- if ok != ModemResult .OK :
695
- self .logger .error ('PDP Context setup failed' )
696
- raise NetworkError ('Failed PDP context setup' )
697
- else :
698
- self .logger .info ('PDP context active' )
623
+ raise NotImplementedError ('Modem PDP context setup not implemented' )
699
624
700
625
def _tear_down_pdp_context (self ):
701
- if not self ._is_pdp_context_active (): return True
702
- self .logger .info ('Tearing down PDP context' )
703
- ok , _ = self .set ('+UPSDA' , '0,4' , timeout = 30 )
704
- if ok != ModemResult .OK :
705
- self .logger .error ('PDP Context tear down failed' )
706
- else :
707
- self .logger .info ('PDP context deactivated' )
708
-
626
+ raise NotImplementedError ('Modem PDP context setup not implemented' )
709
627
710
628
def __enforce_serial_port_open (self ):
711
629
if not (self .serial_port and self .serial_port .isOpen ()):
@@ -807,13 +725,10 @@ def enable_at_sockets_mode(self):
807
725
pass
808
726
809
727
def enable_hex_mode (self ):
810
- self . __set_hex_mode ( 1 )
728
+ pass
811
729
812
730
def disable_hex_mode (self ):
813
- self .__set_hex_mode (0 )
814
-
815
- def __set_hex_mode (self , enable_hex_mode ):
816
- self .command ('+UDCONF' , '1,%d' % enable_hex_mode )
731
+ pass
817
732
818
733
@property
819
734
def serial_port (self ):
@@ -865,27 +780,12 @@ def at_sockets_available(self):
865
780
return self ._at_sockets_available
866
781
867
782
@property
868
- def modem_mode (self ):
869
- mode_number = None
870
- # trim:
871
- # +UUSBCONF: 0,"",,"0x1102" -> 0
872
- # +UUSBCONF: 2,"ECM",,"0x1104" -> 2
873
- try :
874
- ok , res = self .read ('+UUSBCONF' )
875
- if ok == ModemResult .OK :
876
- mode_number = int (res .lstrip ('+UUSBCONF: ' ).split (',' )[0 ])
877
- except (IndexError , ValueError ) as e :
878
- self .logger .error (repr (e ))
879
- return mode_number
783
+ def modem_usb_mode (self ):
784
+ raise NotImplementedError ('This modem does not support this property' )
880
785
881
- @modem_mode .setter
882
- def modem_mode (self , mode ):
883
- self .set ('+UUSBCONF' , str (mode ))
884
- self .logger .info ('Restarting modem' )
885
- self .reset ()
886
- self .logger .info ('Modem restarted' )
887
- self .closeSerialPort ()
888
- time .sleep (Modem .DEFAULT_MODEM_RESTART_TIME )
786
+ @modem_usb_mode .setter
787
+ def modem_usb_mode (self , mode ):
788
+ raise NotImplementedError ('This modem does not support this property' )
889
789
890
790
@property
891
791
def localIPAddress (self ):
@@ -903,7 +803,7 @@ def remoteIPAddress(self):
903
803
904
804
@property
905
805
def version (self ):
906
- raise NotImplementedError ( 'This modem does not support this property ' )
806
+ return self . _basic_command ( 'I9 ' )
907
807
908
808
@property
909
809
def imei (self ):
@@ -917,3 +817,5 @@ def apn(self):
917
817
def apn (self , apn ):
918
818
self ._apn = apn
919
819
return self .set ('+CGDCONT' , f'1,"IP","{ self ._apn } "' )
820
+
821
+
0 commit comments