Phantom's Brick Архив

Главная -> LEGO® Форум -> LEGO® Техника

Звоним, Отправляем Sms С Телефона, Подключенного К Nxt от FatRat

FatRat, 2008-06-02 20:27:29 +00:00

Обещанная библиотечка для RobotC

Кривая до безобразия, но, вроде, со своими обязанностями справляется. Потихоньку довожу в плане надежности и совместимости. Можете использовать в сигнализации, например. Или SMS рассылать массово.

В планах - обработка ошибок, прием SMS из одной секции, отправка русских SMS, адаптация для NXC

Жду заслуженных %sей. Куда идти со свой абракадаброй - тоже знаю. NXT-G это не нарисуешь в принципе. Хотите - берите, не хотите - ваше право.

----------------------------------------------8<----------------------------------------------------------

Юзать так:

Перед первым включением сделайте pair device между телефоном и кирпичом, и впишите в константы

в программе имя своего телефона и ключ доступа bluetooth.

При последующем использовании кирпич настраивать и соединять не надо, только не забывайте, что

bluetooth должен быть включен и на телефоне, и на кирпиче. Видимость можно выключить.

#include "dmp_phonelib.c"

task main() {

if( connectPhone("K790i","1234")) {

dialPhone("89161234567"); //набрали номер

wait1Msec(5000); //подождали 5 секунд

hangupPhone(); //бросили трубку

wait1Msec(1000);

sendsms("79161234567","Hello!",0);

wait1Msec(30000); //после отсылки SMS ждать 30 секунд!

disconnectPhone();

}

}

----------------------------------------------8<----------------------------------------------------------

/////////////////////////////////////////////////////////////////////////////////

//

// Библиотечка для работы с сотовым телефоном dmp_phonelib 0.2alpha

//

// connectPhone(string btDevName, string PIN) - устанавливает связь с телефоном.

//

// телефон занимает 2й bluetooth-канал. Перед использованием нужно один раз pair device,

// потом ничего вводить не надо. Bluetooth на телефоне и NXT должен быть включен.

//

// disconnectPhone() - прерывает связь с телефоном

//

// dialPhone(sring number) - набирает номер. номер вида 89161234567 -> 8-(916)-123-45-67

// hangupPhone() - кладет трубку

// sendsms(string number, string payload, char special) - отправляет SMS

//

// number - в виде "79161234567" -> +7(916)123-45-67. Обратите внимание, обязательно с "7"

// payload - текст sms (до 160 символов латиница+цифры)

// special - 0==обычная SMS, 1==flash SMS

//

// Проверено с fw RobotC 7.42, телефонами SE K790i, SE K750i, Ericsson r520, Siemens S65

//

// (L)FatRat 05.2008. Юзайте - оставляйте шапку.

//

/////////////////////////////////////////////////////////////////////////////////

char phone_temp[255];

char subchar(string source,int element)

{

memcpy( phone_temp,source, sizeof(source));

return phone_temp[element];

}

bool checkBTLinkConnected()

{

if (nBTCurrentStreamIndex >= 0)

return true; // An existing Bluetooth connection is present.

else return false;

}

void sendstring(string s) {

int i;

memcpy( phone_temp,s, sizeof(s));

for(i=0;i<sizeof(s)&&(phone_temp!=0);i++) {

nxtWriteRawBluetooth(phone_temp, 1);

debugPrint("%c",phone_temp);

}

}

void sendcmd(string s)

{ char ODOA[2]={0x0D,0x0A};

sendstring(s);

nxtWriteRawBluetooth(ODOA, 2);

debugPrintLine("");

}

bool connectPhone(string kPhoneName, string kPasskey) {

//nSchedulePriority = 200;

short i;

btDisconnect(2);

for(i=0;(i<600)&&(checkBTLinkConnected());i++) {

// nxtDisplayTextLine(0, "Waiting 4 Phone %c",gethourglass());

wait1Msec(250);

}

if(i==600) return false; //failed 2 disconnect

for(i=0;(i<600)&&(!checkBTLinkConnected());i++) {

// nxtDisplayTextLine(0, "Waiting 4 Phone %c",gethourglass());

if (nBTCurrentStreamIndex < 0)

{

// Not currently connected. Need to make the connection.

setSessionPIN(kPasskey);

bBTSkipPswdPrompt = true;

btConnect(2, kPhoneName);

}

while (bBTBusy) {

// nxtDisplayTextLine(0, "Waiting 4 Phone %c",gethourglass());

wait1Msec(250);

}

setBluetoothRawDataMode(); // There was compiler bug. Overwriting cHeader[0] with return code!

wait1Msec(50);

while (!bBTRawMode) { wait1Msec(100);

// nxtDisplayTextLine(0, "Waiting 4 Phone %c",gethourglass());

}

}

if(i<600) {

sendcmd("ATZ");wait1Msec(2000);

sendcmd("AT+CMEE=2");wait1Msec(1000);

sendcmd("AT+CMGF=0");wait1Msec(1000);

};

return (i<600);

};

void sendhex(unsigned char c) {

unsigned char t;

t=((c>>4)&0x0F);

t+=48;

if(t>57){t+=7;}

debugPrint("%c",t);

nxtWriteRawBluetooth(t, 1);

t=(c & 0x0F)+48;

if(t>57){t+=7;}

debugPrint("%c",t);

nxtWriteRawBluetooth(t, 1);

}

//size of payload,converted to 7-bit alphabet

char GetPayloadLength(string s) {

if ((strlen(s)*7/8)*8/7!=strlen(s))

return (strlen(s)*7/8)+1;

else

return (strlen(s)*7/8);

}

void dialPhone(string number) {

sendstring("ATD");sendstring(number);sendcmd(";");

}

void hangupPhone() {

sendcmd("ATH");

}

void disconnectPhone() {

btDisconnect(2);

}

void send7bit(string payload) {

char outc;

char inc0,inc1;

char i;

//j:=0;

for(i=0;i<strlen(payload);i++) {

inc0=subchar(payload,i);

if(i==strlen(payload)) {inc1=0;} else {inc1=subchar(payload,i+1);}

outc =((inc0&0xFF)>>(i&7))+

(inc1<<(7-(i&7)));

if ((i&7)!=7) {

sendhex(outc); }

}//for

}

void sendsms(string target, string payload, char special) {

const char hdr1[15]={0x00,0x31,0x00,0x0B,0x91,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xAA,

0x00};

char pdu[15];char pdusize;

char i;

char Ox1A=0x1A;

string strl[3];

//memset(pdu,0,255);

memcpy(pdu,hdr1,sizeof(hdr1));

for(i=0;i<=5;i++) {

;

pdu[5+i]=(

subchar(target,i*2)-0x30)|

((subchar(target,i*2+1)-0x30)<<4)

;

};

pdu[0x0A]|=0xF0;

pdu[0x0E]=GetPayloadLength(payload); //DP>!!!

pdusize=pdu[0x0E]+0x0E;

switch(special) {

case 1: pdu[0x0C]=0x10; break; //flash 0

/*спички детям не игрушка*/

}

sendstring("AT+CMGS=");

strl=""+(pdusize+1-1);

sendcmd(strl);

wait1Msec(200);

for(i=0;i<=0x0E;i++) sendhex(pdu);

send7bit(payload);

nxtWriteRawBluetooth(Ox1A,1);

sendcmd("");

}