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()
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()
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
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()
def del_gateway(request): """ 删除网关 :param request: :return: """ return restful.ok()
def reboot_gateway(request): """ 网关重启 :param request: :return: """ return restful.ok()
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)
def async_history(request): """ 同步历史数据 :param request: :return: """ return restful.ok()
def get_dnc_params(request): """ 根据DNC协议返回采集项 :return: """ type = request.POST["type"] infos = ProtocolDNC.objects.filter(type_in=type).all() return restful.ok()
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()
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()
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
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()
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()
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
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
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)
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()
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
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()
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)
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
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
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)
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)
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
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()
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
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)
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