using System.Data; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; using Common; using CommonEntity; using LogCap.Common; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Diagnostics; using NLog; using RestSharp; using RestSharp.Authenticators; using ViewModels; namespace EMQX_HttpAuth.Controllers { [Route("api/[controller]/[action]")] [ApiController] public class SocketTcpController : ControllerBase { private readonly Logger _logger = LogManager.GetCurrentClassLogger(); public static string tcp_server = "http://localhost:8086"; public static string mqtt_server = "http://43.138.217.154:18083"; public IList HexSet = new List() { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'a', 'b', 'c', 'd', 'e', 'f' }; public IConfiguration Configuration { get; set; } public SocketTcpController(IConfiguration config) { this.Configuration = config; } /// /// 获取所有在线的 下位机 客户端,返回的数据是 IP:端口的形式 /// /// /// [HttpPost()] async public Task Get_all_TCPClients([FromBody] Data data) { RestClient client1 = new RestClient(tcp_server); //Console.WriteLine("发送MQTT的数据为:" + str); var request1 = new RestRequest("/blw/tcphandle", Method.Post); //注意方法是POST //Console.WriteLine("Topic: " + debug_log_report_mqtt_topic); request1.AddParameter("cmd", "get_tcp_info"); request1.AddParameter("parameterlist", ""); var Q = await client1.ExecuteAsync(request1); return Q.Content; } /// /// 获取所有在线的MQTTClient /// /// /// [HttpPost()] async public Task Get_all_MQTTClients([FromBody] QueryData data) { string? Key = Configuration["Key"]; string? Security = Configuration["Security"]; var option = new RestClientOptions() { BaseUrl = new Uri(mqtt_server), Authenticator = new HttpBasicAuthenticator(Key, Security) }; RestClient client1 = new RestClient(option); //Console.WriteLine("发送MQTT的数据为:" + str); var request1 = new RestRequest("/api/v5/clients", Method.Get); //注意方法是POST //Console.WriteLine("Topic: " + debug_log_report_mqtt_topic); request1.AddQueryParameter("limit", data.Limit); request1.AddQueryParameter("page", data.Page); request1.AddQueryParameter("isTrusted", true); var Q = await client1.ExecuteAsync(request1); //返回的数据是 //{ // "data": [ // { // "recv_oct": 147525, // "send_msg.dropped.expired": 0, // "recv_msg.qos0": 0, // "inflight_max": 32, // "recv_msg.qos1": 3320, // "send_msg.qos0": 0, // "recv_msg.qos2": 0, // "expiry_interval": 0, // "send_msg.dropped": 0, // "mqueue_len": 0, // "proto_ver": 5, // "keepalive": 60, // "inflight_cnt": 0, // "node": "emqx@127.0.0.1", // "created_at": "2025-06-09T16:08:38.394+08:00", // "send_cnt": 9436, // "ip_address": "43.138.217.154", // "clean_start": true, // "proto_name": "MQTT", // "enable_authn": true, // "mountpoint": null, // "is_persistent": false, // "send_msg.qos1": 6113, // "send_msg.dropped.too_large": 0, // "send_oct": 331649, // "recv_msg": 3320, // "heap_size": 6772, // "username": "admin", // "send_msg.dropped.queue_full": 0, // "send_msg": 6113, // "clientid": "newemqttclient", // "subscriptions_max": "infinity", // "mqueue_max": 1000, // "recv_pkt": 9436, // "user_property": {}, // "port": 36036, // "connected_at": "2025-06-09T16:08:38.394+08:00", // "mailbox_len": 0, // "recv_msg.dropped": 0, // "subscriptions_cnt": 1, // "is_bridge": false, // "awaiting_rel_max": 100, // "awaiting_rel_cnt": 0, // "mqueue_dropped": 0, // "send_pkt": 9436, // "send_msg.qos2": 0, // "recv_msg.dropped.await_pubrel_timeout": 0, // "connected": true, // "reductions": 130011309, // "recv_cnt": 9436, // "listener": "tcp:default" // } // ], // "meta": { // "count": 3, // "limit": 20, // "page": 1, // "hasnext": false // } //} var DDD = System.Text.Json.JsonSerializer.Deserialize(Q.Content); var DDD1 = DDD.data.Select(A => new NiMingOO { Listener = A["listener"].ToString(), UserName = A["username"].ToString(), WWWWIP = A["ip_address"].ToString(), WWWWPort = A["port"].ToString(), ClientId = A["clientid"].ToString(), Connected = A["connected"].ToString(), connected_DateTime = A["connected_at"].ToString() }).ToList(); return DDD1; } public static string FrameNoKey = "FrameNoKey"; [HttpPost()] async public Task send_data_to_target([FromBody] Data data) { RMsg r = new RMsg(); try { RestClient client1 = new RestClient(tcp_server); var request1 = new RestRequest("/blw/tcphandle", Method.Post); request1.AddParameter("cmd", data.Cmd); var VData = data.Parameterlist; string? HHH1 = VData.data; string? HHH2 = HHH1.Replace(" ", ""); if (IsIllegalHexadecimal(HHH2) == false) { request1.AddParameter("parameterlist", JsonSerializer.Serialize(VData)); var Q = await client1.ExecuteAsync(request1); r.isok = true; r.message = "success"; } else { r.isok = false; r.message = "错误,发送的数据必须是 16进制"; } } catch (Exception ex) { r.message = ex.Message; r.isok = false; } return r; } /// /// 发送控制数据 /// 也可以 发送控制指令通过clientid /// 接口加好了。发送控制指令接口 地址: ///http://iot-manage.uts-data.com:5001/api/sockettcp/send_data_to_targetnew /// ///发送数据如下: ///{ /// "Cmd": "tcp_send_data_clientid", /// "Parameterlist": { /// "device_clientid": "71", /// "command_word":"04", /// "data": "AA BB CC DD EE FF AA FF AA" /// } ///} ///command_word 是命令字,device_clientid是CID。data 是要发送的 控制数据 /// /// /// [HttpPost()] async public Task send_data_to_targetnew([FromBody] Data data) { RMsg r = new RMsg(); try { var KKK = CSRedisCacheHelper.ForeverGet(FrameNoKey); if (KKK == 0) { CSRedisCacheHelper.Forever(FrameNoKey, 0); } else { CSRedisCacheHelper.GenericSerNo(FrameNoKey); } ushort Xuhao = CSRedisCacheHelper.ForeverGet(FrameNoKey); ushort NewXuHao = 0; if (Xuhao == ushort.MaxValue) { NewXuHao = 0; } else { NewXuHao = (ushort)(Xuhao + 1); } CSRedisCacheHelper.Forever(FrameNoKey, NewXuHao); RestClient client1 = new RestClient(tcp_server); var request1 = new RestRequest("/blw/tcphandle", Method.Post); //cmd 是 tcp_send_data request1.AddParameter("cmd", data.Cmd); var VData = data.Parameterlist; //组装命令 List lll = new List(); //包头 lll.Add(0xAA); //整包长度 lll.Add(0x00); lll.Add(0x00); //包序号 byte[] XXX = BitConverter.GetBytes(NewXuHao); lll.AddRange(XXX); //重发次数 lll.Add(0x00); string SSS = VData.device_clientid; int SXSX = int.Parse(SSS); //设备序列号 byte[] SXBy = BitConverter.GetBytes(SXSX); lll.AddRange(SXBy); // 要加密的数据 List 加密数据表 = new List(); //命令字 var UUU = VData.command_word; ushort III = ushort.Parse(UUU); byte[] CCC = BitConverter.GetBytes(III); 加密数据表.AddRange(CCC); string? HHH1 = VData.data; string? HHH2 = HHH1.Replace(" ", ""); byte[] finally_data = Tools.HEXString2ByteArray(HHH2); 加密数据表.AddRange(finally_data); //将数据头复制一份 //List jisuan = new List(lll); //加上数据段部分 //jisuan.AddRange(加密数据表); //jisuan.Add(0x00); //jisuan.Add(0x00); //var dainfo = jisuan.ToArray(); //byte[] CRCList = BitConverter.GetBytes(crc); //加密数据表.AddRange(CRCList); byte[] key = new byte[] { }; var TST = CSRedisCacheHelper.HMGet(0, CacheKey.DeviceInfo, VData.device_clientid); if (TST != null) { if (TST[0] != null) { key = Encoding.ASCII.GetBytes(TST[0]); } else { key = Encoding.ASCII.GetBytes("abcdefg123456"); } } byte[] decryptedContent = Tools.IHIOT_Message_Content_Encrypt(NewXuHao, key, 加密数据表.ToArray()); lll.AddRange(decryptedContent); var dainfo = lll.ToArray(); int changdu = dainfo.Length; changdu = changdu + 2 + 6; ushort sss1 = (ushort)changdu; byte[] bas = BitConverter.GetBytes(sss1); dainfo[1] = bas[0]; dainfo[2] = bas[1]; //CRC ushort crc = Tools.CRC16(dainfo, dainfo.Length);//最后两个字节,加CRC16校验 //dainfo[dainfo.Length - 2] = Convert.ToByte(crc & 0xff); //dainfo[dainfo.Length - 1] = Convert.ToByte((crc >> 8) & 0xff); var USB = dainfo.ToList(); byte[] CRCList = BitConverter.GetBytes(crc); USB.AddRange(CRCList); USB.AddRange(new byte[] { 0x2D, 0x2D, 0x0D, 0x0A, 0x2D, 0x2D }); var CMDdata = USB.ToArray(); VData.data = Tools.ByteToString(CMDdata); if (IsIllegalHexadecimal(HHH2) == false) { request1.AddParameter("parameterlist", JsonSerializer.Serialize(VData)); var Q = await client1.ExecuteAsync(request1); r.isok = true; r.message = "success"; } else { r.isok = false; r.message = "错误,发送的数据必须是 16进制"; } } catch (Exception ex) { r.message = ex.Message + ex.StackTrace; r.isok = false; } return r; } [HttpPost()] async public Task send_data_to_lowermachine([FromBody] Data data) { RMsg r = new RMsg(); try { var KKK = CSRedisCacheHelper.ForeverGet(FrameNoKey); if (KKK == 0) { CSRedisCacheHelper.Forever(FrameNoKey, 0); } else { CSRedisCacheHelper.GenericSerNo(FrameNoKey); } var Xuhao = CSRedisCacheHelper.ForeverGet(FrameNoKey); RestClient client1 = new RestClient(tcp_server); var request1 = new RestRequest("/blw/tcphandle", Method.Post); //cmd 是 tcp_send_data request1.AddParameter("cmd", data.Cmd); var VData = data.Parameterlist; //var HHH = JsonSerializer.Deserialize(VData); List lll = new List(); //包头 lll.Add(0xAA); //整包长度 lll.Add(0x00); lll.Add(0x00); //包序号 byte[] XXX = BitConverter.GetBytes(Xuhao); lll.AddRange(XXX); //重发次数 lll.Add(0x00); string SSS = VData.device_clientid; int SXSX = int.Parse(SSS); //设备序列号 byte[] SXBy = BitConverter.GetBytes(SXSX); lll.AddRange(SXBy); List lll_new = new List(lll.ToArray()); //命令字 List jia_mi_bytes = new List(); var UUU = VData.command_word; ushort III = ushort.Parse(UUU); byte[] CCC = BitConverter.GetBytes(III); lll.AddRange(CCC); jia_mi_bytes.AddRange(CCC); string? HHH1 = VData.data; string? HHH2 = HHH1.Replace(" ", ""); byte[] finally_data = Tools.HEXString2ByteArray(HHH2); lll.AddRange(finally_data); jia_mi_bytes.AddRange(finally_data); lll.Add(0x00); lll.Add(0x00); var dainfo = lll.ToArray(); //CRC ushort crc = Tools.CRC16(dainfo, dainfo.Length - 2);//最后两个字节,加CRC16校验 dainfo[dainfo.Length - 2] = Convert.ToByte(crc & 0xff); dainfo[dainfo.Length - 1] = Convert.ToByte((crc >> 8) & 0xff); var dataF = dainfo.ToList(); byte[] CRCList = BitConverter.GetBytes(crc); jia_mi_bytes.AddRange(CRCList); byte[] key = new byte[] { }; var TST = CSRedisCacheHelper.HMGet(0, CacheKey.DeviceInfo, VData.device_clientid); if (TST != null) { key = Encoding.ASCII.GetBytes(TST[0].SecretKey); } byte[] decryptedContent = Tools.IHIOT_Message_Content_Encrypt(Xuhao, key, jia_mi_bytes.ToArray()); dataF.AddRange(new byte[] { 0x2D, 0x2D, 0x0D, 0x0A, 0x2D, 0x2D }); var CMDdata = dataF.ToArray(); int len = CMDdata.Length; ushort sss1 = (ushort)len; byte[] bas = BitConverter.GetBytes(sss1); CMDdata[1] = bas[0]; CMDdata[2] = bas[1]; VData.data = Tools.ByteToString(CMDdata); if (IsIllegalHexadecimal(HHH2) == false) { request1.AddParameter("parameterlist", JsonSerializer.Serialize(VData)); var Q = await client1.ExecuteAsync(request1); r.isok = true; r.message = "success"; } else { r.isok = false; r.message = "错误,发送的数据必须是 16进制"; } } catch (Exception ex) { _logger.Error("错误:" + ex.Message); r.message = ex.Message; r.isok = false; } return r; } /// /// 判断十六进制字符串hex是否正确 /// /// 十六进制字符串 /// true:不正确,false:正确 public bool IsIllegalHexadecimal(string hex) { foreach (char item in hex) { if (!HexSet.Contains(item)) return true; } return false; } } public class MQTTData { public List> data { get; set; } public Dictionary meta { get; set; } } public class NiMingOO { public string? Listener { get; set; } public string? UserName { get; set; } public string? WWWWIP { get; set; } public string? WWWWPort { get; set; } public string? ClientId { get; set; } public string? Connected { get; set; } public string? connected_DateTime { get; set; } } public class QueryData { public int Limit { get; set; } public int Page { get; set; } } public class RMsg { public string message { get; set; } public bool isok { get; set; } } public class Data { public string? Cmd { get; set; } public SendData? Parameterlist { get; set; } } public class SendData { public string? endpoint { get; set; } /// /// 设备序号 /// public string? device_clientid { get; set; } public string? command_word { get; set; } public string? data { get; set; } } }