前面做了两件事情,一个是控制器发送控制数据到服务器,一个是小车从服务器获取数据。

这里贴上服务器代码。

import socket
import time
from threading import Thread

# 小车的数据,由控制器上传状态,服务器进行处理,返回给小车
inputx=0
inputy=0

# 速度上限0-1023
MAX_SPEED = 1023.0
# 小车的延迟
time_car = 0
# 控制的延迟
time_input = 0
# 小车状态 0未连接 1已连接
car_state = 0


# 摇杆控制线程
def Control_Input(socket_input):
    global inputx, inputy
    while True:
        try:
            recvdata = socket_input.recv(8)
            socket_input.send(b'1')
        except:
            print("控制器已断开")
            socket_input.close()
            break
        if recvdata == None:
            socket_input.close()
            print("控制器断开1")
            break
        recvdata = recvdata.decode('utf-8')
        if len(recvdata) != 8:
            socket_input.close()
            print("控制器断开2")
            break
        recvx = int(recvdata[0:4])
        recvy = int(recvdata[4:8])

        # 计算数据
        # x 1877 y1807 中心50不计算
        if recvx > 1877 - 50 and recvx < 1877 + 50:
            recvx = 0
        else:
            if recvx < 1877:
                recvx = int((1877 - recvx) * MAX_SPEED / 1877)
            elif recvx > 1877:
                recvx = int((recvx - 1877) * MAX_SPEED / (4095 - 1877)) + 5000

        if recvy > 1807 - 50 and recvy < 1807 + 50:
            recvy = 0
        else:
            if recvy < 1807:
                recvy = int((1807 - recvy) * MAX_SPEED / 1807)
            elif recvy > 1807:
                recvy = int((recvy - 1807) * MAX_SPEED / (4095 - 1807)) + 5000

        inputx = recvx
        inputy = recvy
        print(str(inputx) + '-' + str(inputy))

# 手机控制线程
def COntrol_Phone(socket_input):
    global inputx,inputy
    while True:
        try:
            recvdata = socket_input.recv(8)
        except:
            print("手机 控制器已断开")
            socket_input.close()
            break
        if recvdata == None:
            socket_input.close()
            print("手机 控制器断开1")
            break
        recvdata = recvdata.decode('utf-8')
        if len(recvdata) != 8:
            socket_input.close()
            print("手机 控制器断开2")
            break
        # 返回当前小车的状态
        time_send = int(time_car*1000)
        if time_send > 9999:
            time_send = 9999
        senddata = '{0:0>4}{1:0>4}'.format(time_send, car_state)
        print(senddata)
        try:
            socket_input.send(bytes(senddata, encoding='utf-8'))
        except:
            print("手机 控制器已断开")
            socket_input.close()
            break
        recvx = int(recvdata[0:4])
        recvy = int(recvdata[4:8])
        inputx = recvy
        inputy = recvx
        print(str(inputx) + '-' + str(inputy))


# 控制线程
def inputproc():
    print("控制线程启动成功")
    sock = socket.socket()
    # 设置给定套接字选项的值。
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # 把地址绑定到套接字
    sock.bind(('0.0.0.0', 6668))
    sock.listen()
    while True:
        print("等待控制器的连接...")
        socket_input, addr = sock.accept()
        print("新的控制器连接")
        recvdata = socket_input.recv(1)
        print(recvdata)
        if recvdata == None:
            socket_input.close()
            print("控制器断开1")
            break
        if recvdata == b'1':
            print("摇杆控制已连接")
            proc= Thread(target=Control_Input, args=(socket_input,))
            proc.start()
        elif recvdata == b'2':
            print("手机控制已连接")
            proc = Thread(target=COntrol_Phone, args=(socket_input,))
            proc.start()
        else:
            socket_input.close()


# 小车线程
def mxcarproc():
    global car_state,time_car
    print("小车线程启动成功")
    sock = socket.socket()
    # 设置给定套接字选项的值。
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # 把地址绑定到套接字
    sock.bind(('127.0.0.1', 6667))
    sock.listen()
    while True:
        print("等待小车的连接...")
        car_state = 0
        socket_car, addr = sock.accept()
        time_last = time.time()
        car_state = 1
        print("小车已连接")
        while True:
            try:
                recvdata = socket_car.recv(1)
                # 发送后到接收到数据之间的时间是延迟
                if recvdata == None:
                    socket_car.close()
                    print("小车已断开")
                    break
                time_car = time.time() - time_last
                # recvdata = recvdata.decode('utf-8')
                # print("recv " + recvdata)
                # 接收到任何消息都返回当前数据
                time_cur = time.time()
                senddata = '{0:0>4}{1:0>4}'.format(inputx,inputy)
                socket_car.send(bytes(senddata, encoding='utf-8'))
                time_last = time.time()
            except:
                print("小车已断开")
                socket_car.close()
                break


if __name__ == '__main__':
    proc1 = Thread(target=inputproc)
    proc2 = Thread(target=mxcarproc)

    proc1.start()
    proc2.start()

这里简要说一下代码:

1.这个开启两个线程,一个是小车线程,一个是控制线程。

2.小车的端口是6667,控制器的端口是6668

3.我是跑在自己电脑上,然后通过frp进行转发的,如果你是跑在服务器上面,那么前面的ip和端口就填写服务器的ip和对应的端口。如果你是frp转发的,就填写转发后的端口。不会frp的可以百度,也可以参考http://mxblog.mxguanwang.cn/232.html

4.细心的可能会发现,代码中还有一个线程是手机线程,那是怎么回事呢,摇杆感觉不方便,我又做了一个app。且看下篇。


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。