Beispiel #1
0
 def try_handler(self, service_name, data):
     ret = dl.send_service(service_name, data, need_resp=True)
     if ret['status'] != 'ok':
         if self.try_count:
             t = threading.Timer(5,
                                 self.try_handler,
                                 args=(service_name, data))
             t.start()
             self.try_count = self.try_count - 1
         else:
             LOG.error('%s service lost connection', service_name)
Beispiel #2
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)
Beispiel #3
0
 def try_handler(self, service_name, data):
     ret = dl.send_service(service_name, data, need_resp=True)
     if ret['status'] != 'ok':
         t = threading.Timer(5, self.try_handler, args=(service_name, data))
         t.start()
Beispiel #4
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
Beispiel #5
0
    def post(self, cmd):
        try:
            request = self.request.body.decode('utf-8')
            request = json.loads(request)
            body = request['d']
            if cmd == 'create':
                pass
                # 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'}
                    try:
                        os.unlink("/tmp/success")
                        os.unlink("/tmp/fail")
                    except:
                        pass
                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'],
                    "msg": result
                }

                upload_data = {'topic': 'dma/cmd/resp', 'payload': resp}

                upload.send('http://127.0.0.1:7788/mqtt/publish/offlinecache',
                            upload_data)
            elif cmd == 'confirm':
                pass
                # 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__())
Beispiel #6
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__())