实例介绍
【实例简介】
【实例截图】
【核心代码】
//阿里云文档:https://help.aliyun.com/document_detail/30539.html?spm=5176.doc42743.6.574.ewvmlO // https://open.aliplus.com/doc_pass/mqtt_mode.html //#define TLS_DirectConnection using System; using Microsoft.SPOT; using uPLibrary.Networking.M2Mqtt; using uPLibrary.Networking.M2Mqtt.Exceptions; using uPLibrary.Networking.M2Mqtt.Messages; using System.Threading; using Microsoft.SPOT.Hardware; using System.Text; using YFSoft.Security.Cryptography; using YFSoft.IO; using YFSoft.NetMF; namespace YFMQTT { public class Program { //三元组信息 const string productKey = "a12F0j8PYhD"; const string deviceName = "yfth"; const string deviceSecret = "TC39z10E5V43j6XIG7XXug3PXNCovJQd"; const string hostServer = productKey ".iot-as-mqtt.cn-shanghai.aliyuncs.com"; //--// const string update_topic = "/" productKey "/" deviceName "/update"; const string error_topic = "/" productKey "/" deviceName "/update/error"; const string get_topic = "/" productKey "/" deviceName "/get"; const string post_topic = "/sys/" productKey "/" deviceName "/thing/event/property/post"; static int SendCount = 0, ReceiveCount = 0, ErrorCount = 0; static OutputPort led = new OutputPort((Cpu.Pin)(7*16 9),false); //PH9 #region //CA证书 static string caCert = "-----BEGIN CERTIFICATE-----\r\n" "MIIEmjCCBAOgAwIBAgIJAKps0iIhwLzrMA0GCSqGSIb3DQEBDQUAMGcxGzAZBgNV\r\n" "BAMMEkFsaXl1biBNUVRUIGJyb2tlcjETMBEGA1UECgwKYWxpeXVuLmNvbTEUMBIG\r\n" "A1UECwwLZ2VuZXJhdGUtQ0ExHTAbBgkqhkiG9w0BCQEWDmlvdEBhbGl5dW4uY29t\r\n" "MB4XDTE2MDQxNTAyMDU0M1oXDTI2MDQxMzAyMDU0M1owWzEPMA0GA1UEAwwGc2Vy\r\n" "dmVyMRMwEQYDVQQKDAphbGl5dW4uY29tMRQwEgYDVQQLDAtnZW5lcmF0ZS1DQTEd\r\n" "MBsGCSqGSIb3DQEJARYOaW90QGFsaXl1bi5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD\r\n" "gY0AMIGJAoGBAK5M/4eU9LD IpzQTFwHSNUPPMNwtDxg3ZOdGszJFdA4vgrVm/hn\r\n" "/TcHfdKKRDyUzwJb1FbNYpdNlXK5l/qLKkY WpzEzJFjUMV9O40cbMXPyQ1VjbLl\r\n" "SvlCGkmVTv8Q1B9fitzbKYGDznKBYES5P8IadvHmm74DtD9uQks6i62HAgMBAAGj\r\n" "ggJYMIICVDAMBgNVHRMBAf8EAjAAMBEGCWCGSAGG EIBAQQEAwIGQDALBgNVHQ8E\r\n" "BAMCBeAwLAYJYIZIAYb4QgENBB8WHUFsaXl1biBJb1QgQnJva2VyIENlcnRpZmlj\r\n" "YXRlMB0GA1UdDgQWBBQcOXMYLcexVRQ6MQKF9gxHYstSTDCBmQYDVR0jBIGRMIGO\r\n" "gBQOqXNDKdO1PQ4xP/tTwnR/gQbuDqFrpGkwZzEbMBkGA1UEAwwSQWxpeXVuIE1R\r\n" "VFQgYnJva2VyMRMwEQYDVQQKDAphbGl5dW4uY29tMRQwEgYDVQQLDAtnZW5lcmF0\r\n" "ZS1DQTEdMBsGCSqGSIb3DQEJARYOaW90QGFsaXl1bi5jb22CCQCpKzLXM7SzvTCB\r\n" "sgYDVR0RBIGqMIGnhxD gAAAAAAAAD4Vwv/ 12GohwQeCbCFhxAgAh4JsBQADT4V\r\n" "wv/ 12GohxAgAh4JsBQADVTlgzaCoNNVhxD wAAAAAAADT4Vwv/ 12GohxD wAAA\r\n" "AAAADcmk/090y3MlhxD gAAAAAAAAGSc0f/ 8tX6hwTAqGMBhwQK0zcChwQKJYEC\r\n" "hwR/AAABhxAAAAAAAAAAAAAAAAAAAAABgglsb2NhbGhvc3QwgYUGA1UdIAR MHww\r\n" "egYDKwUIMHMwHAYIKwYBBQUHAgEWEGh0dHA6Ly9sb2NhbGhvc3QwUwYIKwYBBQUH\r\n" "AgIwRzAQFglPd25UcmFja3MwAwIBARozVGhpcyBDQSBpcyBmb3IgQWxpeXVuIE1R\r\n" "VFQgYnJva2VyIGluc3RhbGxhdGlvbiBvbmx5MA0GCSqGSIb3DQEBDQUAA4GBAJdV\r\n" "BfFYEz/6bzHrAr/6bymO7iwA5qyUDd8WQo1G3D7QklN83A 5GMVK4E8bL8jtCbFv\r\n" "XO0u6hLN4sw0oE0Ntm2M8y 7 GaO6BAOotb2nwecMS67Ltn98j6rF3WLK2opO6Jr\r\n" "G5AeSj86gtAhr2ZVdfGpvWj74 gK4nG7cHnaiZOf\r\n" "-----END CERTIFICATE-----\r\n"; #endregion public static void Main() { Debug.Print("------ Aliyun MQTT ------"); GeneralStream gs = new GeneralStream(); if (gs.Open("DHT11") <= 0) { Debug.Print("Open DHT11 failed!"); return; } #region Ntp网络校时 string[] NtpSever = new string[] { "s2c.time.edu.cn", "time.windows.com", "s2g.time.edu.cn" }; Utility.SetLocalTime(new DateTime(2050, 1, 1, 0, 0, 0)); //先强制设置一个,满足:设备时间 9小时 > 服务器时间即可 for (int i = 0; i < 3; i ) { if (DamperMonitNet.Ntp.UpdateTimeFromNtpServer(NtpSever[i], 8)) break; } Debug.Print(DateTime.Now.ToString()); #endregion //--// while (true) { #if TLS_DirectConnection //目前阿里云支持TLSV1.0,TLSV1.1,TLSV1.2 版本的协议来建立安全连接 MqttClient mqttClient = new MqttClient( hostServer, 1883, true, new System.Security.Cryptography.X509Certificates.X509Certificate(Encoding.UTF8.GetBytes(caCert)), null, //new System.Security.Cryptography.X509Certificates.X509Certificate(Encoding.UTF8.GetBytes(clientCert)), MqttSslProtocols.TLSv1_0 ); #else MqttClient mqttClient = new MqttClient( hostServer, 1883, false, null, null, //new System.Security.Cryptography.X509Certificates.X509Certificate(Encoding.UTF8.GetBytes(clientCert)), MqttSslProtocols.None ); #endif //CPU ID LargeBuffer lb = new LargeBuffer(1024); (new LargeBufferMarshaller(1003)).UnMarshalBuffer(ref lb); string CpuID = ""; for (int i = 0; i < 12; i ) CpuID = lb.Bytes[i].ToString("X2"); string clientId = CpuID; string timestamp = DateTime.Now.Ticks.ToString(); #if TLS_DirectConnection string mqttClientId = clientId "|securemode=2,signmethod=hmacsha1,timestamp=" timestamp "|"; #else string mqttClientId = clientId "|securemode=3,signmethod=hmacsha1,timestamp=" timestamp "|"; #endif string mqttUsername = deviceName "&" productKey; string content = "clientId" clientId "deviceName" deviceName "productKey" productKey "timestamp" timestamp; HMACSHA1 hmacsha1 = new HMACSHA1(); byte[] Key = Encoding.UTF8.GetBytes(deviceSecret); byte[] dataBuffer = Encoding.UTF8.GetBytes(content); byte[] hashBytes = hmacsha1.ComputeHash(Key, dataBuffer); string mqttPassword = ""; for (int i = 0; i < hashBytes.Length; i ) { mqttPassword = hashBytes[i].ToString("X2"); } mqttClient.Connect(mqttClientId, mqttUsername, mqttPassword, false, 10000); //连接成功 if (mqttClient.IsConnected) { mqttClient.ConnectionClosed = new MqttClient.ConnectionClosedEventHandler(mqttClient_ConnectionClosed); mqttClient.MqttMsgPublished = new MqttClient.MqttMsgPublishedEventHandler(mqttClient_MqttMsgPublished); mqttClient.MqttMsgPublishReceived = new MqttClient.MqttMsgPublishEventHandler(mqttClient_MqttMsgPublishReceived); mqttClient.MqttMsgSubscribed = new MqttClient.MqttMsgSubscribedEventHandler(mqttClient_MqttMsgSubscribed); mqttClient.MqttMsgUnsubscribed = new MqttClient.MqttMsgUnsubscribedEventHandler(mqttClient_MqttMsgUnsubscribed); //消息订阅 string[] topics = new string[] { get_topic, error_topic }; //0-至多一次 1-至少一次 2- 确保一次(不支持) byte[] qosLevels = new byte[] { 1, 1 }; mqttClient.Subscribe(topics, qosLevels); while (mqttClient.IsConnected) { try { byte[] bytData = new byte[4]; float T = 0; float H = 0; int ret = gs.IOControl((int)(6*16 11)); //PG11 if (ret != -1) { bytData[0] = (byte)(ret & 0xFF); bytData[1] = (byte)(ret >> 8 & 0xFF); bytData[2] = (byte)(ret >> 16 & 0xFF); bytData[3] = (byte)(ret >> 24 & 0xFF); H = Byte2Float(bytData[0], bytData[1]); T = Byte2Float(bytData[2], bytData[3]); Debug.Print("H = " H.ToString() " T = " T.ToString()); string payload_json = "{" "\"id\": " DateTime.Now.Ticks "," "\"params\":{" "\"temperature\":" T "," "\"humidity\":" H "," "}," "\"method\":\"thing.event.property.post\"" "}"; string Data = Guid.NewGuid().ToString(); mqttClient.Publish(post_topic, Encoding.UTF8.GetBytes(payload_json), MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE, false); Debug.Print(payload_json); } } catch { ErrorCount; break; } string info = "MQTT[S]" SendCount " [R]" ReceiveCount " [E]" ErrorCount; Debug.Print(info); System.Threading.Thread.Sleep(60000); //1分钟访问一次 一天1440次 } } //释放相关资源 try { mqttClient.ConnectionClosed -= new MqttClient.ConnectionClosedEventHandler(mqttClient_ConnectionClosed); mqttClient.MqttMsgPublished -= new MqttClient.MqttMsgPublishedEventHandler(mqttClient_MqttMsgPublished); mqttClient.MqttMsgPublishReceived -= new MqttClient.MqttMsgPublishEventHandler(mqttClient_MqttMsgPublishReceived); mqttClient.MqttMsgSubscribed -= new MqttClient.MqttMsgSubscribedEventHandler(mqttClient_MqttMsgSubscribed); mqttClient.MqttMsgUnsubscribed -= new MqttClient.MqttMsgUnsubscribedEventHandler(mqttClient_MqttMsgUnsubscribed); mqttClient.Disconnect(); } catch { } //3秒后重连MQTT System.Threading.Thread.Sleep(3000); } } //取消订阅完成 static void mqttClient_MqttMsgUnsubscribed(object sender, uPLibrary.Networking.M2Mqtt.Messages.MqttMsgUnsubscribedEventArgs e) { Debug.Print("MqttMsgUnsubscribed:" e.MessageId.ToString()); } //消息订阅完成 static void mqttClient_MqttMsgSubscribed(object sender, uPLibrary.Networking.M2Mqtt.Messages.MqttMsgSubscribedEventArgs e) { Debug.Print("MqttMsgSubscribed:" e.MessageId.ToString()); } //信息接收完成 static void mqttClient_MqttMsgPublishReceived(object sender, uPLibrary.Networking.M2Mqtt.Messages.MqttMsgPublishEventArgs e) { ReceiveCount ; Debug.Print("MqttMsgPublishReceived:" e.Topic); string json = ""; if (e.Message.Length > 0) { //{"method":"thing.service.property.set","id":"196011725","params":{"LED":1},"version":"1.0.0"} json = new string(System.Text.UTF8Encoding.UTF8.GetChars(e.Message)); Debug.Print("Message:" json); string strLED =json.Substring(json.IndexOf("LED") 5,1); led.Write((strLED == "1")); } } //消息发布成功 static void mqttClient_MqttMsgPublished(object sender, uPLibrary.Networking.M2Mqtt.Messages.MqttMsgPublishedEventArgs e) { SendCount ; Debug.Print("MqttMsgPublished:" e.MessageId.ToString()); } //连接断开 static void mqttClient_ConnectionClosed(object sender, EventArgs e) { Debug.Print("ConnectionClosed!!!"); ErrorCount; } static float Byte2Float(byte data1, byte data2) { float temp1 = data1; float temp2 = 0; if (data2 < 10) { temp2 = (float)(data2 / 10.0); } else if (data2 < 100) { temp2 = (float)(data2 / 100.0); } else { temp2 = (float)(data2 / 1000.0); } return temp1 temp2; } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论