using System; using HDL_ON; using HDL_ON.DAL.Server; using System.Threading; using System.Collections.Generic; using HDL_ON.UI.UI2.PersonalCenter.PirDevice; using HDL_ON.Entity; #if __IOS__ using UIKit; using Foundation; #else using Android.Content; #endif namespace Shared { /// /// 丰林可视对讲 /// public class ESOnVideo { /// /// /// private static ESOnVideo m_Current = null; /// /// /// public static ESOnVideo Current { get { if (m_Current == null) { m_Current = new ESOnVideo(); } return m_Current; } } /// /// 门口机、丰林小区信息和房间信息等参数 /// public ESVideoInfo esVideoInfo; /// /// 暂时没用 /// public void InitESVideoSDK() { //ESVideo. } /// /// 如果域名包含china,则SDK 使用乐橙的中国大陆(正式)域名 /// /// bool GetIsChinaMainland() { ////强制使用国内 //return true; return OnAppConfig.Instance.RequestHttpsHost.Contains("china");//如果域名包含china,则SDK 使用乐橙的中国大陆(正式)域名 } /// /// 监控页面 /// /// public void ShowESVideoMonitor(ESVideoInfo mESVideoInfo, string interphoneType) { this.esVideoInfo = mESVideoInfo; int roomID = 0; int.TryParse(mESVideoInfo.roomno, out roomID); #if __IOS__ if (interphoneType == InterphoneType.HDL.ToString()) { //HDLLinphone 狄耐克 HDLLinphone.Current.ShowESVideoMonitor(mESVideoInfo, interphoneType); } else { HDLUtils.WriteLine("未对接,不支持监视"); } #else Intent intent = null; if (interphoneType == InterphoneType.HDL.ToString()) { //HDLLinphone 狄耐克 HDLLinphone.Current.ShowESVideoMonitor(mESVideoInfo, InterphoneType.HDL.ToString()); } else { HDLUtils.WriteLine("未对接,不支持监视"); } #endif } /// /// 被呼叫页面 /// /// public void ShowESvideoVideoIntercom(ESVideoInfo mESVideoInfo, string interphoneType) { this.esVideoInfo = mESVideoInfo; int roomID = 0; int.TryParse(mESVideoInfo.roomno, out roomID); #if __IOS__ if (interphoneType == InterphoneType.HDL.ToString()) { //HDL Linphone 狄耐克 } else{ HDLUtils.WriteLine("未支持的可视对讲类型"); } #else #region Android 处理 Intent intent = null; if (interphoneType == InterphoneType.HDL.ToString()) { //HDL Linphone 狄耐克 } else { HDLUtils.WriteLine("未支持的可视对讲类型"); } #endregion #endif } #region 动作回调和原生交互,提交记录到云端 /// /// 判断callId是否为空 /// /// bool CheckESVideoInfoIsNullOrEmpty() { return (esVideoInfo == null || string.IsNullOrEmpty(esVideoInfo.callId)); } /// /// 接听 /// void AnswerAction() { //Utlis.WriteLine("AnswerAction"); if (CheckESVideoInfoIsNullOrEmpty()) return; new Thread(() => { var requestJson = HttpUtil.GetSignRequestJson(esVideoInfo); var revertObj = HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_FL_Answer, requestJson); if (revertObj.Code == StateCode.SUCCESS) { //Utlis.WriteLine("POST 接听成功"); } else { Utlis.WriteLine("POST 接听失败 code: " + revertObj.Code); } }) { IsBackground = false }.Start(); } /// /// 挂断 /// /// void HangUpAction(int callDuration) { //Utlis.WriteLine("HangUpAction :" + callDuration); if (CheckESVideoInfoIsNullOrEmpty()) return; new Thread(() => { Dictionary dic = new Dictionary(); dic.Add("callId", esVideoInfo.callId); dic.Add("callDuration", callDuration); var requestJson = HttpUtil.GetSignRequestJson(dic); var revertObj = HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_FL_HangUp, requestJson); if (revertObj.Code == StateCode.SUCCESS) { //Utlis.WriteLine("POST 挂断成功"); } else { Utlis.WriteLine("POST 挂断失败 code: " + revertObj.Code); } }) { IsBackground = false }.Start(); } /// /// 拒接 /// void RejectCallAction() { //Utlis.WriteLine("RejectCallAction"); if (CheckESVideoInfoIsNullOrEmpty()) return; new Thread(() => { Dictionary dic = new Dictionary(); dic.Add("callId", esVideoInfo.callId); var requestJson = HttpUtil.GetSignRequestJson(dic); var revertObj = HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_FL_Reject, requestJson); if (revertObj.Code == StateCode.SUCCESS) { //Utlis.WriteLine("POST 拒接成功"); } else { Utlis.WriteLine("POST 拒接失败 code: " + revertObj.Code); } }) { IsBackground = false }.Start(); } /// /// 截图成功 /// void ScreenshotSuccessfulAction(byte[] dataBytes) { //Utlis.WriteLine("ScreenshotSuccessfulAction"); if (CheckESVideoInfoIsNullOrEmpty()) return; new Thread(() => { //var imageName = Guid.NewGuid().ToString(); Dictionary dic = new Dictionary(); dic.Add("callId", esVideoInfo.callId); dic.Add("images", dataBytes); #if __IOS__ dic.Add("imagesName", "_IOS.jpg"); #else dic.Add("imagesName", "_Android.jpg"); #endif var requestJson = HttpUtil.GetSignRequestJson(dic); var revertObj = HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_FL_Screenshot, requestJson); if (revertObj.Code == StateCode.SUCCESS) { //Utlis.WriteLine("POST 截图上传成功"); } else { Utlis.WriteLine("POST 截图上传失败 code: " + revertObj.Code); } }) { IsBackground = false }.Start(); } DateTime UnlockDateTime = DateTime.MinValue; /// /// 开锁成功 /// void UnlockAction() { //Utlis.WriteLine("UnlockAction"); if (CheckESVideoInfoIsNullOrEmpty()) return; //3S内不允许触发第二次 if (UnlockDateTime.AddSeconds(3) > DateTime.Now) { Utlis.WriteLine("3S内不允许触发第二次"); //丰林SDKbug,呼叫的时候开锁成功会有2次回调, return; } UnlockDateTime = DateTime.Now; new Thread(() => { Dictionary dic = new Dictionary(); dic.Add("callId", esVideoInfo.callId); var requestJson = HttpUtil.GetSignRequestJson(dic); var revertObj = HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_FL_Unlock, requestJson); if (revertObj.Code == StateCode.SUCCESS) { //Utlis.WriteLine("POST 开锁成功"); } else { Utlis.WriteLine("POST 开锁失败 code: " + revertObj.Code); } }) { IsBackground = false }.Start(); } #endregion #region 王赢新接听和开锁接口 /// /// 开锁 /// void HDLUnlockAction() { //Utlis.WriteLine("UnlockAction"); if (esVideoInfo == null) return; new Thread(() => { Dictionary dic = new Dictionary(); dic.Add("deviceId", esVideoInfo.Lc_DeviceId);//设备id dic.Add("callId", esVideoInfo.callId); var requestJson = HttpUtil.GetSignRequestJson(dic); var revertObj = HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_VideoDevice_OpenDoorbell, requestJson); if (revertObj.Code == StateCode.SUCCESS) { Application.RunOnMainThread(() => { #if __IOS__ //和原生监控界面交互、发送开锁成功通知 NSNotificationCenter.DefaultCenter.PostNotificationName("lcCallDelegateOpenDoorSuccess", null); #endif }); } else { Utlis.WriteLine("POST 开锁失败 code: " + revertObj.Code); } }) { IsBackground = false }.Start(); } /// /// 更改通话状态 /// void HDLUpdateCallStatus(CallStatusType callStatusType, InterphoneType interphoneType, int callDuration = 0) { if (CheckESVideoInfoIsNullOrEmpty()) return; new Thread(() => { Dictionary dic = new Dictionary(); dic.Add("callId", esVideoInfo.callId);//呼叫id dic.Add("callStatus", callStatusType.ToString());//可用值:MISSED,RECEIVED,REJECT dic.Add("interphoneTypeEnum", interphoneType.ToString());//可用值:FLVI,IMOUVISIAL if (callStatusType == CallStatusType.RECEIVED && callDuration > 0) { dic.Add("callDuration", callDuration);//通话时长(秒) } var requestJson = HttpUtil.GetSignRequestJson(dic); var revertObj = HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_VideoDevice_UpdateCallStatus, requestJson); if (revertObj.Code == StateCode.SUCCESS) { } else { Utlis.WriteLine("POST 更新状态失败 code: " + revertObj.Code); } }) { IsBackground = false }.Start(); } #endregion #if __IOS__ #region OnESCallDelegate #endregion #region OnLCCallDelegate #endregion #endif ///// ///// 测试方法 ///// ///// //public void Test(bool isMonitor = true) //{ // ESVideoInfo eSVideoInfo = new ESVideoInfo() // { // DeviceName = "室外机88", // ESVideoUUID = "JJY000019VPLLF", // }; // if (isMonitor) // { // ShowESVideoMonitor(eSVideoInfo, ""); // } // else // { // eSVideoInfo.callId = "88888"; // ShowESvideoVideoIntercom(eSVideoInfo, ""); // } //} } /// /// 可视对讲参数对象(仅在最后一步跳转到activity时才调用,为了做兼容这里都数据有点乱,以后有时间再理顺思路优化) /// public class ESVideoInfo { /// /// 室外机的UUID /// 例:JJY000007FSEYX /// public string ESVideoUUID = string.Empty; /// /// 室外机的名称 /// 例:室外机 /// public string DeviceName = "室外机"; /// /// 丰林请求的唯一id /// public string uuid = string.Empty; /// /// 丰林社区id /// public string cmtID = string.Empty; /// /// 丰林房间号 /// public string roomno = string.Empty; /// /// 丰林楼栋号 /// public string unitno = string.Empty; ///// ///// 丰林住宅Id ///// //public string HomeID= string.Empty; /// /// 呼叫记录Id /// public string callId = string.Empty; //========================大华========================== /// /// 账号accessToken /// 萤石子账号Token也共用这个字段 /// public string Lc_AccessToken = string.Empty; /// /// 设备序列号,通讯必要字段 /// public string Lc_DeviceId = string.Empty; /// /// 备注??? /// public string Lc_Psk = string.Empty; /// /// 预览画面必须使用 /// public string Lc_PlayToken = string.Empty; /// /// 账号标记:0国内,1国外;国内国外访问都地址不一样 /// public int Lc_Location = 0; //========================萤石云猫眼========================== /// /// 住宅Id /// public string HomeId = string.Empty; /// /// 设备序列号 /// public string DeviceSerial = string.Empty; /// /// 服务器推送时间 /// public string currentTime = string.Empty; /// /// 消息id /// public string msgId = string.Empty; //========================HDL SIP========================== /// /// 设备sip账号 interphoneType是HDL时才会有值 /// public string deviceSipAccount; /// /// spk /// public string spk=""; //========================全视通========================== /// /// 设备编号,相当于全视通的LocalDirectory字段 /// public string deviceCode; } /// /// 通话状态类型 /// public enum CallStatusType { /// /// 未接 /// MISSED, /// /// 已接听 /// RECEIVED, /// /// 拒接 /// REJECT, } /// /// 可视对讲设备平台类型 /// public enum InterphoneType { /// /// 狄耐克 HDL Linphone /// HDL, EZVIZ, } }