From 8c8030cb03c22201e22b514f8f653ca1c96bb52a Mon Sep 17 00:00:00 2001 From: dev02 Date: Fri, 12 May 2023 09:48:06 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=BE=8C=E7=AB=AF]=20=E6=96=B0=E5=A2=9EHiNet?= =?UTF-8?q?=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ApiControllers/HiNetController.cs | 806 ++++++++++++++++++ FrontendWebApi/Models/HiNet.cs | 12 + 2 files changed, 818 insertions(+) create mode 100644 FrontendWebApi/ApiControllers/HiNetController.cs create mode 100644 FrontendWebApi/Models/HiNet.cs diff --git a/FrontendWebApi/ApiControllers/HiNetController.cs b/FrontendWebApi/ApiControllers/HiNetController.cs new file mode 100644 index 0000000..6396606 --- /dev/null +++ b/FrontendWebApi/ApiControllers/HiNetController.cs @@ -0,0 +1,806 @@ +using System; +using System.Text; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using FrontendWebApi.Models; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +/// +/// HiNet 企業簡訊 API for .NetCore 2.0 +/// Web : https://sms.hinet.net +/// Email : hiair@hinet.net +/// +/// Changelog : +/// 2018/04/19 - 初版 +/// + +namespace FrontendWebApi.ApiControllers +{ + /// + /// Request類別 + /// + enum RequestType : byte + { + LOGIN = 0, + SEND = 1, + QUERY = 2, + SENDLONG = 11, + QUERYLONG = 12, + SENDFOREIGN = 15, + CANCEL = 16, + CANCELLONG = 17, + SENDFOREIGNLONG = 18 + } + + /// + /// 訊息編碼 + /// + enum MsgCoding : byte + { + BIG5 = 1, + BINARY = 2, + UCS2 = 3, + UTF8 = 4 + } + + /// + /// 其他定數常數 + /// + enum MsgConst : byte + { + UNUSED = 0 + } + + /// + /// 資料長度定義 + /// + enum LENGTH : int + { + RESPSET = 80, + REQSET = 100, + CONTENT = 160, + REQUEST = 266, + RESPONSE = 244, + SMS_LEN = 70, + ASCII_SMS_LEN = 159, + LONG_ASCII_MSG_LEN = 153, + LONG_MSG_LEN = 67, + MAX_LONG_SPLIT = 10 + } + + [Serializable] + [StructLayout(LayoutKind.Sequential, Pack = 1)] + /// + /// 傳送資料到hiAirV2的資料結構 + /// + struct MsgRequest + { + public byte type; //訊息型態 + public byte coding; //訊息編碼種類 + public byte priority; //訊息優先權 + public byte countryCode; //手機國碼 + public byte setLen; //set[] 訊息內容的長度 + public byte contentLen; //content[]訊息內容的長度 + + // 訊息相關資料設定 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)LENGTH.REQSET)] + public byte[] set; + + // 簡訊內容 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)LENGTH.CONTENT)] + public byte[] content; + } + + [Serializable] + [StructLayout(LayoutKind.Sequential, Pack = 1)] + /// + /// 從hiAirV2接收資料的資料結構 + /// + struct MsgResponse + { + public byte code; //回傳訊息代碼 + public byte coding; //訊息編碼種類 + public byte setLen; //set[] 訊息內容的長度 + public byte contentLen; //content[]訊息內容的長度 + + // 訊息相關資料 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)LENGTH.RESPSET)] + public byte[] set; + + // MessageID或其他文字描述 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)LENGTH.CONTENT)] + public byte[] content; + } + + /// + /// HiNet企業簡訊 Hiair .Net Core API + /// + public class HiNetController : MyBaseApiController + { + + public Socket socket; + + // 傳送型態 + private const String SEND_NOW = "01"; //即時傳送 + private const String SEND_EXPIRE = "02"; //截止重送時間 + private const String SEND_RESERVE = "03"; //預約傳送 + private const String SEND_RESERVE_EXPIRE = "04"; //預約傳送+截止重送時間 + + // 回覆結果的訊息說明 + private StringBuilder retMessage = new StringBuilder(); + + public HiNetController() { } + + /// + /// 將MsgRequest結構轉為byte array + /// + /// MsgRequest結構 + /// byte array + byte[] encode(MsgRequest req) + { + int size = Marshal.SizeOf(req); + byte[] buf = new byte[size]; + + IntPtr ptr = Marshal.AllocHGlobal(size); + Marshal.StructureToPtr(req, ptr, true); + Marshal.Copy(ptr, buf, 0, size); + Marshal.FreeHGlobal(ptr); + return buf; + } + + /// + /// 將byte array轉為MsgResponse結構 + /// + /// byte array + /// MsgResponse結構 + MsgResponse decode(byte[] buf) + { + MsgResponse rep = new MsgResponse(); + int size = buf.Length; + + IntPtr ptr = Marshal.AllocHGlobal(size); + Marshal.Copy(buf, 0, ptr, size); + rep = (MsgResponse)Marshal.PtrToStructure(ptr, rep.GetType()); + Marshal.FreeHGlobal(ptr); + return rep; + } + + /// + /// 建立與hiAirV2的連線 + /// + /// Server IP + /// Server Port + /// 登入帳號 + /// 登入密碼 + /// 0表示連線正常,-3,-4表示異常或斷線。其餘回傳值請參考規格書 + public int StartCon(String serverName, int port, String userID, String passwd) + { + // 回傳值變數 + int ret = 0; + + int timeout = 1000 * 60; //60sec + + socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + socket.ReceiveTimeout = timeout; + socket.SendTimeout = timeout; + + // 將資料清空 + retMessage.Clear(); + + try + { + socket.Connect(serverName, port); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + retMessage = new StringBuilder("Socket Create Error!"); + return -3; + } + + // 設定登入帳號與密碼 + String msgSet = String.Format("{0}\0{1}\0", userID, passwd); + String msgContent = String.Empty; + + // 設定Request資料 + MsgRequest req = new MsgRequest(); + req.type = (byte)RequestType.LOGIN; + req.coding = (byte)MsgCoding.BIG5; + req.priority = (byte)MsgConst.UNUSED; + req.countryCode = (byte)MsgConst.UNUSED; + req.setLen = (byte)msgSet.Length; + req.contentLen = (byte)msgContent.Length; + req.set = Encoding.ASCII.GetBytes(msgSet.PadRight((int)LENGTH.REQSET, '\0')); + req.content = Encoding.ASCII.GetBytes(msgContent.PadRight((int)LENGTH.CONTENT, '\0')); + + // 傳送與接收資料 + ret = sendToserver(req); + + return ret; + } + + /// + /// 立即傳送文字簡訊 + /// + /// 門號 + /// 簡訊內容 + /// 0表示訊息成功傳送至主機,其餘回傳值請參考規格書 + public int SendMsg(String mobileNum, String SMSMessage) + { + return this.Send(mobileNum, SMSMessage, String.Empty, String.Empty); + } + + /// + /// 預約傳送文字簡訊 + /// + /// 門號 + /// 簡訊內容 + /// 預約傳送時間,格式yymmddhhmmss + /// 0表示訊息成功傳送至主機,其餘回傳值請參考規格書 + public int SendMsg_Reserve(String mobileNum, String SMSMessage, String reserveTime) + { + return this.Send(mobileNum, SMSMessage, reserveTime, String.Empty); + } + + /// + /// 立即傳送文字簡訊加重送截止時間 + /// + /// 門號 + /// 簡訊內容 + /// 重送截止時間,單位分鐘0001 ~ 1440 + /// 0表示訊息成功傳送至主機,其餘回傳值請參考規格書 + public int SendMsg_Expire(String mobileNum, String SMSMessage, String expireTime) + { + return this.Send(mobileNum, SMSMessage, String.Empty, expireTime); + } + + /// + /// 預約傳送文字簡訊加重送截止時間 + /// + /// 門號 + /// 簡訊內容 + /// 預約傳送時間,格式yymmddhhmmss + /// 重送截止時間,單位分鐘0001 ~ 1440 + /// 0表示訊息成功傳送至主機,其餘回傳值請參考規格書 + public int SendMsg_Reserve_Expire(String mobileNum, String SMSMessage, String reserveTime, String expireTime) + { + return this.Send(mobileNum, SMSMessage, reserveTime, expireTime); + } + + /// + /// 傳送文字簡訊(封裝程式僅供內部呼叫用) + /// + /// 門號 + /// 簡訊內容 + /// 預約傳送時間,格式yymmddhhmmss + /// 重送截止時間,單位分鐘0001 ~ 1440 + /// 0表示訊息成功傳送至主機,其餘回傳值請參考規格書 + private int Send(String mobileNum, String SMSMessage, String reserveTime, String expireTime) + { + + int ret = 0; + retMessage.Clear(); + + byte[] utf8 = Encoding.UTF8.GetBytes(SMSMessage); + byte[] ucs2 = Encoding.GetEncoding("UTF-16BE").GetBytes(SMSMessage); + + int contentLength = 0; + + MsgRequest req = new MsgRequest(); + + // 若UTF8 Bytes長度與原資料長度相等,表示為純英數字 + if (utf8.Length == SMSMessage.Length) + { //純英數 + req.coding = (byte)MsgCoding.BIG5; + contentLength = SMSMessage.Length; + if (SMSMessage.Length > (int)LENGTH.ASCII_SMS_LEN) + { + retMessage = new StringBuilder("message content length exceeded"); + return -5; + } + } + else + { + req.coding = (byte)MsgCoding.UCS2; //非純英數 + contentLength = ucs2.Length; + + if (SMSMessage.Length > (int)LENGTH.SMS_LEN) + { + retMessage = new StringBuilder("message content length exceeded"); + return -5; + } + + } + + // 帶+號為國外文字簡訊,否則為國內簡訊 + byte msgType = mobileNum.StartsWith("+") ? (byte)RequestType.SENDFOREIGN : (byte)RequestType.SEND; + + String msgSet; + + if (String.IsNullOrEmpty(reserveTime) && String.IsNullOrEmpty(expireTime) == false) + { + // 立即傳送 + msgSet = String.Format("{0}\0{1}\0{2}\0", mobileNum, SEND_EXPIRE, expireTime); + } + else if (String.IsNullOrEmpty(reserveTime) == false && String.IsNullOrEmpty(expireTime)) + { + // 立即傳送加重送截止時間 + msgSet = String.Format("{0}\0{1}\0{2}\0", mobileNum, SEND_RESERVE, reserveTime); + } + else if (String.IsNullOrEmpty(reserveTime) == false && String.IsNullOrEmpty(expireTime) == false) + { + // 預約傳送 + msgSet = String.Format("{0}\0{1}\0{2}\0{3}\0", mobileNum, SEND_RESERVE_EXPIRE, reserveTime, expireTime); + } + else + { + // 預約傳送加重送截止時間 + msgSet = String.Format("{0}\0{1}\0", mobileNum, SEND_NOW); + } + + // 設定Request資料 + req.type = msgType; + req.priority = (byte)MsgConst.UNUSED; + req.countryCode = (byte)MsgConst.UNUSED; + req.setLen = (byte)msgSet.Length; + req.contentLen = (byte)contentLength; + req.set = Encoding.ASCII.GetBytes(msgSet.PadRight((int)LENGTH.REQSET, '\0')); + if (req.coding == (byte)MsgCoding.UCS2) + { + //非純英數字以UCS2 byte傳送 + req.content = Encoding.GetEncoding("UTF-16BE").GetBytes(SMSMessage.PadRight((int)LENGTH.CONTENT, '\0')); + } + else + { + //純英數字以BIG5 byte傳送 + req.content = Encoding.ASCII.GetBytes(SMSMessage.PadRight((int)LENGTH.CONTENT, '\0')); + } + + // 傳送與接收資料 + ret = this.sendToserver(req); + + return ret; + + } + + /// + /// 立即傳送長簡訊 + /// 長簡訊中文每個分則長度為67個字,純英數字每個為則為153個字。 + /// 若中文簡訊沒大於70個字,或是純英數字沒大於159個字,請使用一般簡訊SendMsg相關Method。 + /// 否則將被拆為多則傳送或依實際使用則數計費 + /// + /// 門號 + /// 簡訊內容 + /// + public int SendMsg_Long(String mobileNum, String SMSMessage) + { + return this.SendLong(mobileNum, SMSMessage, String.Empty, String.Empty); + } + + /// + /// 傳送長簡訊加重送期限 + /// 長簡訊中文每個分則長度為67個字,純英數字每個為則為153個字。 + /// 若中文簡訊沒大於70個字,或是純英數字沒大於159個字,請使用一般簡訊SendMsg相關Method。 + /// 否則將被拆為多則傳送或依實際使用則數計費 + /// + /// 門號 + /// 簡訊內容 + /// 重送截止時間,單位分鐘0001 ~ 1440 + /// + public int SendMsg_Long_Expire(String mobileNum, String SMSMessage, String expireTime) + { + return this.SendLong(mobileNum, SMSMessage, String.Empty, expireTime); + } + + /// + /// 傳送長簡訊加預約時間 + /// 長簡訊中文每個分則長度為67個字,純英數字每個為則為153個字。 + /// 若中文簡訊沒大於70個字,或是純英數字沒大於159個字,請使用一般簡訊SendMsg相關Method。 + /// 否則將被拆為多則傳送或依實際使用則數計費 + /// + /// 門號 + /// 簡訊內容 + /// 預約傳送時間,格式yymmddhhmmss + /// + public int SendMsg_Long_Reserve(String mobileNum, String SMSMessage, String reserveTime) + { + return this.SendLong(mobileNum, SMSMessage, reserveTime, String.Empty); + } + + /// + /// 傳送長簡訊加預約時間與重送期限 + /// 長簡訊中文每個分則長度為67個字,純英數字每個為則為153個字。 + /// 若中文簡訊沒大於70個字,或是純英數字沒大於159個字,請使用一般簡訊SendMsg相關Method。 + /// 否則將被拆為多則傳送或依實際使用則數計費 + /// + /// 門號 + /// 簡訊內容 + /// 預約傳送時間,格式yymmddhhmmss + /// 重送截止時間,單位分鐘0001 ~ 1440 + /// + public int SendMsg_Long_Reserve_Expire(String mobileNum, String SMSMessage, String reserveTime, String expireTime) + { + return this.SendLong(mobileNum, SMSMessage, reserveTime, expireTime); + } + + /// + /// 傳送長簡訊(封裝程式僅供內部呼叫用) + /// 長簡訊中文每個分則長度為67個字,純英數字每個為則為153個字。 + /// 若中文簡訊沒大於70個字,或是純英數字沒大於159個字,請使用一般簡訊SendMsg*。 + /// 否則將被拆為多則傳送或依實際使用則數計費 + /// + /// 門號 + /// 簡訊內容 + /// 預約傳送時間,格式yymmddhhmmss + /// 重送截止時間,單位分鐘0001 ~ 1440 + /// + private int SendLong(String mobileNum, String SMSMessage, String reserveTime, String expireTime) + { + int ret = 0; + retMessage.Clear(); + + byte[] utf8 = Encoding.UTF8.GetBytes(SMSMessage); + byte[] ucs2 = Encoding.GetEncoding("UTF-16BE").GetBytes(SMSMessage); + int msg_len = 0; + + MsgCoding coding; + if (utf8.Length == SMSMessage.Length) + { + coding = MsgCoding.BIG5; + msg_len = (int)LENGTH.LONG_ASCII_MSG_LEN; // 純英數字每則分則最長153個字 + } + else + { + coding = MsgCoding.UCS2; + msg_len = (int)LENGTH.LONG_MSG_LEN; // 非純英數字每則分則最長67個字 + } + + // 計算需要拆成多少則分則 + double n = Math.Ceiling((double)SMSMessage.Length / (double)msg_len); + double numOfMsg = Math.Round(n); + + // 需要發送numOfMsg+1則 + for (int cnt = 0; cnt <= numOfMsg; cnt++) + { + + if (cnt == 0) + { + // 第一則發送metadata + + MsgRequest req = new MsgRequest(); + // 判斷是否為國外門號 + req.type = mobileNum.StartsWith("+") ? (byte)RequestType.SENDFOREIGNLONG : (byte)RequestType.SENDLONG; + + String msgSet; + if (String.IsNullOrEmpty(reserveTime) && String.IsNullOrEmpty(expireTime) == false) + { + // 立即傳送 + msgSet = String.Format("{0}\0{1}\0{2}\0", mobileNum, SEND_EXPIRE, expireTime); + } + else if (String.IsNullOrEmpty(reserveTime) == false && String.IsNullOrEmpty(expireTime)) + { + // 立即傳送加重送截止時間 + msgSet = String.Format("{0}\0{1}\0{2}\0", mobileNum, SEND_RESERVE, reserveTime); + } + else if (String.IsNullOrEmpty(reserveTime) == false && String.IsNullOrEmpty(expireTime) == false) + { + // 預約傳送 + msgSet = String.Format("{0}\0{1}\0{2}\0{3}\0", mobileNum, SEND_RESERVE_EXPIRE, reserveTime, expireTime); + } + else + { + // 預約傳送加重送截止時間 + msgSet = String.Format("{0}\0{1}\0", mobileNum, SEND_NOW); + } + + // 第一則用不到 + String msgContent = String.Format("\0"); + + req.coding = (byte)coding; + req.priority = (byte)MsgConst.UNUSED; + req.countryCode = (byte)MsgConst.UNUSED; + req.setLen = (byte)msgSet.Length; + req.contentLen = (byte)numOfMsg; // 填通數 + req.set = Encoding.ASCII.GetBytes(msgSet.PadRight((int)LENGTH.REQSET, '\0')); + req.content = Encoding.ASCII.GetBytes(msgContent.PadRight((int)LENGTH.CONTENT, '\0')); + + ret = sendToserver(req); + + } + else + { + // 第二則開始送簡訊內容 + MsgRequest req = new MsgRequest(); + req.type = (byte)cnt; // 填第幾通 + req.coding = (byte)coding; + req.priority = (byte)MsgConst.UNUSED; + req.countryCode = (byte)MsgConst.UNUSED; + + // 用不到 + String msgSet = String.Format("\0"); + req.setLen = (byte)msgSet.Length; + req.set = Encoding.ASCII.GetBytes(msgSet.PadRight((int)LENGTH.REQSET, '\0')); + + // 取分則內容 + String partial_msg; + try + { + partial_msg = SMSMessage.Substring((cnt - 1) * msg_len, msg_len); + } + catch + { + // ArgumentOutOfRangeException: 超過指定長度就取到字串結尾 + partial_msg = SMSMessage.Substring((cnt - 1) * msg_len); + } + + if (req.coding == (byte)MsgCoding.UCS2) + { + // 非純英數字以UCS2 byte傳送 + byte[] buf = Encoding.GetEncoding("UTF-16BE").GetBytes(partial_msg); + req.content = Encoding.GetEncoding("UTF-16BE").GetBytes(partial_msg.PadRight((int)LENGTH.CONTENT, '\0')); + req.contentLen = (byte)buf.Length; + } + else + { + // 純英數字以BIG5 byte傳送 + byte[] buf = Encoding.ASCII.GetBytes(partial_msg); + req.content = Encoding.ASCII.GetBytes(partial_msg.PadRight((int)LENGTH.CONTENT, '\0')); + req.contentLen = (byte)buf.Length; + } + + ret = sendToserver(req); + + } + + if (ret != 0) + { + // 若中途有錯誤直接中斷迴圈不送 + System.Diagnostics.Debug.WriteLine(String.Format("SendLong() Exit => {0} : {1}", ret, retMessage)); + return ret; + } + } + + return ret; + } + + /// + /// 傳送與接收資料 + /// + /// Request結構 + /// 回應代碼 + private int sendToserver(MsgRequest req) + { + + int ret; + retMessage.Clear(); + + // 將MsgRequest結構轉byte array後傳送 + byte[] data = encode(req); + try + { + int sent = socket.Send(data); + if (sent != (int)LENGTH.REQUEST) + { + retMessage = new StringBuilder("Socket Send Data Error!"); + System.Diagnostics.Debug.WriteLine("sent length:" + sent); + return -4; + } + } + catch + { + retMessage = new StringBuilder("Socket Send Data Error!"); + return -4; + } + + + // 將接收到的byte arry轉為MsgResponse結構 + byte[] buf = new byte[(int)LENGTH.RESPONSE]; + try + { + int recv = socket.Receive(buf); + if (recv != (int)LENGTH.RESPONSE) + { + retMessage = new StringBuilder("Socket Receive Data Error!"); + System.Diagnostics.Debug.WriteLine("recv length:" + recv); + return -4; + } + } + catch + { + retMessage = new StringBuilder("Socket Receive Data Error!"); + return -4; + } + + MsgResponse rep = decode(buf); + // 回傳代碼 + ret = rep.code; + // 回傳的文字描述或MessageID + retMessage = new StringBuilder(Encoding.ASCII.GetString(rep.content).TrimEnd((Char)0)); + + System.Diagnostics.Debug.WriteLine(String.Format("sendToServer() result => {0} : {1}", ret, retMessage)); + + return ret; + + } + + /// + /// 查詢一般簡訊狀態 + /// + /// 訊息ID + /// 0表示訊息已成功送達對方,其餘回傳值請參考規格書 + public int QueryMsg(String messageID) + { + retMessage.Clear(); + + return this.Query(RequestType.QUERY, messageID); + + } + + /// + /// 查詢長簡訊狀態 + /// + /// 訊息ID + /// 0表示訊息已成功送達對方,其餘回傳值請參考規格書 + public int QueryLongMsg(String messageID) + { + retMessage.Clear(); + + return this.Query(RequestType.QUERYLONG, messageID); + } + + /// + /// 查詢簡訊狀態 + /// + /// 查詢類別 + /// 訊息ID + /// 0表示訊息已成功送達對方,其餘回傳值請參考規格書 + private int Query(RequestType type, String messageID) + { + int ret = 0; + retMessage.Clear(); + + + String msgSet = String.Format("{0}\0", messageID); + String msgContent = String.Empty; + + // 設定Request資料 + MsgRequest req = new MsgRequest(); + req.type = (byte)type; + req.coding = (byte)MsgCoding.BIG5; + req.priority = (byte)MsgConst.UNUSED; + req.countryCode = (byte)MsgConst.UNUSED; + req.setLen = (byte)msgSet.Length; + req.contentLen = (byte)msgContent.Length; + req.set = Encoding.ASCII.GetBytes(msgSet.PadRight((int)LENGTH.REQSET, '\0')); + req.content = Encoding.ASCII.GetBytes(msgContent.PadRight((int)LENGTH.CONTENT, '\0')); + + ret = sendToserver(req); + return ret; + } + + /// + /// 取消預約一般簡訊 + /// + /// 訊息ID + /// 0表示訊息已取消成功,其餘回傳值請參考規格書 + public int CancelMsg(String messageID) + { + retMessage.Clear(); + + return this.Cancel(RequestType.CANCEL, messageID); + } + + /// + /// 取消預約長簡訊 + /// + /// 訊息ID + /// 0表示訊息已取消成功,其餘回傳值請參考規格書 + public int CancelLongMsg(String messageID) + { + retMessage.Clear(); + + return this.Cancel(RequestType.CANCELLONG, messageID); + } + + /// + /// 取消預約簡訊(封裝程式僅供內部呼叫用) + /// + /// 預約類別 + /// 訊息ID + /// 0表示訊息已取消成功,其餘回傳值請參考規格書 + private int Cancel(RequestType type, String messageID) + { + int ret = 0; + retMessage.Clear(); + + String msgSet = String.Format("{0}\0", messageID); + String msgContent = String.Empty; + + // 設定Request資料 + MsgRequest req = new MsgRequest(); + req.type = (byte)type; + req.coding = (byte)MsgCoding.BIG5; + req.priority = (byte)MsgConst.UNUSED; + req.countryCode = (byte)MsgConst.UNUSED; + req.setLen = (byte)msgSet.Length; + req.contentLen = (byte)msgContent.Length; + req.set = Encoding.ASCII.GetBytes(msgSet.PadRight((int)LENGTH.REQSET, '\0')); + req.content = Encoding.ASCII.GetBytes(msgContent.PadRight((int)LENGTH.CONTENT, '\0')); + + ret = sendToserver(req); + return ret; + } + + /// + /// 取得描述文字或MessageID + /// + /// 文字或MessageID + public String Get_Message() + { + return this.retMessage.ToString(); + } + + /// + /// 與簡訊主機中斷連線 + /// + public void EndCon() + { + retMessage.Clear(); + if (socket.Connected) + { + socket.Disconnect(false); + } + } + + /// + /// hinet發送信息 + /// + /// + /// + [HttpPost] + [Route("api/HiNetMsg")] + public ActionResult> HiNetMsg(HiNetInput input) + { + ApiResult apiResult = new ApiResult(jwt_str); + if (!jwtlife) + { + apiResult.Code = "5000"; + return BadRequest(apiResult); + } + + try + { + var hiair = new HiNetController(); + int retCode = this.StartCon("202.39.54.130", 8000, "test", "test123"); + string retContent = string.Empty; + if (retCode == 0) + { + //發送文字簡訊並回傳狀態碼 + retCode = this.SendMsg(input.Number, input.Msg); + //retCode = hiair.SendMsg(input.Number, input.Msg); + //取得messageID或文字描述 + retContent = this.Get_Message(); + //retContent = hiair.Get_Message(); + apiResult.Data = retCode + " : " + retContent; + } + else + { + apiResult.Code = "5000"; + apiResult.Msg = retCode + " : " + retContent; + return BadRequest(apiResult); + } + } + catch (Exception exception) + { + apiResult.Code = "9999"; + Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); + return Ok(apiResult); + } + + return Ok(apiResult); + } + } +} \ No newline at end of file diff --git a/FrontendWebApi/Models/HiNet.cs b/FrontendWebApi/Models/HiNet.cs new file mode 100644 index 0000000..0cbd5fb --- /dev/null +++ b/FrontendWebApi/Models/HiNet.cs @@ -0,0 +1,12 @@ +namespace FrontendWebApi.Models +{ + public class HiNet + { + } + + public class HiNetInput + { + public string Msg { get; set; } + public string Number { get; set; } + } +}