Contrôle d'un poste radio via le port COM avec ... PHP

 

Création de l'article : 30/09/2008
Mise à jour : 30/09/2008

Ayant reçu un mail pour avoir des infos sur le façon d'envoyer des données sur un poste radio via PHP (procole CAT via un port COM),
j'ai décidé de mettre un article sur le blog qui explique la technique utilisée qui me permet de piloter mon Yaesu FT-897 ;)

Tout d'abord à la lecture du manuel technique de mon poste j'ai trouvé une page plutôt sympa qui décrit comment marche le protocole CAT,
YAESU met à disposition une matrice avec ... tous les codes qui contrôle le poste :

 

Explication

Ici je change passe le mode de transmission du poste de radio sur : CW ce qui consiste à envoyer un bloc de 5 bits avec 200ms entre chaque bits et de mettre l'opcode à 07

[P1] x x x [07] avec P1 qui contient le code correspondant au mode : 02 00 00 00 07
et voilà ... il ne reste plus qu'a préparer le tout !

YAESU nous permet aussi de changer la fréquence : 43 97 00 00 01 (avec l'opcode = 01)
ce qui nous donnes : 439.70 MHZ !

 

Action !

La méthode consiste à préparer le code CAT à envoyer (sous forme de chaine de caractère)
puis de l'interprêter (passage en hex) puis de l'envoyer sur un socket binder sur ... un port CAT :



	/*
		Contrôle d'un transceiver via le protocole CAT 
		decrit dans la DOC YAESU ... 
		Code testé sur un FT897 sous WINDOWS XP PRO 
		(c) 2008 Bastien Barbe 
	*/

	//On prepare la connexion sur le port COM :
	$com_id=1;
	$state=`mode com$com_id: BAUD=4800 PARITY=N data=8 stop=2 xon=off`;
	$_sock = fopen("COM".$com_id.":", "w+");


	//On prepare les blocs HEXA à transmettre :
	//Ici on envoi cette commande pour changer le mode (03=>CW)

	//La methode utiliee ici consiste à préparer une chaine de caractere .... 
	//contenant le code à envoyer. 
	$hex_command_yaesu="\x03\x00\x00\x00\x07";

	//On prepare les donnees : 
	$blocs = explode('\\',$hex_command_yaesu);
	unset($blocs[0]);


	//Ensuite on envoi paquet par paquet les données (CF PROTOCOLE CAT)
	//sur le socket qui est "bindé" sur le COM1 ici :
	if(is_array($blocs)){
	    foreach($blocs as $k=>$hex_bloc){
	        eval("\$str_hex=\"\\$hex_bloc\";");
	        $r=fwrite($_sock,$str_hex);
	    }          
	}

	fclose($_sock);
	  		
	  
	  
	  
  
	  


Pour les lire les données renvoyé par le poste (cas des commandes pour récupérer la fréquence;)) Il nous faut ceci :

bin2hex( )


Pleins de perspective son possible comme :

- Créer une interface AJAX qui pilote votre poste radio (bientôt dans le logbook CRX disponible ici : www.crxcluster.com)

- Créer une interface WEB qui pilote votre poste de radio (en y connectant le poste sur une webradio/shouotcast/flash streaming...).

 

La suite bientôt .... avec la mise à jour du logbook !
Bonne bidouille avec votre poste radio et PHP :)
73 Bastien

 

PS voilà une fonction pratique pour générer une chaines HEXA à envoyer pour contrôler le poste ;)

	  
	  		/**
	*
	*	Will return : \x01\x40\x96\x00\x01		=>    mean 14096   so    (14,.... mhz)
	*	Will return : \x14\x40\x96\x00\x01		=>    mean  144096 so   (144,096 mhz !)
	*
	*/
		function frequencyNormalyzerHumanKhzToYaesuTransceiver($digit_values_khz=array()){
			$in_size=sizeof($digit_values_khz);
			$pad			=	9;
			$padding_0_size	=	$pad - $in_size - 3;
		
			//print 'PADDING 0 SIZE  => '.$padding_0_size._BR_;
		
			$i				=	0;
			$in_digit_id	=	0;
			$output_str_hex	=	'';
			
			while($i<=10){
				if($i<$padding_0_size){
					$output_str_hex	.= '0';
				}
				else{
					$output_str_hex	.= $digit_values_khz[$in_digit_id];
					$in_digit_id++;
					if($i>8){
						$output_str_hex	.= '0';
					}
				}
				$i++;
			}
			
			$i=0;
			$houtput_str_hex.='\x';
			while($i<=10){
				
				if($i%2 && $i<6 && isset($output_str_hex{$i}))$houtput_str_hex.=$output_str_hex{$i}.'\x';
				else $houtput_str_hex.=$output_str_hex{$i};
				$i++;
			}
			return $houtput_str_hex;
		}
	  
	  
© Bastien Barbe 2008