欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

使用python作為TCP服務端 物聯網應用

系統 2277 0

使用python作為TCP服務端 物聯網應用

說明

  • 因公司自主研發的電噠噠智慧能量柜需要通過TCP與服務器進行通訊,機柜定時傳輸硬件設備信息,用戶掃碼后通過服務端下發“租/還”命令,控制機柜開關鎖等。
  • 服務端通過pymysql直連數據庫操作
  • 僅做為項目記錄,供參考勿噴

附上完整代碼

            
              import socketserver
import _thread
import time
import logging
from threading import Thread
from base import base
from helper import helper
from logger import Logger
from mysql import DB

class Myserver(socketserver.BaseRequestHandler):
    tcp_data = ""
    #主程序
    def handle(self):
        conn = self.request
        conn.sendall(bytes("connection success",encoding="ANSI"))
        # Logger('runtime.log', level='info').logger.info('設備已連接>>>' + str(conn))
        while True:
            try:
                ret_bytes = conn.recv(1024 * 2)
                ret_str = str(ret_bytes, encoding="ANSI")
                tcp_data = ret_str
                # 斷開連接命令
                if ret_str == "q":
                    # Logger('runtime.log', level='info').logger.info('設備已斷開>>>' + str(conn))
                    conn.sendall(bytes("connection dropped", encoding="utf-8"))
                    break
                    //通訊建立后創建線程
                _thread.start_new_thread(Myserver.task, (self,conn,ret_str))
            except OSError as e:
                # Logger('error.log', level='info').logger.info(str(e))
                break
            time.sleep(0.1)

    #線程
    def task(self,conn,data):
  		if data:
                try:
                    while True:
						//這里可以寫自己的業務邏輯
                        time.sleep(1000)
                except IndexError as e:
                    Logger('error.log', level='info').logger.info(e)

if __name__ == "__main__":
    print('*' * 50)
    print('溫州引力聚合信息科技有限公司')
    print('DIDADA Socket Service v1.0')
    print('2019年1月16日')
    print('*' * 50)
    logging.basicConfig(format='【%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s:%(message)s】',level=logging.INFO)
    ip = str(base.GetConfig('service','ip'))
    port = int(base.GetConfig('service','port'))
    base.KillPort(port)
    logging.info('服務開啟>>>地址>>>'+ ip +'>>>端口號>>>'+ str(port))
    server = socketserver.ThreadingTCPServer((ip,port),Myserver)
    server.serve_forever()


            
          

Logger類

            
              import logging
from logging import handlers
import os
import ctypes

FOREGROUND_WHITE = 0x0007
FOREGROUND_BLUE = 0x01  # text color contains blue.
FOREGROUND_GREEN = 0x02  # text color contains green.
FOREGROUND_RED = 0x04  # text color contains red.
FOREGROUND_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN

STD_OUTPUT_HANDLE= -11
std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
def set_color(color, handle=std_out_handle):
    bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
    return bool

class Logger(object):
    level_relations = {
        'debug':logging.DEBUG,
        'info':logging.INFO,
        'warning':logging.WARNING,
        'error':logging.ERROR,
        'crit':logging.CRITICAL
    }#日志級別關系映射

    def __init__(self,filename,level='info',when='D',backCount=3,fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
        set_color(FOREGROUND_GREEN)
        self.logger = logging.getLogger(filename)
        format_str = logging.Formatter(fmt)#設置日志格式
        self.logger.setLevel(self.level_relations.get(level))#設置日志級別
        sh = logging.StreamHandler()#往屏幕上輸出
        sh.setFormatter(format_str) #設置屏幕上顯示的格式
        th = handlers.TimedRotatingFileHandler(filename=filename,when=when,backupCount=backCount,encoding='utf-8')#往文件里寫入#指定間隔時間自動生成文件的處理器
        #實例化TimedRotatingFileHandler
        #interval是時間間隔,backupCount是備份文件的個數,如果超過這個個數,就會自動刪除,when是間隔的時間單位,單位有以下幾種:
        # S 秒
        # M 分
        # H 小時、
        # D 天、
        # W 每星期(interval==0時代表星期一)
        # midnight 每天凌晨
        th.setFormatter(format_str)#設置文件里寫入的格式
        self.logger.addHandler(sh) #把對象加到logger里
        self.logger.addHandler(th)


            
          

DB類

            
              import pymysql.cursors


class DB(object):
    # 連接數據庫
    def __init__(self, host='localhost', port=3306, user='root', passwd='', db='mysql', charset='utf8'):
        self.host = host
        self.port = port
        self.user = user
        self.passwd = passwd
        self.db = db
        self.charset = charset
        self.connect = pymysql.Connect(
            host=self.host,
            port=self.port,
            user=self.user,
            passwd=self.passwd,
            db=self.db,
            charset=self.charset
        )
        # 使用cursor()方法獲取操作游標
        self.cursor = self.connect.cursor()

    def select(self, sql):
        # SQL 查詢語句
        try:
            # 執行SQL語句
            self.cursor.execute(sql)
            # 獲取所有記錄列表
            results = self.cursor.fetchall()
            return results
        except Exception as e:
            return e
        # 關閉數據庫連接
        self.connect.close()


            
          

Base類

            
              
import logging
import configparser
import os
import re
import requests
import json
class base:
    def __init__(self):
        pass

    # 端口占用清理
    def KillPort(port):
        # # 查找端口的pid
        find_port= 'netstat -aon | findstr %s' % port
        result = os.popen(find_port)
        text = result.read()
        logging.info('清理占用端口>>>' + find_port)
        logging.info('清理占用端口>>>' + text)
        # logging.info(text [9:23])
        if text[9:23] =='127.0.0.1:%s' % port:
            pid = text[70:76]
            logging.info('占用端口的pid:' + pid)
            find_kill= 'taskkill -f -pid %s' %pid
            result = os.popen(find_kill)
            logging.info(result.read())
            pass

    #獲取配置文件信息
    def GetConfig(section,key,path='config.ini'):
        config = configparser.ConfigParser()
        config.read(path)  # 配置文件的路徑
        v = config.get(section,key)
        return v

    #Post請求
    def http_post(url,parameter={}):
        return requests.post(url, params=parameter)

    #判斷字符串是否包含另外一個字符串
    def find_string(s, t):
        return t in s


            
          

附上效果圖
使用python作為TCP服務端 物聯網應用_第1張圖片
項目結構
使用python作為TCP服務端 物聯網應用_第2張圖片


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩欧美在线一区二区三区 | 免费性生活视频 | 丁香综合五月 | 国产欧美日韩在线播放 | 99久久精品免费看国产 | 一级毛片真人免费观看 | 国产精品天天干 | 日韩av在线中文字幕 | 中文字幕亚洲第一 | 毛片1毛片2毛片3毛片4 | 夜夜操免费视频 | 青青青青久久久久国产的 | 色在线视频观看 | 最新亚洲国产有精品 | 精品在线一区二区 | 久操视屏 | 高清一区二区 | 国产精品久久久久免费视频 | 国产午夜精品一区二区三区 | wwwwxxxx免费| 欧美成人一级 | 欧美精品一区二区免费 | 日韩城人网站 | 天天操天天插天天干 | 青娱在线 | 国产激情一区二区三区 | 日本视频在线免费 | 欧美午夜精品久久久久免费视 | 久久亚洲这里只有精品18 | 天天噜天天干 | 亚洲视频 中文字幕 | 欧美日韩精品国产一区二区 | 久草色香蕉 | 极品白嫩无套视频在线播放张悠雨 | 欧美国产高清欧美 | 亚洲精品乱码久久久久久按摩观 | 亚洲网视频 | 久久99精品久久久久久 | 婷婷色婷婷 | 国产美女亚洲精品久久久综合 | 日韩 欧美 国产 师生 制服 |