Ejemplo n.º 1
0
def del_template(request):
    """
    删除协议模板
    :param request:
    :return:
    """
    try:
        idList = [int(i) for i in request.POST["idList"].split(",")]
        # operationFlag更新为0
        DeviceTemplates.objects.filter(id__in=idList).update(operationFlag=0)
        result = restful.ok()
    except Exception as e:
        result = restful.params_error(message="模板删除失败!")
    return restful.ok()
Ejemplo n.º 2
0
def bulk_import_dnc_params(request):
    """
    批量导入DNC协议采集项目模板
    :return:
    """
    # DNC协议采集项模板文件放置路径
    basic_path = os.path.join(BASE_DIR, "apps", "Tm", "MatterAnalysis",
                              "ProtocolTemp")
    # 设置默认DNC协议采集项模板文件
    file_import_path = os.path.join(BASE_DIR, "apps", "Tm", "MatterAnalysis",
                                    "ProtocolTemp", "temp.xlsx")
    # 查找是否有DNC协议采集项模板文件(xlsx/xls)
    for root, dirs, files in os.walk(basic_path):
        for filename in files:
            name, suf = os.path.splitext(filename)
            if (suf == '.xlsx') or (suf == '.xls'):
                file_import_path = os.path.join(root, filename)
    # 确定路径下有模板文件
    if not os.path.exists(file_import_path):
        return restful.params_error("没有找到协议模板文件")
    # 读取excel信息
    workbook = xlrd.open_workbook(file_import_path)
    sheet_list = workbook.sheet_names()
    # 初始化数据
    data = []
    for sheet in sheet_list:
        booksheet = workbook.sheet_by_name(sheet)
        # 获取数据的长宽
        x = booksheet.ncols
        y = booksheet.nrows
        # 获取模板内采集项key
        key = [booksheet.cell_value(0, i) for i in range(x)]
        key.append("协议名称")
        if y:
            for j in range(1, y):
                # 获取采集项信息value
                value = [booksheet.cell_value(j, i) for i in range(x)]
                value.append(sheet)
                info = dict(zip(key, value))
                data.append(info)
    # 将采集项数据与数据库建立映射
    for dt in data:
        basic = {
            "ProType": dt.get("协议名称", ""),
            # operationValue 变量名
            "operationValue": dt.get("Description", ""),
            "Description": dt.get("Title", ""),
            "type": dt.get("变量类型", ""),
            #  采集项单位未配置时默认“-”
            "operationUnit": dt.get("单位", "") if dt.get("单位", "") else "-",
            "configValue": dt.get("configValue", ""),
        }
        # excel导入时数字为float,需转化成int
        if isinstance(basic["Description"], float):
            basic["Description"] = int(basic["Description"])
        try:
            ProtocolParamsDNC.objects.create(**basic)
        except Exception:
            continue
    return restful.ok()
Ejemplo n.º 3
0
def register(request):
    """
    用户注册
    """
    name = request.POST["username"]
    telephone = request.POST["telephone"]
    email = request.POST["email"]
    password = request.POST["password"]
    token = uuid.uuid4()
    if UserModel.objects.filter(telephone=telephone):
        return restful.params_error(message="this user is exist!")
    try:
        user = UserModel.objects.create_user(username=name,
                                             telephone=telephone,
                                             email=email,
                                             password=password,
                                             token=token,
                                             is_active=1)
        user.compID = user.id
        user.save()
        login(request, user)
        result = restful.ok()
    except Exception as e:
        result = restful.server_error(
            message="this telephone or email is exist!")
    return result
Ejemplo n.º 4
0
def enable_gate(request):
    """
    网关启用
    :param request:
    :return:
    """
    gateMac = []
    gateMacs = request.POST
    for key, value in gateMacs.items():
        gateMac.append(value)
    gateinfo = GateInfoModel.objects.filter(gateMac__in=gateMac).all()
    try:
        for i in gateMac:
            if GateInfoModel.objects.filter(gateMac=i, ifregister=1):
                continue
            compID = gateinfo.filter(gateMac=i)[0].compID
            topic = str(compID).zfill(4) + '/' + i + '/' + 'Set/LoginAck'
            # 定义payload为一个有序字典
            payload = collections.OrderedDict()
            # payload = {}
            payload["type"] = "LoginAck"
            payload["values"] = []
            # 定义payload_tmp为一个有序字典
            payload_tmp = collections.OrderedDict()
            payload_tmp["result"] = "1"
            payload_tmp["time"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            payload["values"].append(payload_tmp)
            payload = json.dumps(payload)
            # 发送publish消息
            publish_mqtt(topic=topic, payload=payload)
    except:
        pass
    # 更改网关状态字段ifregister=1
    gateinfo.update(ifregister=1)
    return restful.ok()
Ejemplo n.º 5
0
def del_gateway(request):
    """
    删除网关
    :param request:
    :return:
    """
    return restful.ok()
Ejemplo n.º 6
0
def reboot_gateway(request):
    """
    网关重启
    :param request:
    :return:
    """
    return restful.ok()
Ejemplo n.º 7
0
def get_protocols(request):
    """
    根据DNC\PLC返回协议列表
    :return:
    """
    # 获取协议类型
    proType = request.POST["gateType"]
    infos = ProtocolType.objects.filter(DeviceType=proType, operationFlag=9)

    if proType == "GW_DNC":
        data = {}
        typelist = []
        pro_versions = [info.TypeList.split("_") for info in infos]
        for pro in pro_versions:
            # 已有改协议,则添加版本信息
            if pro[0] in typelist:
                if len(pro) == 1:
                    data[pro[0]].append("")
                else:
                    data[pro[0]].append(pro[1])
            else:
                typelist.append(pro[0])
                data[pro[0]] = [pro[1]] if (len(pro) == 2) else []

    # 返回PLC协议信息
    else:
        data = [j for j in set(i.TypeList for i in infos)]
    return restful.ok(data)
Ejemplo n.º 8
0
def async_history(request):
    """
    同步历史数据
    :param request:
    :return:
    """
    return restful.ok()
Ejemplo n.º 9
0
def get_dnc_params(request):
    """
    根据DNC协议返回采集项
    :return:
    """
    type = request.POST["type"]
    infos = ProtocolDNC.objects.filter(type_in=type).all()

    return restful.ok()
Ejemplo n.º 10
0
def update_gateway_info(request):
    """
    保存网关信息
    :param request:
    :return:
    """
    gateMac = request.POST["gateMac"]
    params = {"gateName": request.POST["gateName"]}
    GateInfoModel.objects.filter(gateMac=gateMac).update(**params)
    return restful.ok()
Ejemplo n.º 11
0
def disabled_gate(request):
    """
    网关禁用
    :param request:
    :return:
    """
    gateMac = []
    gateMacs = request.POST
    for key, value in gateMacs.items():
        gateMac.append(value)
    gateinfo = GateInfoModel.objects.filter(gateMac__in=gateMac).all()
    gateinfo.update(ifregister=9)
    return restful.ok()
Ejemplo n.º 12
0
def get_algorithm_details(request):
    """
    算法详情页展示
    :param request: keywords:搜索关键字
    :return: {"算法类型":[{"id":"算法id", "name": "算法名称", "synopsis":"算法简介", "contents": "算法内容", "icon": "图标"}...]...}
    """
    # 用来存储算法类型的字典变量
    algorithmDict = {}
    keywords = request.POST['keywords']
    if keywords == '':
        algorithmType = AlgorithmTypeModel.objects.filter().all()
        for i in algorithmType:
            # 用来存储算法详情的列表变量
            algorithmList = []
            algorithmDetails = AlgorithmDetailsModel.objects.filter(
                type=i.id).all()
            for j in algorithmDetails:
                algorithmList.append({
                    "id": j.id,
                    "name": j.name,
                    "synopsis": j.synopsis[0:28],
                    "contents": j.contents,
                    "icon": j.icon
                })
            # 为了让前端展示方便,给前端添加一个_am来辨识
            algorithmDict[i.name + "_am" + str(i.id)] = algorithmList
    else:
        algorithmDetails = AlgorithmDetailsModel.objects.filter(
            Q(name__icontains=keywords)).all()
        if algorithmDetails:
            algorithmIDs = [(i.type.name, i.id, i.type_id)
                            for i in algorithmDetails]
            algorithmIDs = set(algorithmIDs)
            for i in algorithmIDs:
                algorithmList = []
                algorithm = algorithmDetails.get(id=i[1])
                data = {
                    "id": algorithm.id,
                    "name": algorithm.name,
                    "synopsis": algorithm.synopsis[0:28],
                    "contents": algorithm.contents,
                    "icon": algorithm.icon
                }
                if (str(i[0]) + "_am" + str(i[2])) in algorithmDict:
                    algorithmList = algorithmDict[str(i[0]) + "_am" +
                                                  str(i[2])]
                algorithmList.append(data)
                algorithmDict[str(i[0]) + "_am" + str(i[2])] = algorithmList
    result = restful.ok(data=algorithmDict)
    return result
Ejemplo n.º 13
0
def del_device(request):
    """
    清空网关物影子和相关协议
    :return:
    """
    gateMac = eval(request.POST["gateMac"])
    gateinfos = GateInfoModel.objects.filter(gateMac__in=gateMac)
    for i in gateinfos:
        if i.gateType == "GW_DNC":
            ProtocolDNC.objects.filter(gateMac__in=gateMac).delete()
        else:
            ProtocolPLC.objects.filter(gateMac__in=gateMac).delete()
        Variables.objects.filter(gateMac__in=gateMac).delete()
    DeviceModal.objects.filter(gateMac__in=gateMac).delete()
    return restful.ok()
Ejemplo n.º 14
0
def update_template(request):
    """
    更新协议模板
    :param request:
    :return:
    """
    templateID = request.POST['templateID']
    params = {
        "TemplateName": request.POST['name'],
        "proType": request.POST['type'],
        "TypeList": request.POST['protocol'],
        "operationFlag": request.POST['flag']
    }
    DeviceTemplates.objects.filter(id=templateID).update(**params)
    return restful.ok()
Ejemplo n.º 15
0
def get_plc_params(request):
    """
    获取plc采集项
    :return:
    """
    data = {}
    protocols = request.POST["protocols"].split(",")
    if protocols:
        for i in protocols:
            if i in plc_protocol:
                data[i] = plc_protocol[i]
        result = restful.ok(data=data)
    else:
        result = restful.params_error(message="param is null!")
    return result
Ejemplo n.º 16
0
def chage_passwd(request):
    """
    更改登录密码
    """
    new_passwd = request.POST["new_passwd"]
    telephone = request.POST["telephone"]
    user = UserModel.objects.filter(telephone=telephone)
    if user:
        user = user[0]
        user.set_password(new_passwd)
        user.save()
        result = restful.ok()
    else:
        result = restful.server_error(message="failed to change password")
    return result
Ejemplo n.º 17
0
def get_details(request):
    name = request.POST["name"]
    algorithmDetails = AlgorithmDetailsModel.objects.filter(name=name)[0]
    data = {
        "type": algorithmDetails.type.name,
        "name": name,
        "nameEn": algorithmDetails.nameEn,
        "content": algorithmDetails.synopsis,
        "inputFormat": algorithmDetails.inputFormat,
        "inputJson": algorithmDetails.inputJson,
        "outputJson": algorithmDetails.outputJson,
        "outputContent": algorithmDetails.outputContent,
        "api": algorithmDetails.api
    }
    return restful.ok(data=data)
Ejemplo n.º 18
0
def new_dnc_params(request):
    """
    新建采集项
    :return:
    """
    params = {
        "gateMac": request.POST["gateMac"],
        "type": request.POST["type"],
        "operationFlag": request.POST["operationFlag"],
        "operationUnit": request.POST["operationUnit"],
        "deviceIP": request.POST["deviceIP"],
        "operationValue": request.POST["operationValue"],
        "arrayNum": request.POST["arrayNum"],
        "deviceType_id": 1
    }
    ProtocolDNC.objects.create(**params)
    return restful.ok()
Ejemplo n.º 19
0
def chage_gatename(request):
    """
    更改网关名称
    :param request:
    :return:
    """
    gateMac = request.POST["gateMac"]
    gateName = request.POST["gateName"]
    gateinfo = GateInfoModel.objects.filter(gateMac=gateMac).all()[0]
    gateinfo1 = GateInfoModel.objects.filter(gateName=gateName)
    if gateinfo1:
        result = restful.params_error(message="this gateName is exist!")
    else:
        gateinfo.gateName = gateName
        gateinfo.save()
        result = restful.ok()
    return result
Ejemplo n.º 20
0
def bulk_export_to_excel(request):
    datas = ProtocolParamsDNC.objects.all()
    data_dict = [j.__dict__ for j in datas]
    sheets = [j for j in set(dt["ProType"] for dt in data_dict)]
    filename = request.POST["filename"]
    column = [u"Description", u"变量类型", u"单位", "Title", u"configValue"]
    colindex = [
        'Description', 'type', 'operationUnit', 'operationValue', 'configValue'
    ]
    # 查看文件格式
    file, Type = os.path.splitext(filename)
    if Type == ".xls":
        export_to_excel_xls(data_dict, filename, sheets, column, colindex)
    elif Type == ".xlsx":
        export_to_excel_xlsx(data_dict, filename, sheets, column, colindex)
    else:
        return restful.method_error("Excel文件名错误!")
    return restful.ok()
Ejemplo n.º 21
0
def get_templateList(request):
    """
    获取GW_DNC/GW_PLC模板列表
    :return:
    """
    proType = request.POST["gateType"]
    templates = DeviceTemplates.objects.filter(proType=proType,
                                               operationFlag=9)
    data = []
    for temp in templates:
        info = {
            "templateID": temp.id,
            "name": temp.TemplateName,
            "protocol": [pro for pro in temp.TypeList.split(",")],
            "createTime": temp.createTime.strftime("%Y-%m-%d %H:%M:%S"),
        }
        data.append(info)
    return restful.ok(data)
Ejemplo n.º 22
0
def send_identifying_code(request):
    """
    生成6位随机数并发送给用户
    """
    try:
        telephone = request.POST["telephone"]
        data = {
            "phoneNum": telephone,
            "rname": "i_plc.Page.register.register.getSMS_login"
        }
        res = requests.post(message_url, data=data).json()
        if res["success"]:
            result = restful.ok()
        else:
            result = restful.params_error(
                message="failure to send verification code")
    except Exception as e:
        result = restful.server_error(message=e)
    return result
Ejemplo n.º 23
0
def delete_device(request):
    """
    删除物影子
    :return:
    """
    deviceCode = request.POST["deviceCode"]
    gateMac = request.POST["gateMac"]
    gateType = request.POST["gateType"]
    try:
        Variables.objects.filter(machCode=deviceCode).delete()
        if gateType == "GW_DNC":
            ProtocolDNC.objects.filter(machCode=deviceCode).delete()
        else:
            ProtocolPLC.objects.filter(machCode=deviceCode).delete()
        # 将deviceMoal表中的数据清除
        DeviceModal.objects.filter(machCode=deviceCode).delete()
        result = restful.ok()
    except Exception as e:
        result = restful.params_error(message="删除网关失败!")
    return result
Ejemplo n.º 24
0
def get_params_infos(request):
    """
    获取协议模板采集项详情
    :return:
    """
    # 获取网关协议的类型(PLC/DNC)
    gateType = request.POST["gateType"]
    gateMac = request.POST["gateMac"]
    machCode = request.POST["deviceCode"]
    # 获取采集项的方式
    type = request.POST["type"]
    # 按照协议获取采集项详情
    # data = []
    # 通过模板
    if type == "template":
        # 获取模板名称
        name = request.POST["name"]
        machCode = None
        templateinfo = DeviceTemplates.objects.filter(TemplateName=name,
                                                      operationFlag=9)[0]
        typelist = templateinfo.TypeList.split(",")
        templateID = templateinfo.id
        data = get_params(gateMac, gateType, typelist, machCode, True,
                          templateID)
    # 通过协议type=protocol
    else:
        # 已设置的协议
        oldProtocols = eval(request.POST["oldProtocols"])
        # 需删除的协议
        deleteProtocols = eval(request.POST["deleteProtocols"])
        # 剔除已删掉的协议
        if deleteProtocols:
            for pro in deleteProtocols:
                oldProtocols.pop(oldProtocols.index(pro))
        old_data = get_params(gateMac, gateType, oldProtocols, machCode, True)

        # 新添加协议
        newProtocols = eval(request.POST["newProtocols"])
        new_data = get_params(gateMac, gateType, newProtocols, machCode)
        data = dict(old_data, **new_data)
    return restful.ok(data)
Ejemplo n.º 25
0
def get_deviceList(request):
    """
    获取物影子列表
    :return:
    """
    gateMac = request.POST["gateMac"]
    data = []
    # 查询物影子表
    infos = DeviceModal.objects.filter(gateMac=gateMac, operationFlag=9)
    for info in infos:
        basic = {
            "deviceName": info.modalName,
            "deviceCode": info.machCode,
            "deviceDesc": info.des,
            "protocols": [],
        }
        # 加入未对选择协议情况的异常处理
        if info.protocol:
            basic["protocols"] = [i for i in info.protocol.split(",")]
        data.append(basic)
    return restful.ok(data)
Ejemplo n.º 26
0
def Login(request):
    """
    用户登录
    """
    username = request.POST["username1"]
    password = request.POST["password1"]
    user = UserModel.objects.filter(
        Q(username=username) | Q(telephone=username)).all()
    if user:
        user = user[0]
        if user.check_password(password):
            if user.is_active:
                login(request, user)
                result = restful.ok(data={"token": user.token})
            else:
                result = restful.params_error(message="telephone")
        else:
            result = restful.params_error(message="password")
    else:
        result = restful.params_error(message="telephone")
    return result
Ejemplo n.º 27
0
def update_device(request):
    """
    保存多个物影子,这里只更新物影子的基础信息
    :return:
    """
    data = {}
    deviceInfo = eval(request.POST["deviceInfo"])
    for i in deviceInfo:
        data["gateMac"] = i["gateMac"]
        data["modalName"] = i["deviceName"]
        data["machCode"] = i["deviceCode"]
        data["des"] = i["deviceDesc"]
        device = DeviceModal.objects.filter(machCode=i["deviceCode"])
        if device:
            try:
                DeviceModal.objects.filter(machCode=i["deviceCode"]).update(
                    **data)
            except Exception as e:
                continue
        else:
            DeviceModal.objects.create(**data)
    return restful.ok()
Ejemplo n.º 28
0
def get_identifying_code(request):
    """
    根据手机号从redis获取验证码,前端表单值与redis存储的验证码进行比对
    """
    telephone = request.POST["telephone"]
    cache_code = request.POST["cache_code"]
    user = UserModel.objects.filter(phoneNum=telephone)
    data = {
        "phoneNum": telephone,
        "verificationCode": cache_code,
        "rname": "i_plc.Page.register.register.verifyCode"
    }
    res = requests.post(message_url, data=data).json()
    if not user:
        if res["success"]:
            result = restful.params_error(message="telephone")
        else:
            result = restful.params_error(message="both")
    else:
        if res["success"]:
            result = restful.ok()
        else:
            result = restful.params_error(message="cache_code")
    return result
Ejemplo n.º 29
0
def upgrade_gateway(request):
    """
    网关升级
    :param request:
    :return:
    """
    compID = request.POST["compID"]
    type = request.POST["type"]
    gateMac = eval(request.POST["gateMac"])
    # 记录正在升级的网关id
    idlist = [str(n) for n in eval(request.POST["idlist"])]
    gateMac_dict = dict(zip(idlist, gateMac))
    # 放置升级文件的路径
    upgrade_path = os.path.join(BASE_DIR, "media", "upgradefiles")
    # 请求中正在升级的网关id
    ing_upgrade = []
    for dir in os.listdir(upgrade_path):
        dir_list = [d for d in dir.split("-")]
        ing_upgrade.extend(list(filter(lambda m: m in dir_list, idlist)))
    for i in ing_upgrade:
        idlist.pop(idlist.index(i))
    # 待升级的网关
    to_upgrade = idlist
    msg1 = ""
    msg2 = ""
    if ing_upgrade:
        msg1 = "网关{}已在进行升级!请稍后操作!".format(",".join(ing_upgrade))
    if to_upgrade:
        msg2 = "网关{}开始进行升级!".format(",".join(to_upgrade))
        # 获取升级文件
        file = request.FILES.getlist("file", "")
        if file:
            filename = "-".join(to_upgrade)
            userpath = os.path.join(upgrade_path, filename)
            if not os.path.exists(userpath):
                # 创建升级的临时目录
                os.mkdir(userpath)
                # 将升级文件放置到指定路径
                path = os.path.join(userpath, file[0].name)
                with open(path, 'wb+') as upgrade:
                    for chunk in file[0].chunks():
                        upgrade.write(chunk)

                # 按网关升级
                for t in to_upgrade:
                    to_upgrade_param = {
                        "url":
                        "{0}/media/upgradefiles/{1}/{2}".format(
                            request._current_scheme_host, filename,
                            file[0].name),
                        "time":
                        datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],
                        "md5code":
                        getHash(path),
                    }
                    send_mqtt(compID, gateMac_dict[t], "Upgrade",
                              to_upgrade_param)

                # 删除临时目录
                shutil.rmtree(userpath)
        else:
            return restful.method_error(message="未找到升级文件!")
    return restful.ok(msg1 + msg2)
Ejemplo n.º 30
0
def dispatch(request):
    """
    网关下发
    :return:
    """
    gateMacs = eval(request.POST["gateMac"])
    try:
        for gateMac in gateMacs:
            # 加入公司ID
            gateinfo = GateInfoModel.objects.filter(gateMac=gateMac)[0]
            compID = gateinfo.compID
            gateType = gateinfo.gateType
            # 新建配置文件路径
            gateMacFile = gateMac.replace(":", "-")
            if not os.path.exists(os.path.join(tempfiles, gateMacFile)):
                os.mkdir(os.path.join(tempfiles, gateMacFile))
            # DNC配置采集项下发,DNC配置采集项涉及到改变网关配置,分成配置文件config.ini和采集项文件ManuData.xml,打包成rar包下发
            if gateType == "GW_DNC":
                infos = ProtocolDNC.objects.filter(gateMac=gateMac,
                                                   operationFlag=9,
                                                   upload=9)
                # 获取网关下的协议类型列表
                prolist = list(set(info.deviceType.TypeList for info in infos))
                if prolist:
                    # 拷贝模板文件到tempfiles
                    temp_ini = (os.path.join(tempfiles, gateMacFile,
                                             "Config.ini"))
                    if os.path.exists(temp_ini):
                        os.remove(temp_ini)
                    shutil.copyfile(os.path.join(template_path, "Config.ini"),
                                    temp_ini)

                    # 修改MQTT协议参数
                    INI = rwini(temp_ini)
                    INI.mod_opt("MQTT", "MqttServerIp", config.EMQ_IP)
                    INI.mod_opt("MQTT", "MqttServerPort", str(config.EMQ_PORT))
                    INI.mod_opt("MQTT", "MqttUser", config.EMQ_USERNAME)
                    INI.mod_opt("MQTT", "MqttPassword", config.EMQ_PASSWORD)
                    INI.mod_opt("FACTORY", "factoryID", str(compID).zfill(4))

                    temp_xml = (os.path.join(tempfiles, gateMacFile,
                                             "ManuData.xml"))

                    # 根据协议获取采集项信息
                    xml_data = set_config(prolist, infos, temp_ini, temp_xml)
                    # 编写下发的xml
                    new_temp_xml(temp_xml, xml_data)

                    # 将配置文件打包成rar文件
                    unpack(tempfiles, gateMacFile, ['.ini', '.xml'])

                    # 发送消息到mqtt
                    dnc_param = {
                        "url":
                        request._current_scheme_host +
                        "/media/tempfiles/{0}{1}".format(filename, ".rar"),
                        "time":
                        datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],
                    }
                    send_mqtt(compID, gateMac, "ConfigRar", dnc_param)

            # PLC配置采集项下发,PLC是将采集项分成指令文件instruct.db和解析文件parse.db,打包成tar包下发
            else:
                infos = ProtocolPLC.objects.filter(gateMac=gateMac,
                                                   operationFlag=9)
                prolist = list(set(info.deviceType for info in infos))
                if prolist:
                    # 指令文件
                    instruct_db = (os.path.join(tempfiles, gateMacFile,
                                                "instruct.db"))
                    # 解析文件
                    parse_db = (os.path.join(tempfiles, gateMacFile,
                                             "parse.db"))
                    # 指令文件和解析文件如果存在,先删除,确保没有脏数据
                    if os.path.exists(instruct_db):
                        os.remove(instruct_db)
                    if os.path.exists(parse_db):
                        os.remove(parse_db)
                    DB_INSTRUCT = rwSqlliteDB(instruct_db)
                    DB_PARSE = rwSqlliteDB(parse_db)
                    # 创建db文件,并且新建协议表结构
                    save_db_file(gateMac, prolist, DB_INSTRUCT, DB_PARSE)

                    # 生成md5文件
                    instruct_md5 = getHash(instruct_db)
                    parse_md5 = getHash(parse_db)
                    md5_file = (os.path.join(tempfiles, gateMacFile, "md5"))
                    if os.path.exists(md5_file):
                        os.remove(md5_file)
                    with open(md5_file, 'w') as f:
                        f.write(instruct_md5 + "  instruct.db\n" + parse_md5 +
                                "  parse.db")

                    # 将配置文件打包成rar文件
                    unpack(tempfiles, gateMacFile, ['.db', ''], suffix=".tar")

                    # 发送消息到mqtt
                    plc_param = {
                        "url":
                        request._current_scheme_host +
                        "/media/tempfiles/{0}{1}".format(filename, ".tar"),
                        "time":
                        datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],
                        "version":
                        "",
                    }
                    send_mqtt(compID, gateMac, "Scripts", plc_param)

        result = restful.ok()
    except Exception as e:
        result = restful.method_error(message="下发失败")
    return result