socket服务端代码_UE4 安卓Socket控制树莓派

记得以前看到过一些UE demo,使用手机或者便携式设备,上面几个按钮,操控一个大屏幕上UE4的场景,给场景中车辆、角色换装等等。

因为最近再玩树莓派,所以就想到了在UE4中远程操作树莓派,两个都是无线,那么通过socket连接去控制,这个方法不止可以控制树莓派,可以控制任何单片机,同时还可以实现手机控制PC或者其他设备。

UE4商店里有很多socket连接的插件,这里我使用了python的socket去操作。文章最后放上所有源代码和插件下载地址。

先看下效果:

socket服务端代码_UE4 安卓Socket控制树莓派_第1张图片
https://www.zhihu.com/video/1132793691764596736

思路就是,python中2个文件一个为客户端,跑在UE4中,一个服务端跑在树莓派上,首先是服务端代码:

import socket
import time
import sys
import RPi.GPIO as GPIO

HOST_IP = "192.168.0.103"
HOST_PORT = 5858
print("启动TCP服务...")

socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("监听IP%s:%d!" %(HOST_IP, HOST_PORT) )
host_addr = (HOST_IP, HOST_PORT)

socket_tcp.bind(host_addr)
socket_tcp.listen(1)

socket_con, (client_ip, client_port) = socket_tcp.accept()
print("连接客户端IP地址%s." %client_ip)
socket_con.send("服务器启动成功!!!")

GPIO.setmode(GPIO.BCM)
GPIO.setup(3,GPIO.OUT)
print("Receiving package...")
while True:
    try:
        data=socket_con.recv(512)
        if len(data)>0:
            print("Received:%s"%data)
            if data.decode() =='1':
                GPIO.output(3,GPIO.HIGH)
            elif data.decode() =='0':
                GPIO.output(3,GPIO.LOW)
            socket_con.send(data)
            time.sleep(1)
            continue
    except Exception:
            socket_tcp.close()
            sys.exit(1)

紧接着是客户端代码:

import socket
import time
import sys

SERVER_IP = "192.168.0.103"
SERVER_PORT = 5858
Server_addr = (SERVER_IP, SERVER_PORT)

print("启动socketTCP连接...")
socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("成功!")
while True:
    try:
        print("正在连接服务器%s:%d..." %(SERVER_IP, SERVER_PORT))
        socket_tcp.connect(Server_addr)
        print("连接成功!")
        break
    except Exception:
        print("服务器断开连接,尝试重新连接!")
        time.sleep(1)
        continue
print("操作内容:")

while True:
    try:
        data = socket_tcp.recv(512)
        if len(data)>0:
            #print("Received: %s" % data)
            #command = raw_input()
            str = '1'
            socket_tcp.send(str.encode())
            time.sleep(1)
            continue
    except Exception:
        socket_tcp.close()
        socket_tcp=None
        sys.exit(1)

使用的话将对应的GPIO改掉,包括IP和端口号。

另外要注意的是,上面的客户端代码,是使用本地py脚本的,UE4中操作如下所示:

socket服务端代码_UE4 安卓Socket控制树莓派_第2张图片

首先在游戏开的时候,启动一段python代码,这段代码首先是创建socket连接,并且连接到服务器,如果连接成功,则显示连接成功,如果连接失败,每隔1秒进行重新连接,一直到返回true。这里一开始启动代码主要是连接服务器的,接下来看第二段python:

socket服务端代码_UE4 安卓Socket控制树莓派_第3张图片

第二段python其实可以和上面的合在一起,无所谓都可以,上面如果连接成功到服务器后,这里需要对服务器返回的消息进行接收,也就是recv,如果看服务器代码,可以看到如果连接成功后,会返回一个欢迎消息,那么这里recv作为接收端,需要接受来自服务器的返回。

socket服务端代码_UE4 安卓Socket控制树莓派_第4张图片

接下来都一样了,我使用Red颜色作为说明,在UE4中一共2个button,他们分别像服务器发送一个数据,这个数据必须要进行字符转换,这里使用.send语法像服务器发送数据,如果我们看服务器的代码,服务器在检测客户端有连接请求并且连接成功后,会进入一个循环接受来自客户端的send消息,并且decode转码。

socket服务端代码_UE4 安卓Socket控制树莓派_第5张图片

写在最后,插件使用了UnrealEnginePython,如果想要增加新的python版本,需要增加UnrealEnginePythonandroidarmeabi-v7a下的python编译文件,以及UnrealEnginePythonandroid目录下对应新建版本的include文件夹,同时需要去python对应版本目录下压缩libs到stdlib压缩包中。

最后附上地址,使用UE422开发,先启动服务器,再启动客户端,2个python源文件再PythonPiTCPPython目录下,UE4的客户端代码一个在关卡蓝图,一个在UMG蓝图。

需要各位再手动再编译下插件,因为插件编译完太大了,不好上传,所以把缓存删了。

链接:https://pan.baidu.com/s/1i4yxbkE5FLUS4uqkXFLZww

提取码:igcc

你可能感兴趣的:(socket服务端代码)