缘由:因为带钥匙实在麻烦,市面上的智能锁虽好,但是有点小贵,于是我们就想着能不能自己做一个用手机语音助手加上自己搭的客户端和服务端加上电机,做一个简易版低成本的智能门锁。

功能及应用流程介绍:用户只需要用手机语音助手下达开关门指令(需要在手机端设置命令),门锁服务端接收到移动客户端发送的指令,发送指令给门锁客户端并发送网页反馈,门锁客户端接收服务端命令并驱动电机执行开关门。

话不多说,我们来看一下门锁服务端代码实现吧~

import os,sys
import socket,time
#定义命令函数
def order(data):#将接收到的数据以“换行符”分割并放入列表之中datalist = data.split("\n")#下一行代码不能删,不用的时候就注释掉,用于检查datalist里面的元素#print(datalist)#遍历datalist,若遍历到移动端的特定指令元素(key)就执行相应的指令for i in datalist:if(i=='Upgrade-Insecure-Requests: 1\r'):print("open the door for master")#客户端发指令给门锁客户端msg = 'open'door_sock.send(msg.encode('gbk'))#客户端给移动端发送网页反馈http_response = """\
HTTP/1.1 200 OKHello, World!
"""sock.sendall(http_response.encode("utf-8"))sock.close()breakif(i=='close'):print("close the door for master")break
#本地信息
HOST,PORT ='',4000#创建socket用于服务移动客户端
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#绑定
s.bind((HOST,PORT))#设置服务对象数
s.listen(5)#创建第二个socket用于服务门锁客户端
m = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
m.bind((HOST, 5000))
m.listen(5)#等待门锁客户端连接
while True:try:print('Waiting for door_client connection...')door_sock,door_addr = m.accept()except:continuewhile True:try:recv_data = door_sock.recv(1024)#接收门锁客户端发过来的信息以保证门锁客户端一直连接#若收到的数据不为空if recv_data:print('Waiting for connection...')#创建一个列表用于存放移动客户端发送的数据datalist = [ ]#等待移动客户端连接sock,addr = s.accept()print('Accept new connection from client')#将移动客户端发送的数据存到变量data里while True:data = sock.recv(1024).decode()order(data)break#若门锁服务端发送数据为空,关闭套接字并跳出循环再次尝试连接else:door_sock.close()break#若门锁服务端连接失败,关闭套接字并跳出循环再次尝试连接except:door_sock.close()break#关闭socket,结束进程
sock.close()
door_sock.close()
print('Connection from %s:%s closed.' % addr)

注意:门锁客户端需要一直给服务端发送信息以检测是否掉线,同时也需要一直接收客户端发送过来的指令,于是需要用到多线程。

简易门锁客户端搭建:

import socket
import threadingdef send_date(socket_tcp_client):   #发送数据while  True:server_date = 'connected'   socket_tcp_client.send(server_date.encode("gbk"))  #发数据,enconde为编码 gbk为编码方式socket_tcp_client.close()  #关闭套接字def recv_date(socket_tcp_client):  #接收数据while True:recv_date = socket_tcp_client.recv(1024)  #接收信息,每次最大为1024print("接收到的数据为:", recv_date.decode("gbk"))  #decode为解码,gbk为解码方式#下面需要加入判断语句执行驱动电机的开关门命令def main():socket_tcp_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #创建一个套接字server_ip= '10.161.42.184'server_port = 5000server_addr=(server_ip,server_port)socket_tcp_client.connect(server_addr)# 2.绑定连接send_tcp_date=threading.Thread(target=send_date,args=(socket_tcp_client,))  #定义两个线程,分别为发送和接收recv_tcp_date=threading.Thread(target=recv_date,args=(socket_tcp_client,))send_tcp_date.start()recv_tcp_date.start()   #开启这两个线程if __name__ =='__main__':main()

移动端可用浏览器模拟

看一下运行效果:



大概就是这样的。
小白入门在代码书写上可能还不够简洁、不够优美,还需要继续努力…

Python socket 基于TCP协议智能门锁服务端相关推荐

  1. python中基于tcp协议的通信(数据传输)

    tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据 ...

  2. python socket基于TCP/IP协议实现多人聊天室

    文章目录 前言 一.实现原理 二.queue队列 三.代码实现 四.需要注意的地方 五.总结 前言 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象.一个套接字 ...

  3. 卡牌手机游戏基于HTTP协议的服务端设计方案

    背景: 手机游戏平台服务端设计目前主要有基于Socket的状态连接和HTTP无状态连接两种架构.由于手机用户对于网络流量的敏感和网络状态的变化要比PC环境要复杂,因而对于卡牌类游戏基本采用HTTP连接 ...

  4. python 网络编程 套接字的初使用 基于TCP协议的socket

    文章目录 基于TCP协议的socket server端 client端 尝试启动 基于TCP协议的socket tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端 server端 # ...

  5. udp协议没有粘包问题、基于socketserver实现并发的socket(基于tcp、udp协议)、基于udp协议的套接字、操作系统原理以及进程知识

    基于udp协议的套接字通信服务端 from socket import *server=socket(AF_INET,SOCK_DGRAM) #数据报协议->udp server.bind((' ...

  6. day26-2 基于TCP协议的套接字编程

    目录 基于TCP协议的套接字编程 套接字 套接字工作流程 基于TCP协议的套接字编程(简单) 服务端 客户端 基于TCP协议的套接字编程(循环) 服务端 客户端1 客户端2 基于TCP协议的套接字编程 ...

  7. 网络编程——基于TCP协议的通讯录【课程设计】

    网络编程--基于TCP协议的通讯录[课程设计] 本文目录 网络编程--基于TCP协议的通讯录[课程设计] 一.设计题目和要求 设计目标: 课程设计系统组成及模块功能: 二.设计内容 服务端 客户端 S ...

  8. python实现淘宝客服自动回复语_Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例...

    本文实例讲述了Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能.分享给大家供大家参考,具体如下: [吐槽] 网上的代码害死人,看着都写的言之凿凿,可运行就是有问题. 有些 ...

  9. linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)

    一.介绍基于TCP协议通过socket实现网络编程常用API 1.读者如果不是很熟悉,可以先看我之前写的几篇博客,有socket,地址结构的理解,更加方便读者理解 地址分别是: 1).http://b ...

最新文章

  1. 7-3 逆序的三位数 (Java)
  2. 获取当天0点数据scala实现
  3. Echarts在手机端y轴数据过大,显示不全
  4. LeetCode 491. 递增子序列(回溯+判重剪枝)
  5. 【Http】加解密 生成 X.509格式,DER编码,后缀名.cer 加密公钥证书
  6. 使用FPM打包工具打rpm包
  7. PB级(大数据)的来源
  8. python培训班靠谱吗-Python培训机构就业靠不靠谱?
  9. sourceTree 的使用
  10. 64位MicrosoftOfficeWord加载EndnoteX7
  11. 谷歌seo外链发布50+个网站平台分享(e6zzseo)
  12. 5、提取snp indel 位点
  13. iphone6 和 iphone6 plus 屏幕适配问题
  14. Scala中 class和case class的区别
  15. H5互动游戏平台推荐:盘点那些超火的多人小游戏互动对战平台
  16. 计算机的四个发展史教案,计算机发展史教案
  17. 2019年,SEO关键词KPI考核指标有哪些?
  18. Python:列表推导式、生成器、迭代器
  19. 新朝旧将 vite和webpack煮酒论英雄
  20. 查找M1 MAC 是否适配软件的网站

热门文章

  1. 深入理解微服务Maven父子项目构造以及项目打包部署
  2. 超越爱因斯坦 ——宇宙是可以理解的
  3. 谷歌SEO外链:1400刀保证能多少条外链
  4. 阿里刘振飞:聚安全人之力 为全社会赋能
  5. 华强北的AirPods耳机谁家比较靠谱?
  6. SSM电影点播系统03-UI界面设计
  7. 玩转CVM:Web服务搭建
  8. 卸载electron-builder打包出来的应用,删除用户数据
  9. Install-macOS-Big-Sur-11.5-20G71
  10. 设计师张超越_超越响应能力–手机网站设计技巧