#!/usr/bin/perl
 
use DBI;
use strict;
use POSIX;
#use ESL;
use Switch;
use Time::HiRes;
use WWW::Curl::Easy;
use JSON;
use Config::Tiny;
use Data::Dumper;
use Cwd;
use URI::Encode qw(uri_encode uri_decode);
use threads;
use Thread::Semaphore;
use threads::shared;
use POSIX qw(strftime);
use Net::Ping;
use Dinstar;
use Email::Send;   
use Email::Simple::Creator; # or other Email::
use MIME::Base64;

#   synway_QueryPortInfo( "10.0.66.106", "", "ApiUserAdmin:pepito20", "0002" );

#   synway_QuerySmsResults( "desytel_manzanares.interactivos.net.ar:8090","ApiUserAdmin:pepito20", "", 32 );
#   synway_DeleteSms( "desytel_manzanares.interactivos.net.ar:8090","ApiUserAdmin:pepito20", "2025-04-27 17:52:07" );

#  synway_GetIMEI( "desytel_manzanares.interactivos.net.ar:8090",1,"ApiUserAdmin:pepito20", "" );
   synway1_ChangeIMEI( "10.0.66.106", 1, "ApiUserAdmin:pepito20", 32, "" );

# ------------------
# queryPortStatus
# ------------------

sub synway_QueryPortInfo {
   my $ip = $_[0];
   my $port = $_[1];
   my $auth_name = $_[2];
   my $sn = $_[3];
   my @states = ("UNREGISTER","REGISTER_OK","SEARCHING_NETWORK","NO_SIM","UNKNOWN", "ROAMING");
   my @callstates = ("Idle","Off-hook","Ringing","Talking","Dialing","Dialing","Dialing","Pending","","Ringback","Interior","Unavailable");
   my @reg;
   my @imei;
   my @imsi;
   my @iccid;
   my @porttype;
   my $totales = 0;
   my @tPort;
   my @tPortState;
   my @tPortOp;
   my @tPortType;
   my @tPortSig;
   my $data;

#POWER_OFF, NO_SIM, PIN_REQUIRE,
#PUK_REQUIRE, UNREGISTER,
#SEARCHING_NETWORK, REGISTER_OK or
#UNKNOWN.


   my $auth_basic = encode_base64($auth_name);
   my $url = $ip . "/API/QueryPortInfo";

 	$data = { event => "getportinfoex" };

   my $content = encode_json( $data );
   my $curl = WWW::Curl::Easy->new;
   $curl->setopt( CURLOPT_URL, $url);
   $curl->setopt( CURLOPT_HTTPAUTH, CURLAUTH_ANY ) ;
   $curl->setopt( CURLOPT_HEADER,0);
   $curl->setopt( CURLOPT_USERPWD, $auth_name );
   $curl->setopt( CURLOPT_POST, 1);
   $curl->setopt( CURLOPT_MAXREDIRS, 10 );                                                
   $curl->setopt( CURLOPT_POSTFIELDS, $content );
   $curl->setopt( CURLOPT_HTTPHEADER, ["Content-type:application/json;charset='utf-8'","Accept:application/json"]);
   $curl->setopt( CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
   $curl->setopt( CURLOPT_TIMEOUT, 0);
   $curl->setopt( CURLOPT_FOLLOWLOCATION, 1);
   $curl->setopt( CURLINFO_HEADER_OUT, 1 );
   $curl->setopt( CURLOPT_SSL_VERIFYPEER, 0);
   $curl->setopt( CURLOPT_SSL_VERIFYHOST, 0);

   my $response_body;
   $curl->setopt(CURLOPT_WRITEDATA,\$response_body);
   my $retcode = $curl->perform;
   my $error_text = "";


   if ($retcode == 0) {
		my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
     	if( $response_code == 200 ) {

         $data = decode_json($response_body);
         if( $data->{result} == "ok" ) {

            my @info = split /;/, $data->{content};
            
#           info[0] = total:32
#           info[1] = portstate:17,17,17,17:16,17,17,17:16,17,17,17:17,17,17,17:17,17,17,17:17,17,17,17:17,17,17,17:17,17,17,17:17,17,17,17:17,17,17,17:17,17,17,17:17,17,17,17:17,17,17,17:17,17,17,17:1 

            my $status = substr( $info[1],10 );
            my @ports = split /:/, $status;

            my @total = split /:/, $info[0];
            my $state = "";
            $totales = $total[1];

#           0 In Use, 16 Available  17 Unavailable
            my @slots;
            for( my $i = 0; $i < $total[1]; $i++ ) {
            
               $slots[$i] = "";

               my @portSlots = split /,/, $ports[$i];
               for( my $s = 0; $s < 4; $s++ ) {

                  if( $portSlots[$s] == 0 ) {
                     $slots[$i] = $s;
                  }
               }
               printf( "Port: %d/%d\n", $i, $slots[$i] );  
            }
         }
     	}
   }

=begin
   my $auth_basic = encode_base64($auth_name);
   my $url = $ip . "/API/QueryPortConnectState";

   if( $port == -1 ) {
   	$data = { event => "getportconnectstate" };
	}
	else {
   	$data = { event => "getportconnectstate" };
	}	

   my $content = encode_json( $data );
   my $curl = WWW::Curl::Easy->new;
   $curl->setopt( CURLOPT_URL, $url);
   $curl->setopt( CURLOPT_HTTPAUTH, CURLAUTH_ANY ) ;
   $curl->setopt( CURLOPT_HEADER,0);
   $curl->setopt( CURLOPT_USERPWD, $auth_name );
   $curl->setopt( CURLOPT_POST, 1);
   $curl->setopt( CURLOPT_MAXREDIRS, 10 );                                                
   $curl->setopt( CURLOPT_POSTFIELDS, $content );
   $curl->setopt( CURLOPT_HTTPHEADER, ["Content-type:application/json;charset='utf-8'","Accept:application/json"]);
   $curl->setopt( CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
   $curl->setopt( CURLOPT_TIMEOUT, 0);
   $curl->setopt( CURLOPT_FOLLOWLOCATION, 1);
   $curl->setopt( CURLINFO_HEADER_OUT, 1 );
   $curl->setopt( CURLOPT_SSL_VERIFYPEER, 0);
   $curl->setopt( CURLOPT_SSL_VERIFYHOST, 0);

   my $response_body;
   $curl->setopt(CURLOPT_WRITEDATA,\$response_body);
   my $retcode = $curl->perform;
   my $error_text = "";


   if ($retcode == 0) {
		my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
     	if( $response_code == 200 ) {

         $data = decode_json($response_body);
         if( $data->{result} == "ok" ) {

            my @info = split /;/, $data->{content};
            my @ports = split /,/, $info[1];
            my $state = "";

            my @total = split /:/, $info[0];
            $totales = $total[1];

            for( my $i = 0; $i < $total[1]; $i++ ) {
               $reg[$i] = $states[$ports[$i]];
#              printf( "%s\n", $reg[$i] );
            }
         }
     	}
   }

   # ------
   # IMEI  
   # ------     
   $url = $ip . "/API/QueryWireLessInfo";
   $data = { event => "getwirelessinfo", type => "IMEI" };

   my $content = encode_json( $data );
   my $curl = WWW::Curl::Easy->new;
   $curl->setopt( CURLOPT_URL, $url);
   $curl->setopt( CURLOPT_HTTPAUTH, CURLAUTH_ANY ) ;
   $curl->setopt( CURLOPT_HEADER,0);
   $curl->setopt( CURLOPT_USERPWD, $auth_name );
   $curl->setopt( CURLOPT_POST, 1);
   $curl->setopt( CURLOPT_MAXREDIRS, 10 );                                                
   $curl->setopt( CURLOPT_POSTFIELDS, $content );
   $curl->setopt( CURLOPT_HTTPHEADER, ["Content-type:application/json;charset='utf-8'","Accept:application/json"]);
   $curl->setopt( CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
   $curl->setopt( CURLOPT_TIMEOUT, 0);
   $curl->setopt( CURLOPT_FOLLOWLOCATION, 1);
   $curl->setopt( CURLINFO_HEADER_OUT, 1 );
   $curl->setopt( CURLOPT_SSL_VERIFYPEER, 0);
   $curl->setopt( CURLOPT_SSL_VERIFYHOST, 0);

   my $response_body;
   $curl->setopt(CURLOPT_WRITEDATA,\$response_body);
   my $retcode = $curl->perform;
   my $error_text = "";

   if ($retcode == 0) {
		my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
     	if( $response_code == 200 ) {

         $data = decode_json($response_body);
         if( $data->{result} == "ok" ) {

            my @info = split /;/, $data->{content};
            my @ports = split /,/, $info[0];

            my @imeis = split /\./, $ports[0];

            for( my $i = 0; $i < $totales; $i++ ) {

               my @imei_data = split /:/, $imeis[$i];
               my $index = $imei_data[0]; 
               $imei[$index-1] = $imei_data[1];
            }
         }
      }
   }

   # ------
   # IMSI
   # ------     
   $url = $ip . "/API/QueryWireLessInfo";
   $data = { event => "getwirelessinfo", type => "IMSI" };

   my $content = encode_json( $data );
   my $curl = WWW::Curl::Easy->new;
   $curl->setopt( CURLOPT_URL, $url);
   $curl->setopt( CURLOPT_HTTPAUTH, CURLAUTH_ANY ) ;
   $curl->setopt( CURLOPT_HEADER,0);
   $curl->setopt( CURLOPT_USERPWD, $auth_name );
   $curl->setopt( CURLOPT_POST, 1);
   $curl->setopt( CURLOPT_MAXREDIRS, 10 );                                                
   $curl->setopt( CURLOPT_POSTFIELDS, $content );
   $curl->setopt( CURLOPT_HTTPHEADER, ["Content-type:application/json;charset='utf-8'","Accept:application/json"]);
   $curl->setopt( CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
   $curl->setopt( CURLOPT_TIMEOUT, 0);
   $curl->setopt( CURLOPT_FOLLOWLOCATION, 1);
   $curl->setopt( CURLINFO_HEADER_OUT, 1 );
   $curl->setopt( CURLOPT_SSL_VERIFYPEER, 0);
   $curl->setopt( CURLOPT_SSL_VERIFYHOST, 0);

   my $response_body;
   $curl->setopt(CURLOPT_WRITEDATA,\$response_body);
   my $retcode = $curl->perform;
   my $error_text = "";

   if ($retcode == 0) {
		my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
     	if( $response_code == 200 ) {

         $data = decode_json($response_body);
         if( $data->{result} == "ok" ) {

            my @info = split /;/, $data->{content};
            my @ports = split /,/, $info[0];

            my @imsis = split /\./, $ports[0];
            for( my $i = 0; $i < $totales; $i++ ) {

               my @imsi_data = split /:/, $imsis[$i];
               my $index = $imsi_data[0]; 

               if( $imsi_data[1] eq "----" ) {
                  $imsi[$index-1] = "";
               }
               else {
                  $imsi[$index-1] = $imsi_data[1];
               }
            }
         }
      }
   }

   # ------
   # ICCID
   # ------     
   $url = $ip . "/API/QueryWireLessInfo";
   $data = { event => "getwirelessinfo", type => "ICCID" };

   my $content = encode_json( $data );
   my $curl = WWW::Curl::Easy->new;
   $curl->setopt( CURLOPT_URL, $url);
   $curl->setopt( CURLOPT_HTTPAUTH, CURLAUTH_ANY ) ;
   $curl->setopt( CURLOPT_HEADER,0);
   $curl->setopt( CURLOPT_USERPWD, $auth_name );
   $curl->setopt( CURLOPT_POST, 1);
   $curl->setopt( CURLOPT_MAXREDIRS, 10 );                                                
   $curl->setopt( CURLOPT_POSTFIELDS, $content );
   $curl->setopt( CURLOPT_HTTPHEADER, ["Content-type:application/json;charset='utf-8'","Accept:application/json"]);
   $curl->setopt( CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
   $curl->setopt( CURLOPT_TIMEOUT, 0);
   $curl->setopt( CURLOPT_FOLLOWLOCATION, 1);
   $curl->setopt( CURLINFO_HEADER_OUT, 1 );
   $curl->setopt( CURLOPT_SSL_VERIFYPEER, 0);
   $curl->setopt( CURLOPT_SSL_VERIFYHOST, 0);

   my $response_body;
   $curl->setopt(CURLOPT_WRITEDATA,\$response_body);
   my $retcode = $curl->perform;
   my $error_text = "";

   if ($retcode == 0) {
		my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
     	if( $response_code == 200 ) {

         $data = decode_json($response_body);
         if( $data->{result} == "ok" ) {

            my @info = split /;/, $data->{content};
            my @ports = split /,/, $info[0];
            my @iccids = split /\./, $ports[0];

            for( my $i = 0; $i < $totales; $i++ ) {

               my @iccid_data = split /:/, $iccids[$i];
               my $index = $iccid_data[0]; 

               if( $iccid_data[1] eq "----" ) {
                  $iccid[$index-1] = "";
               }
               else {
                  $iccid[$index-1] = $iccid_data[1];
               }
#               printf( "%s\n", $iccid[$i]);
            }

         }
      }
   }

   # ------
   # Portype
   # ------     
   $url = $ip . "/API/QueryWireLessInfo";
   $data = { event => "getwirelessinfo", type => "porttype" };

   my $content = encode_json( $data );
   my $curl = WWW::Curl::Easy->new;
   $curl->setopt( CURLOPT_URL, $url);
   $curl->setopt( CURLOPT_HTTPAUTH, CURLAUTH_ANY ) ;
   $curl->setopt( CURLOPT_HEADER,0);
   $curl->setopt( CURLOPT_USERPWD, $auth_name );
   $curl->setopt( CURLOPT_POST, 1);
   $curl->setopt( CURLOPT_MAXREDIRS, 10 );                                                
   $curl->setopt( CURLOPT_POSTFIELDS, $content );
   $curl->setopt( CURLOPT_HTTPHEADER, ["Content-type:application/json;charset='utf-8'","Accept:application/json"]);
   $curl->setopt( CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
   $curl->setopt( CURLOPT_TIMEOUT, 0);
   $curl->setopt( CURLOPT_FOLLOWLOCATION, 1);
   $curl->setopt( CURLINFO_HEADER_OUT, 1 );
   $curl->setopt( CURLOPT_SSL_VERIFYPEER, 0);
   $curl->setopt( CURLOPT_SSL_VERIFYHOST, 0);

   my $response_body;
   $curl->setopt(CURLOPT_WRITEDATA,\$response_body);
   my $retcode = $curl->perform;
   my $error_text = "";

   if ($retcode == 0) {
		my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
     	if( $response_code == 200 ) {

         $data = decode_json($response_body);
         if( $data->{result} == "ok" ) {

            my @info = split /;/, $data->{content};
            my @ports = split /,/, $info[0];

            my @porttypes = split /\./, $ports[0];
            my @porttype_data = split /:/, $porttypes[0];
            for( my $i = 0; $i < $totales; $i++ ) {

               $porttype[$i] = $porttype_data[1]; 
            }
         }
      }
   }


   # ----------
   # Detail
   # ----------
   $url = $ip . "/API/QueryInfo";
   $data = { event => "getDetailPortInfo" };

   my $content = encode_json( $data );
   my $curl = WWW::Curl::Easy->new;
   $curl->setopt( CURLOPT_URL, $url);
   $curl->setopt( CURLOPT_HTTPAUTH, CURLAUTH_ANY ) ;
   $curl->setopt( CURLOPT_HEADER,0);
   $curl->setopt( CURLOPT_USERPWD, $auth_name );
   $curl->setopt( CURLOPT_POST, 1);
   $curl->setopt( CURLOPT_MAXREDIRS, 10 );                                                
   $curl->setopt( CURLOPT_POSTFIELDS, $content );
   $curl->setopt( CURLOPT_HTTPHEADER, ["Content-type:application/json;charset='utf-8'","Accept:application/json"]);
   $curl->setopt( CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
   $curl->setopt( CURLOPT_TIMEOUT, 0);
   $curl->setopt( CURLOPT_FOLLOWLOCATION, 1);
   $curl->setopt( CURLINFO_HEADER_OUT, 1 );
   $curl->setopt( CURLOPT_SSL_VERIFYPEER, 0);
   $curl->setopt( CURLOPT_SSL_VERIFYHOST, 0);

   my $response_body;
   $curl->setopt(CURLOPT_WRITEDATA,\$response_body);
   my $retcode = $curl->perform;
   my $error_text = "";

   if ($retcode == 0) {
		my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
     	if( $response_code == 200 ) {

         $data = decode_json($response_body);
#        printf( "%s\n", $response_body );
         if( $data->{result} == "ok" ) {
            my $totalport = $data->{totalPort};
            my $portState = $data->{portState};
            my $portOp = $data->{portOpt};
            my $portType = $data->{portType};
            my $portSig = $data->{portSig};

            @tPort = split /,/, $totalport;
            @tPortState = split /,/, $portState;
            @tPortOp = split /,/, $portOp;
            @tPortType = split /,/, $portType;
            @tPortSig = split /,/, $portSig;
         }
      }
   }


   my $json = sprintf( '{"error_code":200,"sn":"%s","info":[', $sn );
  printf( "%s\n", $json );
   for( my $i = 0; $i < 32; $i++ ) {
      my $state = sprintf( '{"port":%d,"type":"%s","imei":"%s","imsi":"%s","iccid":"%s","number":"","reg":"%s","slot":"%s","callstate":"%s","signal":%s}', $i, $tPortType[0], $imei[$i], $imsi[$i], $iccid[$i], $reg[$i], "", $callstates[$tPortState[$i]], $tPortSig[$i] );
            
      if( $i < 31 ) {
         $state .= ",";
      }
		$json .= $state;
     printf( "%s\n", $state );
   }
   $json .= "]}\n";
   return $json;
=cut
}





# ----------------------------------
# querySmsResults
# ----------------------------------

sub synway_QuerySmsResults {
	my $ip = $_[0];
	my $auth = $_[1];
	my $fecha= $_[2];
	my $canales = $_[3];
   my $json = "";
	my $text = "";
	my $i;

   my $url = sprintf( "%s/API/QueryInfo", $ip ); 
	my $postfields = { 
	   					 event => 'querytxallsms'
						  };
   my $jsonEncoded = encode_json( $postfields );
   my $curl = WWW::Curl::Easy->new;
   $curl->setopt( CURLOPT_HEADER,0);
   $curl->setopt( CURLOPT_URL, $url);
   $curl->setopt( CURLOPT_MAXREDIRS, 10 );                                                
   $curl->setopt( CURLOPT_POSTFIELDS, $jsonEncoded );
   $curl->setopt( CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
   $curl->setopt( CURLOPT_HTTPAUTH, CURLAUTH_ANY ) ;
   $curl->setopt( CURLOPT_USERPWD, $auth );
   $curl->setopt( CURLOPT_POST, 1);
   $curl->setopt( CURLOPT_TIMEOUT, 0);
   $curl->setopt( CURLOPT_FOLLOWLOCATION, 1);
   $curl->setopt( CURLOPT_USERPWD, $auth);
   
   my $response_body;
   $curl->setopt(CURLOPT_WRITEDATA,\$response_body);
   my $retcode = $curl->perform;
   my $error_text = "";

   if ($retcode == 0) {
	   my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);

     	if( $response_code == 200 ) {

         my $data = decode_json($response_body);
         if( $data->{result} eq "ok" ) {

            my $sn = "0002";
				my $error_code = 200;
				my $smstotal = $data->{smstotal};
            if( $smstotal > 0 ) {

               $json = sprintf( '{"error_code":200,"sn":"%s","result":[', $sn );
               $json .= "\n";
               for( $i = 0; $i < $smstotal; $i++ ) {
                  my $sms = sprintf( "SMS%d", $i );
                  my @info = split /:/, $data->{$sms};
                  my $taskid = $info[0];
                  my $time = $info[1];
                  my $port = $info[2];
                  my $recipient = $info[3];
                  my $status = $info[4];

                  my $datetime = substr( $time, 0, 4 ) . "-" . substr( $time, 4, 2 ) . "-" . substr( $time, 6, 2 ) . " " . substr( $time, 8, 2 ) . ":" . substr( $time, 10, 2 ) . ":" . substr( $time, 12, 2 );
                  my $status_report = "";

                  switch( $status ) {

                     case 0 {
                        $status_report = "NONE";
                     }

                     case 3 {
                        $status_report = "DELIVERED";
                     }

                     case 2 {
                        $status_report = "SENDING";
                     }

                     case 4 {
                        $status_report = "FAILED";
                     }

                     case 5 {
                        $status_report = "TIMEOUT";
                     }
                  }
                  $json .= sprintf( '{"port":%d, "number":"%s","time":"%s","ref_id":%d,"status_code":"%s","imsi":""}', $port, $recipient, $datetime, $taskid, $status_report );
                  if( $i < $smstotal-1 ) {
                     $json .= ",\n";
                  } 

#               Dinstar: {"error_code":200,"sn":"xxxx-xxxx-xxxx-xxxx","result":[{"port":0, "number":"12341234","time":"2014-12-21 12:06:01","ref_id":12,"status_code":0,"imsi":"460004642148063"}]}
#               0:20250427175207:1:1144255139:3
#               taskid=0 : 
#               datetime=20250427175207 :
#               port=1   :
#               recipient=1144255139 :
#               send_status=3
#               0-None, 1-Wait, 2-Sending, 3-Successful, 4-Failed 5-Timeout
               }
               $json .= "]}";
               printf( "%s\n", $json );
            }
            else {
               $json = sprintf( '{"error_code":200,"sn":"%s","result":[]}', $sn );
            }
         }
			return $json;
     	}
   }
	return "";
}


# ----------------------------------
# synway_DeleteSms
# ----------------------------------

sub synway_DeleteSms {
	my $ip = $_[0];
	my $auth = $_[1];
	my $fecha= $_[2];
   my $json = "";
	my $text = "";
   my @content;

#  my $datetime = substr( $fecha,0,4) . substr( $fecha,5,2) . substr( $fecha,8,2) . substr( $fecha,11,2) . substr( $fecha,14,2) . substr( $fecha,17,2);
   my $datetime = "20250501000000";
   my $url = sprintf( "%s/API/DeleteSMS", $ip ); 
	my $postfields = { 
	   					 event => 'deletesms',
      					 begintime => $datetime,
#	   					 endtime => $datetime,
	   					 smsbox => 's',
	   					 clear => '1'
						  };

   my $jsonEncoded = encode_json( $postfields );
   printf( "%s\n", $jsonEncoded );

   my $curl = WWW::Curl::Easy->new;
   $curl->setopt( CURLOPT_HEADER,0);
   $curl->setopt( CURLOPT_URL, $url);
   $curl->setopt( CURLOPT_MAXREDIRS, 10 );                                                
   $curl->setopt( CURLOPT_POSTFIELDS, $jsonEncoded );
   $curl->setopt( CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
   $curl->setopt( CURLOPT_HTTPAUTH, CURLAUTH_ANY ) ;
   $curl->setopt( CURLOPT_USERPWD, $auth );
   $curl->setopt( CURLOPT_POST, 1);
   $curl->setopt( CURLOPT_TIMEOUT, 0);
   $curl->setopt( CURLOPT_FOLLOWLOCATION, 1);
   $curl->setopt( CURLOPT_USERPWD, $auth);
   
   my $response_body;
   $curl->setopt(CURLOPT_WRITEDATA,\$response_body);
   my $retcode = $curl->perform;
   my $error_text = "";

   if ($retcode == 0) {
	   my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);

     	if( $response_code == 200 ) {

         my $data = decode_json($response_body);
         if( $data->{result} eq "ok" ) {

#           {“result”:“ok”,“content”:“}
				@content = split /:/, $data->{content};  

#            printf( "%s\n", $data->{content} );
#            printf( "%s\n", $content[0] );      # total
            printf( "%s\n", $content[1] );      # num
         }
			return $content[1];
     	}
   }
	return "0";
}



# -------------------
# synway_GetIMEI
# -------------------
sub synway_GetIMEI {
   my $ip = $_[0];
   my $port = $_[1];
   my $auth_name = $_[2];
   my $sn = $_[3];

   # ------
   # IMEI  
   # ------     
   my $url = $ip . "/API/QueryWireLessInfo";
   my $data = { event => "getwirelessinfo", type => "IMEI", port => $port };

   my $content = encode_json( $data );
   my $curl = WWW::Curl::Easy->new;
   $curl->setopt( CURLOPT_URL, $url);
   $curl->setopt( CURLOPT_HTTPAUTH, CURLAUTH_ANY ) ;
   $curl->setopt( CURLOPT_HEADER,0);
   $curl->setopt( CURLOPT_USERPWD, $auth_name );
   $curl->setopt( CURLOPT_POST, 1);
   $curl->setopt( CURLOPT_MAXREDIRS, 10 );                                                
   $curl->setopt( CURLOPT_POSTFIELDS, $content );
   $curl->setopt( CURLOPT_HTTPHEADER, ["Content-type:application/json;charset='utf-8'","Accept:application/json"]);
   $curl->setopt( CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
   $curl->setopt( CURLOPT_TIMEOUT, 0);
   $curl->setopt( CURLOPT_FOLLOWLOCATION, 1);
   $curl->setopt( CURLINFO_HEADER_OUT, 1 );
   $curl->setopt( CURLOPT_SSL_VERIFYPEER, 0);
   $curl->setopt( CURLOPT_SSL_VERIFYHOST, 0);

   my $response_body = "";
   $curl->setopt(CURLOPT_WRITEDATA,\$response_body);
   my $retcode = $curl->perform;
   my $error_text = "";

   if ($retcode == 0) {
		my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
     	if( $response_code == 200 ) {

         my $data = decode_json($response_body);
         if( $data->{result} eq "ok" ) {
#            printf( "%s\n", $data->{content} );
            my @info = split /:/, $data->{content};
#           printf( "%s\n", $info[0] );
#            printf( "%s\n", $info[1] );
            return substr($info[1],0,15);
         }
      }
   }
   return "";
}


   # -------------------------------------
   # setIMEI
   # -------------------------------------

   sub setIMEI{
   	my $ip = $_[0];
	   my $auth = $_[1];
   	my $port = $_[2];
	   my $imei = $_[3];

      my @IMEI;
      my $headers = 
         "'Host: ' . $ip,
         'Connection: keep-alive',
         'Authorization: Basic YWRtaW46cGVwaXRvMjA=',
         'Upgrade-Insecure-Requests: 1',
         'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
         'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
         'Referer: http://10.0.66.106/en/5-4-1IMEIset.php',
         'Accept-Encoding: gzip, deflate',
         'Accept-Language: es-AR,es;q=0.9,en-US;q=0.8,en;q=0.7,es-419;q=0.6',
         'Content-Type: application/x-www-form-urlencoded'";
#         'Referer: http://' . $ip . '/en/5-4IMEI.php',


      my $url = sprintf( "%s/en/5-4-1IMEIset.php", $ip ); 
      my $content = sprintf( "IMEI%d=%s&save=Save", $port-1, $imei);
#     printf( "%s\n", $content );

      my $curl = WWW::Curl::Easy->new;
      $curl->setopt( CURLOPT_HEADER,0);
      $curl->setopt( CURLOPT_URL, $url);
      $curl->setopt( CURLOPT_MAXREDIRS, 10 );                                                
      $curl->setopt( CURLOPT_HTTPHEADER, [$headers] ); 
      $curl->setopt( CURLOPT_HTTPAUTH, CURLAUTH_ANY ) ;
      $curl->setopt( CURLOPT_USERPWD, $auth );
      $curl->setopt( CURLOPT_POST, 0);
      $curl->setopt( CURLOPT_POSTFIELDS, $content);
      $curl->setopt( CURLOPT_TIMEOUT, 0);
      $curl->setopt( CURLOPT_FOLLOWLOCATION, 1);
      $curl->setopt( CURLINFO_HEADER_OUT, 1 );
   
      my $response_body;
      $curl->setopt(CURLOPT_WRITEDATA,\$response_body);
      my $retcode = $curl->perform;
      my $error_text = "";

      if ($retcode == 0) {
      	my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
        	if( $response_code == 200 ) {

#               open(FH, '>', "./setImei.txt") or die $!;   
#               print FH $response_body;
#               close(FH);
         }
      }
#     curl_close($curl);
      return( 0 );
   }


# ------------
# changeIMEI
# ------------
sub synway1_ChangeIMEI {
	my $ip = $_[0];
	my $port = $_[1];
	my $auth = $_[2];
	my $intended_imei = $_[3];
   my $new_imei = "";

   my $imei = synway_GetIMEI( $ip, $port, $auth, "" );
   printf( "Actual IMEI: %s\n", $imei);

   my $serial = 111111 + int(rand(999999 - 111111));
   my $tac = substr( $imei, 0, 8 );
   my $new_imei = sprintf( "%s%06d", $tac, $serial );
   printf( "New IMEI:    %s\n", calculateIMEI($new_imei) );

   setIMEI($ip,$auth,$port,$new_imei);
	return "";
}



=begin

# ------------
# changeIMEI
# ------------
sub synway1_ChangeIMEI {
	my $ip = $_[0];
	my $port = $_[1];
	my $auth = $_[2];
	my $imei_tac = $_[3];


#   synway1_ChangeIMEI( "10.0.66.106", "ApiUserAdmin:pepito20", 1, 32, "" );

   my @IMEI;
   my @new_imei;
   my $public_url = "10.0.66.106";
   my $channels = 32;

   my $imei = synway_GetIMEI( $ip, $port, $auth, "" );
   printf( "Actual IMEI: %s<<\n", $imei);

   my $serial = 111111 + int(rand(999999 - 111111));
   my $tac = substr( $imei, 0, 8 );
   my $new_imei = sprintf( "%s%6d", $tac, $serial );
   printf( "New IMEI:    %s\n", calculateIMEI($new_imei) );


   my $headers = 
      "'Host: $ip', 'Connection: keep-alive', 'Authorization: Basic YWRtaW46cGVwaXRvMjA=', 'Upgrade-Insecure-Requests: 1', 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
      'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Referer: http://$ip/en/navigation_imei.php',
      'Accept-Encoding: gzip, deflate', 'Accept-Language: es-AR,es;q=0.9,en-US;q=0.8,en;q=0.7,es-419;q=0.6'";

   my $url = sprintf( "%s/en/5-4-1IMEIset.php", $public_url ); 
   my $curl = WWW::Curl::Easy->new;
   $curl->setopt( CURLOPT_HEADER,0);
   $curl->setopt( CURLOPT_URL, $url);
   $curl->setopt( CURLOPT_MAXREDIRS, 10 );                                                
   $curl->setopt( CURLOPT_HTTPHEADER, [$headers] ); 
   $curl->setopt( CURLOPT_HTTPAUTH, CURLAUTH_ANY ) ;
   $curl->setopt( CURLOPT_USERPWD, $auth );
   $curl->setopt( CURLOPT_POST, 0);
   $curl->setopt( CURLOPT_TIMEOUT, 0);
   $curl->setopt( CURLOPT_FOLLOWLOCATION, 1);
   $curl->setopt( CURLINFO_HEADER_OUT, 1 );
   
   my $response_body;
   $curl->setopt(CURLOPT_WRITEDATA,\$response_body);
   my $retcode = $curl->perform;
   my $error_text = "";
   
   if ($retcode == 0) {
   	my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
     	if( $response_code == 200 ) {

#  	   printf( "%s\n", $response_body );
	      my $startstr = index($response_body,"function LoadPreData()");
         my $str = substr( $response_body, $startstr );
      	my $endstr = index($str, "}");
			$str = substr( $str, 0, $endstr );

      	# -----------------------------------
      	# Buscar valores de IMEI en $str
	      # -----------------------------------
         for( my $i = 0; $i < $channels; ++$i ) {
		   
				my $offset = 0;
            my $search = sprintf( "IMEI%d", $i );
            my $strIMEI = index( $str, $search );

            printf( "$strIMEI\n" );
            if( $i >= 10 ) {
					$offset = 18;
				}
            else {
					$offset = 17;
				}

            my $serial = 111111 + int(rand(999999 - 111111));
            my $imei = sprintf( "%s%6d", "35044824", $serial );

            $IMEI[$i] = substr( $str, $strIMEI + $offset, 15 );
 #          printf( "%s\n", $IMEI[$i] );
#           $new_imei[$i] = calculateIMEI($IMEI[$i]);
            $new_imei[$i] = calculateIMEI($imei);

       		printf( "Port %2d: %s -> %s\n", $i + 1, $IMEI[$i], $new_imei[$i] );
#          	printf( "Port %2d: %s\n", $i + 1, $IMEI[$i] );
         }
#	      setIMEI( $ip, $public_url, $auth, 0, $new_imei[0] );
#	      return( $new_imei[$port] );
#        printf( "%s\n", $IMEI[$port] );
	      return( $IMEI[$port] );
     	}
   }
	return "";
}
=cut


