亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

使用python作為TCP服務(wù)端 物聯(lián)網(wǎng)應(yīng)用

系統(tǒng) 2195 0

使用python作為TCP服務(wù)端 物聯(lián)網(wǎng)應(yīng)用

說明

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

附上完整代碼

            
              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('設(shè)備已連接>>>' + 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('設(shè)備已斷開>>>' + str(conn))
                    conn.sendall(bytes("connection dropped", encoding="utf-8"))
                    break
                    //通訊建立后創(chuàng)建線程
                _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:
						//這里可以寫自己的業(yè)務(wù)邏輯
                        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('服務(wù)開啟>>>地址>>>'+ ip +'>>>端口號(hào)>>>'+ 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
    }#日志級(jí)別關(guān)系映射

    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)#設(shè)置日志格式
        self.logger.setLevel(self.level_relations.get(level))#設(shè)置日志級(jí)別
        sh = logging.StreamHandler()#往屏幕上輸出
        sh.setFormatter(format_str) #設(shè)置屏幕上顯示的格式
        th = handlers.TimedRotatingFileHandler(filename=filename,when=when,backupCount=backCount,encoding='utf-8')#往文件里寫入#指定間隔時(shí)間自動(dòng)生成文件的處理器
        #實(shí)例化TimedRotatingFileHandler
        #interval是時(shí)間間隔,backupCount是備份文件的個(gè)數(shù),如果超過這個(gè)個(gè)數(shù),就會(huì)自動(dòng)刪除,when是間隔的時(shí)間單位,單位有以下幾種:
        # S 秒
        # M 分
        # H 小時(shí)、
        # D 天、
        # W 每星期(interval==0時(shí)代表星期一)
        # midnight 每天凌晨
        th.setFormatter(format_str)#設(shè)置文件里寫入的格式
        self.logger.addHandler(sh) #把對(duì)象加到logger里
        self.logger.addHandler(th)


            
          

DB類

            
              import pymysql.cursors


class DB(object):
    # 連接數(shù)據(jù)庫(kù)
    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()方法獲取操作游標(biāo)
        self.cursor = self.connect.cursor()

    def select(self, sql):
        # SQL 查詢語(yǔ)句
        try:
            # 執(zhí)行SQL語(yǔ)句
            self.cursor.execute(sql)
            # 獲取所有記錄列表
            results = self.cursor.fetchall()
            return results
        except Exception as e:
            return e
        # 關(guān)閉數(shù)據(jù)庫(kù)連接
        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請(qǐng)求
    def http_post(url,parameter={}):
        return requests.post(url, params=parameter)

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


            
          

附上效果圖
使用python作為TCP服務(wù)端 物聯(lián)網(wǎng)應(yīng)用_第1張圖片
項(xiàng)目結(jié)構(gòu)
使用python作為TCP服務(wù)端 物聯(lián)網(wǎng)應(yīng)用_第2張圖片


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久色视频在线观看 | 色综合久久久久综合99 | 一级日韩 | 久久九九精品一区二区 | 女人牲交视频一级毛片 | 国产色综合天天综合网 | 91福利在线看 | 99久久精品全部 | 九九久久久 | 国产成人精品视频一区二区不卡 | 日本亚洲欧洲免费无码 | 国产成人精品实拍在线 | 香蕉亚洲欧洲在线一区 | 亚洲性激情 | 国产女主播在线视频 | 久热这里只有精品99国产6 | 国产精品高清一区二区不卡 | 久久精品免费全国观看国产 | 亚洲乱码中文字幕 | 日本高清毛片视频在线看 | 日韩国产成人精品视频 | 亚洲日本久久久午夜精品 | 国产亚洲影院 | 国内国产精品天干天干 | 国产亚洲精品2021自在线 | 免费观看性欧美毛片 | 日韩一区三区 | 91久久精品都在这里 | 欧美理论片大全在线观看 | 日韩99| 中文一区 | 91色多多 | 亚洲高清视频在线播放 | 99久久精品免费观看国产 | 国产天堂 | 欧美黄色录像 | 欧美区视频 | 亚洲精品久久久久午夜 | 99热这里有精品 | 国产在线日韩 | 精品国产美女 |