From e343289c092c5b01a29964abb02663e05ddad249 Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 13:54:23 -0600 Subject: [PATCH 01/21] add sim 7000 to SDK --- Hologram/Network/Cellular.py | 3 +- Hologram/Network/Modem/SIM7000.py | 169 +++++++++++++++++++++++++++++ Hologram/Network/Modem/__init__.py | 2 +- 3 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 Hologram/Network/Modem/SIM7000.py diff --git a/Hologram/Network/Cellular.py b/Hologram/Network/Cellular.py index 928c69ff..3e4583c6 100644 --- a/Hologram/Network/Cellular.py +++ b/Hologram/Network/Cellular.py @@ -11,7 +11,7 @@ from Hologram.Event import Event from Exceptions.HologramError import NetworkError from Hologram.Network.Route import Route -from Hologram.Network.Modem import Modem, E303, MS2131, E372, BG96, Nova_U201, NovaM, DriverLoader +from Hologram.Network.Modem import Modem, E303, MS2131, E372, BG96, SIM7000, Nova_U201, NovaM, DriverLoader from Hologram.Network import Network, NetworkScope import time from serial.tools import list_ports @@ -32,6 +32,7 @@ class Cellular(Network): 'ms2131': MS2131.MS2131, 'e372': E372.E372, 'bg96': BG96.BG96, + 'sim7000': SIM7000.SIM7000, 'nova': Nova_U201.Nova_U201, 'novam': NovaM.NovaM, '': Modem diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py new file mode 100644 index 00000000..c6242479 --- /dev/null +++ b/Hologram/Network/Modem/SIM7000.py @@ -0,0 +1,169 @@ +# SIM7000.py - Hologram Python SDK SIMCom SIM7000 modem interface +# +# Author: Hologram +# +# Copyright 2016 - Hologram (Konekt, Inc.) +# +# +# LICENSE: Distributed under the terms of the MIT License +# +import binascii +import time + +from serial.serialutil import Timeout + +from Hologram.Network.Modem import Modem +from Hologram.Event import Event +from UtilClasses import ModemResult +from Exceptions.HologramError import SerialError, NetworkError + +DEFAULT_SIM7000_TIMEOUT = 200 + +class SIM7000(Modem): + usb_ids = [('1e0e', '9001')] + + def __init__(self, device_name=None, baud_rate='9600', + chatscript_file=None, event=Event()): + + super().__init__(device_name=device_name, baud_rate=baud_rate, + chatscript_file=chatscript_file, event=event) + self._at_sockets_available = True + self.urc_response = '' + + def connect(self, timeout=DEFAULT_SIM7000_TIMEOUT): + + success = super().connect(timeout) + + # put serial mode on other port + if success is True: + # detect another open serial port to use for PPP + devices = self.detect_usable_serial_port() + if not devices: + raise SerialError('Not enough serial ports detected for Nova') + self.logger.debug('Moving connection to port %s', devices[0]) + self.device_name = devices[0] + super().initialize_serial_interface() + + return success + + def send_message(self, data, timeout=Modem.DEFAULT_SEND_TIMEOUT): + # Waiting for the open socket urc + while self.urc_state != Modem.SOCKET_WRITE_STATE: + self.checkURC() + + self.write_socket(data) + + loop_timeout = Timeout(timeout) + while self.urc_state != Modem.SOCKET_SEND_READ: + self.checkURC() + if self.urc_state != Modem.SOCKET_SEND_READ: + if loop_timeout.expired(): + raise SerialError('Timeout occurred waiting for message status') + time.sleep(self._RETRY_DELAY) + elif self.urc_state == Modem.SOCKET_CLOSED: + return '[1,0]' #this is connection closed for hologram cloud response + + return self.urc_response + + def create_socket(self): + self._set_up_pdp_context() + + def connect_socket(self, host, port): + self.command('+CIPSTART', '\"TCP\",\"%s\",%d' % (host, port)) + + def close_socket(self, socket_identifier=None): + ok, _ = self.command('+CIPCLOSE') + if ok != ModemResult.OK: + self.logger.error('Failed to close socket') + self.urc_state = Modem.SOCKET_CLOSED + + def write_socket(self, data): + hexdata = binascii.hexlify(data) + # We have to do it in chunks of 510 since 512 is actually too long (CMEE error) + # and we need 2n chars for hexified data + for chunk in self._chunks(hexdata, 510): + value = '%d,\"%s\"' % (self.socket_identifier, chunk.decode()) + ok, _ = self.command('+CIPSEND', len(value), timeout=10, expected="SEND OK", prompt=">", data=value) + if ok != ModemResult.OK: + self.logger.error('Failed to write to socket') + raise NetworkError('Failed to write to socket') + + def read_socket(self, socket_identifier=None, payload_length=None): + if payload_length is None: + payload_length = self.last_read_payload_length + + ok, resp = self.set('+CIPRXGET', '1,%d' % (payload_length)) + if ok == ModemResult.OK: + if resp is not None: + resp = resp.strip('"') + try: + resp = resp.decode() + except: + # This is some sort of binary data that can't be decoded so just + # return the bytes. We might want to make this happen via parameter + # in the future so it is more deterministic + self.logger.debug('Could not decode recieved data') + + return resp + + def is_registered(self): + return self.check_registered('+CREG') or self.check_registered('+CGREG') + + def checkURC(self, hide=False): + # Not all SIMCOM urcs have a + in front + while(True): + response = self._readline_from_serial_port(0, hide=hide) + if len(response) > 0 and (response.startswith('+') or response in ['CONNECT', 'CONNECT OK', 'CONNECT FAIL', 'SEND OK', 'ALREADY CONNECT', 'CLOSED']): + urc = response.rstrip('\r\n') + self.handleURC(urc) + else: + return + + def handleURC(self, urc): + if urc == 'CONNECT OK': + self.urc_state = Modem.SOCKET_WRITE_STATE + if urc == 'CLOSED': + self.urc_state = Modem.SOCKET_CLOSED + super().handleURC(urc) + + def _is_pdp_context_active(self): + if not self.is_registered(): + return False + + ok, r = self.command('+CIPSTATUS', expected="STATE: IP START") + return ok == ModemResult.OK + + def init_serial_commands(self): + self.command("E0") #echo off + self.command("+CMEE", "2") #set verbose error codes + self.command("+CPIN?") + self.set_timezone_configs() + #self.command("+CPIN", "") #set SIM PIN + self.command("+CPMS", "\"ME\",\"ME\",\"ME\"") + self.command("+CNMP", "38") + self.command("+CMNB", "1") + self.set_sms_configs() + self.set_network_registration_status() + + def set_network_registration_status(self): + self.command("+CREG", "2") + self.command("+CGREG", "2") + + def _set_up_pdp_context(self): + if self._is_pdp_context_active(): return True + ok, _ = self.command('+CIPSTATUS', expected="STATE: IP INITIAL") + while ok != ModemResult.OK: + self.command('+CIPSHUT') + ok, _ = self.command('+CIPSTATUS', expected="STATE: IP INITIAL") + + self.set('+CSTT', '\"hologram\"') + self.set('+CIICR', timeout=30) + if not self._is_pdp_context_active(): + self.logger.error('PDP Context setup failed') + raise NetworkError('Failed PDP context setup') + else: + self.logger.info('PDP context active') + + @property + def description(self): + return 'SIMCom SIM7000' \ No newline at end of file diff --git a/Hologram/Network/Modem/__init__.py b/Hologram/Network/Modem/__init__.py index fe44d41c..bcfc1c50 100644 --- a/Hologram/Network/Modem/__init__.py +++ b/Hologram/Network/Modem/__init__.py @@ -1,4 +1,4 @@ -__all__ = ['Modem', 'MockModem', 'MS2131', 'Nova', 'E303', 'E372'] +__all__ = ['Modem', 'MockModem', 'MS2131', 'Nova', 'E303', 'BG96', 'E372', 'SIM7000'] from .IModem import IModem from .Modem import Modem From e0b6d6ea0f7c71351966fb3bf14991981a9e69f9 Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 14:52:16 -0600 Subject: [PATCH 02/21] set lte registration --- Hologram/Network/Modem/BG96.py | 4 ++-- Hologram/Network/Modem/SIM7000.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Hologram/Network/Modem/BG96.py b/Hologram/Network/Modem/BG96.py index c3424c3b..ab93e188 100644 --- a/Hologram/Network/Modem/BG96.py +++ b/Hologram/Network/Modem/BG96.py @@ -114,7 +114,7 @@ def read_socket(self, socket_identifier=None, payload_length=None): return resp def is_registered(self): - return self.check_registered('+CREG') or self.check_registered('+CGREG') + return self.check_registered('+CREG') or self.check_registered('+CEREG') # EFFECTS: Handles URC related AT command responses. def handleURC(self, urc): @@ -171,7 +171,7 @@ def init_serial_commands(self): def set_network_registration_status(self): self.command("+CREG", "2") - self.command("+CGREG", "2") + self.command("+CEREG", "2") def _set_up_pdp_context(self): if self._is_pdp_context_active(): return True diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index c6242479..2593f37e 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -107,7 +107,7 @@ def read_socket(self, socket_identifier=None, payload_length=None): return resp def is_registered(self): - return self.check_registered('+CREG') or self.check_registered('+CGREG') + return self.check_registered('+CREG') or self.check_registered('+CEREG') def checkURC(self, hide=False): # Not all SIMCOM urcs have a + in front @@ -147,7 +147,7 @@ def init_serial_commands(self): def set_network_registration_status(self): self.command("+CREG", "2") - self.command("+CGREG", "2") + self.command("+CEREG", "2") def _set_up_pdp_context(self): if self._is_pdp_context_active(): return True @@ -157,7 +157,7 @@ def _set_up_pdp_context(self): ok, _ = self.command('+CIPSTATUS', expected="STATE: IP INITIAL") self.set('+CSTT', '\"hologram\"') - self.set('+CIICR', timeout=30) + self.command('+CIICR', timeout=30) if not self._is_pdp_context_active(): self.logger.error('PDP Context setup failed') raise NetworkError('Failed PDP context setup') From 39084d57338fe9db6b1d433c1d30def710887cac Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:07:05 -0600 Subject: [PATCH 03/21] redo network registration code --- Hologram/Network/Modem/SIM7000.py | 32 +++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index 2593f37e..c492d2bc 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -9,6 +9,7 @@ # import binascii import time +from enum import Enum from serial.serialutil import Timeout @@ -19,6 +20,23 @@ DEFAULT_SIM7000_TIMEOUT = 200 +class NetworkState(Enum): + INITIAL = 'IP INITIAL', + START = 'IP START' + CONFIG = 'IP CONFIG', + GPRSACT = 'IP GPRSACT', + STATUS = 'IP STATUS', + TCPCONN = 'TCP CONNECTING', + UDPCONN = 'UDP CONNECTING', + LISTENING = 'SERVER LISTENING', + CONNECTED = 'CONNECT OK', + TCPCLOSING = 'TCP CLOSING', + UDPCLOSING = 'UDP CLOSING', + TCPCLOSED = 'TCP CLOSED', + UDPCLOSED = 'UDP CLOSED', + DISCONNECTED = 'PDP DEACT' + + class SIM7000(Modem): usb_ids = [('1e0e', '9001')] @@ -29,6 +47,7 @@ def __init__(self, device_name=None, baud_rate='9600', chatscript_file=chatscript_file, event=event) self._at_sockets_available = True self.urc_response = '' + self.network_state = NetworkState.DISCONNECTED def connect(self, timeout=DEFAULT_SIM7000_TIMEOUT): @@ -113,13 +132,16 @@ def checkURC(self, hide=False): # Not all SIMCOM urcs have a + in front while(True): response = self._readline_from_serial_port(0, hide=hide) - if len(response) > 0 and (response.startswith('+') or response in ['CONNECT', 'CONNECT OK', 'CONNECT FAIL', 'SEND OK', 'ALREADY CONNECT', 'CLOSED']): + if len(response) > 0 and (response.startswith('+') or response.startswith('STATE') or response in ['CONNECT', 'CONNECT OK', 'CONNECT FAIL', 'SEND OK', 'ALREADY CONNECT', 'CLOSED']): urc = response.rstrip('\r\n') self.handleURC(urc) else: return def handleURC(self, urc): + if urc.startswith('STATE'): + urc = urc.strip('STATE: ') + self.network_state = NetworkState(urc) if urc == 'CONNECT OK': self.urc_state = Modem.SOCKET_WRITE_STATE if urc == 'CLOSED': @@ -151,10 +173,12 @@ def set_network_registration_status(self): def _set_up_pdp_context(self): if self._is_pdp_context_active(): return True - ok, _ = self.command('+CIPSTATUS', expected="STATE: IP INITIAL") - while ok != ModemResult.OK: + self.command('+CIPSTATUS') + self.checkURC() + while self.network_state is not NetworkState.INITIAL: self.command('+CIPSHUT') - ok, _ = self.command('+CIPSTATUS', expected="STATE: IP INITIAL") + self.command('+CIPSTATUS') + self.checkURC() self.set('+CSTT', '\"hologram\"') self.command('+CIICR', timeout=30) From a32412a6168b1eb0fc5529514514134618a4640c Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:16:31 -0600 Subject: [PATCH 04/21] remove commas --- Hologram/Network/Modem/SIM7000.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index c492d2bc..57db53f5 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -21,19 +21,19 @@ DEFAULT_SIM7000_TIMEOUT = 200 class NetworkState(Enum): - INITIAL = 'IP INITIAL', + INITIAL = 'IP INITIAL' START = 'IP START' - CONFIG = 'IP CONFIG', - GPRSACT = 'IP GPRSACT', - STATUS = 'IP STATUS', - TCPCONN = 'TCP CONNECTING', - UDPCONN = 'UDP CONNECTING', - LISTENING = 'SERVER LISTENING', - CONNECTED = 'CONNECT OK', - TCPCLOSING = 'TCP CLOSING', - UDPCLOSING = 'UDP CLOSING', - TCPCLOSED = 'TCP CLOSED', - UDPCLOSED = 'UDP CLOSED', + CONFIG = 'IP CONFIG' + GPRSACT = 'IP GPRSACT' + STATUS = 'IP STATUS' + TCPCONN = 'TCP CONNECTING' + UDPCONN = 'UDP CONNECTING' + LISTENING = 'SERVER LISTENING' + CONNECTED = 'CONNECT OK' + TCPCLOSING = 'TCP CLOSING' + UDPCLOSING = 'UDP CLOSING' + TCPCLOSED = 'TCP CLOSED' + UDPCLOSED = 'UDP CLOSED' DISCONNECTED = 'PDP DEACT' From 695325950a03f56420c2050b1d0e5e6edbbb3521 Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:18:22 -0600 Subject: [PATCH 05/21] handle urc more gracefully --- Hologram/Network/Modem/SIM7000.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index 57db53f5..b2c59013 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -142,11 +142,13 @@ def handleURC(self, urc): if urc.startswith('STATE'): urc = urc.strip('STATE: ') self.network_state = NetworkState(urc) - if urc == 'CONNECT OK': + return + elif urc == 'CONNECT OK': self.urc_state = Modem.SOCKET_WRITE_STATE - if urc == 'CLOSED': + elif urc == 'CLOSED': self.urc_state = Modem.SOCKET_CLOSED - super().handleURC(urc) + else: + super().handleURC(urc) def _is_pdp_context_active(self): if not self.is_registered(): From 520a95c470b666109466060e7a80b18e17f6bba4 Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:19:59 -0600 Subject: [PATCH 06/21] fix check PDP function --- Hologram/Network/Modem/SIM7000.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index b2c59013..19983c04 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -154,8 +154,9 @@ def _is_pdp_context_active(self): if not self.is_registered(): return False - ok, r = self.command('+CIPSTATUS', expected="STATE: IP START") - return ok == ModemResult.OK + self.command('+CIPSTATUS') + self.checkURC() + return self.network_state = NetworkState.CONNECTED def init_serial_commands(self): self.command("E0") #echo off From 0c22e7790ea3820dcbae76832b29768cb5338fe9 Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:23:23 -0600 Subject: [PATCH 07/21] fix equality check --- Hologram/Network/Modem/SIM7000.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index 19983c04..6719d4b8 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -156,7 +156,7 @@ def _is_pdp_context_active(self): self.command('+CIPSTATUS') self.checkURC() - return self.network_state = NetworkState.CONNECTED + return self.network_state is NetworkState.CONNECTED def init_serial_commands(self): self.command("E0") #echo off From 11908472235587ca137aaedfd4d67374345b8def Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:35:46 -0600 Subject: [PATCH 08/21] log urc, why is it being trimmed? --- Hologram/Network/Modem/SIM7000.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index 6719d4b8..fa2f747e 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -133,7 +133,9 @@ def checkURC(self, hide=False): while(True): response = self._readline_from_serial_port(0, hide=hide) if len(response) > 0 and (response.startswith('+') or response.startswith('STATE') or response in ['CONNECT', 'CONNECT OK', 'CONNECT FAIL', 'SEND OK', 'ALREADY CONNECT', 'CLOSED']): + self.logger.debug(urc) urc = response.rstrip('\r\n') + self.logger.debug(urc) self.handleURC(urc) else: return From 2e05509f94412ff6cf6ea1c0f5f91c7f460b70c2 Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:36:17 -0600 Subject: [PATCH 09/21] log response --- Hologram/Network/Modem/SIM7000.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index fa2f747e..d0d438b1 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -133,7 +133,7 @@ def checkURC(self, hide=False): while(True): response = self._readline_from_serial_port(0, hide=hide) if len(response) > 0 and (response.startswith('+') or response.startswith('STATE') or response in ['CONNECT', 'CONNECT OK', 'CONNECT FAIL', 'SEND OK', 'ALREADY CONNECT', 'CLOSED']): - self.logger.debug(urc) + self.logger.debug(response) urc = response.rstrip('\r\n') self.logger.debug(urc) self.handleURC(urc) From 53c5841ea58243bb23c7a4e572ab3d952b4c6b95 Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:37:23 -0600 Subject: [PATCH 10/21] strip from left side only --- Hologram/Network/Modem/SIM7000.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index d0d438b1..f443c5d7 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -133,16 +133,14 @@ def checkURC(self, hide=False): while(True): response = self._readline_from_serial_port(0, hide=hide) if len(response) > 0 and (response.startswith('+') or response.startswith('STATE') or response in ['CONNECT', 'CONNECT OK', 'CONNECT FAIL', 'SEND OK', 'ALREADY CONNECT', 'CLOSED']): - self.logger.debug(response) urc = response.rstrip('\r\n') - self.logger.debug(urc) self.handleURC(urc) else: return def handleURC(self, urc): if urc.startswith('STATE'): - urc = urc.strip('STATE: ') + urc = urc.lstrip('STATE: ') self.network_state = NetworkState(urc) return elif urc == 'CONNECT OK': From c504c7913876a942fdb867af683e6556e83841d1 Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:40:41 -0600 Subject: [PATCH 11/21] sleep briefly and check for other urcs before getting status --- Hologram/Network/Modem/SIM7000.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index f443c5d7..966a2457 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -154,6 +154,7 @@ def _is_pdp_context_active(self): if not self.is_registered(): return False + self.checkURC() self.command('+CIPSTATUS') self.checkURC() return self.network_state is NetworkState.CONNECTED @@ -185,6 +186,7 @@ def _set_up_pdp_context(self): self.set('+CSTT', '\"hologram\"') self.command('+CIICR', timeout=30) + time.sleep(1) if not self._is_pdp_context_active(): self.logger.error('PDP Context setup failed') raise NetworkError('Failed PDP context setup') From d264e20189cc1a4a9ccc0f64cbadae2bd018ff6d Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:44:04 -0600 Subject: [PATCH 12/21] give modem a little time to configure --- Hologram/Network/Modem/SIM7000.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index 966a2457..1897e8b5 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -154,7 +154,6 @@ def _is_pdp_context_active(self): if not self.is_registered(): return False - self.checkURC() self.command('+CIPSTATUS') self.checkURC() return self.network_state is NetworkState.CONNECTED @@ -170,6 +169,7 @@ def init_serial_commands(self): self.command("+CMNB", "1") self.set_sms_configs() self.set_network_registration_status() + time.sleep(0.5) def set_network_registration_status(self): self.command("+CREG", "2") From 6534ac45d2beadfbc003d12d6395f01d98b26bd1 Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:45:55 -0600 Subject: [PATCH 13/21] wait for buffer to fill --- Hologram/Network/Modem/SIM7000.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index 1897e8b5..683c95b9 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -155,6 +155,8 @@ def _is_pdp_context_active(self): return False self.command('+CIPSTATUS') + # wait for the buffer to fill up + time.sleep(0.5) self.checkURC() return self.network_state is NetworkState.CONNECTED From 200309aa91ba4e01f1c5cb57154bd91b317ebc92 Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:49:36 -0600 Subject: [PATCH 14/21] check urc multiple times cuz of new lines from modem --- Hologram/Network/Modem/SIM7000.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index 683c95b9..0ad36d00 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -156,9 +156,10 @@ def _is_pdp_context_active(self): self.command('+CIPSTATUS') # wait for the buffer to fill up - time.sleep(0.5) self.checkURC() - return self.network_state is NetworkState.CONNECTED + self.checkURC() + self.checkURC() + return self.network_state is NetworkState.GPRSACT def init_serial_commands(self): self.command("E0") #echo off From 7fa8f386a18d4cea2bc7ebfcb0c895fd5514986d Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:52:15 -0600 Subject: [PATCH 15/21] add cgreg too --- Hologram/Network/Modem/SIM7000.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index 0ad36d00..4602f677 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -176,6 +176,7 @@ def init_serial_commands(self): def set_network_registration_status(self): self.command("+CREG", "2") + self.command("+CGREG", "2") self.command("+CEREG", "2") def _set_up_pdp_context(self): From 83c1c7a891d1302488864f4917f2da88ca056380 Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sat, 6 Mar 2021 15:55:23 -0600 Subject: [PATCH 16/21] check cgreg --- Hologram/Network/Modem/SIM7000.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hologram/Network/Modem/SIM7000.py b/Hologram/Network/Modem/SIM7000.py index 4602f677..ee0dd9d5 100644 --- a/Hologram/Network/Modem/SIM7000.py +++ b/Hologram/Network/Modem/SIM7000.py @@ -126,7 +126,7 @@ def read_socket(self, socket_identifier=None, payload_length=None): return resp def is_registered(self): - return self.check_registered('+CREG') or self.check_registered('+CEREG') + return self.check_registered('+CREG') or self.check_registered('+CEREG') or self.check_registered('+CGREG') def checkURC(self, hide=False): # Not all SIMCOM urcs have a + in front From a10fd1663b6d74f6b88d3c2d21ab9a4c49e2e801 Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sun, 7 Mar 2021 15:34:31 -0600 Subject: [PATCH 17/21] strip newlines from result --- Hologram/HologramCloud.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hologram/HologramCloud.py b/Hologram/HologramCloud.py index 6c730363..9d8b25e2 100755 --- a/Hologram/HologramCloud.py +++ b/Hologram/HologramCloud.py @@ -107,7 +107,7 @@ def sendMessage(self, message, topics=None, timeout=DEFAULT_SEND_MESSAGE_TIMEOUT modem_id=modem_id, version=self.version) - result = super().sendMessage(output, timeout) + result = super().sendMessage(output, timeout).strip('\r\n') return self.__parse_result(result) def __parse_result(self, result): From 79b0cfadd4d66e5912d2e572924a1f5d748c206f Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sun, 7 Mar 2021 20:10:17 -0600 Subject: [PATCH 18/21] handle error 563 --- Hologram/Network/Modem/BG96.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Hologram/Network/Modem/BG96.py b/Hologram/Network/Modem/BG96.py index ab93e188..239a6f97 100644 --- a/Hologram/Network/Modem/BG96.py +++ b/Hologram/Network/Modem/BG96.py @@ -125,6 +125,10 @@ def handleURC(self, urc): if err == 0: self.urc_state = Modem.SOCKET_WRITE_STATE self.socket_identifier = socket_identifier + elif err = 563: + #Socket is already open + self.urc_state = Modem.SOCKET_WRITE_STATE + self.socket_identifier = socket_identifier else: self.logger.error('Failed to open socket') raise NetworkError('Failed to open socket') From 53ccfaf369540aead511ec961ca6aae1c84bc2bd Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sun, 7 Mar 2021 20:10:55 -0600 Subject: [PATCH 19/21] double equals --- Hologram/Network/Modem/BG96.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hologram/Network/Modem/BG96.py b/Hologram/Network/Modem/BG96.py index 239a6f97..60dd5e3d 100644 --- a/Hologram/Network/Modem/BG96.py +++ b/Hologram/Network/Modem/BG96.py @@ -125,7 +125,7 @@ def handleURC(self, urc): if err == 0: self.urc_state = Modem.SOCKET_WRITE_STATE self.socket_identifier = socket_identifier - elif err = 563: + elif err == 563: #Socket is already open self.urc_state = Modem.SOCKET_WRITE_STATE self.socket_identifier = socket_identifier From ca3d9dcd3c22af72bd6679accec6045dc56c5315 Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sun, 7 Mar 2021 20:14:42 -0600 Subject: [PATCH 20/21] close the socket if already open --- Hologram/Network/Modem/BG96.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Hologram/Network/Modem/BG96.py b/Hologram/Network/Modem/BG96.py index 60dd5e3d..19b254cb 100644 --- a/Hologram/Network/Modem/BG96.py +++ b/Hologram/Network/Modem/BG96.py @@ -126,9 +126,9 @@ def handleURC(self, urc): self.urc_state = Modem.SOCKET_WRITE_STATE self.socket_identifier = socket_identifier elif err == 563: - #Socket is already open - self.urc_state = Modem.SOCKET_WRITE_STATE - self.socket_identifier = socket_identifier + self.close_socket(socket_identifier) + self.logger.error('Failed to open socket, socket was already open') + raise NetworkError('Failed to open socket, socket was already open') else: self.logger.error('Failed to open socket') raise NetworkError('Failed to open socket') From b2402fbaf712f82595ffc28da8042d190652792b Mon Sep 17 00:00:00 2001 From: Dom Amato Date: Sun, 7 Mar 2021 20:16:55 -0600 Subject: [PATCH 21/21] try using a random id --- Hologram/Network/Modem/BG96.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Hologram/Network/Modem/BG96.py b/Hologram/Network/Modem/BG96.py index 19b254cb..257c9456 100644 --- a/Hologram/Network/Modem/BG96.py +++ b/Hologram/Network/Modem/BG96.py @@ -9,6 +9,7 @@ # import binascii import time +import random from serial.serialutil import Timeout @@ -69,7 +70,7 @@ def create_socket(self): self._set_up_pdp_context() def connect_socket(self, host, port): - self.command('+QIOPEN', '1,0,\"TCP\",\"%s\",%d,0,1' % (host, port)) + self.command('+QIOPEN', '1,%d,\"TCP\",\"%s\",%d,0,1' % (random.randint(0,11), host, port)) # According to the BG96 Docs # Have to wait for URC response “+QIOPEN: ,