webForumDet fria alternativet

Koda SMS

10 svar · 682 visningar · startad av Gein

GeinMedlem sedan sep. 20005 700 inlägg
#1

Jag har installerat Gammu för att kunna skicka och ta emot SMS från en mobiltelefon kopplad till datorn. Jag kör smsd som är kopplat till en MySQL-databas. Tekniskt sett kan jag både skicka och ta emot SMS men när jag skickar (vilket görs genom att helt enkelt lägga in en rad i en tabell i databasen) så ska jag koda texten och jag vet inte riktigt hur det ska gå till. Eftersom jag kan ta emot SMS utan problem så råkar jag veta t.ex. att
"005900650073002C002000670061006D006D00750020007300750078002000690066002000770065002000630061006E00270074002000610063006300650073007300200073006D007300200065006100730069006C00790021" = "Yes, gammu sux if we can't access sms easily!"

Jag är ute efter en algoritm att koda sms alltså. Beror kodning på mottagarens nummer? Fick för mig det när jag googlade runt. Stötte även på uttrycket PDU encoding.

tydalMedlem sedan juni 20034 013 inlägg
#2

Det du har där är unicodetecknen uttryckta i hex. Kakbit. Vilket programmeringsspråk vill du använda?

tydalMedlem sedan juni 20034 013 inlägg
#3

00480065006C006C006F00200057006C0072006C00640021

GeinMedlem sedan sep. 20005 700 inlägg
#4

Det blir väl främst PHP men kanske även C eller så. Därför jag ville ha en algoritm. Men det kanske finns färdiga funktioner för detta i PHP?

tydalMedlem sedan juni 20034 013 inlägg
#5

I C använder du printf med %X för att skriva ut tecknet som hex.

char str[] = "Test";
int i;
for (i = 0; i < strlen(str); i++)
{
  printf("00%X", str[i]);
}

Jag har för mig att printf funkar på samma sätt i php.

tydalMedlem sedan juni 20034 013 inlägg
#6

Detta förutsätter dock att det är en vanlig asciisträng du har. Är det unicode du har redan från början kan du ta bort 00 från printf-strängen.

Har du inte unicode behöver du köra search-and-replace på å, ä och ö innan.

å är C3A5, ä C3A4 och ö C3B6. Minns dock inte hur det är med små och stora bokstäver, men du hittar teckentabeller på http://www.unicode.org/

GeinMedlem sedan sep. 20005 700 inlägg
#7

Okej, men då är det något mer som måste göras. Så här ser tabellen för att skicka ett SMS ut:

CREATE TABLE outbox (
  UpdatedInDB timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  InsertIntoDB timestamp NOT NULL default '0000-00-00 00:00:00',
  SendingDateTime timestamp NOT NULL default '0000-00-00 00:00:00',
  `Text` text,
  DestinationNumber varchar(20) NOT NULL default '',
  Coding enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') default '8bit',
  UDH text,
  Class int(11) default '-1',
  TextDecoded varchar(160) NOT NULL default '',
  ID int(11) unsigned NOT NULL auto_increment,
  MultiPart enum('false','true') default 'false',
  RelativeValidity int(11) default '-1',
  SenderID text,
  SendingTimeOut timestamp NULL default '0000-00-00 00:00:00',
  DeliveryReport enum('default','yes','no') default 'default',
  CreatorID text NOT NULL,
  UNIQUE KEY ID (ID)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;

Det jag fyller i är Text, DestinationNumber och TextDecoded. Ett SMS går iväg men i min mobil står det att jag inte kan läsa innehållet. Måste jag kanske fylla i UDH också? Coding är förvalt till 8bit, osäker på om det ska vara det.

GeinMedlem sedan sep. 20005 700 inlägg
#8

Ahh, nu fungerar det, om jag väljer Default_No_Compression, men eftersom 8bit var default så trodde jag det var det som gällde. Nåväl, nu fungerar det. Tack! Nu kan jag leka vidare :)

GeinMedlem sedan sep. 20005 700 inlägg
#9

tydal skrev:

I C använder du printf med %X för att skriva ut tecknet som hex.

char str[] = "Test";
int i;
for (i = 0; i < strlen(str); i++)
{
  printf("00%X", str[i]);
}

Jag har för mig att printf funkar på samma sätt i php.

Jag letar efter motsvarande för PHP. Hur ser det ut? printf med %x för ett tecken ger bara 0 hela tiden av någon anledning.
T.ex. printf("%x", 'T'); ger 0.

tydalMedlem sedan juni 20034 013 inlägg
#10

Just ja, i php måste man ju använda funktionen ord() för att få fram värdet...

printf("%X", ord('T');

GeinMedlem sedan sep. 20005 700 inlägg
#11

Tackar! Lyckades hitta denna funktion också (lite modifierad):

function strhex($string) {
   $hex = '';
   $len = strlen($string);
   for ($i = 0; $i < $len; $i++) {
       $hex .= "00".str_pad(dechex(ord($string[$i])), 2, 0, STR_PAD_LEFT);
   }
   return $hex;
}

Vilken lösning är att föredra?

red/ Jag vågar anta att din lösning är snabbare.

128 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)