443 lines
16 KiB
Objective-C
Executable File

//
// FirstViewController.m
// Talk
//
// Created by xuzs on 22/10/11.
// Copyright (c) 2022年 xuzs. All rights reserved.
//
#import "Call.h"
#import "UI.h"
#import "Pub.h"
#import "Opendoor.h"
#import "Sformat.h"
#import "Msg.h"
#import "AppDelegate.h"
@interface Call ()
@property (nonatomic, strong)UIView *rview,*spkView,*cutView,*hangupView,*openView;
@property (nonatomic, strong)UIImageView *playerImage,*spkImage,*cutImage,*hangupImage,*answerImage,*openImage;
@property (nonatomic, strong)UIScrollView *scrollView;
@property (nonatomic, strong)UIButton *answerView;
@property (nonatomic, strong)UILabel *statuLabel;
@property (nonatomic, strong)UIAlertController *openAlert;
@property (nonatomic, strong)NSTimer *timer;
@end
@implementation Call
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self.navigationController.navigationBar setHidden:YES];
[self setupViews];
[self setUI];
}
- (void)setupViews
{
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.modalPresentationCapturesStatusBarAppearance = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
[self.view addSubview:self.rview];
[self.rview addSubview:self.scrollView];
[self.scrollView addSubview:self.playerImage];
[self.rview addSubview:self.statuLabel];
if([_CallTag isEqualToString:@"BECALL"]){
[_statuLabel setText:[[NSString alloc] initWithFormat:@"%@呼叫",@"小小茜子的搬砖"]];
// [_statuLabel setText:[[NSString alloc] initWithFormat:@"%@呼叫",[Opendoor EquNameById:[[Pub getApp].talk getRemoteEqu]]]];
[self.rview addSubview:self.spkView];
[self.spkView addSubview:self.spkImage];
[self.rview addSubview:self.cutView];
[self.cutView addSubview:self.cutImage];
[self.rview addSubview:self.hangupView];
[self.hangupView addSubview:self.hangupImage];
[self.rview addSubview:self.answerView];
[self.answerView addSubview:self.answerImage];
[self.rview addSubview:self.openView];
[self.openView addSubview:self.openImage];
[self.cutView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(SaveImg)]];
[self.hangupView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Hangup)]];
[self.answerView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Answer)]];
[self.openView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Open)]];
}
else if([_CallTag isEqualToString:@"WATCH"]){
[_statuLabel setText:[[NSString alloc] initWithFormat:@"监视%@",[Opendoor EquNameById:[[Pub getApp].talk getRemoteEqu]]]];
[self.rview addSubview:self.cutView];
[self.cutView addSubview:self.cutImage];
[self.rview addSubview:self.hangupView];
[self.hangupView addSubview:self.hangupImage];
[self.rview addSubview:self.openView];
[self.openView addSubview:self.openImage];
[self.cutView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(SaveImg)]];
[self.hangupView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Hangup)]];
[self.openView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Open)]];
}
}
- (void)setUI{
[UI SetRView:self.rview Top:@"0" Right:@"0" Bottom:@"0" Left:@"0"];
CGFloat imgwidth = [UI getScreenHeight]*640/480;
self.scrollView.contentSize=CGSizeMake(imgwidth, [UI getScreenHeight]);
self.playerImage.frame = CGRectMake(0,0,imgwidth, [UI getScreenHeight]);
[self.scrollView setContentOffset:CGPointMake((imgwidth-[UI getScreenWidth])/2, 0)];
[UI setFrameInView:self.statuLabel Width:@"100vw" Height:@"20" TranslateX:@"0" TranslateY:@"5vh" InView:nil Position:UITopMid];
if([_CallTag isEqualToString:@"BECALL"]){
[UI setFrameInView:self.spkView Width:@"14vmin" Height:@"14vmin" TranslateX:@"-36vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
[UI setCornerRadius:self.spkView];
[UI setFrameInView:self.spkImage Width:@"50%" Height:@"50%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
[UI setFrameInView:self.cutView Width:@"14vmin" Height:@"14vmin" TranslateX:@"-18vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
[UI setCornerRadius:self.cutView];
[UI setFrameInView:self.cutImage Width:@"50%" Height:@"50%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
[UI setFrameInView:self.hangupView Width:@"14vmin" Height:@"14vmin" TranslateX:@"0" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
[UI setCornerRadius:self.hangupView];
[UI setFrameInView:self.hangupImage Width:@"58%" Height:@"22%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
[UI setFrameInView:self.answerView Width:@"14vmin" Height:@"14vmin" TranslateX:@"18vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
[UI setCornerRadius:self.answerView];
[UI setFrameInView:self.answerImage Width:@"40%" Height:@"40%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
[UI setFrameInView:self.openView Width:@"14vmin" Height:@"14vmin" TranslateX:@"36vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
[UI setCornerRadius:self.openView];
[UI setFrameInView:self.openImage Width:@"35%" Height:@"40%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
}
else if([_CallTag isEqualToString:@"WATCH"]){
[UI setFrameInView:self.cutView Width:@"14vmin" Height:@"14vmin" TranslateX:@"-26vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
[UI setCornerRadius:self.cutView];
[UI setFrameInView:self.cutImage Width:@"50%" Height:@"50%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
[UI setFrameInView:self.hangupView Width:@"14vmin" Height:@"14vmin" TranslateX:@"0" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
[UI setCornerRadius:self.hangupView];
[UI setFrameInView:self.hangupImage Width:@"58%" Height:@"22%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
[UI setFrameInView:self.openView Width:@"14vmin" Height:@"14vmin" TranslateX:@"26vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid];
[UI setCornerRadius:self.openView];
[UI setFrameInView:self.openImage Width:@"35%" Height:@"40%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter];
[[Pub getApp].talk watchByServer];
}
}
- (void)setTime:(long)time0{
int sec_total = (int)([Sformat timestamp] - time0)/1000;
int sec = sec_total % 60;
int min = (sec_total-sec)/60;
//dispatch_async(dispatch_get_main_queue(), ^{//转到主线程处理
[self.statuLabel setText:[[NSString alloc] initWithFormat:@"%02d:%02d",min,sec]];
//});
}
- (void)SaveImg{
long time = [Sformat timestamp];
//
// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
// // 构造保存文件的名称 保存成功会返回YES
// NSString *filePath = [[paths objectAtIndex:0]stringByAppendingPathComponent:
// [NSString stringWithFormat:@"%ld.jpg",time]];
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];// 拼接图⽚名为"currentImage.png"的路径
NSString *filePath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%ld.jpg",time]];//获取⽹络请求中的url地址
//保存操作
BOOL result = [UIImageJPEGRepresentation(self.playerImage.image, .9) writeToFile:filePath atomically:YES];
if (result == YES) {
[self alert:@"保存截图成功"];
[[Pub getApp].sysinfo SaveRecord:time Type:@"截图" Equ:[[Pub getApp].talk getRemoteEqu] Img:[NSString stringWithFormat:@"%ld.jpg",time] Note:@""];
}else{
[self alert:@"保存截图失败"];
}
//https://wenku.baidu.com/view/2ff5463ba000a6c30c22590102020740be1ecd95.html
}
- (void)Hangup{
NSLog(@"挂机");
if([Pub getApp].talk.status>0){
if([_CallTag isEqualToString:@"BECALL"]){
[[Pub getApp].talk talkEnd];
}
else{
[[Pub getApp].talk watchEnd];
}
}
if([_CallTag isEqualToString:@"WATCH"]){
if([Pub getApp].talk.status==0){
[[Pub getApp].udp stopSend:@"" rr6:152 rr8:1];
}
}
[self UIClose];
}
- (void)UIClose{
[[Pub getApp].talk status_ini];
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
[Pub getApp].callOut = nil;
}
- (void)Answer{
if([Pub getApp].talk.status==6){
NSLog(@"接听");
[Pub getApp].TalkSendAudio = false;
[[Pub getApp] ring_stop];
[[Pub getApp].talk talkOn];
}
else{
[self TouchUp];
}
}
//接听成功
- (void)AnswerSucc{
NSLog(@"接听Succ");
dispatch_async(dispatch_get_main_queue(), ^{//转到主线程处理
[self.answerImage setImage:[UIImage imageNamed:@"ic_vd_mic_off"]];
[self.answerView addTarget:self action:@selector(TouchDown) forControlEvents:UIControlEventTouchDown];
[self.answerView addTarget:self action:@selector(TouchUp) forControlEvents:UIControlEventTouchUpInside];
[self.answerView addTarget:self action:@selector(TouchUp) forControlEvents:UIControlEventTouchUpOutside];
});
}
-(void)TouchDown{
[self.answerImage setImage:[UIImage imageNamed:@"ic_vd_mic_on"]];
[Pub getApp].TalkSendAudio = true;
}
-(void)TouchUp{
[self.answerImage setImage:[UIImage imageNamed:@"ic_vd_mic_off"]];
[Pub getApp].TalkSendAudio = false;
}
- (void)Open{
self.openAlert = [Msg OpendoorByPwd:self SelectedHandler:^(int index) {
[self alert:@"请输入6位数字密码"];
}];
}
- (void)OpenDoorGo:(NSString *)pwd{
if(self.openAlert){
[self.openAlert dismissViewControllerAnimated:YES completion:nil];
[[Pub getApp].talk openDoor:pwd];
}
}
- (void)RefImg:(NSData *)data{
NSString *getStr = [self convertDataToHexStr:data];
NSLog(@"111得到的十六进制图像数据为:%@", getStr);
NSData *binaryData = [self dataFromHexString:getStr];
// 将NSData转换为二进制数组
const uint8_t *bytes = (const uint8_t *)[binaryData bytes];
NSUInteger length = [binaryData length];
NSMutableArray *binaryArray = [NSMutableArray array];
for (NSUInteger i = 0; i < length; i++) {
[binaryArray addObject:@(bytes[i])];
}
NSLog(@"222得到的二进制图像数据为:%@", binaryArray);
UIImage *image = [UIImage imageWithData: data];
//self.playerImage = [[UIImageView alloc] initWithImage:image];
[self.playerImage setImage:image];
}
//将NSData转换成十六进制的字符串则可使用如下方式:
- (NSString *)convertDataToHexStr:(NSData *)data {
if (!data || [data length] == 0) {
return @"";
}
NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
[data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
unsigned char *dataBytes = (unsigned char*)bytes;
for (NSInteger i = 0; i < byteRange.length; i++) {
NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
if ([hexStr length] == 2) {
[string appendString:hexStr];
} else {
[string appendFormat:@"0%@", hexStr];
}
}
}];
return string;
}
//将十六进制字符串转换为二进制数据
- (NSData *)dataFromHexString:(NSString *)hexString {
// 去除字符串中的空格和换行符
NSString *cleanedString = [hexString stringByReplacingOccurrencesOfString:@" " withString:@""];
cleanedString = [cleanedString stringByReplacingOccurrencesOfString:@"\n" withString:@""];
// 检查字符串长度是否为偶数
if (cleanedString.length % 2 != 0) {
// 如果长度为奇数,可以根据需要选择在字符串前面添加或去除一个字符
// 例如,你可以选择在前面添加一个零,或者去除最后一个字符
// cleanedString = [@"0" stringByAppendingString:cleanedString];
// 或者
// cleanedString = [cleanedString substringToIndex:cleanedString.length - 1];
}
// 使用一个循环将每两个字符转换为一个字节
NSMutableData *data = [NSMutableData data];
for (NSInteger i = 0; i < cleanedString.length; i += 2) {
NSString *byteString = [cleanedString substringWithRange:NSMakeRange(i, 2)];
NSScanner *scanner = [NSScanner scannerWithString:byteString];
unsigned int byteValue;
[scanner scanHexInt:&byteValue];
uint8_t byte = (uint8_t)byteValue;
[data appendBytes:&byte length:1];
}
return data;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark Property Accessors
- (UIView *)rview
{
if (!_rview) {
_rview = [[UIView alloc] init];
_rview.backgroundColor = [UIColor colorWithRed:0/255. green:0/255. blue:0/255. alpha:1];
}
return _rview;
}
- (UILabel *)statuLabel
{
if (!_statuLabel) {
_statuLabel = [[UILabel alloc] init];
_statuLabel.font = [UIFont systemFontOfSize:18.0f];
_statuLabel.textColor = [UIColor whiteColor];
_statuLabel.textAlignment = NSTextAlignmentCenter;
_statuLabel.text = NSLocalizedString(@"", nil);
}
return _statuLabel;
}
//免提
- (UIView *)spkView
{
if (!_spkView) {
_spkView = [[UIView alloc] init];
_spkView.backgroundColor = [UI colorWithHex:0x999999 alpha: .8];
}
return _spkView;
}
- (UIImageView *)spkImage
{
if (!_spkImage) {
_spkImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"hf"]];
}
return _spkImage;
}
//截图
- (UIView *)cutView
{
if (!_cutView) {
_cutView = [[UIView alloc] init];
_cutView.backgroundColor = [UI colorWithHex:0x999999 alpha: .8];
}
return _cutView;
}
- (UIImageView *)cutImage
{
if (!_cutImage) {
_cutImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"save_photo"]];
}
return _cutImage;
}
//挂机
- (UIView *)hangupView
{
if (!_hangupView) {
_hangupView = [[UIView alloc] init];
_hangupView.backgroundColor = [UI colorWithHex:0xff0000 alpha: .8];
}
return _hangupView;
}
- (UIImageView *)hangupImage
{
if (!_hangupImage) {
_hangupImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"hangup"]];
}
return _hangupImage;
}
//接听
- (UIButton *)answerView
{
if (!_answerView) {
_answerView = [[UIButton alloc] init];
_answerView.backgroundColor = [UI colorWithHex:0x2f6da8 alpha: .8];
}
return _answerView;
}
- (UIImageView *)answerImage
{
if (!_answerImage) {
_answerImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"call_call_on"]];
}
return _answerImage;
}
//开门
- (UIView *)openView
{
if (!_openView) {
_openView = [[UIView alloc] init];
_openView.backgroundColor = [UI colorWithHex:0x999999 alpha: .8];
}
return _openView;
}
- (UIImageView *)openImage
{
if (!_openImage) {
_openImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"unlock_on2"]];
}
return _openImage;
}
//播放画面
- (UIScrollView *)scrollView{
if(!_scrollView){
_scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, [UI getScreenWidth], [UI getScreenHeight])];
_scrollView.pagingEnabled = NO;
_scrollView.showsHorizontalScrollIndicator = YES;
_scrollView.showsVerticalScrollIndicator = NO;
_scrollView.delegate = self;
}
return _scrollView;
}
- (UIImageView *)playerImage
{
if (!_playerImage) {
//_playerImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.jpg"]];
_playerImage = [[UIImageView alloc] init];
}
return _playerImage;
}
@end