Skip to content
Snippets Groups Projects
Commit 289a6d54 authored by Strasser, Andreas's avatar Strasser, Andreas
Browse files

implemented retry mechanism

parent 68d69a78
No related branches found
No related tags found
No related merge requests found
...@@ -92,6 +92,8 @@ class NBIoTDriverState ...@@ -92,6 +92,8 @@ class NBIoTDriverState
end end
class NBIoTDriver class NBIoTDriver
static var MAX_RETRIES = 10
var ser var ser
var state var state
var rsp_awaiting var rsp_awaiting
...@@ -105,7 +107,7 @@ class NBIoTDriver ...@@ -105,7 +107,7 @@ class NBIoTDriver
self.state = NBIoTDriverState.RESET self.state = NBIoTDriverState.RESET
self.rsp_awaiting = false self.rsp_awaiting = false
self.payload_awaiting = false self.payload_awaiting = false
self.retries = 0 self.retries = self.MAX_RETRIES
self.request_queue = [] self.request_queue = []
self.request = nil self.request = nil
self.mqtt_connection = nil self.mqtt_connection = nil
...@@ -113,6 +115,11 @@ class NBIoTDriver ...@@ -113,6 +115,11 @@ class NBIoTDriver
self.ser = serial(rx, tx, 115200, serial.SERIAL_8N1) self.ser = serial(rx, tx, 115200, serial.SERIAL_8N1)
end end
def next_state(state)
self.state = state
self.retries = self.MAX_RETRIES
end
def queue_request(request) def queue_request(request)
self.request_queue.push(request) self.request_queue.push(request)
end end
...@@ -147,7 +154,6 @@ class NBIoTDriver ...@@ -147,7 +154,6 @@ class NBIoTDriver
def rsp_contains_msg(msg) def rsp_contains_msg(msg)
if self.rsp_awaiting if self.rsp_awaiting
var rsp = self.ser.read().asstring() var rsp = self.ser.read().asstring()
print(rsp)
if string.find(rsp, msg) >= 0 if string.find(rsp, msg) >= 0
self.rsp_awaiting = false self.rsp_awaiting = false
...@@ -155,7 +161,8 @@ class NBIoTDriver ...@@ -155,7 +161,8 @@ class NBIoTDriver
return true return true
else else
if self.retries > 0 if self.retries > 0
self.retries -= self.retries self.retries -= 1
tasmota.log(string.format('NBT: state %s retries %s', str(self.state), str(self.retries)), 2)
end end
return false return false
...@@ -167,23 +174,32 @@ class NBIoTDriver ...@@ -167,23 +174,32 @@ class NBIoTDriver
def rsp_contains_msg_or_send(msg, cmd) def rsp_contains_msg_or_send(msg, cmd)
if self.rsp_contains_msg(msg) if self.rsp_contains_msg(msg)
tasmota.log(string.format('NBT: Received \'%s\'', msg), 2)
return true return true
else else
print('send ' + cmd)
self.ser.write(bytes().fromstring(cmd)) self.ser.write(bytes().fromstring(cmd))
self.rsp_awaiting = true self.rsp_awaiting = true
tasmota.log(string.format('NBT: Sending command \'%s\'', string.replace(cmd, '\r\n', '')), 2)
return false return false
end end
end end
def every_second() def every_second()
# ---- RESET ---- # # ---- retries exceeded ---- #
if self.state == NBIoTDriverState.RESET if self.retries < 1 && self.request != nil
self.request = nil
self.next_state(NBIoTDriverState.RESET)
tasmota.log('NBT: Maximum number of retries exceeded, skipping request', 2)
# ---- reset module ---- #
elif self.state == NBIoTDriverState.RESET
if self.rsp_contains_msg_or_send('RDY', 'AT+QRST=1\r\n') if self.rsp_contains_msg_or_send('RDY', 'AT+QRST=1\r\n')
self.state = NBIoTDriverState.READY self.next_state(NBIoTDriverState.READY)
end end
# ---- READY ---- # # ---- ready for request ---- #
elif self.state == NBIoTDriverState.READY elif self.state == NBIoTDriverState.READY
if self.request_queue.size() > 0 if self.request_queue.size() > 0
self.request = self.request_queue[0] self.request = self.request_queue[0]
...@@ -196,58 +212,63 @@ class NBIoTDriver ...@@ -196,58 +212,63 @@ class NBIoTDriver
self.request.password) self.request.password)
if self.mqtt_connection != nil && self.mqtt_connection.equals(mqtt_connection) if self.mqtt_connection != nil && self.mqtt_connection.equals(mqtt_connection)
self.state = NBIoTDriverState.MQTT_CHECK_CONN self.next_state(NBIoTDriverState.MQTT_CHECK_CONN)
elif self.mqtt_connection != nil elif self.mqtt_connection != nil
self.mqtt_connection = mqtt_connection self.mqtt_connection = mqtt_connection
self.state = NBIoTDriverState.MQTT_CLOSE self.next_state(NBIoTDriverState.MQTT_CLOSE)
else else
self.mqtt_connection = mqtt_connection self.mqtt_connection = mqtt_connection
self.state = NBIoTDriverState.MQTT_OPEN self.next_state(NBIoTDriverState.MQTT_OPEN)
end end
else else
self.finish_request() self.finish_request()
end end
end end
# ---- COAP ---- # # ---- send coap request ---- #
elif self.state == NBIoTDriverState.COAP_SET_OPTIONS elif self.state == NBIoTDriverState.COAP_SET_OPTIONS
if self.rsp_contains_msg_or_send('OK', 'AT+QCOAPOPTION=1,11,\"test\"\r\n') if self.rsp_contains_msg_or_send('OK', 'AT+QCOAPOPTION=1,11,\"test\"\r\n')
self.state = NBIoTDriverState.COAP_SEND self.next_state(NBIoTDriverState.COAP_SEND)
end end
elif self.state == NBIoTDriverState.COAP_SEND elif self.state == NBIoTDriverState.COAP_SEND
if self.rsp_contains_msg_or_send('OK', 'AT+QCOAPSEND=1,0,\"37.120.174.40\",5683,0\r\n') if self.rsp_contains_msg_or_send('OK', 'AT+QCOAPSEND=1,0,\"37.120.174.40\",5683,0\r\n')
self.state = NBIoTDriverState.COAP_RECEIVE self.next_state(NBIoTDriverState.COAP_RECEIVE)
end end
elif self.state == NBIoTDriverState.COAP_RECEIVE elif self.state == NBIoTDriverState.COAP_RECEIVE
var msg = self.ser.read().asstring() var msg = self.ser.read().asstring()
print(msg) print(msg)
# ---- MQTT ---- # # ---- punlish mqtt message ---- #
elif self.state == NBIoTDriverState.MQTT_CHECK_CONN elif self.state == NBIoTDriverState.MQTT_CHECK_CONN
if self.rsp_contains_msg_or_send('+QMTCONN: 0,3', 'AT+QMTCONN?\r\n') if self.retries == 1
self.state = NBIoTDriverState.MQTT_PUBLISH self.mqtt_connection = nil
self.next_state(NBIoTDriverState.MQTT_CLOSE)
elif self.rsp_contains_msg_or_send('+QMTCONN: 0,3', 'AT+QMTCONN?\r\n')
self.next_state(NBIoTDriverState.MQTT_PUBLISH)
end end
elif self.state == NBIoTDriverState.MQTT_OPEN elif self.state == NBIoTDriverState.MQTT_OPEN
if self.rsp_contains_msg_or_send('+QMTOPEN: 0,0', self.build_mqtt_open_cmd()) if self.rsp_contains_msg_or_send('+QMTOPEN: 0,0', self.build_mqtt_open_cmd())
self.state = NBIoTDriverState.MQTT_CONNECT self.next_state(NBIoTDriverState.MQTT_CONNECT)
end end
elif self.state == NBIoTDriverState.MQTT_CONNECT elif self.state == NBIoTDriverState.MQTT_CONNECT
if self.rsp_contains_msg_or_send('+QMTCONN: 0,0,0', self.build_mqtt_conn_cmd()) if self.rsp_contains_msg_or_send('+QMTCONN: 0,0,0', self.build_mqtt_conn_cmd())
self.state = NBIoTDriverState.MQTT_PUBLISH self.next_state(NBIoTDriverState.MQTT_PUBLISH)
end end
elif self.state == NBIoTDriverState.MQTT_PUBLISH elif self.state == NBIoTDriverState.MQTT_PUBLISH
if self.rsp_contains_msg_or_send('+QMTPUB: 0,0,0', self.build_mqtt_pub_cmd()) if self.rsp_contains_msg_or_send('+QMTPUB: 0,0,0', self.build_mqtt_pub_cmd())
self.finish_request() self.finish_request()
self.state = NBIoTDriverState.READY self.next_state(NBIoTDriverState.READY)
end end
elif self.state == NBIoTDriverState.MQTT_CLOSE elif self.state == NBIoTDriverState.MQTT_CLOSE
if self.rsp_contains_msg_or_send('+QMTDISC: 0,0', 'AT+QMTDISC=0\r\n') if self.rsp_contains_msg_or_send('+QMTCLOSE: 0,0', 'AT+QMTCLOSE=0\r\n')
if self.request != nil if self.request != nil
self.state = NBIoTDriverState.MQTT_OPEN self.next_state(NBIoTDriverState.MQTT_OPEN)
else else
self.state = NBIoTDriverState.READY self.next_state(NBIoTDriverState.READY)
end end
end end
else else
tasmota.log('NBT: Invalid driver state, stopping driver', 2)
tasmota.remove_driver(self) tasmota.remove_driver(self)
end end
end end
...@@ -260,7 +281,6 @@ nbiot.init = def (m) ...@@ -260,7 +281,6 @@ nbiot.init = def (m)
var _driver var _driver
def init() def init()
print('init')
self._driver = NBIoTDriver(19, 23) self._driver = NBIoTDriver(19, 23)
tasmota.add_driver(self._driver) tasmota.add_driver(self._driver)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment