前言
在做项目的过程中,需要用树莓派与PC机做的控制中心进行Socket通信
树莓派上的程序是Python的,PC机上的程序有Python和C两个版本
树莓派上运行Client端程序,PC机上运行Server端程序
一、树莓派端(Client)
由于树莓派还连接着Arduino串口,所以里面也有和串口通信的代码,懒得删了
import socket
import time
import sys
import serial
SERVER_IP = "192.168.1.102" #服务器的IP地址
SERVER_PORT = 8888 #端口号
ser = serial.Serial("/dev/ttyUSB1",115200,timeout=1) #串口通信的东西
print("Starting socket: TCP...")
server_addr = (SERVER_IP, SERVER_PORT)
socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True: #将Client端连接到Server端上
try:
print("Connecting to server @ %s:%d..." %(SERVER_IP, SERVER_PORT))
socket_tcp.connect(server_addr)
break
except Exception:
print("Can't connect to server,try it latter!")
time.sleep(1)
continue
while True:
command = socket_tcp.recv(512)
if len(command)>0:
print("Received: %s" % command)
ser.write(command)
time.sleep(0.1)
response=ser.readall()
while(len(response) < 3):
response=ser.readall()
time.sleep(0.1)
print (response)
socket_tcp.send(response)
#time.sleep(1)
二、PC端(Server)
1.Python版本
2.C版本
比较简略,当作每一步都正常进行,没有异常处理
#include <stdio.h>
#include <winsock2.h>
#include <string>
using namespace std;
#pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll
const int PORT = 8888;
int main()
{
WSAData wsd; // 一种用于初始启动信息的数据结构,加载winsocket.dll
WSAStartup(MAKEWORD(2, 2), &wsd); // 初始启动信息(加载版本号,模块)
//创建Socket, 使用 IPv4 进行通信(Windows只有AF_INET)、流式套接字、TCP协议
SOCKET ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN ListenAddr;
ListenAddr.sin_family = AF_INET;
ListenAddr.sin_addr.s_addr = INADDR_ANY; //表示填入本机ip
ListenAddr.sin_port = htons(PORT);
int n;
bind(ServerSocket, (LPSOCKADDR)&ListenAddr, sizeof(ListenAddr));
cout << "端口绑定成功:" << PORT << endl;
listen(ServerSocket, 20);
cout << "服务端准备就绪,等待连接请求" << endl;
SOCKET* ClientSocket = new SOCKET;
ClientSocket = (SOCKET*)malloc(sizeof(SOCKET));
//接收客户端连接请求
int SockAddrlen = sizeof(sockaddr);
*ClientSocket = accept(ServerSocket, 0, 0);
cout << "一个客户端已连接到服务器,socket是:" << *ClientSocket << endl;
char RecvBuf[50];
char SendBuf[50];
cout << "请输入一个命令,例如m:";
gets_s(SendBuf);
send(*ClientSocket, SendBuf, 50, 0);
cout << endl;
recv(*ClientSocket, RecvBuf, 50, NULL);
cout << "Receive response: " << RecvBuf << endl << endl;
closesocket(ServerSocket);
WSACleanup();
return(0);
}