如何对RS485设备进行地址的设置?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何对RS485设备进行地址的设置?相关的知识,希望对你有一定的参考价值。

我需要控制多台电机,厂家给了指令码和指令格式,但是地址怎么设置啊?求高手解答!谢谢
以下是厂家给到的参数:
固定数据格式
通讯协议(控制指令):为五个字节的十六进制表示的指令:
上指令:0xFF,0xEE,0xEE,0xEE,0xDD
停指令:0xFF,0xEE,0xEE,0xEE,0xCC
下指令:0xFF,0xEE,0xEE,0xEE,0xEE
232\485端口(速率码)设置:2400,n,8,1 一个数据串要连续发送2次以上中间间隔500MS

可以设置数据格式
数据格式:0XFF, D1,D2,D3,OPN
0XFF:标志码
D1,D2,D3:地址码
OPN:操作码-AA=登录,BB=删除,CC=停止,DD=上行,EE=下行
232\485端口(速率码)设置:2400,n,8,1一个数据串要连续发送2次以上中间间隔500MS

modbus用串口通信时一般不用设端口地址的,每一个485口可以并联最多32个从设备(自然最好将地址的值定义在1到32之间),每个从设备的地址不一样,从设备会根据主设备发送帧报文中的地址判断是不是在查询自己,若是则进行应答。至于地址设置,只要在从设备通信程序中定义一个地址变量,可以给地址变量赋定值,也可以编个小程序根据需要设置地址变量的值,最后通过比较该值与接收的报文中的地址是否一致,若一致,则进行返回应答帧。 参考技术A 不知道你这个登录是什么意思,如果登录就是设置地址的话,可以这样设置:
0xFF,0xEE,0xEE,0xEE,0xBB 删除

0xFF,0x01,0x01,0x01,0xAA 登录设置地址
于是
上指令:0xFF,0x01,0x01,0x01,0xDD
停指令:0xFF,0x01,0x01,0x01,0xCC
下指令:0xFF,0x01,0x01,0x01,0xEE追问

按你说的试了,结果电机还是没有反应

追答

问一下厂家,如何设置地址吧

追问

谢谢,已经问了,厂家说他们的RS485端口是假的,根本不能用...

本回答被提问者采纳

如何使用我自己的 rsa 私钥使用 rs256 算法对字节进行签名?

【中文标题】如何使用我自己的 rsa 私钥使用 rs256 算法对字节进行签名?【英文标题】:how to sign bytes using my own rsa private key using rs256 algorithm? 【发布时间】:2014-11-12 13:55:32 【问题描述】:

我有自己的私钥字符串,即

-----BEGIN RSA PRIVATE KEY-----

MIICXAIBAAKBgQCSAYYgzvGTww....
....
....
.....
3yUMYj9oYzqdrRHP0XgD0cEEvyqPBwLaNsRdFwy5qTiHjj0f+ZWHQWmqcoLmmpzyZEbIvQm/VhbjRF6iKG4WZ9Hfa7ntYRNGdWgD/KMIeZI=

-----END RSA PRIVATE KEY-----

现在,我需要在 C# 中使用此私钥签署我的声明集以生成 JWT 有效负载。

我写了以下代码:

var utc0 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var issueTime = DateTime.Now;

var iat = (int)issueTime.Subtract(utc0).TotalSeconds;
var exp = (int)issueTime.AddMinutes(55).Subtract(utc0).TotalSeconds;

var payload = new

    iss = email,
    prn = prn,
    scope = "scope",
    aud = "https://example.com",
    exp = exp,
    iat = iat
;

var segments = new List<string>();
var header = new  typ = "JWT", alg = "RS256" ;

byte[] headerBytes = Encoding.UTF8.GetBytes(jsonSerializer.Serialize(header));
byte[] payloadBytes = Encoding.UTF8.GetBytes(jsonSerializer.Serialize(payload));

segments.Add(Base64UrlEncode(headerBytes));
segments.Add(Base64UrlEncode(payloadBytes));

var stringToSign = string.Join(".", segments.ToArray());

var bytesToSign = Encoding.UTF8.GetBytes(stringToSign);

现在我需要这些 bytesToSign 由我的私钥签名,正如我上面提到的使用 rs256 算法。任何人都可以帮忙吗?

我已按照以下内容更新了我的代码:

var pemprivatekey = OpenSSLKey.DecodeOpenSSLPrivateKey(privateKey);
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();

if (pemprivatekey != null)

    rsaProvider = OpenSSLKey.DecodeRSAPrivateKey(pemprivatekey);


byte[] signature = rsaProvider.SignData(bytesToSign, "SHA256");

segments.Add(Base64UrlEncode(signature));

return string.Join(".", segments.ToArray());

并生成 JWT 令牌。请让我知道我在哪里犯了错误,因为它不正确:当我将它传递给 API 时,它不起作用并引发错误。

【问题讨论】:

Start here 如果遇到困难请回来。对于其他人来说,RS256 似乎是使用 SHA-256 为 RSASSA-PKCS-v1_5 指定的 JSON 名称。 我尝试使用OpenSSLKey,它也解码了 RSA 私钥,并且我能够对我的字节进行编码以生成 JWT 令牌,但是当我传递给 API 时,它指出错误为无效的 JWT 令牌,有什么帮助吗? ,我在上面的问题本身中添加了更新的代码。 看来你已经领先了,但不幸的是,我本人并不了解 JWT 格式 另见Signing and verifying signatures with RSA C#、how to sign bytes using my own rsa private key using rs256 algorithm?、Signing data with private key in c#、How can I sign a file using RSA and SHA256 with .NET?、Signing a string with RSA private key on .NET?等 【参考方案1】:

这个问题的关键是使用 JWT 和 Bouncy castle 库分别对令牌进行编码和签名。

    JWT 用于对 JWT 令牌进行编码和解码 Bouncy Castle支持加解密,特别是RS256 get it here

首先,您需要将私钥转换为 RSA 参数的形式。然后您需要将 RSA 参数作为私钥传递给 RSA 算法。最后,您使用 JWT 库对令牌进行编码和签名。

    public string GenerateJWTToken(string rsaPrivateKey)
    
        var rsaParams = GetRsaParameters(rsaPrivateKey);
        var encoder = GetRS256JWTEncoder(rsaParams);

        // create the payload according to your need
        var payload = new Dictionary<string, object>
        
             "iss", "",
             "sub", "" ,
            // and other key-values 
        ;

        var token = encoder.Encode(payload, new byte[0]);

        return token;
    

    private static IJwtEncoder GetRS256JWTEncoder(RSAParameters rsaParams)
    
        var csp = new RSACryptoServiceProvider();
        csp.ImportParameters(rsaParams);

        var algorithm = new RS256Algorithm(csp, csp);
        var serializer = new JsonNetSerializer();
        var urlEncoder = new JwtBase64UrlEncoder();
        var encoder = new JwtEncoder(algorithm, serializer, urlEncoder);

        return encoder;
    

    private static RSAParameters GetRsaParameters(string rsaPrivateKey)
    
        var byteArray = Encoding.ASCII.GetBytes(rsaPrivateKey);
        using (var ms = new MemoryStream(byteArray))
        
            using (var sr = new StreamReader(ms))
            
                // use Bouncy Castle to convert the private key to RSA parameters
                var pemReader = new PemReader(sr);
                var keyPair = pemReader.ReadObject() as AsymmetricCipherKeyPair;
                return DotNetUtilities.ToRSAParameters(keyPair.Private as RsaPrivateCrtKeyParameters);
            
        
    

ps:RSA 私钥应采用以下格式:

-----开始 RSA 私钥--

base64 格式的值

-----结束 RSA 私钥-----

【讨论】:

谢谢你!!!我花了很多时间在很多天里寻找可以满足我需要的东西,而这是在 C# 中唯一对我有用的东西。【参考方案2】:

我将分步列出我的答案

    为此,您需要安装一个包以获取名为Jose-jwt 的库。这代表 JavaScript 对象签名和加密。从 NuGet 包管理器安装包,Install-package Jose-jwt

    使用 OpenSSL,以 PKCS12 文件 (*.p12) 的形式打包您的私钥,您将在此过程中为该文件设置密码。

    openssl pkcs12 -export -nocerts -in ./myKey.key -out my-Key.p12
    

    如Library's readme 中所列,您需要从该文件生成RSACryptoServiceProvider,如下所示:

    var privateKey=new X509Certificate2("my-key.p12", "password", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet).PrivateKey as RSACryptoServiceProvider;
    

    使用创建的RSACryptoServiceProvider 以及在 PKCS12 打包期间设置的密码来对您的有效负载进行编码,如下所示:

    string token=Jose.JWT.Encode(payload, privateKey, JwsAlgorithm.RS256);
    

【讨论】:

【参考方案3】:

我最近不得不实现类似的事情,并且在签署我的有效负载时遇到了一个错误“指定的算法无效”,因此解决了我认为我会分享代码的具体问题。我认为这对您也可能有用。

您可以在 Karama.Jwt.Public 找到完整的解释性 [ReadME][2] 和源代码。我碰巧使用了一个不同的库来生成我的 JWT,即 JOSE,但我认为这是偶然的,为了完整起见,有一个项目没有使用第三方库来实现相同的目的。

请告诉我你的进展情况。

【讨论】:

【参考方案4】:

我发现了一些纯基于 Javascript 的解决方案,如果它对任何人有用的话。你可以找到 JS 库here。

它已经解决了我的要求。

【讨论】:

以上是关于如何对RS485设备进行地址的设置?的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式 Linux 设备在启动期间阻塞 RS485 总线

labview怎么读取RS485转网口的数据

RS485接口OSI模型的应用层

RS485接口OSI模型的应用层

三菱PLC怎么用485接口与单片机通讯

RS485自动方向切换模式