Обещанная библиотечка для 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(""); } |