#if UNITY_STANDALONE_WIN using BestHTTP; using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; using System.Text; using System.Timers; using UnityEngine; using UnityEngine.Gonbest.MagicCube; namespace Thousandto.CoreSDK { public class SDKStatisticsPC : SDKStatistics { public SDKStatisticsPC() { SendHeartBeats(null, null); SendOpenGameMsg(); //间隔5分钟调用一次做心跳 Timer timer = new Timer(300000); //到达时间执行心跳 timer.Elapsed += new ElapsedEventHandler(SendHeartBeats); timer.Start(); } public override void StatisticalEvent(DataTypes funcType, string jsonParam) { switch (funcType) { case DataTypes.DATA_USER_REGISTER: break; case DataTypes.DATA_LOGIN: SendStatisticsParams("203"); break; case DataTypes.DATA_CREATE_ROLE: SendStatisticsParams("202"); break; case DataTypes.DATA_ENTER_GAME: break; case DataTypes.DATA_ROLE_LEVELUP: SendStatisticsParams("205"); break; case DataTypes.DATA_TUTORIAL: break; case DataTypes.DATA_SERVER_ROLE_INFO: break; case DataTypes.DATA_RECHARGE: SendOrderParams(); break; case DataTypes.DATA_RES_DOWNLOAD_FINISHED: break; case DataTypes.DATA_EXIT_GAME: break; case DataTypes.CUSTOM_EVENT: break; } } private void SendStatisticsParams(string opcode) { Dictionary statisticsDataDict = new Dictionary(); statisticsDataDict.Add("accountid", SDKCacheData.UserID); statisticsDataDict.Add("actorguid", SDKCacheData.RoleID); statisticsDataDict.Add("actorname", SDKCacheData.RoleName); statisticsDataDict.Add("gserverid", SDKCacheData.ServerID); //玩家所在大区id | 1 | statisticsDataDict.Add("gzoneid", SDKCacheData.QQZoneID); statisticsDataDict.Add("actorlevel", SDKCacheData.RoleLevel); statisticsDataDict.Add("party", SDKCacheData.RoleGuidName); statisticsDataDict.Add("game_version", AppPersistData.AppVersion); statisticsDataDict.Add("role_sex", SDKCacheData.RoleSex); statisticsDataDict.Add("role_combat", SDKCacheData.FightPower); statisticsDataDict.Add("map_id", SDKCacheData.MapId); //角色创建:202 角色登录:203 角色升级:205 statisticsDataDict.Add("opcode", opcode); var dict = GetUniversalParamsDict(); var iter = dict.GetEnumerator(); try { while (iter.MoveNext()) { statisticsDataDict.Add(iter.Current.Key, iter.Current.Value); } } finally { iter.Dispose(); } DebugLog("SDKStatisticsPC SendStatisticsParams: ", statisticsDataDict); HttpPost(STATISTICS_URL, statisticsDataDict); } /// /// 组装通用的带参数据 /// /// private Dictionary GetUniversalParamsDict() { Dictionary universalDict = new Dictionary(); universalDict.Add("xlogtime", ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000).ToString()); universalDict.Add("appver", AppPersistData.AppVersion); universalDict.Add("mobilemodel", SystemInfo.operatingSystem); universalDict.Add("brand", SystemInfo.deviceName); var resolutions = Screen.resolutions; if (resolutions != null && resolutions.Length > 0) { //设置为显示器支持的最大分辨率 var size = resolutions[resolutions.Length - 1]; universalDict.Add("screen", string.Format("{0}*{1}", size.width, size.width)); } universalDict.Add("idfa", SystemInfo.deviceName); universalDict.Add("gaid", SystemInfo.deviceName); universalDict.Add("os", SystemInfo.operatingSystem); universalDict.Add("osv", SystemInfo.operatingSystem); universalDict.Add("imei", SystemInfo.operatingSystem); universalDict.Add("device_id", SystemInfo.deviceUniqueIdentifier); universalDict.Add("appid", AppPersistData.AppVersion); universalDict.Add("channel_id", SDKCacheData.ChannelID); universalDict.Add("gameid", SDKCacheData.SecID); universalDict.Add("sourcetype", SDKCacheData.SourceId); universalDict.Add("sourceid", SDKCacheData.CPDid); universalDict.Add("nettype", Application.internetReachability.ToString()); universalDict.Add("ip", GetHostIp()); universalDict.Add("mac", GetMacAddress()); return universalDict; } private void SendOrderParams() { Dictionary orderDict = new Dictionary(); orderDict.Add("accountid", SDKCacheData.UserID); orderDict.Add("actorguid", SDKCacheData.RoleID); orderDict.Add("actorname", SDKCacheData.RoleName); orderDict.Add("actorlevel", SDKCacheData.RoleLevel); orderDict.Add("gzoneid", SDKCacheData.QQZoneID); orderDict.Add("roleviplevel", SDKCacheData.RoleRealmLv); orderDict.Add("orderid", SDKCacheData.OrderNo); orderDict.Add("paymethod", ""); orderDict.Add("money", SDKCacheData.UserID); orderDict.Add("money_type", ""); orderDict.Add("gamemoney", SDKCacheData.ItemPrice); orderDict.Add("productid", SDKCacheData.ItemId); orderDict.Add("productname", SDKCacheData.ItemName); orderDict.Add("productnum", SDKCacheData.BuyNum); //opcode 定值 210 orderDict.Add("opcode", "210"); var dict = GetUniversalParamsDict(); var iter = dict.GetEnumerator(); try { while (iter.MoveNext()) { orderDict.Add(iter.Current.Key, iter.Current.Value); } } finally { iter.Dispose(); } DebugLog("SDKStatisticsPC SendOrderParams: ", orderDict); HttpPost(STATISTICS_URL, orderDict); } /// /// 给平台那边做心跳操作 /// /// /// private void SendHeartBeats(object source, ElapsedEventArgs e) { Dictionary heartbeatsDict = new Dictionary(); heartbeatsDict.Add("accountid", SDKCacheData.UserID); heartbeatsDict.Add("actorguid", SDKCacheData.RoleID); heartbeatsDict.Add("actorname", SDKCacheData.RoleName); heartbeatsDict.Add("gserverid", SDKCacheData.ServerID); heartbeatsDict.Add("firstacttime", Time.realtimeSinceStartup.ToString()); heartbeatsDict.Add("lastacttime", ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000).ToString()); heartbeatsDict.Add("gzoneid", SDKCacheData.QQZoneID); heartbeatsDict.Add("opcode", "204"); var dict = GetUniversalParamsDict(); var iter = dict.GetEnumerator(); try { while (iter.MoveNext()) { heartbeatsDict.Add(iter.Current.Key, iter.Current.Value); } } finally { iter.Dispose(); } DebugLog("SDKStatisticsPC SendHeartBeats: ", heartbeatsDict); HttpPost(STATISTICS_URL, heartbeatsDict); } private void SendOpenGameMsg() { bool isFirstOpen = PlayerPrefs.GetInt("IsFirstOpenGame") == 1; if (!isFirstOpen) { PlayerPrefs.SetInt("IsFirstOpenGame", 1); } Dictionary openGameDict = new Dictionary(); if (isFirstOpen) { openGameDict.Add("is_first_active", "1"); openGameDict.Add("opcode", "100"); openGameDict.Add("os_version", SystemInfo.operatingSystem); openGameDict.Add("operator", SystemInfo.operatingSystem); openGameDict.Add("network", "WIFI"); openGameDict.Add("ip", GetHostIp()); openGameDict.Add("serial", SystemInfo.deviceUniqueIdentifier); openGameDict.Add("cpu_count", SystemInfo.processorCount.ToString()); openGameDict.Add("cpu_freq", SystemInfo.processorFrequency.ToString()); openGameDict.Add("cpu_model", SystemInfo.processorType); openGameDict.Add("cpu_mem", SystemInfo.systemMemorySize.ToString()); openGameDict.Add("total_space", ""); openGameDict.Add("free_space", ""); openGameDict.Add("sdk_version", "2.0"); openGameDict.Add("country", "CN"); openGameDict.Add("languages", "CN"); //{"bootTime":"开机时间(单位秒)","brightness":"屏幕亮度(用数字区分亮度)","macAddr":"mac地址","mockGps":"是否允许模拟定位","SimSerialNumber":"设备序列号"} openGameDict.Add("device_info", ""); openGameDict.Add("mobile_no", ""); openGameDict.Add("imei", ""); openGameDict.Add("imsi", ""); openGameDict.Add("sim_no", ""); openGameDict.Add("net_provider", ""); openGameDict.Add("oaid", ""); openGameDict.Add("app_contract_list", ""); openGameDict.Add("gaid", ""); openGameDict.Add("ipm", "1"); openGameDict.Add("logchn", "device"); openGameDict.Add("appid", SDKCacheData.AppID); openGameDict.Add("channel_id", SDKCacheData.ChannelID); openGameDict.Add("platform", "2"); openGameDict.Add("source_id", SDKCacheData.CPDid); openGameDict.Add("device_id", SystemInfo.deviceUniqueIdentifier); openGameDict.Add("app_version", SDKCacheData.AppVersion); openGameDict.Add("is_emu", "1"); openGameDict.Add("os_type", SystemInfo.operatingSystem); openGameDict.Add("brand", SystemInfo.deviceName); openGameDict.Add("model", SystemInfo.operatingSystem); var resolutions = Screen.resolutions; if (resolutions != null && resolutions.Length > 0) { //设置为显示器支持的最大分辨率 var size = resolutions[resolutions.Length - 1]; openGameDict.Add("screen", string.Format("{0}*{1}", size.width, size.width)); } } else { openGameDict.Add("is_first_active", "0"); openGameDict.Add("opcode", "200"); openGameDict.Add("click_id", "1"); openGameDict.Add("click_name", "点击启动客户端"); var dict = GetUniversalParamsDict(); var iter = dict.GetEnumerator(); try { while (iter.MoveNext()) { openGameDict.Add(iter.Current.Key, iter.Current.Value); } } finally { iter.Dispose(); } } DebugLog("SDKStatisticsPC SendOpenGameMsg: ", openGameDict); HttpPost(STATISTICS_URL, openGameDict); } private string GetMacAddress() { string physicalAddress = ""; NetworkInterface[] nice = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface adaper in nice) { if (adaper.Description == "en0") { physicalAddress = adaper.GetPhysicalAddress().ToString(); break; } else { physicalAddress = adaper.GetPhysicalAddress().ToString(); if (physicalAddress != "") { break; }; } } return physicalAddress.Replace("-", "."); } private string GetHostIp() { string ip = "localhost"; try { IPHostEntry iphostInfo = Dns.GetHostEntry(Dns.GetHostName()); ip = null; for (int i = 0; i < iphostInfo.AddressList.Length; ++i) { var ipAddress = iphostInfo.AddressList[i]; if (ipAddress.AddressFamily == AddressFamily.InterNetwork) { ip = ipAddress.ToString(); if (ip.EndsWith(".1")) { ip = null; continue; } break; } } } catch (System.Exception ex) { UnityEngine.Debug.LogException(ex); } return ip; } private void HttpPost(string Url, Dictionary postDataDict, Action callback = null) { HTTPRequest request = new HTTPRequest(new Uri(Url), HTTPMethods.Post, delegate (HTTPRequest originalRequest, HTTPResponse response) { string responseStr = response.DataAsText; Debug.Log("登陆返回:" + responseStr); if (callback != null) { callback(responseStr); } } ); request.AddHeader("ContentType", "application/x-www-form-urlencoded"); request.AddHeader("Charset", "utf-8"); var iter = postDataDict.GetEnumerator(); while (iter.MoveNext()) { var value = iter.Current.Value; if(value == null) { value = string.Empty; } request.AddField(iter.Current.Key, value); } request.Send(); } private void DebugLog(string logTitle, Dictionary pramsDict) { StringBuilder sb = new StringBuilder(); sb.Append(logTitle); var dataIter = pramsDict.GetEnumerator(); while (dataIter.MoveNext()) { var value = dataIter.Current.Value; if (value == null) { value = string.Empty; } sb.AppendFormat("{0}:{1} ", dataIter.Current.Key, value); } Debug.Log(sb.ToString()); } } } #endif