17、监测数据采集物联网应用开发步骤(12.2)

news2025/1/12 4:02:18

阶段性源码将于本章节末尾给出下载

  1. 监测数据采集物联网应用开发步骤(12.1)

新建web数据接口http-request解析类com.zxy.tcp.Request.py

#! python3
# -*- coding: utf-8 -
'''
Created on 2017年05月10日
@author: zxyong 13738196011
'''

import urllib.parse,json
from com.zxy.common import Com_Para
from com.zxy.common.Com_Fun import Com_Fun
from com.zxy.model.Return_Value import Return_Value               
from com.zxy.z_debug import z_debug

#监测数据采集物联网应用--web数据接口http-request解析
class Request(z_debug):

    attStrIP = ""
    attServSocket = None
    attUri = ""
    attPost_str = []
    attRv = Return_Value()
    attUploadFile = ""
    attConnection = ""
    
    def __init__(self):
        pass
    
    def parseUri(self,inputValue):
        temStrResult = ""
        if inputValue.find("/favicon.ico") != -1:
            temStrResult += "favicon.ico"
            return temStrResult
        elif inputValue.find(Com_Para.Inf_Name) != -1:
            for temStrITem in inputValue.split("\r\n"):
                if temStrITem.find(Com_Para.Inf_Name) != -1:
                    if (temStrITem.split(" ")[1]).find("?") != -1:
                        temStrResult += urllib.parse.unquote(temStrITem.split(" ")[1].split("?")[1])
                    else:
                        temStrResult += urllib.parse.unquote(temStrITem.split(" ")[1])
                    break
        elif self.FindWebName(inputValue):
            for temStrITem in inputValue.split("\r\n"):
                if self.FindWebName(temStrITem):
                    temStrT = temStrITem.split(" ")[1]
                    if temStrT.find("?") == -1:
                        temStrResult = urllib.parse.unquote(temStrITem.split(" ")[1],Com_Para.U_CODE)
                    else:
                        temStrResult = urllib.parse.unquote(temStrT[0:temStrT.find("?")],Com_Para.U_CODE)
                    break
        elif len(inputValue) > 10:
            temStrResult = inputValue
        return temStrResult
    
    def FindWebName(self,inputValue):
        for temAttF in Com_Para.web_Name:
            if inputValue.find(temAttF) != -1:
                return True
        return False
    
    def PostData(self,inputValue):
        temStrResult = ["",""]
        if self.FindWebName(inputValue):
            temStrTem = inputValue.split("\r\n")
            if len(temStrTem[0].split(" ")) > 1 and (temStrTem[0].split(" ")[0] == "POST" or temStrTem[0].split(" ")[0] == "OPTIONS") :
                temContent_Length = -1
                temStrEnd = inputValue[len(inputValue) - 4:len(inputValue)]
                if temStrEnd != "\r\n\r\n":
                    temStrResult[1] = temStrTem[len(temStrTem) - 1]
                for temStrItem in temStrTem:
                    temStrItem = urllib.parse.unquote(temStrItem,Com_Para.U_CODE)
                    if temStrItem.find("post_param: ") == 0:
                        temStrResult[1] = temStrItem[temStrItem.find("post_param: ") + 12:len(temStrItem)]
                        temStrResult[0] = "Content-Length:"
                        temStrResult[0] += str(len(temStrResult[1]))
                        break
                    if temStrItem.find("Content-Length:") == 0:
                        temContent_Length = int(temStrItem.split(":")[1].strip())
                        temStrResult[0] = "Content-Length:"
                        temStrResult[0] += str(temContent_Length)
                    if temContent_Length > 0 and temContent_Length == len(temStrResult[1].encode(Com_Para.U_CODE)):
                        break
        return temStrResult
    
    def GetHttpHeadByte(self,inputValue):
        temResult = {}
        for temStrItem in inputValue.split(b"\r\n"):
            if temStrItem.find(b"POST") == 0 or temStrItem.find(b"GET") == 0:                
                strKey = temStrItem.split(b" ")[0]          
                strValue = temStrItem.split(b" ")[1]
            else:
                strKey = temStrItem[0:temStrItem.find(b":")]            
                strValue = temStrItem[len(strKey)+1:len(temStrItem)]
            if Com_Fun.GetHashTableNone(temResult, strKey) == None:
                Com_Fun.SetHashTable(temResult, strKey, strValue)
        return temResult
    
    def GetHttpHead(self,inputValue):
        temResult = {}
        for temStrITem in inputValue.split("\r\n"):
            if temStrITem.find("POST") == 0 or temStrITem.find("GET") == 0:                
                strKey = temStrITem.split(" ")[0]          
                strValue = temStrITem.split(" ")[1]
            else:
                strKey = temStrITem[0:temStrITem.find(":")]            
                strValue = temStrITem[len(strKey)+1:len(temStrITem)]
            if Com_Fun.GetHashTableNone(temResult, strKey) == None:
                Com_Fun.SetHashTable(temResult, strKey, strValue)
        return temResult
    
    def GetHttpHeadArray(self,inputValue):
        inputValue = inputValue[inputValue.find(b"\r\n\r\n")+4:len(inputValue)]
        temResult = []
        for temStrITem in inputValue.split(b"\n"):
            temResult.append(temStrITem)
        return temResult
    
    #从套接字中读取字符信息
    def parse(self):        
        temInit_msg = b'' # 初始化流
        temFile = None
        temValue = ""
        try:        
            temInit_msg = self.attServSocket.recv(20480) #接受数据  20480
            temStrCheck = []
            #特殊符号处理
            try:
                temValue = temInit_msg.decode(Com_Para.U_CODE)
                self.attUri = self.parseUri(temValue)
                temStrCheck = self.PostData(temValue)
            except Exception as et:
                if temInit_msg.find(b"\r\n\r\n") == -1:
                    return
                else:
                    temValue = temInit_msg[0:temInit_msg.find(b"\r\n\r\n")].decode(Com_Para.U_CODE)                    
                    self.attUri = self.parseUri(temValue)
                    temStrCheck = self.PostData(temValue)                    
            inputHtHead = self.GetHttpHeadByte(temInit_msg)
            self.attConnection = Com_Fun.GetHashTable(inputHtHead,b"Connection").decode(Com_Para.U_CODE)            
            #数据接口
            if temStrCheck[0] != "" and int(temStrCheck[0].split(":")[1].strip()) == len(temStrCheck[1].encode(Com_Para.U_CODE)):
                self.attPost_str = urllib.parse.unquote(temStrCheck[1].replace("+","%20"),Com_Para.U_CODE).split("&")
                if temStrCheck[1] != "":
                    self.attUri += "&" + urllib.parse.unquote(temStrCheck[1].replace("+","%20"),Com_Para.U_CODE)                
            #附件上传
            elif temStrCheck[0] != "" and int(temStrCheck[0].split(":")[1].strip()) > 0:                
                if self.attUri.find("param_name=upLoadFile") != -1:
                    bSaveFile = False
                    #附件大小
                    iAllLength = int(temStrCheck[0].split(":")[1].strip())
                    if Com_Fun.GetHashTable(inputHtHead,b"Content-Type").find(b"boundary=") == -1:
                        boundary = Com_Fun.Get_New_GUID().encode(Com_Para.U_CODE)
                    else:
                        boundary = Com_Fun.GetHashTable(inputHtHead,b"Content-Type").split(b";")[1].split(b"=")[1]
                    oldFileName = []
                    newFileName = []
                    temFile_dataAry = []
                    bFlagF = -1
                    while iAllLength > 0:
                        bLastCR = False
                        if Com_Fun.GetHashTableNone(inputHtHead, b"Content-Disposition") != None and len(temFile_dataAry) == 0:
                            temFile_dataAry = self.GetHttpHeadArray(temInit_msg)
                            if temInit_msg[len(temInit_msg)-1:len(temInit_msg)] == b'\n':
                                bLastCR = True
                        else:
                            temInit_msg = self.attServSocket.recv(iAllLength)
                            temFile_dataAry = temInit_msg.split(b'\n')
                            if temInit_msg[len(temInit_msg)-1:len(temInit_msg)] == b'\n':
                                bLastCR = True                                
                        iIndex = 0
                        for temItem in temFile_dataAry:
                            #判断是否正确附件码
                            if temItem.find(b"--"+boundary) == 0 and temFile is not None:
                                bSaveFile = True
                                temFile.close()
                                temFile = None
                                bFlagF = -1
                            #判断是否附件模块
                            if temItem.find(b"Content-Disposition: form-data") == 0:
                                cdAry = temItem.split(b";")
                                if len(cdAry) == 3 and cdAry[2].find(b"filename=") == 1:
                                    bFlagF = 0                     
                                else:
                                    bFlagF = -1                            
                            if bFlagF == 0 and temItem.find(b"Content-Disposition:") == 0:
                                oldN = temItem.split(b":")[1].split(b";")[2].split(b"=")[1].replace(b"\r",b"").replace(b"\n",b"").replace(b"\"",b"")
                                if oldN != b"" and oldN.find(b".") != -1:
                                    if Com_Para.attUpFile.find((oldN.split(b".")[1].lower()+b"|").decode(Com_Para.U_CODE)) == -1:
                                        oldFileName.append("不符合上传文件格式,上传失败:"+oldN.decode(Com_Para.U_CODE))
                                        newFileName.append("不符合上传文件格式,上传失败:"+oldN.decode(Com_Para.U_CODE))
                                    else:
                                        oldFileName.append(oldN.decode(Com_Para.U_CODE))                                
                                        if oldN.find(b".") == -1:
                                            newFileName.append(Com_Fun.Get_New_GUID().replace("-", "")+".no")                                
                                        else:
                                            newFileName.append(Com_Fun.Get_New_GUID().replace("-", "")+"."+oldN.decode(Com_Para.U_CODE).split(".")[1])
                                        strF = Com_Para.ApplicationPath+Com_Para.zxyPath+"web"+Com_Para.zxyPath+"file"+Com_Para.zxyPath+newFileName[len(newFileName) - 1]
                                        temFile = open(strF, "wb")
                                        bFlagF = 1
                            elif bFlagF == 1 and temItem == b"\r":
                                bFlagF = 2
                            elif bFlagF == 2 and temFile is not None and iAllLength > 0:
                                if temItem != b'' and (b"--"+boundary).find(temItem) == 0:
                                    bSaveFile = True
                                    temFile.close()
                                    temFile = None
                                    bFlagF = -1
                                    #break
                                else:
                                    temFile.write(temItem)
                                    #加上\n间隔符
                                    if iIndex != len(temFile_dataAry) - 1 or bLastCR == True:
                                        temFile.write(b'\n')
                            iIndex = iIndex + 1  
                            iAllLength = iAllLength - len(temItem+b'\n')                  
                    if temFile is not None:
                        bSaveFile = True
                        temFile.close()
                        temFile = None               
                    if bSaveFile == False:                        
                        self.attRv.s_result = 0
                        self.attRv.err_desc = "文件上传失败,请刷新网络或重新上传"
                        self.attUploadFile = "{\"A01_UpLoadFile\":[{\""+Com_Fun.GetLowUpp("s_result")+"\":\"0\",\""+Com_Fun.GetLowUpp("error_desc")+"\":\"上传失败,请刷新网络或重新上传\"}]}"
                        return
                    jso = {}
                    jsary = []
                    iIndex = 0
                    for temItem in oldFileName:
                        temjso = {}
                        temjso[Com_Fun.GetLowUpp("oldFileName")] = temItem
                        temjso[Com_Fun.GetLowUpp("newFileName")] = newFileName[iIndex]
                        jsary.append(temjso) 
                        
                        iIndex = iIndex + 1    
                    jso["A01_UpLoadFile"] = jsary                        
                    self.attUploadFile = json.dumps(jso,ensure_ascii=False)       
                else:                
                    temStrCheck[1] = ""                
                    temInit_msg = b''
                    temInit_msg = self.attServSocket.recv(20480)
                    temStrCheck[1] = urllib.parse.unquote(temInit_msg.decode(Com_Para.U_CODE),Com_Para.U_CODE)   
                    self.attPost_str = temStrCheck[1].split("&")
                    if temStrCheck[1] != "":
                        self.attUri += "&" + temStrCheck[1]
        except Exception as e:
            self.attRv.s_result = 0
            self.attRv.err_desc = repr(e)
            self.attUploadFile = "{\"A01_UpLoadFile\":[{\""+Com_Fun.GetLowUpp("s_result")+"\":\"0\",\""+Com_Fun.GetLowUpp("error_desc")+"\":\"上传失败,请刷新网络或重新上传\""+ repr(e)+"}]}"
        finally:
            if temFile is not None:
                temFile.close()
                temFile = None
            Pass

com.zxy.main.Init_Page.py中添加如下内容

from com.zxy.tcp.ServerThreadHttp import ServerThreadHttp


        
    @staticmethod
    def Start_Http():        
        # 是否启用http协议接口
        if Com_Para.bThread == True:
            # TCP服务
            temSthttp = ServerThreadHttp("", "", Com_Para.port)
            t1 = threading.Thread(target=temSthttp.run, name="ServerHttpThread")
            t1.start()

web接口服务运行案例MonitorDataCmd.py主文件中编写:

添加如下内容:

        #web数据接口服务
        Init_Page.Start_Http()

程序运行之后在浏览器敲入如下内容访问数据接口:

http://localhost:9000/CenterData?param_name=A01_AAA111&sub_code=&sub_usercode=

http://localhost:9000/CenterData?param_name=A01_AAA222&sub_code=&sub_usercode=

运行结果见图:

后台数据获取调式见:

com.zxy.business.Ope_DB_Cent.py

  def Cal_Data(self, inputSub_code, inputParam_name, inputAryParamValue, inputStrIP,inputSession_id,inputHtParam):
  1. 监测数据采集物联网应用开发步骤(12.3)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1116934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试 - 根据某条件聚类最少交换次数 - 滑动窗口(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…

解决ubuntu系统运行pyside2或6的问题

解决ubuntu系统运行pyside2或6时出现的问题 当运行程序时,出现“qt.qpa.plugin: Could not load the Qt platform plugin “xcb” in “/usr/local/lib/python3.6/dist-packages/cv2/qt/plugins” even though it was found. This application failed to start bec…

全志R128软件配置——RTOS 软件包配置

RTOS 软件包配置 本文将介绍 RTOS 软件包、地址,内核配置等。 Kconfig 简介 有过 linux 内核开发经验的人,对 menuconfig 不会陌生。对于各类内核,只要是支持 menuconfig 配置界面,都是使用 Kconfig。 换言之: me…

c++_learning-c++标准库STL和boost库

c的标准库 STL标准库&#xff1a;#include<iostream>&#xff1a;#include<iomanip>&#xff1a;#include<cstdlib>&#xff1a;#include<cmath>&#xff1a;#include<tuple>&#xff1a;利用可变参数模板&#xff0c;借助“递归继承”或“递归组…

AD画板时,元器件跑到屏幕左下角,看不见啦,咋办?

解决办法&#xff1a; EDIT---------------->SELECT---------------->ALL 然后鼠标选中&#xff0c;整体移动----》OK

手机主流存储器件的分析与发展

一、前言 存储器件作为系统中存储数据的物理单元&#xff0c;承担着非常重要的责任&#xff0c;它的运行状态时刻影响着整个系统的运行效率&#xff0c;存储容量和数据安全。所以整个产业针对存储器件的寿命&#xff0c;稳定性&#xff0c;容量&#xff0c;性能以及价格等方面进…

紫光展锐携中国联通完成RedCap芯片V517孵化测试

近日&#xff0c;紫光展锐携手中国联通5G物联网OPENLAB开放实验室&#xff08;简称“OPENLAB实验室”&#xff09;共同完成RedCap芯片V517创新孵化&#xff0c;并实现在联通5G全频段3.5GHz、2.1GHz、900MHz下的端到端业务验证测试。 V517是一款基于紫光展锐5G成熟平台设计与研发…

电脑技巧:推荐八个实用的在线学习网站

目录 1、程序员英语词汇宝典 2、国图公开课 4、Maspeak 5、Visuwords 6、Learning Music 7、考试酷 8、好知网 今天给大家分享8个非常使用的学习网站&#xff0c;值得收藏&#xff01; 1、程序员英语词汇宝典 官网&#xff1a;https://learn-english.dev/ 程序员英语词…

【论文解读】Prefix-Tuning: Optimizing Continuous Prompts for Generation

一.介绍 1.1 前置知识 1.1.1 in-context learning At the limit, GPT-3 (Brown et al, 2020) can be deployed using in-context learning, which is a form of prompting, without modifying any LM parameters. "部署" 指的是将 GPT-3 模型用于实际应用或特定任务…

项目添加以vue为后缀名的vue文件,怎么解析打包

我们都知道&#xff0c;将css文件打包起来&#xff0c;需要加载css-loader和style-loader&#xff0c;那么vue文件打包也需要 下载插件&#xff1a; npm install vue-loader vue-template-compiler --save -dev 下载过程&#xff1a; 下载成功样子&#xff1a; 下载完之后&am…

学信息系统项目管理师第4版系列33_信息化发展

1. 企业信息化发展战略要点 1.1. 【高22下选12】 1.2. 以信息化带动工业化 1.3. 信息化与企业业务全过程的融合、渗透 1.4. 信息产业发展与企业信息化良性互动 1.5. 充分发挥政府的引导作用 1.6. 高度重视信息安全 1.7. 企业信息化改组改造和形成现代企业制度有机结合 …

Leetcode 剑指 Offer II 049. 求根节点到叶节点数字之和

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个二叉树的根节点 root &#xff0c;树中每个节点都存放有…

基于孔雀优化的BP神经网络(分类应用) - 附代码

基于孔雀优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于孔雀优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.孔雀优化BP神经网络3.1 BP神经网络参数设置3.2 孔雀算法应用 4.测试结果&#xff1a;5.M…

基于SpringBoot的招生管理系统

基于SpringBoot的招生管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录界面 管理员界面 用户界面 摘要 基于SpringBoot的招生管理系统是一款现…

基于战争策略优化的BP神经网络(分类应用) - 附代码

基于战争策略优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于战争策略优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.战争策略优化BP神经网络3.1 BP神经网络参数设置3.2 战争策略算法应用 4.测试结果…

mysqld: File ‘./binlog.index‘ not found (OS errno 13 - Permission denied) 问题解决

问题背景 Centos7 安装Mysql 8后启动时遇到的问题&#xff0c;看了好几个博客方案无效&#xff0c;搞了半小时才找到正解&#xff0c;在此次进行记录。 在此假设你已经修改了对应目录的权限&#xff0c;比如配置的mysql data目录初始化后已经执行了chown -R mysql:mysql /XXX/…

bug记录——设置了feign的fallback,但是没有生效

问题描述 feign的代码 package com.tianju.order.feign;import com.tianju.order.feign.fallback.StorageFallback; import com.tinaju.common.dto.GoodsDto; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMap…

虹科分享 | 超低温冷冻箱温度分布验证的9步指南

虹科分享 | 超低温冷冻箱温度分布验证的9步指南 背景&#xff1a; 在生物制药行业&#xff0c;温度分布验证是确保对时间和温度敏感的产品在保证质量和安全的条件下储存和运输的关键步骤。这对于超低温冷冻箱尤为重要&#xff0c;因为超低温冷冻箱用于在低于 -60℃ 的温度下储…

[人工智能-综述-13]:第九届全球软件大会(南京)有感 -2-新型的云服务:AI即服务,传统的云服务:IaaS,PaaS,SaaS, DaaS

目录 一、传统的云服务 1.1 概述 1.2 从大数据云服务走向AI云服务 二、AI即服务&#xff1a;新型的云服务 1.1 概述 1.2 基于AI服务的应用程序 1.3 基于大语言模型的AI应用程序 1.4 AI 编程云服务平台 1.5 大模型在AI应用程序编程平台中的应用的主要思想 一、传统的…

LC-2316. 统计无向图中无法互相到达点对数(DFS、并查集)

2316. 统计无向图中无法互相到达点对数 中等 给你一个整数 n &#xff0c;表示一张 无向图 中有 n 个节点&#xff0c;编号为 0 到 n - 1 。同时给你一个二维整数数组 edges &#xff0c;其中 edges[i] [ai, bi] 表示节点 ai 和 bi 之间有一条 无向 边。 请你返回 无法互相…