Socket网口通讯控制光源

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内的任一数值),对应通道电源的设置参数,高位在前,低位在后。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值