Exemplo n.º 1
0
    def create_task(self, task_id, image_data_id, image_data_url,\
            image_data_md5, iot_dev_list_md5, iot_dev_list_url, start_time, end_time):
        epd_task = EpdTask(self.task_url)

        # 0-none 1-sleep 2-ready 3-run 4-finish 5-suspend
        if self.__taskId == 0 or (self.__taskStatus in ('', '0', '4', '5')):
            # 下载任务
            os.system("wget %s -O %s.tmp" %
                      (image_data_url, epd_task.data_url))
            os.system("wget %s -O %s.tmp" %
                      (iot_dev_list_url, epd_task.execute_url))
            ret = self.check_task_integrity(image_data_md5, iot_dev_list_md5)
            if not ret:
                return False
            # 保存任务状态
            epd_task.set_item('task_id', str(task_id))
            epd_task.set_item('image_data_id', str(image_data_id))
            epd_task.set_item('image_data_url', image_data_url)
            epd_task.set_item('start_time', start_time)
            epd_task.set_item('end_time', end_time)
            epd_task.set_item('task_status', '1')
            epd_task.save()
            # 保存待更新列表
            os.system("mv %s.tmp %s" % (epd_task.data_url, epd_task.data_url))
            os.system("mv %s.tmp %s" %
                      (epd_task.execute_url, epd_task.execute_url))
            self.__taskId = self.get_task_id()
            self.__taskStatus = self.get_task_status()  # 更新任务状态
            self.set_task_monitor()
            return True
        else:
            LOG.info("task status not allowed, status:%s", self.__taskStatus)
            return False
Exemplo n.º 2
0
 def send_service(self, service_name, data, need_resp=False):
     path = ""
     for service in self.services:
         if service_name == service[0]:
             path = service[1]
             break
     if path:
         try:
             self.__client = socket(family=AF_UNIX)
             self.__client.connect(path)
             content = json.dumps(data)
             self.__client.send(content.encode('utf-8'))
             if need_resp:
                 resp = self.__client.recv(1024 * 1024)
                 if not resp:
                     raise Exception()
                 resp = resp.decode('utf-8')
                 LOG.info(resp)
                 content = json.loads(resp, encoding='utf-8')
         except Exception as e:
             LOG.error(e.__repr__())
             content = {'status': 500, 'msg': e.__repr__()}
         finally:
             self.__client.close()
             return content
Exemplo n.º 3
0
    def post(self, cmd):
        try:
            request = self.request.body.decode('utf-8')
            request = json.loads(request)
            body = request["d"]
            if cmd == 'group':
                pass
            elif cmd == 'white_list':
                ret = gw.create_whitelist(body['url'], body['md5'])
                if ret:
                    LOG.info("white list create success")
                    resp_status = "ok"
                    resp_data = {"result": "ok"}
            elif cmd == 'check_code':
                gw.set_auth_key(body['check_code'])
                resp_status = "ok"
                resp_data = {"result": "ok"}

        except EpdException as e:
            LOG.error(e.__repr__())
            resp_status = "err",
            resp_data = {"msg": e.message}
        finally:
            upload = uplink.Upload()
            resp = {
                "id": request['id'],
                "from": request['from'],
                "status": resp_status,
                "command": request['command'],
                "d": resp_data
            }
            upload.send(resp, topic="dma/cmd/resp")
Exemplo n.º 4
0
 def func(self, request):
     LOG.info('%s heart beat', request['device_id'])
     if gw.is_in_whitelist(request['device_id']):
         LOG.info("%s is in white list", request['device_id'])
         status = "ok"
     else:
         status = "error"
     send_data = {"status": status}
     return send_data
Exemplo n.º 5
0
 def func(self, request):
     LOG.info('%s heart beat', request['device_id'])
     if gw.is_in_executelist(request['device_id'], request['data_id']):
         LOG.info("%s is in execute list", request['device_id'])
         status = "ok"
     else:
         status = "error"
     send_data = {"status": status}
     return send_data
     # dl.send_service('serial', send_data)
     self.upload(request)
Exemplo n.º 6
0
 def func(self, request):
     device_id = request['device_id']
     LOG.info("%s register", device_id)
     ret = gw.is_in_whitelist(device_id)
     send_data = {}
     if ret:
         LOG.info("%s is in white list", device_id)
         send_data['status'] = 'ok'
         send_data['key'] = int(gw.get_auth_key())
     else:
         send_data['status'] = 'error'
     return send_data
Exemplo n.º 7
0
 def create_whitelist(self, url, md5):
     LOG.info("download white list file")
     os.system("wget -c %s -O %s.tmp" % (url, self.white_list_url))
     ret = self.check_whitelist_integrity(md5)
     if not ret:
         return False
     else:
         LOG.info("store white list file")
         os.system("mv %s.tmp %s" %
                   (self.white_list_url, self.white_list_url))
         self.__whiteListMD5 = self.get_whitelist()
         return True
Exemplo n.º 8
0
 def send(self, url, data):
     try:
         data = json.dumps(data).encode('utf-8')
         LOG.info(data)
         request = urllib.request.Request(url,
                                          data=data,
                                          headers={'token': token})
         resp = urllib.request.urlopen(request)
         content = resp.read().decode('utf-8')
         LOG.info("result:" + content)
         content = json.loads(content)
         return content
     except Exception as e:
         LOG.error(e.__str__())
Exemplo n.º 9
0
 def post(self, cmd):
     body = self.request.body.decode('utf-8')
     body = json.loads(body)
     src = "local" if body['from'] == 'local' else 'remote'
     radio_number = body.get('radio_number')
     if cmd == 'update':
         LOG.info('%s setup radio parameters', src)
         data = {"cmd": "update", "radio": radio_number}
     elif cmd == 'restart':
         LOG.info('%s restart radio', src)
         data = {"cmd": "restart", "radio": radio_number}
         ret = dl.send_service("serial", data, need_resp=True)  # 向串口发送消息
         if ret['status'] != 'ok':
             gw.set_try_data('serial', data)
Exemplo n.º 10
0
 def handle(self):
     try:
         data = self.request.recv(1024)
         data = data.decode('utf-8')
         data = json.loads(data, encoding='utf-8')
         LOG.info("downlink recv: %s", data)
         HandleClass = self.route(data)
         handler = HandleClass()
         send_data = handler.func(data)
         if isinstance(send_data, dict):
             content = json.dumps(send_data)
             LOG.info("downlink send: %s", content)
             self.wfile.write(content.encode('utf-8'))
     except Exception as e:
         LOG.error('%s exception: data: %s', e.__str__(), str(data))
Exemplo n.º 11
0
    def check_task_integrity(self, image_data_md5, iot_dev_list_md5):
        hash_obj = hashlib.md5()
        with open("%s.tmp" % self.data_url, "rb") as datafile:
            hash_obj.update(datafile.read())
            hash_code = hash_obj.hexdigest()
        if image_data_md5 != hash_code:
            LOG.info("image data md5 check failed")
            return False

        hash_obj = hashlib.md5()
        with open("%s.tmp" % self.execute_url, "rb") as devfile:
            hash_obj.update(devfile.read())
            hash_code = hash_obj.hexdigest()
        if iot_dev_list_md5 != hash_code:
            LOG.info("iot dev list md5 check failed")
            return False
        return True
Exemplo n.º 12
0
    def send(self, payload, topic='pc_test', wait_event=None, need_wait=False, cache=False):
        if cache:
            url = r'http://127.0.0.1:7788/mqtt/publish/offlinecache'
        else:
            url = r'http://127.0.0.1:7788/mqtt/publish'
        data = {}
        data['topic'] = topic
        data['payload'] = payload

        try:
            params = json.dumps(data).encode('utf-8')
            LOG.info(params)
            request = urllib.request.Request(url, data=params, headers={'token':token})
            resp = urllib.request.urlopen(request)
            content = resp.read().decode('utf-8')
            LOG.info("result:"+content)
        except Exception as e:
            LOG.error(e.__str__())
Exemplo n.º 13
0
    def post(self, cmd):
        try:
            request = self.request.body.decode('utf-8')
            request = json.loads(request)
            body = request["d"]
            if cmd == 'group':
                raise Exception("%s cmd not found" % cmd)
            elif cmd == 'white_list':
                ret = gw.create_whitelist(body['url'], body['md5'])
                if ret:
                    LOG.info("white list create success")
                    resp_status = "ok"
                    resp_data = {"result": "ok"}
                else:
                    raise Exception("white list create failed")
            elif cmd == 'check_code':
                gw.set_auth_key(body['check_code'])
                resp_status = "ok"
                resp_data = {"result": "ok"}
            elif cmd == 'interval':
                gw.set_interval_time(body['interval'])
                resp_status = "ok"
                resp_data = {"result": "ok"}
            else:
                raise Exception("%s cmd not found" % cmd)

        except Exception as e:
            LOG.error(e.__repr__())
            resp_status = "err",
            resp_data = {"msg": e.__str__()}
        finally:
            upload = uplink.Upload()
            url = r'http://127.0.0.1:7788/mqtt/publish/offlinecache'
            resp = {
                "id": request.get('id'),
                "from": request.get('from'),
                "status": resp_status,
                "command": request.get('command'),
                "d": resp_data
            }
            data = {'topic': "dma/cmd/resp", 'payload': resp}
            upload.send(url, data)
Exemplo n.º 14
0
 def set_task_monitor(self):
     try:
         task_status = self.get_task_status()
         if task_status == '0':
             return
         start_time, end_time = self.get_task_time()
         end_time = mktime(strptime(end_time, "%Y-%m-%d %H:%M:%S"))
         cur_time = time()
         task_id = self.get_task_id()
         if task_status != '4' and (cur_time >
                                    end_time + 60):  # 结束1分钟之后没有收到结束信号就主动结束
             LOG.info("task %s execute timeout", task_id)
             self.set_task_status(task_id, '4')
             self.report_task_status()
         elif task_status == '4':
             pass
         else:
             timer = threading.Timer(60, self.set_task_monitor)
             timer.start()
     except:
         pass
Exemplo n.º 15
0
    def func(self, request):
        try:
            send_data = dict()
            upload_data = None
            device_id = request['device_id']
            firmware = request.get('firmware', None)
            data_id = request.get('data_id', "0")
            interval = request.get('interval', None)
            if firmware:
                # 注册上报
                LOG.info("%s register", device_id)
                upload_data = {
                    "d": [{
                        "nid": device_id,
                        "d": {
                            "firmware": firmware
                        }
                    }]
                }
                topic = 'dma/report/periph/reg'
            elif data_id:
                # 心跳上报
                # 准备上报数据
                upload_data = {
                    "d": [{
                        "nid": device_id,
                        "d": {
                            "image_data_id": int(data_id),
                            "interval": request['interval'],
                            "battery": request['battery']
                        }
                    }]
                }
                topic = 'dma/report/periph'
                ts = gw.get_task_status()
                LOG.info("task status: %s", ts)
                if ts in ('0', '4', '5'):  # 没有任务或任务已结束
                    data = {
                        'nid': device_id,
                        'image_data_id': int(data_id),
                        # 'image_data_id': int(gw.get_data_id()),
                        'sn': gw.get_gw_id()
                    }
                    LOG.info("start query")
                    host, port = gw.get_server_url()
                    resp = self.query_task(
                        'http://{}/iotgw/api/v1/tasks/gwtasks/assign'.format(
                            host), data)
                    LOG.info("get response")
                    if resp:
                        # 应答成功,保存任务状态,下发时间,下载任务
                        if resp['status'] != 'ok':
                            raise Exception("get task error")
                        data = resp['data']
                        ret = gw.create_task(data['task_id'], data['image_data_id'], data['image_data_url'], \
                                data['image_data_md5'], data['iot_dev_list_md5'], data['iot_dev_list_url'], \
                                data['scheduled_start_time'], data['scheduled_end_time'])
                        if ret:
                            start_time, end_time = gw.get_task_time()
                            send_data['task_id'] = gw.get_task_id()
                            send_data['data_id'] = gw.get_data_id()
                            send_data['start_time'] = start_time
                            send_data['end_time'] = end_time

                            # 向serial发送任务开始命令
                            task_start = {
                                "cmd": "task",
                                "method": "create",
                                "task_id": send_data['task_id'],
                                "data_id": int(send_data['data_id']),
                                "start_time": send_data['start_time'],
                                "end_time": send_data['end_time']
                            }
                            ret = dl.send_service('serial',
                                                  task_start,
                                                  need_resp=True)
                            if ret['status'] != 'ok':
                                gw.set_try_data('serial', task_start)

                            # 添加待执行表
                            gw.create_pending_list()
                            gw.add_pending_list(device_id)
                        else:
                            # 创建失败上报
                            pass
                    else:
                        raise Exception("server no response")
                elif ts in ('1', '2'):
                    ret = gw.is_in_executelist(device_id, data_id)
                    if ret:
                        start_time, end_time = gw.get_task_time()
                        send_data['task_id'] = gw.get_task_id()
                        send_data['data_id'] = int(gw.get_data_id())
                        send_data['start_time'] = start_time
                        send_data['end_time'] = end_time
                        gw.add_pending_list(device_id)
                else:
                    # 其他情况处理
                    pass
                # 更新唤醒周期
                send_data['status'] = 'ok'
                interval_time = gw.get_interval_time()
                if interval_time != request['interval']:
                    send_data['interval'] = interval_time
            else:
                raise Exception("request param invalid")
        except Exception as e:
            send_data['status'] = 'error'
            LOG.error(e.__repr__())
        finally:
            if upload_data:
                self.upload(topic, upload_data)
            return send_data
Exemplo n.º 16
0
    def post(self, cmd):
        try:
            request = self.request.body.decode('utf-8')
            request = json.loads(request)
            body = request['d']
            if cmd == 'create':
                ret = gw.create_task(body['task_id'], body['image_data_id'], body['image_data_url'], \
                    body['image_data_md5'], body['iot_dev_list_md5'], body['iot_dev_list_url'], \
                    body['start_time'], body['end_time'])
                if ret:
                    data = {
                        "cmd": "task",
                        "method": "create",
                        "task_id": body['task_id'],
                        "data_id": body['image_data_id'],
                        "start_time": body['start_time'],
                        "end_time": body['end_time']
                    }
                    ret = dl.send_service('serial', data, need_resp=True)
                    if ret['status'] != 'ok':
                        gw.set_try_data('serial', data)
                    # raise HTTPError(200)
                    status = 'ok'
                    msg = "task_id %s create success" % body['task_id']
                else:
                    # 不可创建任务
                    LOG.info("task could not create")
                    status = 'failed'
                    msg = "task_id %s create not allowed" % body['task_id']
                    # 上传命令处理结果
                upload = uplink.Upload()
                resp = {
                    "id": request['id'],
                    "from": request['from'],
                    "status": status,
                    "command": request['command'],
                    "d": {
                        "code": "task_status",
                        "msg": msg
                    }
                }
                # gw.get_task_status()
                upload.send(resp, topic='dma/cmd/resp')
            elif cmd == 'cancel':
                # cancel task
                data = {
                    "cmd": "task",
                    "method": "cancel",
                    "task_id": body['task_id']
                }
                ret = dl.send_service('serial', data, need_resp=True)
                if ret['status'] != 'ok':  # 向模块发出取消命令
                    gw.set_try_data('serial', data)

                ret = gw.cancel_task(body['task_id'])
                if ret:
                    status = 'ok'
                    result = {'result': 'ok'}
                else:
                    status = 'err'
                    result = {'code': 'cancel_failed', 'msg': 'task not found'}
                # 上传处理结果
                upload = uplink.Upload()
                resp = {
                    "id": request['id'],
                    "from": request['from'],
                    "status": status,
                    "command": request['command'],
                    "d": result
                }
                upload.send(resp, topic='dma/cmd/resp')
            elif cmd == 'confirm':
                # confirm task
                data = {
                    "table_name":"sql",
                    "sql_cmd":"update `task` set (`start_time`='%s', `end_time`='%s', `status`=2) where `task_id`='%s';" % \
                        (body['start_time'], body['end_time'], body['task_id'])
                }
                dl.send_service('database', data)
            else:
                raise HTTPError(404)
        except Exception as e:
            self.write(e.__str__())
            LOG.error("%s" % e.__str__())
Exemplo n.º 17
0
#!/usr/bin/env python3

# from downlink import dl
# from task import task
import sys
import os
from epd_log import epdlog as LOG

version = '1.0.0'

if __name__ == "__main__":
    with open('/etc/gateway/gwapp.version', 'w') as vfp:
        vfp.write(version)

    sys.path.append(os.path.dirname(os.path.abspath(__file__)))
    LOG.info('epd service start...')
    from uplink import Uplink
    uplinkHandler = Uplink()
    uplinkHandler.begin()
    uplinkHandler.end()
Exemplo n.º 18
0
 def begin(self):
     LOG.info("sever host:%s port:%d", self.__host, self.__port)
     self.listen(self.__port, self.__host)
     tornado.ioloop.IOLoop.current(instance=False).start()
Exemplo n.º 19
0
 def stop_service(self):
     LOG.info("downlink service stop")
     self.server_close()
     self.__thread.join()
Exemplo n.º 20
0
 def start_service(self):
     LOG.info("downlink service start")
     self.serve_forever()
Exemplo n.º 21
0
 def end(self):
     LOG.info("server stop")