/var/www/doncode.com.ua/www/libs
Edit: /var/www/doncode.com.ua/www/libs/class.transfer_scales.php (10626B)
0x1021,
"init" => 0,
"xor_out" => 0,
);
foreach ($aDefaults as $key => $val){
if (!isset($aParams[$key])){
$aParams[$key] = $val;
}
}
$sStr .= "";
$crc = $aParams['init'];
$len = strlen($sStr);
$i = 0;
while ($len--){
$crc ^= ord($sStr[$i++]) << 8;
$crc &= 0xffff;
for ($j = 0; $j < 8; $j++){
$crc = ($crc & 0x8000) ? ($crc << 1) ^ $aParams['polynome'] : $crc << 1;
$crc &= 0xffff;
}
}
$crc ^= $aParams['xor_out'];
return $crc;
}
/**
* @param
* $count_page количетво страниц PLU
* $command команда , 207 - запись
* $tranz - передача
* $mode - режим (0/1)(запись/чтение)
* $numv - номер вессов (не использется)
* $pagelength - 100 если запись
* $deprtment - номер отдела
* @return string
*
*/
public static function buildHeader ($count_page,$command=207,$tranz=0,$mode = 0,$numv=0,$pagelength = 100,$department=1){
$cmdheader = pack("hvvvh",$tranz,$command,$mode,$department,$numv);
$len_header_cmd =strlen($cmdheader);
$totallength = ($count_page*$pagelength)+$len_header_cmd;// длина всего пакета
$packetheader = pack("v*",$totallength,$count_page,$pagelength);
self::$header =bin2hex($packetheader). bin2hex($cmdheader);
return ( strlen(self::$header)/2==14) ;
}
/**
* @param
* (array) $adress ip port вессов
* (array) $PLU
* $PLU['name'] наименование артикула не больше 56 символов
* $PLU['id'] №PLU и его же артикул
* $PLU['units'] еденицы измерения
* $PLU['grad'] 0/1 0-вессовой , 1 - штучный
* $PLU['price'] цена
* $PLU['category']
* @return
* (bool)
*/
public static function send ( $PLU, $adress,$Wweight=1000){
if(is_array($PLU)){
$rezerv = bin2hex(pack("h",2)); //стартовый байт
/*---------------------------------------------------------------------------------------*/
$c =0;
$arr = array();
$countAdr = count($adress);
foreach ($PLU as $k=>$v){
$c++;
$arr[$k]='';
$id = (int)$v['id'];
if((int)$v['id']==0){
self::logs('ID товара должно быть числом');
return false;
}
$arr[$k].=bin2hex(pack ('l',$v['id'] ));// номер PLU
$charPluArtile = 13;//Article количество байт (Не менять!)
$a =pack('a*',$v['id']);
$articleNum= bin2hex($a);
if(strlen($articleNum)/2<$charPluArtile){
for($i=0;$i<$charPluArtile-strlen($articleNum)/2;$i++){
$arr[$k].= bin2hex(pack('a',0));
}
}else if(strlen($articleNum)/2>$charPluArtile){
self::logs('Не удалось сформировать артикул');
return false;
}
$arr[$k].=$articleNum;
$string = explode(' ',$v['name']);
$buffStr = '';
$plu1 ='';
$plu2 ='';
$charPluName = 30;
$buffStr1 ='';
$overflow = false;
$x=0;
$CP866='';
$bin='';
for($i=0;$i
$charPluName){
$plu1 = substr ($plu1,0, $charPluName *2);
}
}else{
$overflow = true;
}
}
if($overflow){
$CP866 =iconv("UTF-8", "CP866", $string[$i].' ');
$bin = bin2hex(pack('A*',$CP866));
$buffStr1 .=$bin;
if (strlen($buffStr1)/2<=$charPluName){
$plu2=$buffStr1;
}
}
}
if($charPluName-strlen($plu1)/2>0){
$i=0;
while($i <$charPluName-strlen($plu1)/2){
$plu1.= bin2hex(pack('a',' '));
}
}
if($charPluName-strlen($plu2)/2>0){
$i=0;
while($i <$charPluName-strlen($plu2)/2){
$plu2.= bin2hex(pack('a',' '));
}
}
if (strlen($plu1)/2==$charPluName && strlen($plu2)/2==$charPluName){
$arr[$k].=$plu1.$plu2.'20'.bin2hex(pack('l',(isset($v['price'])&&is_numeric($v['price']))?$v['price']*100:0)).'00'.bin2hex(pack('c',(isset($v['units'])&&is_numeric($v['units']))?$v['units']:0)).'1010'.bin2hex(pack('l',(is_numeric($Wweight))?$Wweight:0)).bin2hex(pack('s',(isset($v['category'])&&is_numeric($v['category']))?$v['category']:0)).bin2hex(pack('h',(isset($v['grad'])&&is_numeric($v['grad']))?$v['grad']:0)).'00000000000000';
}else{
self::logs('Не удалось сформировать наименование PLU');
return false;
}
if($c%8==0){
if( !self::buildHeader($c)){
self::logs('Не правильно сформирован заголовок');
return false;
}
$s = self::$header.implode('',$arr);
$len = strlen($s);
$ctrl_sum = dechex(self::crc16(pack("H{$len}", $s))); //контрольная сумма
$hex_str = $rezerv.$s.$ctrl_sum;
$arr = array();
if(is_array($adress)){
for ($k=0;$k<$countAdr;$k++){
if($k!=0 && $adress[$k]['ip']!=$adress[$k-1]['ip']){
if(!self::sendSocket($adress[$k]['ip'],$adress[$k]['port'],$hex_str)){
self::logs('Не удалось отправить данные на '.$ip.':'.$port);
return false;
}
}else{
if(!self::sendSocket($adress[$k]['ip'],$adress[$k]['port'],$hex_str)){
self::logs('Не удалось отправить данные на '.$ip.':'.$port);
return false;
}
usleep(1000000);
}
}
}
}
}
if(count($arr)>0){
if( !self::buildHeader(count($arr))){
self::logs('Не правильно сформирован заголовок');
return false;
}
$s = self::$header.implode('',$arr);
$len = strlen($s);
$ctrl_sum = dechex(self::crc16(pack("H{$len}", $s))); //контрольная сумма
$hex_str = $rezerv.$s.$ctrl_sum;
if(is_array($adress)){
for ($k=0;$k<$countAdr;$k++){
if($k!=0 && $adress[$k]['ip']!=$adress[$k-1]['ip']){
if(!self::sendSocket($adress[$k]['ip'],$adress[$k]['port'],$hex_str)){
self::logs('Не удалось отправить данные на '.$ip.':'.$port);
return false;
}
}else{
if(!self::sendSocket($adress[$k]['ip'],$adress[$k]['port'],$hex_str)){
self::logs('Не удалось отправить данные на '.$ip.':'.$port);
return false;
}
usleep(1000000);
}
}
}
}
}else{
self::logs('Передан не массив PLU');
return false;
}
return true;
}
/**
*
*
*
*/
public function sendSocket($ip,$port,$hex_string){
$fp = fsockopen($ip, $port, $errno, $errstr,15);
if (!$fp) {
return false;
} else {
$binary_string = pack("H*" , $hex_string);
if(fwrite($fp, $binary_string) !== false ){
fclose($fp);
return true;
}else{
fclose($fp);
return false;
}
}
}
/**
*
*
*
*
*/
public static function logs ( $str , $file='scale' ){
$file = fopen('logs/'.$file.'.txt','a+');
fputs($file, date('Y-m-d H:i:s').' | '.$str."\r\n");
fclose($file);
}
}