Python
import time
import socket
c_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def xor_check(s):
b = s.encode('ascii')
xor_result = b[0]
for byte in b[1:]:
xor_result ^= byte
return s + format(xor_result, 'X')
def turnon(channel):
data = '$' + str(1) + str(channel) + "000"
data = xor_check(data)
data = data.encode('ASCII')
c_socket.sendall(data)
time.sleep(1)
def turnoff(channel):
data = '$' + str(2) + str(channel) + "000"
data = xor_check(data)
data = data.encode('ASCII')
c_socket.sendall(data)
time.sleep(1)
def turnchange(channel, num):
#turnon
num_str = str(num).zfill(3)
data = '$' + str(3) + str(channel) + num_str
data = xor_check(data)
data = data.encode('ASCII')
c_socket.sendall(data)
time.sleep(1)
def turnoffall():
turnoff(1)
turnoff(2)
turnoff(3)
turnoff(4)
def connect():
try:
c_socket.settimeout(1)
c_socket.connect(('192.168.1.22', 8000))
print("连接成功")
return True
except socket.error as e:
print(f"连接失败: {e}")
return False
except socket.timeout:
print("连接超时")
return False
is_connect = connect()
turnon(1)
turnon(2)
turnchange(1, 9)
turnchange(1,99)
turnchange(1,199)
turnoffall()
c_socket.close()
Cpp
#include <string>
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <thread>
#include <chrono>
#include <sstream>
#include <iomanip>
#pragma comment(lib, "ws2_32.lib")
sockaddr_in serverAddr;
WSADATA wsaData;
SOCKET sockfd;
char buffer[100];
int iResult;
bool connect()
{
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
std::cerr << "WSAStartup failed: " << iResult << std::endl;
return false;
}
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockfd == INVALID_SOCKET) {
int errorCode = WSAGetLastError();
std::cerr << "socket creation failed with error: " << errorCode << std::endl;
WSACleanup();
return false;
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8000);
inet_pton(AF_INET, "192.168.1.22", &serverAddr.sin_addr);
if (connect(sockfd, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
int errorCode = WSAGetLastError();
std::cerr << "connect failed with error: " << errorCode << std::endl;
closesocket(sockfd);
WSACleanup();
return false;
}
return true;
}
std::string xorCheck(const std::string& str)
{
unsigned char xorResult = static_cast<unsigned char>(str[0]);
for (size_t i = 1; i < str.length(); ++i) {
xorResult ^= static_cast<unsigned char>(str[i]);
}
char hexResult[3];
snprintf(hexResult, sizeof(hexResult), "%02X", xorResult);
return str + hexResult;
}
void sendmessage(int sendLen)
{
if (sendLen == SOCKET_ERROR) {
int errorCode = WSAGetLastError();
if (errorCode == WSAECONNRESET) {
std::cerr << "Connection reset by peer, send failed." << std::endl;
}
else {
std::cerr << "Send failed with error: " << errorCode << std::endl;
}
}
else if (sendLen < strlen(buffer)) {
std::cerr << "Data partially sent, only " << sendLen << " bytes sent." << std::endl;
}
else {
std::cout << "Data sent successfully." << std::endl;
}
}
void turnon(int chanel)
{
std::string input = "$" + std::to_string(1) + std::to_string(chanel) + "100";
std::string text = xorCheck(input);
const char* cStr = text.c_str();
strcpy(buffer, cStr);
int sendLen = send(sockfd, buffer, strlen(buffer), 0);
sendmessage(sendLen);
std::this_thread::sleep_for(std::chrono::seconds(1));
}
void turnoff(int chanel)
{
//turnon(chanel);
std::string input = "$" + std::to_string(2) + std::to_string(chanel) + "000";
std::string text = xorCheck(input);
const char* cStr = text.c_str();
strcpy(buffer, cStr);
int sendLen = send(sockfd, buffer, strlen(buffer), 0);
sendmessage(sendLen);
std::this_thread::sleep_for(std::chrono::seconds(1));
}
void turnchange(int chanel, int num)
{
std::stringstream ss;
ss << std::setw(3) << std::setfill('0') << num;
std::string vars = ss.str();
std::string input = "$" + std::to_string(3) + std::to_string(chanel) + vars;
std::string text = xorCheck(input);
const char* cStr = text.c_str();
strcpy(buffer, cStr);
int sendLen = send(sockfd, buffer, strlen(buffer), 0);
sendmessage(sendLen);
std::this_thread::sleep_for(std::chrono::seconds(1));
}
void turnoffall()
{
turnoff(1);
turnoff(2);
turnoff(3);
turnoff(4);
}
int main() {
bool isconnect = connect();
turnon(1);
turnon(2);
turnchange(1, 9);
turnchange(1, 99);
turnchange(1, 199);
turnoffall();
closesocket(sockfd);
WSACleanup();
return 0;
}
C#
using System;
using System.Text;
using System.Threading;
using System.Net;
using System.Net.Sockets;
namespace client
{
class Program
{
private static byte[] result = new byte[1024];
static Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private static string xorCheack(string str)
{
byte[] b = Encoding.ASCII.GetBytes(str);
byte xorResult = b[0];
for (int i = 1; i < b.Length; i++)
{
xorResult ^= b[i];
}
return str + xorResult.ToString("X");
}
public static bool connect()
{
IPAddress ip = IPAddress.Parse("192.168.1.22");
try
{
clientSocket.Connect(new IPEndPoint(ip, 8000)); //配置服务器IP与端口
Console.WriteLine("连接服务器成功");
return true;
}
catch
{
Console.WriteLine("连接服务器失败,请按回车键退出!");
return false;
}
}
public static void turnON(int channel, int intensity)
{
try
{
string sendMessage = null;
Thread.Sleep(1000);
sendMessage = "$"+"1"+channel.ToString()+"000";
sendMessage = xorCheack(sendMessage);
byte[] byteArray = Encoding.ASCII.GetBytes(sendMessage);
clientSocket.Send(Encoding.ASCII.GetBytes(sendMessage));
}
catch
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}
public static void turnChange(int channel, int intensity, int var)
{
string num_var = var.ToString("D3");
try
{
string sendMessage = null;
Thread.Sleep(1000);
sendMessage = "$" + "3" + channel.ToString() + num_var;
sendMessage = xorCheack(sendMessage);
clientSocket.Send(Encoding.ASCII.GetBytes(sendMessage));
}
catch
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}
public static void turnOFF(int channel)
{
//turnON(channel, 0);
try
{
string sendMessage = null;
Thread.Sleep(1000);
sendMessage = "$" + "2" + channel.ToString() + "000";
sendMessage = xorCheack(sendMessage);
clientSocket.Send(Encoding.ASCII.GetBytes(sendMessage));
}
catch
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}
public static void destory()
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
public static void turnOFFAll()
{
turnOFF(1);
turnOFF(2);
turnOFF(3);
turnOFF(4);
}
static void Main(string[] args)
{
bool result = connect();
turnON(1,0);
turnON(2, 0);
turnChange(1, 0, 9);
turnChange(1, 0, 99);
turnChange(1, 0, 199);
turnOFFAll();
clientSocket.Close();
}
}
}
所有通讯字节都采用ASCII码
特征字 = $; 命令字 = 1,2,3,4;
1: 打开对应通道电源
2: 关闭对应通道电源
3: 设置对应通道电源参数
4: 读出对应通道电源参数
当命令字为1,2,3时,如果控制器接收命令成功,则返回特征字$;如果控制器接收命令失败,则返回&。
当命令字为4时,如果控制器接收命令成功,则返回对应通道的电源设置参数(返回格式跟发送格式相同);如果控制器接收命令失败,则返回&。
通道字 = 1,2,3,4。分别代表1,2,3,4个输出通道;5表示所有通道,6表示1,2,3通道,7表示1,2通道。
数据 = 0XX(XX=00~FF内的任一数值),对应通道电源的设置参数,高位在前,低位在后。