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

ota updater

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