Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
N
node-software
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
bachelor-project
node-software
Commits
0f6cd69e
Commit
0f6cd69e
authored
Jul 29, 2023
by
Strasser, Andreas
Browse files
Options
Downloads
Patches
Plain Diff
implemented ntc time sync
parent
289a6d54
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/driver/nbiot.be
+93
-34
93 additions, 34 deletions
src/driver/nbiot.be
with
93 additions
and
34 deletions
src/driver/nbiot.be
+
93
−
34
View file @
0f6cd69e
...
@@ -3,6 +3,7 @@ import string
...
@@ -3,6 +3,7 @@ import string
class NBIoTRequestType
class NBIoTRequestType
static var MQTT = 1
static var MQTT = 1
static var COAP = 2
static var COAP = 2
static var NTP = 3
end
end
class NBIoTRequest
class NBIoTRequest
...
@@ -31,6 +32,12 @@ class NBIoTMQTTRequest : NBIoTRequest
...
@@ -31,6 +32,12 @@ class NBIoTMQTTRequest : NBIoTRequest
end
end
end
end
class NBIoTNTPRequest : NBIoTRequest
def init()
self.type = NBIoTRequestType.NTP
end
end
class NBIoTCOAPRequest : NBIoTRequest
class NBIoTCOAPRequest : NBIoTRequest
var host
var host
var port
var port
...
@@ -79,16 +86,17 @@ end
...
@@ -79,16 +86,17 @@ end
class NBIoTDriverState
class NBIoTDriverState
static var RESET = 1
static var RESET = 1
static var READY = 2
static var READY = 2
static var COAP_OPEN = 3
static var NTP_SYNC = 3
static var COAP_SET_OPTIONS = 4
static var MQTT_OPEN = 4
static var COAP_SEND = 5
static var MQTT_CONNECT = 5
static var COAP_RECEIVE = 6
static var MQTT_PUBLISH = 6
static var COAP_CLOSE = 7
static var MQTT_CHECK_CONN = 7
static var MQTT_OPEN = 8
static var MQTT_CLOSE = 8
static var MQTT_CONNECT = 9
static var COAP_OPEN = 9
static var MQTT_PUBLISH = 10
static var COAP_SET_OPTIONS = 10
static var MQTT_CHECK_CONN = 11
static var COAP_SEND = 11
static var MQTT_CLOSE = 12
static var COAP_RECEIVE = 12
static var COAP_CLOSE = 13
end
end
class NBIoTDriver
class NBIoTDriver
...
@@ -106,7 +114,6 @@ class NBIoTDriver
...
@@ -106,7 +114,6 @@ class NBIoTDriver
def init(rx, tx)
def init(rx, tx)
self.state = NBIoTDriverState.RESET
self.state = NBIoTDriverState.RESET
self.rsp_awaiting = false
self.rsp_awaiting = false
self.payload_awaiting = false
self.retries = self.MAX_RETRIES
self.retries = self.MAX_RETRIES
self.request_queue = []
self.request_queue = []
self.request = nil
self.request = nil
...
@@ -132,6 +139,21 @@ class NBIoTDriver
...
@@ -132,6 +139,21 @@ class NBIoTDriver
self.request = nil
self.request = nil
end
end
def set_system_time(rsp)
var rsp_args = string.split(rsp, '\"')
var timestamp = nil
for rsp_arg : rsp_args
timestamp = tasmota.strptime(rsp_arg, "%y/%m/%d,%H:%M:%S")
if timestamp != nil
break
end
end
tasmota.cmd('time ' + str(timestamp['epoch'] + 3600)) # UTC + 1
end
def build_mqtt_open_cmd()
def build_mqtt_open_cmd()
var cmd = 'AT+QMTOPEN=0,\"%s\",%s\r\n'
var cmd = 'AT+QMTOPEN=0,\"%s\",%s\r\n'
...
@@ -151,37 +173,58 @@ class NBIoTDriver
...
@@ -151,37 +173,58 @@ class NBIoTDriver
return string.format(cmd, self.request.topic, self.request.payload)
return string.format(cmd, self.request.topic, self.request.payload)
end
end
def rsp_contains_msg(msg)
def send_cmd(cmd)
self.ser.write(bytes().fromstring(cmd))
self.rsp_awaiting = true
tasmota.log(string.format('NBT: Sending command \'%s\'', string.replace(cmd, '\r\n', '')), 2)
end
def rsp_contains_msg(msg, return_rsp)
if self.rsp_awaiting
if self.rsp_awaiting
var rsp = self.ser.read().asstring()
var rsp = self.ser.read().asstring()
if string.find(rsp, msg) >= 0
if string.find(rsp, msg) >= 0
self.rsp_awaiting = false
self.rsp_awaiting = false
tasmota.log(string.format('NBT: Received \'%s\'', msg), 2)
if return_rsp
return rsp
end
return true
return true
else
else
if self.retries > 0
if self.retries > 0
self.retries -= 1
self.retries -= 1
tasmota.log(string.format('NBT: state %s retries %s', str(self.state), str(self.retries)), 2)
end
end
end
end
if return_rsp
return nil
else
return false
return false
end
end
end
def fetch_rsp_if_contains_msg_or_send(msg, cmd)
var rsp = self.rsp_contains_msg(msg, true)
if rsp != nil
return rsp
else
else
return false
self.send_cmd(cmd)
return nil
end
end
end
end
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, false)
tasmota.log(string.format('NBT: Received \'%s\'', msg), 2)
return true
return true
else
else
self.ser.write(bytes().fromstring(cmd))
self.send_cmd(cmd)
self.rsp_awaiting = true
tasmota.log(string.format('NBT: Sending command \'%s\'', string.replace(cmd, '\r\n', '')), 2)
return false
return false
end
end
...
@@ -205,7 +248,9 @@ class NBIoTDriver
...
@@ -205,7 +248,9 @@ class NBIoTDriver
self.request = self.request_queue[0]
self.request = self.request_queue[0]
self.request_queue.remove(0)
self.request_queue.remove(0)
if self.request.type == NBIoTRequestType.MQTT
if self.request.type == NBIoTRequestType.NTP
self.next_state(NBIoTDriverState.NTP_SYNC)
elif self.request.type == NBIoTRequestType.MQTT
var mqtt_connection = NBIoTMQTTConnection(self.request.host,
var mqtt_connection = NBIoTMQTTConnection(self.request.host,
self.request.port,
self.request.port,
self.request.username,
self.request.username,
...
@@ -224,18 +269,14 @@ class NBIoTDriver
...
@@ -224,18 +269,14 @@ class NBIoTDriver
self.finish_request()
self.finish_request()
end
end
end
end
# ---- send coap request ---- #
# ---- fetch time from ntp server ---- #
elif self.state == NBIoTDriverState.COAP_SET_OPTIONS
elif self.state == NBIoTDriverState.NTP_SYNC
if self.rsp_contains_msg_or_send('OK', 'AT+QCOAPOPTION=1,11,\"test\"\r\n')
var rsp = self.fetch_rsp_if_contains_msg_or_send('+QNTP: 0', 'AT+QNTP=1,\"0.at.pool.ntp.org\"\r\n')
self.next_state(NBIoTDriverState.COAP_SEND)
end
if rsp != nil
elif self.state == NBIoTDriverState.COAP_SEND
self.set_system_time(rsp)
if self.rsp_contains_msg_or_send('OK', 'AT+QCOAPSEND=1,0,\"37.120.174.40\",5683,0\r\n')
self.next_state(NBIoTDriverState.READY)
self.next_state(NBIoTDriverState.COAP_RECEIVE)
end
end
elif self.state == NBIoTDriverState.COAP_RECEIVE
var msg = self.ser.read().asstring()
print(msg)
# ---- punlish mqtt message ---- #
# ---- punlish mqtt message ---- #
elif self.state == NBIoTDriverState.MQTT_CHECK_CONN
elif self.state == NBIoTDriverState.MQTT_CHECK_CONN
if self.retries == 1
if self.retries == 1
...
@@ -267,6 +308,18 @@ class NBIoTDriver
...
@@ -267,6 +308,18 @@ class NBIoTDriver
self.next_state(NBIoTDriverState.READY)
self.next_state(NBIoTDriverState.READY)
end
end
end
end
# ---- send coap request ---- #
elif self.state == NBIoTDriverState.COAP_SET_OPTIONS
if self.rsp_contains_msg_or_send('OK', 'AT+QCOAPOPTION=1,11,\"test\"\r\n')
self.next_state(NBIoTDriverState.COAP_SEND)
end
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')
self.next_state(NBIoTDriverState.COAP_RECEIVE)
end
elif self.state == NBIoTDriverState.COAP_RECEIVE
var msg = self.ser.read().asstring()
print(msg)
else
else
tasmota.log('NBT: Invalid driver state, stopping driver', 2)
tasmota.log('NBT: Invalid driver state, stopping driver', 2)
tasmota.remove_driver(self)
tasmota.remove_driver(self)
...
@@ -286,6 +339,12 @@ nbiot.init = def (m)
...
@@ -286,6 +339,12 @@ nbiot.init = def (m)
tasmota.add_driver(self._driver)
tasmota.add_driver(self._driver)
end
end
def sync_time()
var request = NBIoTNTPRequest()
self._driver.queue_request(request)
end
def mqtt_publish(host, port, username, password, topic, payload, callback)
def mqtt_publish(host, port, username, password, topic, payload, callback)
if type(payload) == type('')
if type(payload) == type('')
var request = NBIoTMQTTRequest(host, port, username, password, topic, payload, callback)
var request = NBIoTMQTTRequest(host, port, username, password, topic, payload, callback)
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment