Hi, I needed to create config files for downloading to Grandstream devices and made a little script for it. It seems to work fine for the HT486. The script needs a config file (cfg.in) which is in this format: P2 = blah P10 = hrm ...etc... The configfile may contain comments (starting with '#') and empty lines. Mind that the 'gnkey=0b82' shouldn't be in the configfile, as it's already appended by the script. Hope it's useful.. Thanks to Stephen R. Besch for information about the format of this file ! (One thing I am not 100% sure of: do I have to append zeros to the end of the body until it has an even amount of bytes, or an even amount of words ? Right now, I do both.) Regards, Leon de Rooij -------------- #!/usr/bin/perl -w use strict; my $h_mac = '000b82014e20'; # hexadecimal mac address my $f_in = 'cfg.in'; # file body, configfile containing all parameters my $f_out = 'cfg.txt'; # the configfile that will be written to my $h_crlf = '0d0a'; # hexadecimal crlf # convert some things to binary my $b_mac = pack("H12", $h_mac); # convert 12 hex numbers to bin my $b_crlf = pack("H4", $h_crlf); # convert 4 hex numbers to bin # open configfile and make body in ascii (a_body) my $a_body; open F,$f_in; while (<F>) { chomp; # remove trailing lf s/\#.*$//g; # remove comments s/\s//g; # remove all whitespace $a_body .= $_.'&' if length > 0; } close F; $a_body .='gnkey=0b82'; # add an extra byte to make the body even (bytewise) $a_body .= "\0" if ((length($a_body) % 2) ne 0); # add an extra word ( = two bytes) to make the body even (wordwise) $a_body .= "\0\0" if ((length($a_body) % 4) ne 0); # generate a d_length (length of the complete message, counting words, in dec) # ( header is always 8 words lang ) + ( body in ascii (bytes) / 2 = in words ) my $d_length = 8 + (length($a_body)/2); # make that a binary dword my $b_length = pack("N", $d_length); # generate a checksum my $d_checksum; foreach ($b_length,$b_mac,$b_crlf,$b_crlf,$a_body) { $d_checksum += unpack("%16n*", $_); } #$d_checksum %= 65536; $d_checksum = 65536-$d_checksum; # and make a binary word of that my $b_checksum = pack("n", $d_checksum); # and write the config back to disk, in a grandstream readable format open F,">$f_out"; binmode F; print F $b_length; print F $b_checksum; print F $b_mac; print F $b_crlf; print F $b_crlf; print F $a_body; close F;
Way cool :) I noticed a couple of differences between Grandstream's GAPSLITE tool and your tool: 1) GS ignores multiple occurrences of a parameter, only using the last. For example: P30=time.nist.gov P30=clock1.redhat.com GS's tool only puts "P30=clock1.redhat.com" in the cfg file while yours puts both. 2) GS keeps spaces in a parameter. For example: P3=George W Bush GS puts "P3=George W Bush" in the cfg file while yours puts "P3=GeorgeWBush" 3) GS lets you specify the MAC, input, and output files on the command line while yours is "in the code." This is probably the most important difference as it would allow easy scripting to support a bunch of devices. On Wed, 22 Sep 2004, Leon de Rooij wrote:> Hi, > > I needed to create config files for downloading to Grandstream devices and > made a little script for it. It seems to work fine for the HT486. > The script needs a config file (cfg.in) which is in this format: > > P2 = blah > P10 = hrm > ...etc... > > The configfile may contain comments (starting with '#') and empty lines. Mind > that the 'gnkey=0b82' shouldn't be in the configfile, as it's already > appended by the script. > > Hope it's useful.. > > Thanks to Stephen R. Besch for information about the format of this file ! > > (One thing I am not 100% sure of: do I have to append zeros to the end of the > body until it has an even amount of bytes, or an even amount of words ? Right > now, I do both.) > > Regards, > > Leon de Rooij > > -------------- > > #!/usr/bin/perl -w > use strict; > > my $h_mac = '000b82014e20'; # hexadecimal mac address > my $f_in = 'cfg.in'; # file body, configfile containing all > parameters > my $f_out = 'cfg.txt'; # the configfile that will be written to > > my $h_crlf = '0d0a'; # hexadecimal crlf > > # convert some things to binary > my $b_mac = pack("H12", $h_mac); # convert 12 hex numbers to bin > my $b_crlf = pack("H4", $h_crlf); # convert 4 hex numbers to bin > > # open configfile and make body in ascii (a_body) > my $a_body; > open F,$f_in; > while (<F>) { > chomp; # remove trailing lf > s/\#.*$//g; # remove comments > s/\s//g; # remove all whitespace > $a_body .= $_.'&' if length > 0; > } > close F; > $a_body .='gnkey=0b82'; > > # add an extra byte to make the body even (bytewise) > $a_body .= "\0" if ((length($a_body) % 2) ne 0); > > # add an extra word ( = two bytes) to make the body even (wordwise) > $a_body .= "\0\0" if ((length($a_body) % 4) ne 0); > > # generate a d_length (length of the complete message, counting words, in > dec) > # ( header is always 8 words lang ) + ( body in ascii (bytes) / 2 = in words > ) > my $d_length = 8 + (length($a_body)/2); > > # make that a binary dword > my $b_length = pack("N", $d_length); > > # generate a checksum > my $d_checksum; > foreach ($b_length,$b_mac,$b_crlf,$b_crlf,$a_body) { > $d_checksum += unpack("%16n*", $_); > } > #$d_checksum %= 65536; > > $d_checksum = 65536-$d_checksum; > > # and make a binary word of that > my $b_checksum = pack("n", $d_checksum); > > # and write the config back to disk, in a grandstream readable format > open F,">$f_out"; > binmode F; > print F $b_length; > print F $b_checksum; > print F $b_mac; > print F $b_crlf; > print F $b_crlf; > print F $a_body; > close F; > > _______________________________________________ > Asterisk-Users mailing list > Asterisk-Users@lists.digium.com > http://lists.digium.com/mailman/listinfo/asterisk-users > To UNSUBSCRIBE or update options visit: > http://lists.digium.com/mailman/listinfo/asterisk-users >Thanks in advance, ------------------------------------------------------------------------ Steve Edwards sedwards@sedwards.com Voice: +1-760-468-3867 PST Newline pagesteve@sedwards.com Fax: +1-760-731-3000
Stephen R. Besch
2004-Sep-30 13:26 UTC
[Asterisk-Users] Re: Grandstream bin cfg.txt generator
Leon de Rooij wrote:> Thanks to Stephen R. Besch for information about the format of this file ! > > (One thing I am not 100% sure of: do I have to append zeros to the end > of the body until it has an even amount of bytes, or an even amount of > words ? Right now, I do both.)Sorry for the slow response. I've been away for a few days and have 1500 messages from the * mail. If this hasn't been answered yet, the answer is that the file length is in words, so you need to pad to get to a word boundary, i.e., an even number of bytes. Any extra padding should not hurt however, since the phone seems to be very tolerant about this. In fact, you can even add your own parameters to the list, as long as they don't conflict with the GS parameters, and the phone simply ignores them - could be useful for adding a comment about the phone, or it's configuration. Stephen R. Besch.> > Regards, > > Leon de Rooij