基于阿里云的C#窗体实现两端通信

基于阿里云的C#窗体实现两端通信

来自一位大手子@Eragonl,大家可以在csdn找到他

前期准备

·1.1所需工具的确认和安装:

打开VisualStdio Installer后点击上方的单个组件后向下寻找到 .NET Framework的SDK和目标包,确认好至少安装了一个版本的SDK和目标包(我这里使用的是4.6.1的版本)

在这里插入图片描述

·1.2 创建一个C#窗体:

在这里插入图片描述

·1.3 下载MQTT库和必要的SDK文件

创建完成以后,现在我们来下载MQTT库的4.3.0版本。

首先我们需要在VS中创建两个C#窗体应用。创建完成以后,点开VS上方的“工具”,找到NuGet 包管理器,选择“程序包管理器控制台”,等待初始化结束以后在下方的PM>的后面输入“Install-Package M2Mqtt -Version 4.3.0”后按下回车,等待安装完成。

然后我们需要安装阿里云上物联网平台的SDK。进入 https://developer.aliyun.com/tools/sdk?spm=5176.11122631.962077.11.17e83801jxoNww#/dotnet ,下载 SDK核心库 以及 阿里云物联网平台 。

image-20200602221206361

以及

image-20200602221220084

下载后解压得到dll文件。在项目中右击右方“解决方案资源管理器”中的引用,点击添加引用后选择浏览,将刚刚下载的两个dll文件导入,这样就完成了开始项目前的准备。(也可以直接拖进引用这里)

image-20200602221307110

创建产品和设备

·2.1 阿里云上产品的注册

在此之前,我们需要先注册一个阿里云上的账号,这个很简单,只需要百度“阿里云平台”,然后注册一个阿里云平台的账号即可,在此不做演示。然后进入链接 https://iot.console.aliyun.com/product?spm=a2c4g.11186623.2.16.18ce4c07ESOaSj 进行用户登录,将会出现如下所示的登录页面,提示输入注入用户名以及密码即可:

点击页面左边的“设备管理”->“产品”,在产品页面的右边有“创建产品”按钮:

image-20200602221353462

点击该按钮之后,出现下面的“新建产品”页面:

image-20200602221402182

因为我们的连接方式是WiFi,所以就不需要再选择接入网关了,故选择的是否。以及ID2认证的话,除非需要很高的安全性,不然一般情况下也是选择否。

在“产品列表”中打开具体的产品后,将会显示产品信息页面,其中有产品的型号(ProductKey)和产品密钥(ProductSecret),将数据保存在本地txt文档中,之后的程序中会用到这两个字符串。

IMG_256

·2.2 阿里云上设备的建立

创建产品完成以后点击“前往管理”进行设备的建立

IMG_256

点击“添加设备”,我们开始建立数据发出端的程序。

IMG_256

跳出如图的界面后自行填入DeviceName和备注名称,其中备注名称需要保存到txt文件中,之后的编程中需要使用。

IMG_256

点击确定后会跳出如图界面,将三个数据进行保存,之后的编程中也会用到

IMG_256

复制完成以后就会在设备列表中创建出一个未被激活的设备出来,这个设备我称之为A,我这里的名字为lalala,之后测试的时候设备A的名字会变成computer。

IMG_256

·2.3与阿里云单设备的数据传输

·2.3.1 本地设备的开发

我们现在对设备A进行开发,我们现在要做的是用本地的C#代码连接设备A后将数据发送到云上,然后云再将数据返回来,由本地的C#进行接收。我们先写本地的C#程序:首先,窗体界面的建立,我们需要在VS上进行窗体的建立。点击左侧的工具箱,找到textBox,label还有button,将他们放置在窗体上。然后修改右下角的Text以及字体的大小和字种(不改其实也没问题)。如下图所示:
在这里插入图片描述

然后双击传输数据以后,进入编程界面,将下列代码复制进去:

(我这里的“传输数据”为button1;文字框为testBox1;“数据未上传”为label1;“数值为:”为label2;“注释为:…”为label3;“null”为label4)

(注:这里的代码不能直接全部复制进去!而是要根据自己C#里的各个组件,一个一个对应着,双击各个组件以后根据功能将代码拷贝进去并进行修改。就算和我的各个组件名字一样,也要每个组件双击着去做,不然没有效果并且会报错!)

using System;
using System.Net;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
using System.Windows.Forms;
using System.Security.Cryptography;
namespace WindowsFormsApp1
{
  public partial class Form1 : Form
  {

​    //阿里云的数据
​    static string ProductKey = "***";//来自自己的设备
​    static string DeviceName = "***";//来自自己的设备
​    static string DeviceSecret = "***";//来自自己的设备
​    static string RegionId = "cn-shanghai";
​    static string PubTopic = "/" + ProductKey + "/" + DeviceName + "/user/update";
​    static string SubTopic = "/" + ProductKey + "/" + DeviceName + "/user/get";
​    public Form1()
​    {
​      InitializeComponent();
​      System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
​    }

​    private void Form1_Load(object sender, EventArgs e)
​    {
​      button1.Text = "数据上传";
​    }

​    private void button1_Click(object sender, EventArgs e)
​    {
​      label1.Text = "数据已经上传!";
​      //开始连接阿里云
​      IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
​      string clientId = host.AddressList.FirstOrDefault(
​        ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToString();
​      string t = Convert.ToString(DateTimeOffset.Now.ToUnixTimeMilliseconds());
​      string signmethod = "hmacmd5";
​      Dictionary<string, string> dict = new Dictionary<string, string>();
​      dict.Add("productKey", ProductKey);
​      dict.Add("deviceName", DeviceName);
​      dict.Add("clientId", clientId);
​      dict.Add("timestamp", t);
​      string mqttUserName = DeviceName + "&" + ProductKey;
​      string mqttPassword = IotSignUtils.sign(dict, DeviceSecret, signmethod);
​      string mqttClientId = clientId + "|securemode=3,signmethod=" + signmethod + ",timestamp=" + t + "|";
​      string targetServer = ProductKey + ".iot-as-mqtt." + RegionId + ".aliyuncs.com";
​      ConnectMqtt(targetServer, mqttClientId, mqttUserName, mqttPassword);
​    }
​    public void ConnectMqtt(string targetServer, string mqttClientId, string mqttUserName, string mqttPassword)
​    {
​      MqttClient client = new MqttClient(targetServer);
​      client.ProtocolVersion = MqttProtocolVersion.Version_3_1_1;
​      client.Connect(mqttClientId, mqttUserName, mqttPassword, false, 60);
​      client.MqttMsgPublishReceived += Client_MqttMsgPublishReceived;
​      //发布消息
​      String content = textBox1.Text;
​      //将string类转换成byte[]
​      byte[] by1 = System.Text.Encoding.ASCII.GetBytes(content);
​      var id = client.Publish(PubTopic,by1);
​      //订阅消息
​      var id2 = client.Subscribe(new string[] { SubTopic }, new byte[] { 0 });
​    }
​    //client.Unsubscribe(topics);
​    public void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
​    {
​      // handle message received
​      string topic = e.Topic;
​      string message = Encoding.ASCII.GetString(e.Message);
​      //int length = message.Length;
​      label4.Text = message;
​    }
​     }
  public class IotSignUtils//IoT平台接入password签名算法
  {
​    public static string sign(Dictionary<string, string> param,
​              string deviceSecret, string signMethod)
​    {
​      string[] sortedKey = param.Keys.ToArray();
​      Array.Sort(sortedKey);
​      StringBuilder builder = new StringBuilder();
​      foreach (var i in sortedKey)
​      {
​        builder.Append(i).Append(param[i]);
​      }

​      byte[] key = Encoding.UTF8.GetBytes(deviceSecret);
​      byte[] signContent = Encoding.UTF8.GetBytes(builder.ToString());
​      var hmac = new HMACMD5(key);
​      byte[] hashBytes = hmac.ComputeHash(signContent);
​      StringBuilder signBuilder = new StringBuilder();
​      foreach (byte b in hashBytes)
​        signBuilder.AppendFormat("{0:x2}", b);
​      return signBuilder.ToString();
​    }
  }
}
·2.3.2 阿里云端的开发

然后我们登陆阿里云平台,进入物联网平台,点击左侧的规则引擎,会有一个数据流转列表,点击创建规则,规则描述可以不用填:

在这里插入图片描述

然后进入编辑页面,点击 编写SQL ,字段这一行输入 * ,表示直接透析,不需要SELECT。然后类型选择为 自定义 模式,选择我们的项目,我这里是test,然后选择我们的数据发出端,因为我们现在数据是从A到A,所以发出端就是设备A,我这里是computer,地址选择为user/update 就可以了。

在这里插入图片描述

点击确定后,我们再点击转发数据里面的添加操作,还是选择 自定义 ,选择我们的产品,我这里是 test ,然后这里还是选择设备A,因为我们数据的接收端还是设备A,在我这里也就是 computer,地址就是 user/get ,点击确定,这条将设备A得到的数据转给设备A的规则就完成了。然后回到规则引擎一开始的界面上,启动该规则引擎即可。

然后我们运行程序:

IMG_256

在文本框里输入我们要上传的值以后,点击“数据上传”,然后显示结果如下:

image-20200602221836801

我们设备A的值经过阿里云后又被我们接受了回来,并显示在了原来null的位置上。我们还可以查看阿里云上的日志服务来看到数据的传递:

进入日志服务,我们就可以看到如图的界面,设备行为分析包含了上线,数据的上传,数据的发布等行为。我们由本地设备A传输给云的数据在上行消息分析里可以查看,由云传输给设备A的数据可以在下行消息分析里面查看。

IMG_256

由此单设备的与云传输数据就完成了。

双设备通信

3.1设备的创建

在第二个任务的基础上,我们用同样的方法去在云上创建一个设备,我们称之为设备C,我这里是computer2。

我们测试的时候,设备A先是一个数据的发出端,设备C是数据的接收端;然后我们再让设备C作为数据的发出端,设备A作为数据的接收端,进行一个数据的双向传递。

首先我们先在阿里云上再创建一个设备出来(在同一个产品下),按照之前创建的方式即可。

IMG_256

然后我们再创建一个C#项目,也可以直接用之前写的设备A的代码复制出来就行,窗体改不改其实都可以。将里面对应好了的namespace以及DeviceName之类的string类进行修改,修改成设备C的参数即可。

·3.2规则引擎的修改和添加

然后我们需要去对阿里云上的规则引擎进行修改和增加。

我们先点开之前在任务2里创造好了的那条规则,将转发数据的地点进行修改:
IMG_256
将数据目的地的名字改为设备C的名字即可其他的都不需要进行修改。

IMG_256

修改完后,现在的这一条规则就是将数据由设备A转到设备C的一条规则。现在我们同样的,因为是双向通信,所以我们需要再建立一条由设备C到设备A的规则,与之前的那条规则一样,唯一有变动的就是这次是由computer2给computer,所以要把名字对调(原先是computer的选computer2,原先为computer2的选择computer),其他的都不用改变。

IMG_256

·3.3 程序的运行

然后我们运行两个程序:(我这里设备C的界面改了下,不改也没什么问题)

数据由A->C:

_@(OI((T4PO0%O3QZX03UNH

数据由C->A

IMG_256

数值的显示有时可能会显示不出来,原因是操作速度过慢导致账号已下线。最快的解决办法是重新启动两个程序后快速操作上述操作。

  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!对于使用C#窗体客户端与PLC进行TCP协议通信的问题,我可以给出一些基本的步骤和建议。 1. 确定PLC的IP地址和端口号:首先,您需要了解PLC的IP地址和端口号。这些信息通常可以在PLC的设置中找到。 2. 创建C#窗体应用程序:使用Visual Studio或其他适用的集成开发环境,创建一个C#窗体应用程序。 3. 导入必要的命名空间:您需要导入一些命名空间,以便能够使用相关的类和方法。常用的命名空间包括:System.Net.Sockets和System.IO。 4. 建立TCP连接:使用TcpClient类创建一个TCP连接到PLC。使用PLC的IP地址和端口号作为参数来实例化TcpClient对象。 5. 发送和接收数据:一旦建立了TCP连接,您可以使用NetworkStream类来发送和接收数据。通过获取TcpClient对象的GetStream()方法来获取NetworkStream对象。 6. 与PLC进行通信:根据PLC的通信协议,您需要了解相应的数据格式和通信规则。您可以发送特定格式的命令或请求以获取或设置PLC的状态。 7. 处理接收到的数据:当您收到来自PLC的响应数据时,您可以根据需要进行解析和处理。通常,您可以使用StreamReader类从NetworkStream中读取数据。 8. 关闭连接:当您完成与PLC的通信后,记得关闭TCP连接和释放相关资源。使用TcpClient的Close()方法来关闭连接。 请注意,具体的实现细节可能因PLC型号、通信协议和要求的数据格式而有所不同。您可能需要参考PLC的文档或联系PLC供应商以获取更详细的信息。此外,错误处理和异常处理也是重要的方面,以确保通信的稳定性和可靠性。 希望这些步骤和建议能对您有所帮助!如有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值