基于开源MQTT自主接入阿里云IoT平台(C#)

简介: 基于开源MQTT自主接入阿里云IoT平台(C#)

本文由 GXIC 作者 wongxmig 完成,欢迎关注 IoT 开发者社区

1. 准备工作

1.1 注册阿里云账号

使用淘宝账号或手机号,开通阿里云账号,并通过实名认证(可以用支付宝认证)

1.2 免费开通IoT物联网套件

产品官网 https://www.aliyun.com/product/iot

image.png | left | 462x328

1.3 软件开发环境

  • 语言 C#
  • 工具 Visual Studio IDE

2. IoT平台云端开发

2.1 创建基础版产品

产品信息

image.png | left | 540x333

消息通信Topic

image.png | left | 539x290

2.2 注册设备

获取设备身份三元组,ProductKey,DeviceName,DeviceSecret

image.png | left | 572x220

3. 设备端开发

3.1 IoT平台接入password签名算法文件

签名规则参考 https://www.yuque.com/cloud-dev/iot-tech/mebm5g

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
namespace iotxsdkmqttnet {
    public class IotSignUtils {
        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());
            //这里根据signMethod动态调整,本例子硬编码了: 'hmacmd5'
            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();
        }
    }
}

3.2 接入IoT平台C#版本的MQTT库

C#的mqtt库 https://www.nuget.org/packages/M2Mqtt/

3.3 设备端应用程序

using System;
using System.Net;
using System.Collections.Generic;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
using System.Text;
using System.Linq;

namespace iotMqttDemo {
    class MainClass {
        static string ProductKey = "******";
        static string DeviceName = "******";
        static string DeviceSecret = "******";
        static string RegionId = "cn-shanghai";

        static string PubTopic = "/" + ProductKey + "/" + DeviceName + "/update";
        static string SubTopic = "/" + ProductKey + "/" + DeviceName + "/get";

        public static void Main(string[] args)
        {
            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 = "tcp://" + ProductKey + ".iot-as-mqtt." + RegionId + ".aliyuncs.com";
            
            ConnectMqtt(targetServer, mqttClientId, mqttUserName, mqttPassword);
        }

        static 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 = "{'content':'msg from :" + mqttClientId + ", 这里是.NET设备'}";
            var id = client.Publish(PubTopic, Encoding.ASCII.GetBytes(content));

            //订阅消息
            client.Subscribe(new string[] { SubTopic }, new byte[] { 0 });
        }

        static void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
        {
            // handle message received
            string topic = e.Topic;
            string message = Encoding.ASCII.GetString(e.Message);
        }

    }
}

4. 运行结果

云端看到设备上线记录,数据上报记录

image.png | left | 584x310

至此,完成了.NET平台设备C#语言接入阿里云IoT物联网云平台的开发实践。

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法
【AAAI 2024】再创佳绩!阿里云人工智能平台PAI多篇论文入选
阿里云人工智能平台PAI发表的多篇论文在AAAI-2024上正式亮相发表。AAAI是由国际人工智能促进协会主办的年会,是人工智能领域中历史最悠久、涵盖内容最广泛的国际顶级学术会议之一,也是中国计算机学会(CCF)推荐的A类国际学术会议。论文成果是阿里云与浙江大学、华南理工大学联合培养项目等共同研发,深耕以通用人工智能(AGI)为目标的一系列基础科学与工程问题,包括多模态理解模型、小样本类增量学习、深度表格学习和文档版面此次入选意味着阿里云人工智能平台PAI自研的深度学习算法达到了全球业界先进水平,获得了国际学者的认可,展现了阿里云人工智能技术创新在国际上的竞争力。
|
3月前
|
机器学习/深度学习 PyTorch 算法框架/工具
在阿里云机器学习平台上布置一个PyTorch模型
在阿里云机器学习平台上布置一个PyTorch模型【1月更文挑战第21天】【1月更文挑战第105篇】
164 1
|
1月前
|
弹性计算 安全 定位技术
幻兽帕鲁服务器搭建攻略:【阿里云平台快速上手指南】
2024年,火爆畅销的《幻兽帕鲁》游戏让无数玩家着迷不已!那么,您是否急切想要拥有一个能与伙伴们一起畅快玩耍的游戏服务器呢?现在就跟随若城的脚步,一起动手搭建一个属于自己的《幻兽帕鲁》服务器吧!让这个新年有心意
|
2月前
|
弹性计算 Linux 数据安全/隐私保护
幻兽帕鲁服务器搭建攻略:阿里云平台快速上手指南
2024年,火爆畅销的《幻兽帕鲁》游戏让无数玩家着迷不已!那么,您是否急切想要拥有一个能与伙伴们一起畅快玩耍的游戏服务器呢?现在就跟随若城的脚步,一起动手搭建一个属于自己的《幻兽帕鲁》服务器吧!让这个新年有心意, 让这个寒假更有趣
75102 10
|
3月前
|
人工智能 自然语言处理 开发者
书生·浦语2.0开源,阿里云魔搭首发
书生·浦语2.0开源,阿里云魔搭首发
62 0
|
1月前
|
缓存 运维 监控
应用研发平台EMAS 常见问题之用华为的推送界面阿里云收不到如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
382 2
|
1月前
|
存储 数据采集 Apache
众安保险 CDP 平台:借助阿里云数据库 SelectDB 版内核 Apache Doris 打破数据孤岛,人群圈选提速4倍
随着业务在金融、保险和商城领域的不断扩展,众安保险建设 CDP 平台以提供自动化营销数据支持。早期 CDP 平台依赖于 Spark + Impala + Hbase + Nebula 复杂的技术组合,这不仅导致数据分析形成数据孤岛,还带来高昂的管理及维护成本。为解决该问题,众安保险引入 Apache Doris,替换了早期复杂的技术组合,不仅降低了系统的复杂性,打破了数据孤岛,更提升了数据处理的效率。
众安保险 CDP 平台:借助阿里云数据库 SelectDB 版内核 Apache Doris 打破数据孤岛,人群圈选提速4倍
|
3月前
|
机器学习/深度学习 人工智能 分布式计算
阿里云PAI:一站式AI研发平台,引领深度学习潮流
阿里云PAI:一站式AI研发平台,引领深度学习潮流 随着人工智能的飞速发展,深度学习框架已经成为AI研发的核心工具。然而,选择合适的深度学习框架并不容易,需要考虑的因素包括计算性能、易用性、支持的算法组件等多种因素。今天,我们就来介绍一款一站式AI研发平台——阿里云PAI,看看它如何解决这些痛点。
116 1
|
3月前
|
弹性计算 监控 NoSQL
扩展至千万级用户:阿里云平台的初学者指南
【1月更文挑战第7天】这几天支原体感染了,每天半夜都咳醒,实在撑不住了才断更几天。