提交 8894a281 authored 作者: blu's avatar blu

ota updater

上级 3e77a774
......@@ -19,7 +19,8 @@ SN_FILE = '/etc/devsn.cfg'
VER_FILE = '/etc/devversion.cfg'
LOCAL_CFG_URL = 'http://localhost:8088/config'
MIN_SN_LEN = 8
DOWNLOAD_PATH = '/tmp/update_package/update_package.zip'
DOWNLOAD_PATH = '/tmp/update_package/'
PACKAGE_NAME = 'update.zip'
EXTRACT_PATH = '/tmp/update_extract/'
BIN_DIR = '/tmp/work/opencv-pocs/opencv-motion-detect/'
LIB_DIR = BIN_DIR + 'vendor/lib/'
......@@ -125,7 +126,12 @@ class OTAClient:
self.client.on_message = self.on_message
self.client.connect_async(self.host, self.port, 30)
#self.client.loop_start()
def run(self):
self.client.loop_forever()
def run_nonblock(self):
self.client.loop_start()
def download(self, url):
logger.info("downloading package {}".format(url))
......@@ -136,7 +142,7 @@ class OTAClient:
with requests.get(url, stream=True, timeout=5) as r:
r.raise_for_status()
logger.info("download {} -> {}".format(url, DOWNLOAD_PATH))
with open(DOWNLOAD_PATH, 'wb') as f:
with open(DOWNLOAD_PATH + PACKAGE_NAME, 'wb') as f:
for ch in r.iter_content(chunk_size=8000):
f.write(ch)
except requests.exceptions.ConnectionError as e:
......@@ -169,11 +175,13 @@ class OTAClient:
rep['status'] = status
try:
logger.info("reply with status {}".format(status))
mc = mqtt.Client('EVBRep-'+self.sn, userdata=self) # , protocol=mqtt.MQTTv5)
if self.username and self.password:
mc.username_pw_set(username=self.username, password=self.password)
mc.connect_async(self.host, self.port, 10)
mc.publish(REPLY_TOPIC, json.dumps(rep), 1)
# mc = mqtt.Client('EVBRep-'+self.sn, userdata=self) # , protocol=mqtt.MQTTv5)
# if self.username and self.password:
# mc.username_pw_set(username=self.username, password=self.password)
# mc.connect_async(self.host, self.port, 10)
# mc.publish(REPLY_TOPIC, json.dumps(rep), 1)
self.client.publish(REPLY_TOPIC, json.dumps(rep), 1)
logger.info("replyed")
except Exception as e:
logger.info('exception in publish reply message: %s', e)
extype, value, tb = sys.exc_info()
......@@ -190,16 +198,16 @@ class OTAClient:
msg = 'OK'
if not sku or sku != SKU:
msg = "invalid sku {} in update request, expected {}. ignored".format(sku, SKU)
logger.warn(msg);
logger.error(msg);
elif not sn or sn != self.sn:
msg = "invalid sn {} in update request, expected {} ignored".format(sn, self.sn)
logger.warn(msg);
logger.error(msg);
elif not url or url[:7] != 'http://':
msg = "invalid url {} in update request, ignored".format(url)
logger.warn(msg);
logger.error(msg);
elif not batchId or not str(batchId).isdigit():
msg = "invalid batchId {} in update request, ignored".format(batchId)
logger.warn(msg);
logger.error(msg);
elif not self.version:
logger.warn("no local version file, update initialized")
else:
......@@ -216,7 +224,7 @@ class OTAClient:
return
# extract
try:
with zipfile.ZipFile(DOWNLOAD_PATH, 'r') as zip_ref:
with zipfile.ZipFile(DOWNLOAD_PATH + PACKAGE_NAME, 'r') as zip_ref:
zip_ref.extractall(EXTRACT_PATH)
except Exception as e:
msg = 'failed to extract pakage: {}'.format(str(e))
......@@ -255,5 +263,6 @@ if __name__ == "__main__":
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 45432))
logger.setLevel(logging.INFO)
OTAClient(MQTT_HOST, MQTT_PORT, MQTT_USER_NAME, MQTT_USER_PASSWORD)
ota = OTAClient(MQTT_HOST, MQTT_PORT, MQTT_USER_NAME, MQTT_USER_PASSWORD)
ota.run()
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论