标签归档:python智能化

快来用Python制作只属于你和ta的聊天渠道吧

是否担心微信的数据流会被监视?是否担心你和ta聊天的小秘密会被保存到某个数据里?没关系,现在我们可以用Python做一个只属于你和ta的聊天渠道,来解除你们心中的担忧。

1.原理简介

在我们今天的教程中,将用到即时通讯的概念,即时通讯允许两人或多人同时使用网络传递文字信息、文字、语音等。即时通讯一般都基于socket连接,socket连接可用于发送或接受数据,一般的组合形式是IP+端口号

也就是说,在我们的例子中,聊天的双方,由一方要承担“服务器 ” 的责任,维持一个socket服务器,等待连接进入;另一方则是“客户端”,在服务器端维持等待状态时即可发送请求,建立连接。

当你和ta想进入“小黑屋 ” 里聊天的时候,只有有一方充当服务器,另一方充当客户端即可,作为“服务器端 ” 的那个人,在微信中将IP和端口号告诉对方,即可构建连接,在小黑屋里聊天,这个小黑屋里的数据不会被任何数据保留(除非你自己做了一个保存的数据)。

2.代码编写

好了,基本原理我们已经讲清楚了。不过,在开始教程之前,你得先安装好了Python,如果还没有安装,可以看这篇文章:https://pythondict.com/python-tutorials/how-to-install-python/

2.1 服务器端

聊天的时候,我们有时候会遇到双方同时发消息的情况。这种聊天方式就叫全双工聊天方式:“服务器”可向“客户端”发送消息,“客户端”也可向“服务端”发送消息,而且允许同时发送消息。

服务器端怎么实现全双工的聊天方式呢?其实很简单,只要用多线程就行了,主线程用于接收客户端的连接,连接成功后新建两个线程:一个用于发送消息,一个用于接收消息:

首先,建立socket服务器:

import socket
import traceback
# 设定ip和端口号
host = ''
port = 51423 
# 建立socket服务器
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen() 
while True:
    # 等待连接
    try:
        clientsock, clientaddr = s.accept()
    except KeyboardInterrupt:
        raise
    except:
        traceback.print_exc()
        continue 

其中,AF_INET指的是用IPv4进行通信,而SOCK_STREAM指的是TCP协议。端口号你可以随意设定,服务器端的IP地址默认为空即可。

在while循环中不断等待用户的连接。如果有用户连接成功了,我们将进入下一步,分别建立发送和接受线程:

# 建立接收线程
t = _thread.start_new_thread(processRecv, (clientsock,))

# 建立发送线程
r = _thread.start_new_thread(processSend, (clientsock,)) 

clientsock就是我们得到的socket连接,processRecv和processSend分别用于处理接受信息和处理发送信息:

import _thread 
def processRecv(clientsock):
    """
    接受消息
        :param clientsock: 客户端的socket连接
    """
    while True:
        data = clientsock.recv(4096)
        if not len(data):
            break
        print (data.decode('utf-8'))
    clientsock.close()

def processSend(clientsock):
    """
    发送消息
        :param clientsock: 客户端的socket连接
    """
    while True:
        data = input("> ")
        data = data
        clientsock.sendall(data.encode('utf-8'))
    clientsock.close() 

有个小细节要注意,socket连接的sendall函数只支持bytes类型的数据,所以我们要encode(‘utf-8’)。

服务端的所有代码就这样,没错,就是这么简单。

2.2 客户端

客户端则更简单,主线程本身设定为接受消息,那么我们只需要多一个线程用于发送消息即可。客户端的全部代码如下:

#-*-coding:utf-8-*-

import _thread
import sys
from socket import *

def send_message(tcpCliSock):
    """
    发送信息
        :param tcpCliSock: 与服务端的socket连接
    """
    while True:
        message = input('> ')
        if not message:
            break
        tcpCliSock.send(message.encode('utf-8'))

    tcpCliSock.close()

if(len(sys.argv) < 3):
    HOST = 'localhost'
    PORT = 51423
else:
    HOST = sys.argv[1]
    PORT = int(sys.argv[2])

BUFSIZ = 1024
ADDR = (HOST,PORT)

tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)

# 建立发送消息的线程
s = _thread.start_new_thread(send_message, (tcpCliSock,))

while True:
    rdata = tcpCliSock.recv(BUFSIZ)
    if not rdata:
        break
    print (rdata.decode('utf-8'))
    
tcpCliSock.close() 

其中,HOST部分填写对方的IP,PORT部分填写端口号。sys.argv用于通过参数输入这两个值,比如我们将客户端文件命名为:client.py, 在cmd中输入:

python client.py 127.0.0.1 51423

能直接传入参数执行脚本,除此之外,其他部分和服务端其实差不多。注意把接受到的数据decode一下(因为我们发的时候encode了)。

3. 改进

实际上,这份代码虽然可以用,但是还是存在许多问题的。比如在你们聊天的时候,突然又有一个人向服务端发送连接请求怎么办?这时候我们需要在服务端加一份拥有验证的代码,要求对方输入聊天室密码后才可建立连接。

这个密码必须是你们双方才知道的密码,任何通过第三方工具传播密码的行为都是不可靠和不安全的。这样才可以防止第三者的偷听。增加一个密码功能其实也不难,这部分交给大家自己去实现啦!

本文完整源代码下载请在公众号后台回复:聊天渠道

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

python 树莓派语音控制普通台灯教程

阅读这篇文章前,这两篇文章可能对你会有所帮助:

利用智能音箱语音控制电脑开关机 (必读,否则你可能不知道我在说什么)

语音控制 – 改造普通风扇 (选读)

先看看效果:

完成这项有趣的实验,你所需要的材料有:

1.电烙铁

2.一个8050三极管

3.一个继电器

4.一个路由器

5.一个树莓派

6.一个智能音箱 (我使用的是亚马逊 Echo Dot2)

7.一个普通台灯

我使用的是最基本的开关台灯,所以它只有一个开关按钮,也只有一个功能,那就是开关台灯(废话),现在我们需要让它能够被语音控制。由于我们可以让智能音箱树莓派通信,所以只需要让台灯连接树莓派就能达成我们的目的,因此我们需要有一个能和这个台灯并联,并且能够接线出来让树莓派控制的器件。那就是继电器。

PS:为什么不能让树莓派像控制风扇一样,直接控制台灯呢?

因为台灯接的是220V电压,树莓派最大电压只有5V,树莓派是较小电流,较小电流要控制大电流则必须用继电器。

加上继电器后,其电路图就如同下面所示。

我们使用的继电器是这个小东西:

但由于我的台灯里的空间不够大(如下图所示,我还打了个孔,方便接出线),我只好拆出这个继电器的核心,当然如果你的台灯够大,就不需要考虑这一点了。

接下来讲一下继电器的使用(原理可见上方动图),其实是很简单的,把点灯开关的两条线接到COM端(共接点)和NO端(常开端),此外DC+, DC-分别连树莓派的5V电源和接地即可。然后从树莓派任意GPIO引脚中引线接继电器的控制端,这个控制端能控制NO端的开闭,当输入1的时候就是闭合,电路连通,灯亮。

不过需要注意的是,树莓派的GPIO口是3.3V的,你需要把它转化成5V才能进行控制,怎么转化呢?那就要使用上我们上一节 语音控制 – 改造普通风扇 讲的三极管了。

接完后如下图所示

这样,硬件方面的工作我们就做完了,接下来是软件方面的工作。

其实也就是让智能音箱识别到一个控制开关的命令,跟 利用智能音箱语音控制电脑开关机 中提到的一样。让树莓派使用fauxmo,模拟成许多智能设备,模拟的配置如下:

"MyLight": {
    "path": "/home/pi/Documents/fauxmo/src/fauxmo/plugins/MyLight.py",
    "DEVICES": [
        {
        "name": "Light",
        "port": 49919,
        "on_cmd": "python2 /home/pi/Documents/Automatic/GPIO13.py on",
        "off_cmd": "python /home/pi/Documents/Automatic/GPIO13.py off",
        "state_cmd": ""
        }
    ]
}

这样,智能音箱就会把这个设备的名字识别为 Light. 因此,当你说

” turn on the light “,

它就会执行on_cmd命令,(在这个例子中,我们的path指向的文件MyLight.py即只是启动一个cmd命令而已)即执行 python GPIO13.py on . 相应地,”turn off the light”则执行off_cmd命令。

GPIO13.py 内只是控制树莓派的开关而已,如下所示,它接收两个参数,on或off. 当参数是on的时候,向树莓派的GPIO33口输出高电平,灯亮。Off的时候则输出低电平,灯灭。

# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time
import sys

# BOARD编号方式,基于插座引脚编号
GPIO.setmode(GPIO.BOARD)

# 输出模式
GPIO.setup(33, GPIO.OUT)

def turnOn():
    GPIO.output(33, GPIO.HIGH)

def turnOff():
    GPIO.output(33, GPIO.LOW)

if sys.argv[1] == 'on':
    turnOn()

elif sys.argv[1] == 'off':
    turnOff()

重启fauxmo,让智能音箱重新搜索,就能找到这个Light的设备,然后说一句 “turn on the light”,就能享受这份折腾的成就感了。

最近我还发现,Amazon Alexa 的手机软件,还支持外网控制这些室内设备,如图。

因此,现在每当我要回到宿舍的时候,在宿舍楼下时,我都会先点击Fan,让它帮我开个风扇,然后根据我是要玩游戏还是要干活,再点击PC或Laptop. 如果是晚上,我还可以点击Light打开点灯。这就是新时代的生活,你得Catch Up。

无论是多么普通的设备,你都可以用一个树莓派把它变得智能。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 树莓派语音控制普通风扇实现教程

完成这项有趣的实验,你所需要的材料有:

其实也可以改造220V风扇,但是比较复杂,需要多一个继电器,我们下一篇讲改造台灯的时候会说到。建议开始之前先阅读上一篇文章:Python利用智能音箱语音控制电脑开关机 你会得到控制流程的整体思路。

首先是改造风扇,利用树莓派控制开关,我们的改造对象:

完成这项有趣的实验,你所需要的材料有:

1.电烙铁

2.一个8050三极管

3.一个路由器

4.一个树莓派

5.一个智能音箱 (我使用的是亚马逊 Echo Dot2)

6.一个普通的5V风扇 

其实也可以改造220V风扇,但是比较复杂,需要多一个继电器,我们下一篇讲改造台灯的时候会说到。

首先是改造风扇,利用树莓派控制开关,我们的改造对象:

像这种风扇,内部电路其实就是一个开关,它使用USB连接的5V电压,其实和树莓派的5V是一样的。所以我们可以直接使用树莓派供电。但是怎么样才能控制它开关呢?这时候我们就需要8050三极管了。

如图所示,从8050的正面(平)的这一面看过去,三极管中间的那一根即b可以作为控制端,我们可以将它连接到树莓派上的GPIO口,三极管的原理我们可以先跳过,大致先这样理解:当b端为低电平时,电路不通;当b端为高电平时,电路连通;因此,通过控制GPIO口的高低电平便能控制它的开关。我们放弃它原先的电路,使用三极管作为一个新的开关电路,如下图所示,树莓派的5V接风扇,出来后接三极管,然后接负极,b端接GPIO的第12号口,如图所示。

这样,我们通过树莓派控制Pin12#的高低电平就能控制风扇的开关。现实版焊接如图所示(没错,红色的不用管,只是线不够长我又延长了,黑色那块就是三极管,棕色那条是控制端,接树莓派的PIN12#):

进去后,只要把正负连线分别焊接到风扇的正负极即可,如图(其实我这个甚至不用焊,直接连到风扇的正负极就可以了,焊接是怕它掉下来):

大家如果心里没底,可以先用个LED灯接个电阻试一下三极管的控制,成功后就可以大胆上了!

下面是我们的控制代码GPIO12.py:

# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time
import sys

# BOARD编号方式,基于插座引脚编号
GPIO.setmode(GPIO.BOARD)

# 输出模式
GPIO.setup(12, GPIO.OUT)

def turnOn():
    GPIO.output(12, GPIO.HIGH)

def turnOff():
    GPIO.output(12, GPIO.LOW)

if sys.argv[1] == 'on':
    turnOn()

elif sys.argv[1] == 'off':
    turnOff()

文件接收一个参数即 on 或 off. 当参数是on的时候,运行turnOn函数,向pin12#发送高电平,风扇开启。off的时候,则执行turnOff函数,向pin12#发送低电平,风扇关闭。

前面我们已经讲过如何用树莓派控制风扇的开关,接下来是语音控制部分。

在上一篇推送中《利用智能音箱语音控制电脑开关机》我已经介绍了模拟WEMO智能家居软件Fauxmo是如何和亚马逊Echo dot2一起工作的,所以我们这里就不再介绍了,大家如果不理解,可以仔细琢磨一下上一篇推送。

根据前面的代码,我们知道控制风扇开关的是一个Python文件,那么我们可以以这样的逻辑思路完成语音控制

“echo, turn on the fan” -> Echo -> 向树莓派发送指令,执行Python文件,向Pin12#输出高电平,风扇启动

“echo, turn off the fan” -> Echo -> 向树莓派发送指令,执行Python文件,向Pin12#输出低电平,风扇关闭

因此在这里,我们可以继续使用之前提到的commandlineplugin.py文件。音箱收到指令后便查找有没有一个叫 fan 的设备,然后发现(树莓派上)有这样一个设备,便让它通过commandlineplugin.py执行一个文件(GPIO12.py on/off)。

在config.json的PLUGINS下添加下面的代码,注意,port可以随意设置,只要不重复就可以了,Fan 是音箱识别的名字,如果你把它改成baby,那就要 turn on (the) baby 才执行,GPIO12.py你可以放在任何你想要的位置,只要执行的时候写清楚即可,另外如前面所述,文件后面记得写上传递给它的参数。

"MyLight": {
    "path": "/home/pi/Documents/fauxmo/src/fauxmo/plugins/commandlineplugin.py",
    "DEVICES": [
        {
            "name": "Fan",
            "port": 49918,
            "on_cmd": "python2 /home/pi/Documents/Automatic/GPIO12.py on",
            "off_cmd": "python /home/pi/Documents/Automatic/GPIO12.py off",
            "state_cmd": ""
        }
    ]
}

大功告成,重启fauxmo, 然后试试echo, turn on the fan. 你会发现风扇成功运转起来了。如果你是使用的其他智能音箱,请注意,Fauxmo只适用于Echo, 你可以找一个适合于你的智能音箱的,并能让你的树莓派模拟智能家居的工具

风扇只是牛刀小试,下一篇我们将改造台灯,那才是真正的大工程。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典