Bluetooth.cpp 63 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093
  1. #include "Bluetooth.h"
  2. #include "AutoConnect.h"
  3. #include "RunnableThread.h"
  4. #include "Multimedia.h"
  5. #include "UserInterfaceUtility.h"
  6. #include "carlink.h"
  7. #include "Audio.h"
  8. #include "Setting.h"
  9. #include <QList>
  10. #include <QString>
  11. #include <QChar>
  12. #include <QMap>
  13. #include <unistd.h>
  14. #include <stdio.h>
  15. #include <QTime>
  16. #include <QTimer>
  17. #include <QFile>
  18. #include <iostream>
  19. #include <sstream>
  20. #include <iomanip>
  21. #include <fstream>
  22. #include <QTextCodec>
  23. #include "BusinessLogic/Setting.h"
  24. #include "BusinessLogic/configUtils.h"
  25. static const QString BTconfig("/data/Blutooth.ini");
  26. #if 0
  27. static bool IsNotChinese(QString str)
  28. {
  29. QByteArray ba = str.toLatin1();
  30. const char *ch = ba.data();
  31. while (*ch) {
  32. if((*ch >= 'A' && *ch <= 'Z')||(*ch >= 'a' && *ch <= 'z') || (*ch >= '0' && *ch <= '9')){
  33. }else {
  34. return false;
  35. }
  36. ch++;
  37. }
  38. return true;
  39. }
  40. #endif
  41. static bool IsChinese(QString str)
  42. {
  43. int count = str.count();
  44. for(int i = 0; i < count; i++){
  45. QChar ch = str.at(i);
  46. ushort us = ch.unicode();
  47. if(us >= 0x4E00 && us <= 0x9FA5){
  48. }else {
  49. return false;
  50. }
  51. }
  52. return true;
  53. }
  54. bool In(wchar_t start, wchar_t end, wchar_t code)
  55. {
  56. if (code >= start && code <= end)
  57. {
  58. return true;
  59. }
  60. return false;
  61. }
  62. char convert(int n)
  63. {
  64. if (In(0xB0A1,0xB0C4,n)) return 'a';
  65. if (In(0XB0C5,0XB2C0,n)) return 'b';
  66. if (In(0xB2C1,0xB4ED,n)) return 'c';
  67. if (In(0xB4EE,0xB6E9,n)) return 'd';
  68. if (In(0xB6EA,0xB7A1,n)) return 'e';
  69. if (In(0xB7A2,0xB8c0,n)) return 'f';
  70. if (In(0xB8C1,0xB9FD,n)) return 'g';
  71. if (In(0xB9FE,0xBBF6,n)) return 'h';
  72. if (In(0xBBF7,0xBFA5,n)) return 'j';
  73. if (In(0xBFA6,0xC0AB,n)) return 'k';
  74. if (In(0xC0AC,0xC2E7,n)) return 'l';
  75. if (In(0xC2E8,0xC4C2,n)) return 'm';
  76. if (In(0xC4C3,0xC5B5,n)) return 'n';
  77. if (In(0xC5B6,0xC5BD,n)) return 'o';
  78. if (In(0xC5BE,0xC6D9,n)) return 'p';
  79. if (In(0xC6DA,0xC8BA,n)) return 'q';
  80. if (In(0xC8BB,0xC8F5,n)) return 'r';
  81. if (In(0xC8F6,0xCBF0,n)) return 's';
  82. if (In(0xCBFA,0xCDD9,n)) return 't';
  83. if (In(0xCDDA,0xCEF3,n)) return 'w';
  84. if (In(0xCEF4,0xD188,n)) return 'x';
  85. if (In(0xD1B9,0xD4D0,n)) return 'y';
  86. if (In(0xD4D1,0xD7F9,n)) return 'z';
  87. return '\0';
  88. }
  89. class BluetoothPrivate
  90. {
  91. public:
  92. explicit BluetoothPrivate(Bluetooth* parent);
  93. ~BluetoothPrivate();
  94. void connectAllSlots();
  95. void cancelSync();
  96. void syncPhoneBook();
  97. void syncAllCallLog();
  98. void syncInComingCallLog();
  99. void syncOutComingCallLog();
  100. void syncMissedCallLog();
  101. void initializeAutoCancelTimer();
  102. void getBwSerialData(std::string data);
  103. void getAddrMac();
  104. QString getBtManufacturer();
  105. QString getChineseSpell(QString src);
  106. public:
  107. std::ifstream readStream;
  108. private:
  109. Bluetooth* const q_ptr;
  110. Q_DECLARE_PUBLIC(Bluetooth)
  111. QString m_Pincode;
  112. QString m_LocalDeviceName;
  113. QString m_RemoteDeviceName;
  114. QString m_RemoteBtAddress;
  115. QString m_LocalAddress;
  116. int m_BluetoothConnectStatus;
  117. int m_LastBluetoothConnectStatus;
  118. QTimer* m_AutoCancelTimer;
  119. BluetoothVoiceMode m_BluetoothVoiceMode;
  120. BluetoothPairedMode m_BluetoothPairedMode;
  121. int m_BluetoothPowerStatus;
  122. int m_BluetoothAutoConnect;
  123. int m_BluetoothAutoAnswer;
  124. QString m_LastNumber;
  125. QList<struct PhoneBookInfo> m_PhoneBookList;
  126. QList<struct CallLogInfo> m_AllCallList;
  127. QList<struct RemoteDeviceInfo>m_RemoteDeviceInfoList;
  128. QMap<QString, QString> m_PairedMap;
  129. int m_SyncType;
  130. int m_index;
  131. int m_HFPCFGBit;
  132. int m_A2DPStatus;
  133. int m_BluetoothPlayerStatus;
  134. int m_BtMicMuteStatus;
  135. int m_BtFirstEnterStatus;
  136. int m_LastBtStatus;
  137. int m_MusicType;
  138. QString m_BtMusicTitle;
  139. QString m_BtMusicArtist;
  140. QString m_BtMusicAlbum;
  141. QString m_HicarBackLinkMac;
  142. QString m_HicarBackLinkCmd;
  143. QString m_LastOnCallingNum;
  144. };
  145. Bluetooth::Bluetooth(QObject *parent)
  146. : QObject(parent)
  147. , d_ptr(new BluetoothPrivate(this))
  148. {
  149. }
  150. Bluetooth::~Bluetooth()
  151. {
  152. if (NULL != d_ptr) {
  153. delete d_ptr;
  154. }
  155. }
  156. QString Bluetooth::pinCode()
  157. {
  158. Q_D(Bluetooth);
  159. QFile BTcfgFile(BTconfig);
  160. if(BTcfgFile.exists()){
  161. QSettings * BTcfgSetFile = new QSettings(BTconfig,QSettings::IniFormat);
  162. d->m_Pincode = BTcfgSetFile->value("General/PinCode").toString();
  163. delete BTcfgSetFile;
  164. qDebug() << __PRETTY_FUNCTION__ << d->m_Pincode;
  165. }
  166. return d->m_Pincode;
  167. }
  168. QString Bluetooth::localDeviceName()
  169. {
  170. Q_D(Bluetooth);
  171. QSettings * BTcfgSetFile = new QSettings(BTconfig,QSettings::IniFormat);
  172. d->m_LocalDeviceName = BTcfgSetFile->value("General/DeviceName").toString();
  173. delete BTcfgSetFile;
  174. qDebug() << __PRETTY_FUNCTION__ << d->m_LocalDeviceName;
  175. return d->m_LocalDeviceName;
  176. }
  177. QString Bluetooth::remoteDeviceName()
  178. {
  179. Q_D(Bluetooth);
  180. return d->m_RemoteDeviceName;
  181. }
  182. int Bluetooth::connectStatus()
  183. {
  184. Q_D(Bluetooth);
  185. return d->m_BluetoothConnectStatus;
  186. }
  187. const QList<PhoneBookInfo> &Bluetooth::getRecordList()
  188. {
  189. Q_D(Bluetooth);
  190. return d->m_PhoneBookList;
  191. }
  192. QList<struct CallLogInfo>& Bluetooth::getCallLogInfo(){
  193. Q_D(Bluetooth);
  194. return d->m_AllCallList;
  195. }
  196. const QMap<QString, QString> &Bluetooth::getPairedList()
  197. {
  198. Q_D(Bluetooth);
  199. return d->m_PairedMap;
  200. }
  201. void Bluetooth::musicToggle()
  202. {
  203. if (BPS_PowerOn != getPowerStatus()) {
  204. return;
  205. }
  206. Q_D(Bluetooth);
  207. QString type;
  208. qDebug()<<__PRETTY_FUNCTION__ <<"LINE:"<<__LINE__ <<"m_BluetoothPlayerStatus ="<<d->m_BluetoothPlayerStatus;
  209. if (Bluetooth::BtMusic_Playing == d->m_BluetoothPlayerStatus) {
  210. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  211. {
  212. type = QString("MA");// ABT_MusicPause;
  213. }
  214. else//飞易通蓝牙和顾凯蓝牙
  215. {
  216. type = QString("PAUSE");// ABT_MusicPause;
  217. }
  218. } else{
  219. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  220. {
  221. type = QString("MA");// ABT_MusicPlay;
  222. }
  223. else//飞易通蓝牙和顾凯蓝牙
  224. {
  225. type = QString("PLAY");// ABT_MusicPlay;
  226. }
  227. }
  228. QString CMD = type;
  229. Send_AT_CMD(CMD);
  230. }
  231. void Bluetooth::musicPause()
  232. {
  233. Q_D(Bluetooth);
  234. if (BPS_PowerOn != getPowerStatus()) {
  235. return;
  236. }
  237. QString CMD;
  238. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  239. {
  240. if(Bluetooth::BtMusic_Playing == d->m_BluetoothPlayerStatus)
  241. CMD = QString("MA");// ABT_MusicPause;
  242. }
  243. else//飞易通蓝牙和顾凯蓝牙
  244. {
  245. CMD = QString("PAUSE");// ABT_MusicPause;
  246. }
  247. Send_AT_CMD(CMD);
  248. }
  249. void Bluetooth::musicStop()
  250. {
  251. Q_D(Bluetooth);
  252. if (BPS_PowerOn != getPowerStatus()) {
  253. return;
  254. }
  255. QString CMD;
  256. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  257. {
  258. CMD = QString("MC");
  259. }
  260. else//飞易通蓝牙和顾凯蓝牙
  261. {
  262. CMD = QString("STOP");
  263. }
  264. Send_AT_CMD(CMD);
  265. }
  266. void Bluetooth::musicPlay()
  267. {
  268. Q_D(Bluetooth);
  269. if (BPS_PowerOn != getPowerStatus()) {
  270. return;
  271. }
  272. QString CMD;
  273. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  274. {
  275. CMD = QString("MA");
  276. }
  277. else//飞易通蓝牙和顾凯蓝牙
  278. {
  279. CMD = QString("PLAY");
  280. }
  281. Send_AT_CMD(CMD);
  282. }
  283. void Bluetooth::musicPrevious()
  284. {
  285. Q_D(Bluetooth);
  286. if (BPS_PowerOn != getPowerStatus()) {
  287. return;
  288. }
  289. QString CMD;
  290. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  291. {
  292. CMD = QString("ME");
  293. }
  294. else//飞易通蓝牙和顾凯蓝牙
  295. {
  296. CMD = QString("FORWARD");
  297. }
  298. Send_AT_CMD(CMD);
  299. }
  300. void Bluetooth::musicNext()
  301. {
  302. Q_D(Bluetooth);
  303. if (BPS_PowerOn != getPowerStatus()) {
  304. return;
  305. }
  306. QString CMD;
  307. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  308. {
  309. CMD = QString("MD");
  310. }
  311. else//飞易通蓝牙和顾凯蓝牙
  312. {
  313. CMD = QString("BACKWARD");
  314. }
  315. Send_AT_CMD(CMD);
  316. }
  317. void Bluetooth::disconnectRemoteDevice()
  318. {
  319. Q_D(Bluetooth);
  320. if (BPS_PowerOn != getPowerStatus()) {
  321. return;
  322. }
  323. QString AT_CMD;
  324. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  325. {
  326. AT_CMD = QString("CD");
  327. }
  328. else//飞易通蓝牙和顾凯蓝牙
  329. {
  330. AT_CMD = QString("DSCA");
  331. }
  332. Send_AT_CMD(AT_CMD);
  333. }
  334. void Bluetooth::deleteRemoteDevice(const unsigned short index)
  335. {
  336. Q_D(Bluetooth);
  337. QString AT_CMD;
  338. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  339. {
  340. AT_CMD = QString("CV") + QString::number(index);
  341. }
  342. else//飞易通蓝牙和顾凯蓝牙
  343. {
  344. AT_CMD = QString("PLIST=") + QString::number(index);
  345. }
  346. Send_AT_CMD(AT_CMD);
  347. }
  348. int Bluetooth::getSynchronizeType()
  349. {
  350. Q_D(Bluetooth);
  351. return d->m_SyncType;
  352. }
  353. void Bluetooth::cancelSynchronize(BluetoothRecordType type)
  354. {
  355. Q_D(Bluetooth);
  356. if (d->m_SyncType == type) {
  357. d->cancelSync();
  358. }
  359. }
  360. void Bluetooth::synchronizePhoneBook()
  361. {
  362. // g_Radio->setRadioIdle();
  363. Q_D(Bluetooth);
  364. d->cancelSync();
  365. d->m_PhoneBookList.clear();
  366. d->syncPhoneBook();
  367. d->initializeAutoCancelTimer();
  368. d->m_AutoCancelTimer->start();
  369. }
  370. void Bluetooth::synchronizeAllCallLog(){
  371. Q_D(Bluetooth);
  372. d->cancelSync();
  373. d->m_AllCallList.clear();
  374. d->syncInComingCallLog();
  375. d->initializeAutoCancelTimer();
  376. d->m_AutoCancelTimer->start();
  377. }
  378. void Bluetooth::setPincode(const QString &pincode)
  379. {
  380. Q_D(Bluetooth);
  381. QString PINCODE;
  382. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  383. {
  384. PINCODE = QString("MN") + pincode;
  385. }
  386. else//飞易通蓝牙和顾凯蓝牙
  387. {
  388. PINCODE = QString("PIN=") + pincode;
  389. }
  390. Send_AT_CMD(PINCODE);
  391. d->m_Pincode = pincode;
  392. emit onPinCodeChange(pincode);
  393. QFile BTcfgFile(BTconfig);
  394. if(!BTcfgFile.exists()){
  395. QSettings *BTcfgSetFile = new QSettings(BTconfig,QSettings::IniFormat);
  396. BTcfgSetFile->beginGroup("General");
  397. BTcfgSetFile->setValue("PinCode", pincode);
  398. BTcfgSetFile->endGroup();
  399. BTcfgSetFile->sync();
  400. CHECK_SYSTEM("sync");
  401. delete BTcfgSetFile;
  402. }
  403. }
  404. void Bluetooth::setLocalDeviceName(const QString &devicename)
  405. {
  406. Q_D(Bluetooth);
  407. QString DEVNAME;
  408. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  409. {
  410. DEVNAME = QString("MM") + devicename;
  411. }
  412. else//飞易通蓝牙和顾凯蓝牙
  413. {
  414. DEVNAME = QString("NAME=") + devicename;
  415. }
  416. Send_AT_CMD(DEVNAME);
  417. d->m_LocalDeviceName = devicename;
  418. emit onLocalDeviceNameChange(devicename);
  419. QSettings *BTcfgFile = new QSettings(BTconfig,QSettings::IniFormat);
  420. BTcfgFile->beginGroup("General");
  421. BTcfgFile->setValue("DeviceName", devicename);
  422. BTcfgFile->endGroup();
  423. BTcfgFile->sync();
  424. CHECK_SYSTEM("sync");
  425. delete BTcfgFile;
  426. }
  427. void Bluetooth::dialPhone(const QString &phone)
  428. {
  429. Q_D(Bluetooth);
  430. QString CALLPHONE;
  431. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  432. {
  433. CALLPHONE = QString("CW") + phone;
  434. }
  435. else//飞易通蓝牙和顾凯蓝牙
  436. {
  437. CALLPHONE = QString("HFPDIAL=") + phone;
  438. }
  439. Send_AT_CMD(CALLPHONE);
  440. }
  441. void Bluetooth::dialNumber(const QString &number)
  442. {
  443. Q_D(Bluetooth);
  444. QString CALLNUMBER;
  445. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  446. {
  447. CALLNUMBER = QString("CX") + number;
  448. }
  449. else//飞易通蓝牙和顾凯蓝牙
  450. {
  451. CALLNUMBER = QString("HFPDTMF=") + number;
  452. }
  453. Send_AT_CMD(CALLNUMBER);
  454. }
  455. BluetoothVoiceMode Bluetooth::getVoiceMode()
  456. {
  457. Q_D(Bluetooth);
  458. return d->m_BluetoothVoiceMode;
  459. }
  460. void Bluetooth::voiceToggleSwitch()
  461. {
  462. Q_D(Bluetooth);
  463. QString AT_CMD;
  464. if(d->m_BluetoothVoiceMode == BVM_VoicePhone){
  465. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  466. {
  467. qDebug()<<"++++++++AT_CMD_CN_CP+++++++++++++";
  468. AT_CMD= QString("CP");//CP切换到车机蓝牙
  469. }
  470. else//飞易通蓝牙和顾凯蓝牙
  471. {
  472. AT_CMD= QString("HFPADTS=2");//CP切换到车机蓝牙
  473. }
  474. d->m_BluetoothVoiceMode = BVM_VoiceBluetooth;
  475. }else {
  476. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  477. {
  478. qDebug()<<"++++++++AT_CMD_CN+++++++++++++";
  479. AT_CMD= QString("CN");//CN音频切换到手机
  480. }
  481. else//飞易通蓝牙和顾凯蓝牙
  482. {
  483. AT_CMD= QString("HFPADTS=1");//音频切换到手机
  484. }
  485. d->m_BluetoothVoiceMode = BVM_VoicePhone;
  486. }
  487. Send_AT_CMD(AT_CMD);
  488. onVoiceChange(d->m_BluetoothVoiceMode);
  489. }
  490. void Bluetooth::redialLastPhone()//重播电话
  491. {
  492. Q_D(Bluetooth);
  493. QString AT_CMD;
  494. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  495. {
  496. AT_CMD = QString("CH");
  497. }
  498. else//飞易通蓝牙和顾凯蓝牙
  499. {
  500. AT_CMD = QString("HFPDIAL");
  501. }
  502. Send_AT_CMD(AT_CMD);
  503. }
  504. void Bluetooth::pickupPhone()//接听
  505. {
  506. Q_D(Bluetooth);
  507. QString AT_CMD;
  508. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  509. {
  510. AT_CMD = QString("CE");
  511. }
  512. else//飞易通蓝牙和顾凯蓝牙
  513. {
  514. AT_CMD = QString("HFPANSW");
  515. }
  516. Send_AT_CMD(AT_CMD);
  517. }
  518. void Bluetooth::hanupPhone()//挂断
  519. {
  520. Q_D(Bluetooth);
  521. QString AT_CMD;
  522. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  523. {
  524. qDebug()<<"+++++++hanupPhone_CG+++++++";
  525. AT_CMD = QString("CG");
  526. }
  527. else//飞易通蓝牙和顾凯蓝牙
  528. {
  529. AT_CMD = QString("HFPCHUP");
  530. }
  531. Send_AT_CMD(AT_CMD);
  532. g_Audio->releaseAudioSource(AS_BluetoothPhone);
  533. emit onHangUpPhone();
  534. }
  535. void Bluetooth::asynchronousQueryStatus()
  536. {
  537. Q_D(Bluetooth);
  538. QString AT_CMD;
  539. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  540. {
  541. AT_CMD = QString("CY");
  542. }
  543. else//飞易通蓝牙和顾凯蓝牙
  544. {
  545. AT_CMD = QString("HFPSTAT");
  546. }
  547. Send_AT_CMD(AT_CMD);
  548. }
  549. int Bluetooth::getPowerStatus()//蓝牙开关状态
  550. {
  551. Q_D(Bluetooth);
  552. return d->m_BluetoothPowerStatus;//蓝牙开关状态
  553. }
  554. void Bluetooth::powerOn()
  555. {
  556. Q_D(Bluetooth);
  557. QString AT_CMD;
  558. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  559. {
  560. AT_CMD = QString("P1");
  561. }
  562. else//飞易通蓝牙和顾凯蓝牙
  563. {
  564. AT_CMD = QString("BTEN=1");
  565. }
  566. Send_AT_CMD(AT_CMD);
  567. }
  568. void Bluetooth::powerOff()
  569. {
  570. Q_D(Bluetooth);
  571. d->cancelSync();
  572. QString AT_CMD;
  573. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  574. {
  575. AT_CMD = QString("P0");
  576. }
  577. else//飞易通蓝牙和顾凯蓝牙
  578. {
  579. AT_CMD = QString("BTEN=0");
  580. }
  581. Send_AT_CMD(AT_CMD);
  582. }
  583. int Bluetooth::getAutoConnectStatus()
  584. {
  585. Q_D(Bluetooth);
  586. return d->m_BluetoothAutoConnect;
  587. }
  588. void Bluetooth::autoConnectOn()
  589. {
  590. Q_D(Bluetooth);
  591. QString AT_CMD;
  592. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  593. {
  594. AT_CMD = QString("MG");
  595. }
  596. else//飞易通蓝牙和顾凯蓝牙
  597. {
  598. d-> m_HFPCFGBit = d->m_HFPCFGBit | 0x01;
  599. qDebug()<<"+++++[autoConnectOn:d->m_HFPCFGBit]+++++"<< d->m_HFPCFGBit;
  600. AT_CMD = "HFPCFG=" + QString("%1").arg(d->m_HFPCFGBit);
  601. }
  602. Send_AT_CMD(AT_CMD);
  603. }
  604. void Bluetooth::autoConnectOff()
  605. {
  606. Q_D(Bluetooth);
  607. QString AT_CMD;
  608. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  609. {
  610. AT_CMD = QString("MH");
  611. }
  612. else//飞易通蓝牙和顾凯蓝牙
  613. {
  614. d->m_HFPCFGBit = d->m_HFPCFGBit & 0x0E;
  615. qDebug()<<"+++++[autoConnectOff:d->m_HFPCFGBit]+++++"<<d->m_HFPCFGBit;
  616. AT_CMD = "HFPCFG=" + QString("%1").arg(d->m_HFPCFGBit);
  617. }
  618. Send_AT_CMD(AT_CMD);
  619. }
  620. int Bluetooth::getAutoAnswer()
  621. {
  622. Q_D(Bluetooth);
  623. return d->m_BluetoothAutoAnswer;
  624. }
  625. void Bluetooth::autoAnswerOn()
  626. {
  627. Q_D(Bluetooth);
  628. QString AT_CMD;
  629. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  630. {
  631. AT_CMD = QString("MP");
  632. }
  633. else//飞易通蓝牙和顾凯蓝牙
  634. {
  635. d->m_HFPCFGBit = d->m_HFPCFGBit | 0x02;
  636. qDebug()<<"+++++[autoAnswerOn:d->m_HFPCFGBit]+++++"<<d->m_HFPCFGBit;
  637. AT_CMD = "HFPCFG=" + QString("%1").arg(d->m_HFPCFGBit);
  638. }
  639. Send_AT_CMD(AT_CMD);
  640. }
  641. void Bluetooth::autoAnswerOff()
  642. {
  643. Q_D(Bluetooth);
  644. QString AT_CMD;
  645. if(d->getBtManufacturer() == "s")//速鼎蓝牙
  646. {
  647. qDebug()<<"++++++++autoAnswerOff_S+++++++++++";
  648. AT_CMD = QString("MQ");
  649. }
  650. else//飞易通蓝牙和顾凯蓝牙
  651. {
  652. qDebug()<<"++++++++autoAnswerOff_NS+++++++++++";
  653. d->m_HFPCFGBit = d->m_HFPCFGBit & 0x0D;
  654. qDebug()<<"+++++[autoAnswerOff:d->m_HFPCFGBit]+++++"<<d->m_HFPCFGBit;
  655. AT_CMD = "HFPCFG=" + QString("%1").arg(d->m_HFPCFGBit);
  656. }
  657. Send_AT_CMD(AT_CMD);
  658. }
  659. int Bluetooth::getBTMusicStatus()
  660. {
  661. Q_D(Bluetooth);
  662. return d->m_BluetoothPlayerStatus;
  663. }
  664. static void* RevBtCmdTask(void *parent)
  665. {
  666. BluetoothPrivate *pThis = (BluetoothPrivate *)parent;
  667. std::string readData;
  668. printf("[Bluetooth] RevBtCmdTask Create\n");
  669. while (1)
  670. {
  671. readData.clear();
  672. if(std::getline(pThis->readStream, readData))
  673. {
  674. if(readData.size() <= 0)
  675. {
  676. usleep(50*1000);
  677. }
  678. else
  679. {
  680. pThis->getBwSerialData(readData);
  681. }
  682. }
  683. }
  684. return NULL;
  685. }
  686. int Bluetooth::Blutooth_startThread()
  687. {
  688. Q_D(Bluetooth);
  689. pthread_t mThread;
  690. int ret = -1;
  691. QString btManufacturer = d->getBtManufacturer();
  692. std::string filename;
  693. if(btManufacturer == "s")
  694. {
  695. filename = string("/dev/goc_serial");
  696. }
  697. else{
  698. filename = string("/dev/bw_serial");
  699. }
  700. if (access(filename.data(), F_OK) == 0)
  701. {
  702. d->readStream.open(filename);
  703. printf("[Bluetooth] open %s success.\n", filename.c_str());
  704. }
  705. ret = pthread_create(&mThread, NULL, RevBtCmdTask, d);
  706. if(ret != 0)
  707. {
  708. printf("[Bluetooth] pthread_create failed.\n");
  709. ret = -1;
  710. }
  711. return ret;
  712. }
  713. void Bluetooth::Send_AT_CMD(QString AT_STR)
  714. {
  715. qDebug()<<__PRETTY_FUNCTION__ <<"LINE :"<<__LINE__;
  716. Q_D(Bluetooth);
  717. QString AT_CMD;
  718. QString btManufacturer = d->getBtManufacturer();
  719. QFile gocsdk_dev;
  720. if(btManufacturer == "s")
  721. {
  722. AT_CMD = QString("AT#") + AT_STR;
  723. AT_CMD.append("\r\n");
  724. gocsdk_dev.setFileName(QString("/dev/goc_serial"));
  725. }
  726. else{
  727. AT_CMD = QString("AT+") + AT_STR;
  728. AT_CMD.append("\r\n");
  729. gocsdk_dev.setFileName(QString("/dev/bw_serial"));
  730. //gocsdk_dev.setFileName(QString("/dev/goc_serial"));
  731. }
  732. qDebug()<<__PRETTY_FUNCTION__ <<__LINE__ <<"ATCMD:"<<AT_CMD.toLocal8Bit();
  733. if(gocsdk_dev.exists()){
  734. if(gocsdk_dev.open(QIODevice::ReadWrite)){
  735. gocsdk_dev.write(AT_CMD.toLocal8Bit());
  736. gocsdk_dev.close();
  737. }else {
  738. qDebug("/dev/bt_serial is open failed");
  739. }
  740. }else {
  741. qDebug("/dev/bt_serial is not exists");
  742. }
  743. qDebug()<<__PRETTY_FUNCTION__ <<"LINE :"<<__LINE__;
  744. }
  745. void Bluetooth::connectRemoteDevice(const unsigned short index)
  746. {
  747. Q_D(Bluetooth);
  748. qDebug()<<"+++++++++connectRemoteDevice+++++++++++="<<d->m_RemoteDeviceInfoList.size();
  749. if(d->m_RemoteDeviceInfoList.size() > index)
  750. {
  751. if(d->m_RemoteDeviceInfoList.at(index).macAddress != d->m_RemoteBtAddress){
  752. if(d->m_BluetoothConnectStatus >=3)
  753. {
  754. disconnectRemoteDevice();
  755. }
  756. if(d->getBtManufacturer() == "s")
  757. {
  758. QString AT_CMD = QString("CC") + d->m_RemoteDeviceInfoList.at(index).macAddress;
  759. Send_AT_CMD(AT_CMD);
  760. }
  761. else{
  762. QString AT_CMD = QString("HFPCONN=") + d->m_RemoteDeviceInfoList.at(index).macAddress;
  763. Send_AT_CMD(AT_CMD);
  764. }
  765. }
  766. }
  767. qDebug()<<"+++++++++>m_PairedMap.size()+++++++++++="<<d->m_PairedMap.size();
  768. if(d->m_PairedMap.size()>0)
  769. {
  770. QMap<QString, QString>::iterator itor = d->m_PairedMap.begin();
  771. bool _CanPaired(true);
  772. int count = 0;
  773. QString _RemoteAddr;
  774. while(itor != d->m_PairedMap.end())
  775. {
  776. if(count == index)
  777. {
  778. _RemoteAddr = itor.key();
  779. }
  780. if(itor.key() == d->m_RemoteBtAddress)
  781. {
  782. _CanPaired = false;
  783. break;
  784. }
  785. count++;
  786. itor++;
  787. }
  788. qDebug()<<"+++++++count++++++++"<<count;
  789. if(_CanPaired == true)
  790. {
  791. if(d->m_BluetoothConnectStatus >=3)
  792. {
  793. disconnectRemoteDevice();
  794. }
  795. if(d->getBtManufacturer() =="s")
  796. {
  797. QString AT_CMD = QString("CC") + _RemoteAddr;
  798. Send_AT_CMD(AT_CMD);
  799. }
  800. else{
  801. QString AT_CMD = QString("HFPCONN=") + _RemoteAddr;
  802. Send_AT_CMD(AT_CMD);
  803. }
  804. }
  805. }
  806. }
  807. void Bluetooth::onHolderChange(const AudioSource oldHolder, const AudioSource newHolder)
  808. {
  809. switch (newHolder) {
  810. case AS_Aux: {
  811. if (AS_BluetoothMusic == oldHolder) {
  812. musicPause();
  813. }
  814. break;
  815. }
  816. case AS_BluetoothMusic: {
  817. qDebug() << __PRETTY_FUNCTION__ << __LINE__;
  818. break;
  819. }
  820. default:
  821. break;
  822. }
  823. }
  824. void Bluetooth::onTimeout()
  825. {
  826. qDebug() << __PRETTY_FUNCTION__ << __LINE__;
  827. QTimer* ptr = static_cast<QTimer*>(sender());
  828. Q_D(Bluetooth);
  829. if (ptr == d->m_AutoCancelTimer) {
  830. d->cancelSync();
  831. qDebug() << __PRETTY_FUNCTION__ << __LINE__;
  832. }
  833. }
  834. /**********************************************************
  835. * source_str: 源字符串
  836. * n: 默认为2,每间隔两个字符串添加ch
  837. * ch:默认为空格
  838. * eg:Get_MAC_addr(out_str, 2 , ":");得到MAC地址
  839. **********************************************************/
  840. QString Get_MAC_addr(QString source_str, int n=2,const QString &ch=" ")
  841. {
  842. int size= source_str.size();
  843. int lenth = size/n;
  844. QString target_str = source_str;
  845. int str_lenth = ch.size();
  846. int i = 0;
  847. for(i = 0; i < lenth ; i++){
  848. target_str = target_str.insert((i + 1) * n + (i * str_lenth), ch);
  849. }
  850. return target_str.left(target_str.size() -1);
  851. }
  852. void Bluetooth::readHFPCFGValue()
  853. {
  854. Q_D(Bluetooth);
  855. if(d->getBtManufacturer() != "s")
  856. {
  857. QString CMD = "HFPCFG";
  858. Send_AT_CMD(CMD);
  859. }
  860. else{
  861. QString CMD = "MF";
  862. Send_AT_CMD(CMD);
  863. }
  864. }
  865. void Bluetooth::ScanNearByRemoteDevice(){
  866. Q_D(Bluetooth);
  867. if(d->getBtManufacturer() == "s")
  868. {
  869. QString CMD = "SD";
  870. Send_AT_CMD(CMD);
  871. d->m_RemoteDeviceInfoList.clear();
  872. }
  873. else{
  874. QString CMD = "SCAN=1";
  875. Send_AT_CMD(CMD);
  876. }
  877. }
  878. void Bluetooth::StopScanNearByRemoteDevice(){
  879. Q_D(Bluetooth);
  880. if(d->getBtManufacturer() == "s")
  881. {
  882. QString CMD = "ST";
  883. Send_AT_CMD(CMD);
  884. }
  885. else{
  886. QString CMD = "SCAN=0";
  887. Send_AT_CMD(CMD);
  888. }
  889. }
  890. void Bluetooth::QueryPairedList()
  891. {
  892. qDebug()<<"+++[Bluetooth::QueryPairedList]+++";
  893. Q_D(Bluetooth);
  894. if(d->getBtManufacturer() == "s")
  895. {
  896. QString CMD = "MX";
  897. Send_AT_CMD(CMD);
  898. }
  899. else{
  900. QString CMD = "PLIST";
  901. Send_AT_CMD(CMD);
  902. }
  903. }
  904. void Bluetooth::BtMusicPlyaStatus(int status)
  905. {
  906. Q_D(Bluetooth);
  907. if(d->getBtManufacturer() == "s")
  908. {
  909. QString CMD = "VI";
  910. Send_AT_CMD(CMD);
  911. }
  912. else{
  913. QString CMD = "PLAYSTAT=" + QString("%1").arg(status);
  914. Send_AT_CMD(CMD);
  915. }
  916. }
  917. void Bluetooth::BtMusicInfo(int param)
  918. {
  919. Q_D(Bluetooth);
  920. if(d->getBtManufacturer() == "s")
  921. {
  922. QString CMD = "MK";
  923. Send_AT_CMD(CMD);
  924. }
  925. else{
  926. QString CMD = "AVRCPCFG=" + QString("%1").arg(param);
  927. Send_AT_CMD(CMD);
  928. }
  929. }
  930. void Bluetooth::BtMicMuteChanged(int mute){
  931. Q_D(Bluetooth);
  932. if(d->getBtManufacturer() == "s")
  933. {
  934. qDebug()<<"++++++++BtMicMuteChanged_CM++++++++++";
  935. QString CMD = "CM";//打开关闭麦克风
  936. Send_AT_CMD(CMD);
  937. }
  938. else{
  939. QString CMD = "MICMUTE=" + QString("%1").arg(mute);
  940. Send_AT_CMD(CMD);
  941. }
  942. }
  943. void Bluetooth::disableBtMusic()
  944. {
  945. Q_D(Bluetooth);
  946. if(d->getBtManufacturer() == "s")
  947. {
  948. QString CMD = "VA";
  949. Send_AT_CMD(CMD);
  950. }
  951. else{
  952. QString CMD = "A2DPDISC";
  953. Send_AT_CMD(CMD);
  954. }
  955. }
  956. void Bluetooth::connectBtMusic()
  957. {
  958. Q_D(Bluetooth);
  959. if(d->getBtManufacturer() == "s")
  960. {
  961. QString CMD = "VB";
  962. Send_AT_CMD(CMD);
  963. }
  964. else{
  965. QString CMD = "A2DPCONN";
  966. Send_AT_CMD(CMD);
  967. }
  968. }
  969. int Bluetooth::getBtMicMuteStatus()
  970. {
  971. Q_D(Bluetooth);
  972. return d->m_BtMicMuteStatus;
  973. }
  974. void Bluetooth::reConnectLastDevice()
  975. {
  976. Q_D(Bluetooth);
  977. if(d->getBtManufacturer() == "s")
  978. {
  979. QString CMD = "MI";
  980. Send_AT_CMD(CMD);
  981. }
  982. else{
  983. QString CMD = "HFPCONN";
  984. Send_AT_CMD(CMD);
  985. }
  986. }
  987. QString Bluetooth::getRemoteBtAddress(){
  988. Q_D(Bluetooth);
  989. return d->m_RemoteBtAddress;
  990. }
  991. void Bluetooth::setMusicType(int musicType)
  992. {
  993. Q_D(Bluetooth);
  994. d->m_MusicType = musicType;
  995. }
  996. char convertCharToHex(char ch)
  997. {
  998. if((ch >= '0') && (ch <= '9'))
  999. return ch-0x30;
  1000. else if((ch >= 'A') && (ch <= 'F'))
  1001. return ch-'A'+10;
  1002. else if((ch >= 'a') && (ch <= 'f'))
  1003. return ch-'a'+10;
  1004. else return (-1);
  1005. }
  1006. BluetoothPrivate::BluetoothPrivate(Bluetooth *parent)
  1007. : q_ptr(parent)
  1008. {
  1009. m_BluetoothConnectStatus = 0;
  1010. m_LastBluetoothConnectStatus = 0;
  1011. m_BluetoothPlayerStatus = -1;
  1012. m_AutoCancelTimer = NULL;
  1013. m_BluetoothVoiceMode = BVM_VoiceBluetooth;
  1014. m_BluetoothPairedMode = BPM_Undefine;
  1015. m_BluetoothPowerStatus = undefined;
  1016. m_BluetoothAutoConnect = BAC_Undefine;
  1017. m_BluetoothAutoAnswer = BAA_Undefine;
  1018. m_SyncType = BRT_Undefine;
  1019. m_index = 0;
  1020. m_HFPCFGBit = 0;
  1021. m_BtMicMuteStatus = 0;
  1022. m_BtMusicTitle = "";
  1023. m_BtMusicArtist= "";
  1024. m_BtMusicAlbum = "";
  1025. m_BtFirstEnterStatus = true;
  1026. m_LastBtStatus = 0;
  1027. m_MusicType = 0;
  1028. connectAllSlots();
  1029. }
  1030. BluetoothPrivate::~BluetoothPrivate()
  1031. {
  1032. }
  1033. void BluetoothPrivate::connectAllSlots()
  1034. {
  1035. Q_Q(Bluetooth);
  1036. connectSignalAndSlotByNamesake(g_Audio, q, ARKRECEIVER(onHolderChange(const int, const int)));
  1037. }
  1038. void BluetoothPrivate::cancelSync()
  1039. {
  1040. qDebug() << __PRETTY_FUNCTION__ << __LINE__;
  1041. if (BRT_Undefine != m_SyncType) {
  1042. Q_Q(Bluetooth);
  1043. if(getBtManufacturer() == "s")
  1044. {
  1045. QString AT_CMD = QString("PS");//停止下载
  1046. q->Send_AT_CMD(AT_CMD);
  1047. }
  1048. else{
  1049. QString AT_CMD = QString("PBABORT");//停止下载
  1050. q->Send_AT_CMD(AT_CMD);
  1051. }
  1052. if(m_SyncType == BRT_PhoneBook)
  1053. {
  1054. emit q->onSyncPhoneBook();
  1055. }
  1056. else if(m_SyncType != BRT_PhoneBook && m_SyncType != BRT_Undefine){
  1057. emit q->onSyncAllCallLog();
  1058. }
  1059. m_SyncType = BRT_Undefine;
  1060. if (NULL != m_AutoCancelTimer) {
  1061. m_AutoCancelTimer->stop();
  1062. }
  1063. }
  1064. }
  1065. void BluetoothPrivate::getAddrMac()
  1066. {
  1067. qDebug() << __PRETTY_FUNCTION__;
  1068. Q_Q(Bluetooth);
  1069. if(getBtManufacturer() == "s")
  1070. {
  1071. QString AT_CMD = QString("DF");
  1072. q->Send_AT_CMD(AT_CMD);
  1073. }
  1074. else
  1075. {
  1076. QString AT_CMD = QString("ADDR");
  1077. q->Send_AT_CMD(AT_CMD);
  1078. }
  1079. }
  1080. void BluetoothPrivate::syncPhoneBook()
  1081. {
  1082. qDebug() << __PRETTY_FUNCTION__;
  1083. Q_Q(Bluetooth);
  1084. m_SyncType = BRT_PhoneBook;
  1085. if(getBtManufacturer() == "s")
  1086. {
  1087. QString AT_CMD = QString("PB");//同步电话本
  1088. q->Send_AT_CMD(AT_CMD);
  1089. }
  1090. else
  1091. {
  1092. QString AT_CMD = QString("PBDOWN=1");//同步电话本
  1093. q->Send_AT_CMD(AT_CMD);
  1094. }
  1095. }
  1096. void BluetoothPrivate::syncAllCallLog(){
  1097. qDebug() << __PRETTY_FUNCTION__;
  1098. Q_Q(Bluetooth);
  1099. m_SyncType = BRT_AllCall;
  1100. if(getBtManufacturer() != "s")
  1101. {
  1102. QString AT_CMD = QString("PBDOWN=5");//同步电话本
  1103. q->Send_AT_CMD(AT_CMD);
  1104. }
  1105. }
  1106. void BluetoothPrivate::syncInComingCallLog(){
  1107. qDebug() << __PRETTY_FUNCTION__;
  1108. Q_Q(Bluetooth);
  1109. m_SyncType = BRT_Incoming;
  1110. if(getBtManufacturer() == "s")
  1111. {
  1112. qDebug()<<"+++++++syncInComingCallLog_PI+++++++++";
  1113. QString AT_CMD = QString("PI");//已接电话同步
  1114. q->Send_AT_CMD(AT_CMD);
  1115. }
  1116. else
  1117. {
  1118. QString AT_CMD = QString("PBDOWN=2");//已接电话同步
  1119. q->Send_AT_CMD(AT_CMD);
  1120. }
  1121. }
  1122. void BluetoothPrivate::syncOutComingCallLog(){
  1123. qDebug() << __PRETTY_FUNCTION__;
  1124. Q_Q(Bluetooth);
  1125. cancelSync();
  1126. m_SyncType = BRT_Outgoing;
  1127. if(getBtManufacturer() == "s")
  1128. {
  1129. QString AT_CMD = QString("PH");//已拨电话同步
  1130. q->Send_AT_CMD(AT_CMD);
  1131. }
  1132. else
  1133. {
  1134. QString AT_CMD = QString("PBDOWN=3");//已拨电话同步
  1135. q->Send_AT_CMD(AT_CMD);
  1136. }
  1137. initializeAutoCancelTimer();
  1138. m_AutoCancelTimer->start();
  1139. }
  1140. void BluetoothPrivate::syncMissedCallLog(){
  1141. qDebug() << __PRETTY_FUNCTION__;
  1142. Q_Q(Bluetooth);
  1143. cancelSync();
  1144. m_SyncType = BRT_Missed;
  1145. if(getBtManufacturer() == "s")
  1146. {
  1147. QString AT_CMD = QString("PJ");//未接电话同步
  1148. q->Send_AT_CMD(AT_CMD);
  1149. }
  1150. else
  1151. {
  1152. QString AT_CMD = QString("PBDOWN=4");//未接电话同步
  1153. q->Send_AT_CMD(AT_CMD);
  1154. }
  1155. initializeAutoCancelTimer();
  1156. m_AutoCancelTimer->start();
  1157. }
  1158. void BluetoothPrivate::initializeAutoCancelTimer()
  1159. {
  1160. if (NULL == m_AutoCancelTimer) {
  1161. Q_Q(Bluetooth);
  1162. m_AutoCancelTimer = new QTimer(q);
  1163. m_AutoCancelTimer->setInterval(10 * 1000);
  1164. m_AutoCancelTimer->setSingleShot(true);
  1165. QObject::connect(m_AutoCancelTimer, ARKSENDER(timeout()),
  1166. q, ARKRECEIVER(onTimeout()));
  1167. }
  1168. }
  1169. void BluetoothPrivate::getBwSerialData(std::string data)
  1170. {
  1171. Q_Q(Bluetooth);
  1172. if(getBtManufacturer() == "s")
  1173. {
  1174. q->SudingBlutoothHandle(QString::fromStdString(data));
  1175. }
  1176. else{
  1177. q->BlutoothHandle(QString::fromStdString(data));
  1178. }
  1179. }
  1180. QString BluetoothPrivate::getChineseSpell(QString src)
  1181. {
  1182. QTextCodec *codec4gbk = QTextCodec::codecForName("GBK"); //获取qt提供的gbk的解码器
  1183. QByteArray buf = codec4gbk->fromUnicode(src); //qt用的unicode,转成gbk
  1184. int size = buf.size();
  1185. quint16 *array = new quint16[size+1];
  1186. QString alphbats;
  1187. for( int i = 0, j = 0; i < buf.size(); i++, j++ )
  1188. {
  1189. if( (quint8)buf[i] < 0x80 ) //gbk的第一个字节都大于0x81,所以小于0x80的都是符号,字母,数字etc
  1190. continue;
  1191. array[j] = (((quint8)buf[i]) << 8) + (quint8)buf[i+1]; //计算gbk编码
  1192. i++;
  1193. alphbats.append( convert( array[j] ) ); //相当于查表,用gbk编码得到首拼音字母
  1194. }
  1195. delete [] array;
  1196. return alphbats;
  1197. }
  1198. QList<struct RemoteDeviceInfo> Bluetooth::getRemoteDeviceInfoList(){
  1199. Q_D(Bluetooth);
  1200. return d->m_RemoteDeviceInfoList;
  1201. }
  1202. void Bluetooth::sendHicarDataToblueware(QString atCmd,QString Data)
  1203. {
  1204. Q_D(Bluetooth);
  1205. qDebug()<<__PRETTY_FUNCTION__ <<"LINE :"<<__LINE__;
  1206. QString btManufacturer = d->getBtManufacturer();
  1207. QFile gocsdk_dev;
  1208. QString AT_CMD;
  1209. if(btManufacturer == "s")
  1210. {
  1211. AT_CMD = QString("AT#") + atCmd + Data;
  1212. AT_CMD.append("\r\n");
  1213. gocsdk_dev.setFileName(QString("/dev/goc_serial"));
  1214. }
  1215. else{
  1216. AT_CMD = QString("AT#") + atCmd + QString("=")+Data;
  1217. AT_CMD.append("\r\n");
  1218. qDebug()<<"++++++AT_CMD++++++"<<AT_CMD;
  1219. gocsdk_dev.setFileName(QString("/dev/bw_serial"));
  1220. }
  1221. qDebug()<<__PRETTY_FUNCTION__ <<__LINE__ <<"ATCMD:"<<AT_CMD.toLocal8Bit();
  1222. if(gocsdk_dev.exists()){
  1223. if(gocsdk_dev.open(QIODevice::ReadWrite)){
  1224. gocsdk_dev.write(AT_CMD.toLocal8Bit());
  1225. gocsdk_dev.close();
  1226. }else {
  1227. qDebug("/dev/bt_serial is open failed");
  1228. }
  1229. }else {
  1230. qDebug("/dev/bt_serial is not exists");
  1231. }
  1232. qDebug()<<__PRETTY_FUNCTION__ <<"LINE :"<<__LINE__;
  1233. }
  1234. QString Bluetooth::getLocalMacAddress(){
  1235. Q_D(Bluetooth);
  1236. return d->m_LocalAddress;
  1237. }
  1238. QString Bluetooth::getHicarBackLinkMac(){
  1239. Q_D(Bluetooth);
  1240. return d->m_HicarBackLinkMac;
  1241. }
  1242. QString Bluetooth::getHicarBackLinkCmd(){
  1243. Q_D(Bluetooth);
  1244. return d->m_HicarBackLinkCmd;
  1245. }
  1246. void Bluetooth::BlutoothHandle(QString data)
  1247. {
  1248. Q_D(Bluetooth);
  1249. //qDebug()<<__PRETTY_FUNCTION__<<__LINE__<<"readData:"<<data;
  1250. //蓝牙开关状态
  1251. if(data.contains("DEVSTAT"))
  1252. {
  1253. int ofIndex = data.indexOf('=');
  1254. QString powerStatusStr = data.mid(ofIndex+1);
  1255. powerStatusStr = powerStatusStr.left(powerStatusStr.size()-1);
  1256. d->m_BluetoothPowerStatus = powerStatusStr.toInt() & 0x01;
  1257. emit onPowerChange(d->m_BluetoothPowerStatus);
  1258. if(d->m_BluetoothPowerStatus > 0){
  1259. d->getAddrMac();
  1260. setPincode(QString("0000"));
  1261. }
  1262. qDebug()<<"===[Bluetooth::BlutoothHandle:m_BluetoothPowerStatus000]====="<<d->m_BluetoothPowerStatus;
  1263. }
  1264. //自动连接和自动接听状态
  1265. else if(data.contains("HFPCFG"))
  1266. {
  1267. int ofIndex = data.indexOf('=');
  1268. QString HFPCFGStr = data.mid(ofIndex+1);
  1269. HFPCFGStr = HFPCFGStr.left(HFPCFGStr.size()-1);
  1270. d->m_HFPCFGBit = HFPCFGStr.toInt();
  1271. d->m_BluetoothAutoConnect = HFPCFGStr.toInt() & 0x01;
  1272. qDebug()<<"++++++d->m_BluetoothAutoConnect++++++"<<d->m_BluetoothAutoConnect;
  1273. emit onAutoConnectChange(d->m_BluetoothAutoConnect);
  1274. if((HFPCFGStr.toInt() & 0x02) == 0x02)
  1275. {
  1276. d->m_BluetoothAutoAnswer = 0x01;
  1277. }
  1278. else
  1279. {
  1280. d->m_BluetoothAutoAnswer = 0;
  1281. }
  1282. qDebug()<<"++++++d->m_BluetoothAutoAnswer++++++"<<d->m_BluetoothAutoAnswer;
  1283. emit onAutoAnswerChange(d->m_BluetoothAutoAnswer);
  1284. }
  1285. //扫描远程设别的信息
  1286. else if(data.contains("SCAN"))
  1287. {
  1288. int ofIndex = data.indexOf('=');
  1289. QString scanStr = data.mid(ofIndex+1);
  1290. //E\r
  1291. QStringList scanStrList;
  1292. scanStrList.clear();
  1293. RemoteDeviceInfo _RemoteDeviceInfo;
  1294. if(scanStr.left(2)!="E\r")
  1295. {
  1296. scanStrList = scanStr.split("�");
  1297. if(QString(scanStrList.at(0)).toInt() == 1)
  1298. {
  1299. d->m_RemoteDeviceInfoList.clear();
  1300. }
  1301. for(int i= 0;i< scanStrList.size();i++)
  1302. {
  1303. switch (i) {
  1304. case 0:
  1305. _RemoteDeviceInfo.index = QString(scanStrList.at(0)).toInt();
  1306. break;
  1307. case 1:
  1308. _RemoteDeviceInfo.rssi = QString(scanStrList.at(1)).toInt();
  1309. break;
  1310. case 2:
  1311. _RemoteDeviceInfo.deviceType = QString(scanStrList.at(2)).toInt();
  1312. break;
  1313. case 3:
  1314. _RemoteDeviceInfo.macAddress = QString(scanStrList.at(3));
  1315. break;
  1316. case 4:
  1317. _RemoteDeviceInfo.name = QString(scanStrList.at(4));
  1318. break;
  1319. case 5:
  1320. _RemoteDeviceInfo.deviceClass = QString(scanStrList.at(5)).left(QString(scanStrList.at(5)).size()-1);
  1321. break;
  1322. default:
  1323. break;
  1324. }
  1325. }
  1326. d->m_RemoteDeviceInfoList.append(_RemoteDeviceInfo);
  1327. }
  1328. else{
  1329. d->m_PairedMap.clear();
  1330. d->m_BtFirstEnterStatus = false;
  1331. emit onScanFinish();
  1332. }
  1333. }
  1334. //配对状态
  1335. else if(data.contains("HFPSTAT")){
  1336. int ofIndex = data.indexOf('=');
  1337. QString btConnectStatusStr = data.mid(ofIndex+1);
  1338. d->m_BluetoothConnectStatus= btConnectStatusStr.left(1).toInt();
  1339. QString _onCallingNumber;
  1340. if(d->m_BluetoothConnectStatus == 6)
  1341. {
  1342. QStringList _onCallingList = btConnectStatusStr.split(",");
  1343. if(_onCallingList.size() > 1)
  1344. {
  1345. _onCallingNumber = QString(_onCallingList.at(1)).left(QString(_onCallingList.at(1)).size()-1);
  1346. d->m_LastOnCallingNum = _onCallingNumber;
  1347. }
  1348. }
  1349. qDebug()<<"++++++++++++d->m_BluetoothConnectStatus++++++++++++"<<d->m_BluetoothConnectStatus;
  1350. qDebug()<<"++++++++++++_onCallingNumber++++++++++++"<<_onCallingNumber;
  1351. qDebug()<<"++++++++++++d->m_LastBluetoothConnectStatus++++++++++++"<<d->m_LastBluetoothConnectStatus;
  1352. qDebug()<<"++++++++++++d->m_LastOnCallingNum++++++++++++"<<d->m_LastOnCallingNum;
  1353. qDebug()<<"++++++++++++d->m_LastOnCallingNum.size++++++++++++"<<d->m_LastOnCallingNum.size();
  1354. if(d->m_BluetoothConnectStatus != d->m_LastBluetoothConnectStatus)
  1355. {
  1356. if(_onCallingNumber.size() == 0 || ( _onCallingNumber.size() != 0 && _onCallingNumber != QString("000000")))
  1357. {
  1358. emit onConnectStatusChange(d->m_BluetoothConnectStatus);
  1359. }
  1360. if(d->m_LastBluetoothConnectStatus >= 4 && d->m_BluetoothConnectStatus < 4)
  1361. {
  1362. if(d->m_LastBluetoothConnectStatus != Bluetooth::BCS_Talking || d->m_LastOnCallingNum != QString("000000"))
  1363. {
  1364. qDebug()<<"++++++0000####xxx++++++";
  1365. g_Audio->releaseAudioSource(AS_BluetoothPhone);
  1366. }
  1367. }
  1368. }
  1369. d->m_LastBluetoothConnectStatus = d->m_BluetoothConnectStatus;
  1370. if(d->m_LastBluetoothConnectStatus != Bluetooth::BCS_Talking)
  1371. {
  1372. d->m_LastOnCallingNum.clear();
  1373. }
  1374. if(d->m_BluetoothConnectStatus < 3){
  1375. if(d->m_LastBtStatus >= 3)
  1376. d->m_BtFirstEnterStatus = true;
  1377. d->m_RemoteBtAddress.clear();
  1378. d->m_RemoteDeviceName.clear();
  1379. }
  1380. d->m_LastBtStatus = d->m_BluetoothConnectStatus;
  1381. qDebug()<<"+++[Bluetooth::BlutoothHandle:BluetoothConnectStatus]+++"<<d->m_BluetoothConnectStatus;
  1382. //电话接入
  1383. if(d->m_BluetoothConnectStatus == Bluetooth::BCS_Incoming){
  1384. // if(g_Link->getLinkConnectStatus() != 0 && g_Link->getLinkType() == Carlife && g_Setting->getCarlifeTelephoneStatus() == 0)
  1385. // {
  1386. // g_Link->requestKey(KEY_MUSIC_PAUSE);
  1387. // g_Link->requestLink(g_Link->getLinkType(), g_Link->getLinkMode(), DBUS_REQUEST_BACKGROUND);
  1388. // }
  1389. // QStringList _IncomingList = btConnectStatusStr.split(",");
  1390. // QString IncomingNumber;
  1391. // if(_IncomingList.size() > 1)
  1392. // {
  1393. // IncomingNumber = QString(_IncomingList.at(1)).left(QString(_IncomingList.at(1)).size()-1);
  1394. // }
  1395. // emit onDialInfo(d->m_BluetoothConnectStatus,IncomingNumber);
  1396. // g_Audio->requestAudioSource(AS_BluetoothPhone);
  1397. }//正在接听中
  1398. else if(d->m_BluetoothConnectStatus == Bluetooth::BCS_Talking && _onCallingNumber != "000000"){
  1399. qDebug()<<"------_onCallingNumber-----"<<_onCallingNumber;
  1400. emit onDialInfo(d->m_BluetoothConnectStatus,_onCallingNumber);
  1401. g_Audio->requestAudioSource(AS_BluetoothPhone);
  1402. }//电话拨出
  1403. else if(d->m_BluetoothConnectStatus == Bluetooth::BCS_Outgoing){
  1404. QStringList _OutComingList = btConnectStatusStr.split(",");
  1405. QString _OutComingNumber;
  1406. if(_OutComingList.size() > 1)
  1407. {
  1408. _OutComingNumber = QString(_OutComingList.at(1)).left(QString(_OutComingList.at(1)).size()-1);
  1409. }
  1410. g_Audio->requestAudioSource(AS_BluetoothPhone);
  1411. emit onDialInfo(d->m_BluetoothConnectStatus,_OutComingNumber);
  1412. }
  1413. }
  1414. //配对过的链表
  1415. else if(data.contains("PLIST")){
  1416. if(!d->m_BtFirstEnterStatus){
  1417. return;
  1418. }
  1419. int ofIndex = data.indexOf('=');
  1420. QString pairedListStr = data.mid(ofIndex+1);
  1421. QStringList pairedList;
  1422. if(pairedListStr.left(2)!="E\r"){
  1423. pairedList = pairedListStr.split("�");
  1424. QString pairedAddr = QString(pairedList.at(2));
  1425. QString pairedName = QString(pairedList.at(3)).left(QString(pairedList.at(3)).size()-1);
  1426. d->m_PairedMap.insert(pairedAddr,pairedName);
  1427. }
  1428. else
  1429. {
  1430. qDebug()<<"=======onGetPairedListFinish======";
  1431. emit onGetPairedListFinish();
  1432. }
  1433. }
  1434. //配对成功的远程设备MAC地址和名称
  1435. else if(data.contains("HFPDEV")){
  1436. int ofIndex = data.indexOf('=');
  1437. QString pairedConnectStr = data.mid(ofIndex+1);
  1438. QStringList pairedConnectList;
  1439. pairedConnectList = pairedConnectStr.split("�");
  1440. d->m_RemoteBtAddress = QString(pairedConnectList.at(0));
  1441. d->m_RemoteDeviceName = QString(pairedConnectList.at(1)).left(QString(pairedConnectList.at(1)).size()-1);
  1442. qDebug()<<"+++[Bluetooth::BlutoothHandle:m_RemoteBtAddress]+++"<<__LINE__ <<d->m_RemoteBtAddress;
  1443. qDebug()<<"+++[Bluetooth::BlutoothHandle:m_RemoteDeviceName]+++"<<__LINE__ <<d->m_RemoteDeviceName;
  1444. onRemoteDeviceNameChange(d->m_RemoteDeviceName);
  1445. }
  1446. //蓝牙音乐Play状态
  1447. else if(data.contains("PLAYSTAT")){
  1448. int ofIndex = data.indexOf('=');
  1449. int btMusicPlayStatus = QString(data.mid(ofIndex+1)).left(QString(data.mid(ofIndex+1)).size()-1).toInt();
  1450. qDebug()<<"++++++++Bluetooth::BtMusic_Playing+++++++++" << btMusicPlayStatus;
  1451. if(btMusicPlayStatus == Bluetooth::BtMusic_Playing)
  1452. {
  1453. qDebug()<<"++++++++Bluetooth::BtMusic_Playing0000+++++++++";
  1454. g_Audio->requestAudioSource(AS_BluetoothMusic);
  1455. int param = 35;
  1456. BtMusicInfo(param);
  1457. }
  1458. else
  1459. {
  1460. if(d->m_BluetoothPlayerStatus == Bluetooth::BtMusic_Playing)
  1461. {
  1462. if(d->m_MusicType == 1 && btMusicPlayStatus == BtMusic_Stopped)
  1463. {
  1464. qDebug()<<"+++++++++++holderChange+++++++++++";
  1465. g_Audio->requestAudioSource(AS_Music);
  1466. }
  1467. }
  1468. }
  1469. d->m_BluetoothPlayerStatus = btMusicPlayStatus;
  1470. emit onMusicStatusChange(d->m_BtMusicTitle,d->m_BluetoothPlayerStatus);
  1471. }
  1472. else if(data.contains("TRACKINFO")){
  1473. int ofIndex = data.indexOf('=');
  1474. QString btMusicID3InfoStr = data.mid(ofIndex+1);
  1475. QStringList btMusicID3InfoList;
  1476. btMusicID3InfoList = btMusicID3InfoStr.split("�");
  1477. qDebug()<<"++++++++btMusicID3InfoList000++++++"<<btMusicID3InfoList.size();
  1478. if(btMusicID3InfoList.size() < 3){
  1479. return;
  1480. }
  1481. QString _Title_Artist = QString(btMusicID3InfoList.at(1));
  1482. QStringList _Title_ArtistList = _Title_Artist.split("-");
  1483. qDebug()<<"++++++++_Title_Artist000++++++"<<_Title_Artist;
  1484. qDebug()<<"++++++++_Title_ArtistList.size()0000++++++"<<_Title_ArtistList.size();
  1485. if(_Title_ArtistList.size() == 1)
  1486. {
  1487. _Title_ArtistList = _Title_Artist.split(" — ");
  1488. }
  1489. if(_Title_ArtistList.size() >= 2)
  1490. {
  1491. QString _TitleStr = QString(_Title_ArtistList.at(1));
  1492. QString _ArtistStr = QString(_Title_ArtistList.at(0));
  1493. QString _AlbumStr = QString(btMusicID3InfoList.at(2)).left(QString(btMusicID3InfoList.at(2)).size()-1);
  1494. d->m_BtMusicTitle = _TitleStr;
  1495. d->m_BtMusicArtist= _ArtistStr;
  1496. d->m_BtMusicAlbum = _AlbumStr;
  1497. qDebug()<<"++++++++_TitleStr111++++++"<<_TitleStr;
  1498. qDebug()<<"++++++++_ArtistStr111++++++"<<_ArtistStr;
  1499. qDebug()<<"++++++++_AlbumStr+++++"<<_AlbumStr;
  1500. emit onBtMusicID3InfoChange(_TitleStr,_ArtistStr,_AlbumStr);
  1501. }
  1502. else
  1503. {
  1504. if(btMusicID3InfoList.size() >= 2)
  1505. {
  1506. QString _TitleStr = QString(btMusicID3InfoList.at(0));
  1507. QString _ArtistStr = QString(btMusicID3InfoList.at(1));
  1508. QString _AlbumStr ="";
  1509. qDebug()<<"++++++++_TitleStr222++++++"<<_TitleStr;
  1510. qDebug()<<"++++++++_ArtistStr22++++++"<<_ArtistStr;
  1511. emit onBtMusicID3InfoChange(_TitleStr,_ArtistStr,_AlbumStr);
  1512. }
  1513. }
  1514. qDebug()<<"--------TRACKINFO----END-------";
  1515. }
  1516. else if(data.contains("TRACKSTAT")){
  1517. int ofIndex = data.indexOf('=');
  1518. QString btMusicTimeInfoStr = data.mid(ofIndex+1);
  1519. QStringList btMusicTimeInfoList;
  1520. btMusicTimeInfoList = btMusicTimeInfoStr.split(",");
  1521. int _ElapsedTime = QString(btMusicTimeInfoList.at(1)).toInt();
  1522. int _EndTime = QString(btMusicTimeInfoList.at(2)).toInt();
  1523. // qDebug()<<"+++++++++++TRACKSTAT++++++++++";
  1524. onBtMusicElapsedInfo(_ElapsedTime,_EndTime);
  1525. }
  1526. else if(data.contains("PBDATA")){
  1527. int ofIndex = data.indexOf('=');
  1528. QString _RecordStr = data.mid(ofIndex+1);
  1529. if(_RecordStr.left(1) != "E")
  1530. {
  1531. if(_RecordStr.left(1) == "1")
  1532. {
  1533. QStringList _PhoneBookList = _RecordStr.split("�");
  1534. if(_PhoneBookList.size() < 3){
  1535. return;
  1536. }
  1537. struct PhoneBookInfo _PhoneBookStr;
  1538. _PhoneBookStr.name = QString(_PhoneBookList.at(1));
  1539. _PhoneBookStr.phone = QString(_PhoneBookList.at(2)).left(QString(_PhoneBookList.at(2)).size()-1);
  1540. if(QString(_PhoneBookStr.name) <= 0)
  1541. {
  1542. _PhoneBookStr.name = _PhoneBookStr.phone;
  1543. }
  1544. QString character;
  1545. if(IsChinese(_PhoneBookStr.name.left(1))){
  1546. character = d->getChineseSpell(QString(_PhoneBookStr.name.left(1)));
  1547. }
  1548. else{
  1549. character = _PhoneBookStr.name.left(1);
  1550. }
  1551. if(character.size() >= 1)
  1552. _PhoneBookStr.head = character.left(1);
  1553. d->m_PhoneBookList.append(_PhoneBookStr);
  1554. }
  1555. else{
  1556. QStringList _AllCallList = _RecordStr.split("�");
  1557. if(_AllCallList.size() < 4){
  1558. return;
  1559. }
  1560. struct CallLogInfo _AllCallStr;
  1561. _AllCallStr.callType = QString(_AllCallList.at(0)).toInt();
  1562. _AllCallStr.name = QString(_AllCallList.at(1));
  1563. _AllCallStr.phoneNumber = QString(_AllCallList.at(2));
  1564. if(_AllCallStr.name.size()==0)
  1565. {
  1566. _AllCallStr.name = _AllCallStr.phoneNumber;
  1567. }
  1568. QStringList _DataTimeList = QString(_AllCallList.at(3)).split("T");
  1569. _AllCallStr.data = QString(_DataTimeList.at(0));
  1570. _AllCallStr.time = QString(_DataTimeList.at(1));
  1571. d->m_AllCallList.append(_AllCallStr);
  1572. }
  1573. }
  1574. else{
  1575. if(d->m_AutoCancelTimer->isActive())
  1576. {
  1577. d->m_AutoCancelTimer->stop();
  1578. }
  1579. if(d->m_SyncType == BRT_PhoneBook){
  1580. emit onSyncPhoneBook();
  1581. }
  1582. else if(d->m_SyncType == BRT_Incoming){
  1583. d->syncOutComingCallLog();
  1584. }
  1585. else if(d->m_SyncType == BRT_Outgoing){
  1586. d->syncMissedCallLog();
  1587. }
  1588. else if(d->m_SyncType == BRT_Missed){
  1589. emit onSyncAllCallLog();
  1590. }
  1591. }
  1592. }
  1593. else if(data.contains("MICMUTED")){
  1594. int ofIndex = data.indexOf('=');
  1595. QString _BtMicMuteStatusStr = data.mid(ofIndex+1);
  1596. d->m_BtMicMuteStatus = _BtMicMuteStatusStr.left(1).toInt();
  1597. }
  1598. //Hicar无线连接
  1599. else if(data.contains("ADDR=")){
  1600. int ofIndex = data.indexOf('=');
  1601. QString _AddrStr = data.mid(ofIndex+1);
  1602. _AddrStr = _AddrStr.left(_AddrStr.size()-1);
  1603. d->m_LocalAddress = _AddrStr;
  1604. QFile addressfile(QString("/data/bluetoothaddress"));
  1605. if(!addressfile.exists())
  1606. {
  1607. QString _BtAddress = _AddrStr;
  1608. if(_BtAddress.size() == 12)
  1609. {
  1610. _BtAddress = d->m_LocalAddress.mid(0,2) +(QString(":")) + d->m_LocalAddress.mid(2,2) +(QString(":"))+
  1611. d->m_LocalAddress.mid(4,2) +(QString(":")) + d->m_LocalAddress.mid(6,2) +(QString(":"))+
  1612. d->m_LocalAddress.mid(8,2) +(QString(":")) + d->m_LocalAddress.mid(10,2);
  1613. }
  1614. if (addressfile.open(QFile::WriteOnly)) {
  1615. QString localAddress = _BtAddress;
  1616. addressfile.write(localAddress.toLocal8Bit().data(), localAddress.length());
  1617. addressfile.flush();
  1618. addressfile.close();
  1619. }
  1620. }
  1621. qDebug()<<"=====_AddrStr=========="<<_AddrStr;
  1622. }
  1623. else if(data.left(2)== QString("SR")){
  1624. qDebug()<<"========Hicar无线连接SR======="<<data.left(data.size()-1);
  1625. g_Link->requestBluetoothCmd(data.left(data.size()-1).toStdString());
  1626. }
  1627. else if(data.left(2)== QString("SI")){
  1628. qDebug()<<"========Hicar无线连接SI======="<<data.left(data.size()-1);
  1629. g_Link->requestBluetoothCmd(data.left(data.size()-1).toStdString());
  1630. }
  1631. else if(data.left(2)== QString("SV")){
  1632. qDebug()<<"========Hicar无线连接SV======="<<data.left(data.size()-1);
  1633. g_Link->requestBluetoothCmd(data.left(data.size()-1).toStdString());
  1634. }
  1635. else if(data.left(2)== QString("SS")){
  1636. qDebug()<<"========Hicar无线连接SS======="<<data.left(data.size()-1);
  1637. g_Link->requestBluetoothCmd(data.left(data.size()-1).toStdString());
  1638. }
  1639. else if(data.left(3)== QString("MX0")){
  1640. qDebug()<<"========Hicar无线连接MX0======="<<data.left(data.size()-1);
  1641. d->m_HicarBackLinkMac = data.left(15).right(12);
  1642. d->m_HicarBackLinkCmd = data.left(data.size()-1);
  1643. if(g_Link->getHicarInitDoneStatu()){
  1644. }
  1645. g_Link->requestBluetoothCmd(g_Bluetooth->getHicarBackLinkCmd().left(15).toStdString());
  1646. }
  1647. else if(data.left(4)== QString("MZ12")){
  1648. qDebug()<<"========Hicar无线连接MZ12======="<<data.left(data.size()-1);
  1649. g_Link->requestBluetoothCmd(data.left(data.size()-1).toStdString());
  1650. }
  1651. }
  1652. void Bluetooth::SudingBlutoothHandle(QString data)
  1653. {
  1654. Q_D(Bluetooth);
  1655. qDebug()<<__PRETTY_FUNCTION__<<__LINE__<<"readData:"<<data;
  1656. //蓝牙开关状态:ST0 关闭, ST1 开启 undefined、BPS_PowerOff、BPS_PowerOn
  1657. // if(data.contains("ST1"))
  1658. // {
  1659. // d->m_BluetoothPowerStatus = BPS_PowerOn;
  1660. // emit onPowerChange(d->m_BluetoothPowerStatus);
  1661. // d->getAddrMac();
  1662. // setPincode(QString("0000"));
  1663. // }
  1664. // else if(data.contains("ST0")){
  1665. // d->m_BluetoothPowerStatus = BPS_PowerOff;
  1666. // emit onPowerChange(d->m_BluetoothPowerStatus);
  1667. // }
  1668. if (data.startsWith("IS")){
  1669. int power = data.mid(2,1).toInt();
  1670. qDebug()<<__PRETTY_FUNCTION__<<__LINE__<<"111=== blutooth power status"<<power;
  1671. if (power == 1) {
  1672. Send_AT_CMD(QString("DF"));
  1673. d->m_BluetoothPowerStatus = BPS_PowerOn;
  1674. } else {
  1675. d->m_BluetoothPowerStatus = BPS_PowerOff;
  1676. }
  1677. emit onPowerChange(d->m_BluetoothPowerStatus);
  1678. }
  1679. //自动连接和自动接听状态MF[auto_reconnect:1][ auto_pickup:1]\r\n1 为 TRUE,0 为 FALSE
  1680. else if(data.contains("MF") && data.size() >=4)
  1681. {
  1682. d->m_BluetoothAutoConnect = data.right(3).left(1).toInt();
  1683. if(d->m_BluetoothAutoConnect > 0)
  1684. {
  1685. d->m_BluetoothAutoConnect = 1;
  1686. }
  1687. emit onAutoConnectChange(d->m_BluetoothAutoConnect);
  1688. d->m_BluetoothAutoAnswer = data.right(2).left(1).toInt();
  1689. if(d->m_BluetoothAutoAnswer > 0)
  1690. {
  1691. d->m_BluetoothAutoAnswer = 1;
  1692. }
  1693. emit onAutoAnswerChange(d->m_BluetoothAutoAnswer);
  1694. }
  1695. //扫描远程设别的信息
  1696. else if(data.contains("SF"))
  1697. {
  1698. RemoteDeviceInfo _RemoteDeviceInfo;
  1699. _RemoteDeviceInfo.index= d->m_RemoteDeviceInfoList.size();
  1700. _RemoteDeviceInfo.rssi = 0;
  1701. _RemoteDeviceInfo.deviceType = data.left(3).right(1).toInt();
  1702. _RemoteDeviceInfo.macAddress = data.left(15).right(12);
  1703. _RemoteDeviceInfo.name = data.right(data.size()-15).left(data.right(data.size()-15).size()-1);
  1704. _RemoteDeviceInfo.deviceClass = QString("0");
  1705. d->m_RemoteDeviceInfoList.append(_RemoteDeviceInfo);
  1706. qDebug()<<__FUNCTION__<<__LINE__<<_RemoteDeviceInfo.macAddress<<" "<<_RemoteDeviceInfo.name;
  1707. }
  1708. //结束扫描
  1709. else if(data.contains("SH")){
  1710. d->m_PairedMap.clear();
  1711. d->m_BtFirstEnterStatus = false;
  1712. emit onScanFinish();
  1713. }
  1714. //当前HFP和a2dp状态MG[status]1:未连接 3:已连接 4:电话拨出 5:电话打入 6:通话中
  1715. // enum BluetoothConnectStatus {
  1716. // BCS_Undefine = -1,
  1717. // BCS_Unsupported,
  1718. // BCS_Idle,
  1719. // BCS_Connecting,
  1720. // BCS_Connected,
  1721. // BCS_Outgoing,
  1722. // BCS_Incoming,
  1723. // BCS_Talking,
  1724. // BCS_ActiveHeld,
  1725. // };
  1726. else if(data.contains("MG")){
  1727. d->m_BluetoothConnectStatus = data.left(3).right(1).toInt();
  1728. if(d->m_BluetoothConnectStatus != d->m_LastBluetoothConnectStatus)
  1729. {
  1730. emit onConnectStatusChange(d->m_BluetoothConnectStatus);
  1731. }
  1732. d->m_LastBluetoothConnectStatus = d->m_BluetoothConnectStatus;
  1733. if(d->m_BluetoothConnectStatus < 3){
  1734. if(d->m_LastBtStatus >= 3)
  1735. d->m_BtFirstEnterStatus = true;
  1736. d->m_RemoteBtAddress.clear();
  1737. d->m_RemoteDeviceName.clear();
  1738. }
  1739. d->m_LastBtStatus = d->m_BluetoothConnectStatus;
  1740. }
  1741. //来电电话号码
  1742. else if(data.left(2).contains("ID"))
  1743. {
  1744. // //电话接入
  1745. // if(g_Link->getLinkConnectStatus() != 0 && g_Link->getLinkType() == Carlife && g_Setting->getCarlifeTelephoneStatus() == 0)
  1746. // {
  1747. // g_Link->requestKey(KEY_MUSIC_PAUSE);
  1748. // g_Link->requestLink(g_Link->getLinkType(), g_Link->getLinkMode(), DBUS_REQUEST_BACKGROUND);
  1749. // }
  1750. // QString IncomingNumber = data.left(data.size()-1).right(data.left(data.size()-1).size()-2);
  1751. // d->m_BluetoothConnectStatus = BCS_Incoming;
  1752. // emit onDialInfo(d->m_BluetoothConnectStatus,IncomingNumber);
  1753. // g_Audio->requestAudioSource(AS_BluetoothPhone);
  1754. }
  1755. //去电电话号码
  1756. else if(data.left(2).contains("IC"))
  1757. {
  1758. //电话拨出
  1759. QString _OutComingNumber = data.left(data.size()-1).right(data.left(data.size()-1).size()-2);
  1760. g_Audio->requestAudioSource(AS_BluetoothPhone);
  1761. d->m_BluetoothConnectStatus = BCS_Outgoing;
  1762. emit onDialInfo(d->m_BluetoothConnectStatus,_OutComingNumber);
  1763. }
  1764. //通话中电话号码...
  1765. else if(data.left(2).contains("IG"))
  1766. {
  1767. //通话中...
  1768. QString _onCallingNumber = data.left(data.size()-1).right(data.left(data.size()-1).size()-2);
  1769. g_Audio->requestAudioSource(AS_BluetoothPhone);
  1770. d->m_BluetoothConnectStatus = BCS_Talking;
  1771. emit onDialInfo(d->m_BluetoothConnectStatus,_onCallingNumber);
  1772. g_Audio->requestAudioSource(AS_BluetoothPhone);
  1773. }
  1774. //挂断电话
  1775. else if(data.left(2).contains("IF")){
  1776. g_Audio->releaseAudioSource(AS_BluetoothPhone);
  1777. }
  1778. //配对记录
  1779. else if(data.contains("MX") && data.left(3) != "MX0")
  1780. {
  1781. if(!d->m_BtFirstEnterStatus){
  1782. return;
  1783. }
  1784. QString pairedAddr = data.left(15).right(12);
  1785. QString pairedName = data.right(data.size()-15).left(data.right(data.size()-15).size()-1);
  1786. d->m_PairedMap.insert(pairedAddr,pairedName);
  1787. emit onGetPairedListFinish();
  1788. }
  1789. //当前连接设备名称
  1790. else if(data.contains("SA"))
  1791. {
  1792. d->m_RemoteDeviceName = data.left(data.size()-1).right(data.left(data.size()-1).size()-2);
  1793. onRemoteDeviceNameChange(d->m_RemoteDeviceName);
  1794. qDebug()<<"+++[Bluetooth::BlutoothHandle:m_RemoteDeviceName]+++"<<__LINE__ <<d->m_RemoteDeviceName;
  1795. }
  1796. //当前连接设备地址:::JH[addr:12]
  1797. else if(data.contains("JH"))
  1798. {
  1799. d->m_RemoteBtAddress = data.left(data.size()-1).right(data.left(data.size()-1).size()-2);
  1800. onRemoteDeviceNameChange(d->m_RemoteBtAddress);
  1801. qDebug()<<"+++[Bluetooth::BlutoothHandle:m_RemoteBtAddress]+++"<<__LINE__ <<d->m_RemoteBtAddress;
  1802. }
  1803. //蓝牙音乐状态
  1804. else if(data.contains("MB"))
  1805. {
  1806. d->m_BluetoothPlayerStatus = Bluetooth::BtMusic_Playing;
  1807. g_Audio->requestAudioSource(AS_BluetoothMusic);
  1808. BtMusicInfo(0);//获取歌曲信息
  1809. }
  1810. //音乐停止
  1811. else if(data.contains("MA"))
  1812. {
  1813. d->m_BluetoothPlayerStatus = Bluetooth::BtMusic_Paused;
  1814. emit onMusicStatusChange(d->m_BtMusicTitle,d->m_BluetoothPlayerStatus);
  1815. }
  1816. //音乐信息
  1817. else if(data.contains("MI"))
  1818. {
  1819. QStringList _MusicInfoList = data.split("�");
  1820. if(_MusicInfoList.size() >=3)
  1821. {
  1822. QString _MusicName = QString(_MusicInfoList.at(0)).right(QString(_MusicInfoList.at(0)).size()-2);
  1823. QString _MusicArtist = _MusicInfoList.at(1);
  1824. QString _MusicAlbum = _MusicInfoList.at(2);
  1825. d->m_BtMusicTitle = _MusicName;
  1826. d->m_BtMusicArtist= _MusicArtist;
  1827. d->m_BtMusicAlbum = _MusicAlbum;
  1828. emit onBtMusicID3InfoChange(_MusicName,_MusicArtist,_MusicAlbum);
  1829. emit onMusicStatusChange(d->m_BtMusicTitle,d->m_BluetoothPlayerStatus);
  1830. }
  1831. }
  1832. //蓝牙音乐进度信息
  1833. else if(data.contains("MP"))
  1834. {
  1835. if(data.size() >=22)
  1836. {
  1837. int _ElapsedTime = data.left(12).right(10).toInt();
  1838. int _EndTime = data.right(11).right(data.right(11).size()-1).toInt();
  1839. onBtMusicElapsedInfo((_ElapsedTime/1000),(_EndTime/1000));
  1840. }
  1841. }
  1842. //电话本信息
  1843. else if(data.contains("PB"))
  1844. {
  1845. struct PhoneBookInfo _PhoneBookStr;
  1846. //int _PhoneNameLen = data.left(4).right(2).toInt();
  1847. int _PhoneNumberLen = data.left(6).right(2).toInt();
  1848. _PhoneBookStr.name = data.left(data.size()-_PhoneNumberLen-1).right(data.left(data.size()-_PhoneNumberLen-1).size()-6);
  1849. _PhoneBookStr.phone = data.left(data.size()-1).right(_PhoneNumberLen);
  1850. if(QString(_PhoneBookStr.name) <= 0)
  1851. {
  1852. _PhoneBookStr.name = _PhoneBookStr.phone;
  1853. }
  1854. QString character;
  1855. if(IsChinese(_PhoneBookStr.name.left(1))){
  1856. character = d->getChineseSpell(QString(_PhoneBookStr.name.left(1)));
  1857. }
  1858. else{
  1859. character = _PhoneBookStr.name.left(1);
  1860. }
  1861. if(character.size() >= 1)
  1862. _PhoneBookStr.head = character.left(1);
  1863. d->m_PhoneBookList.append(_PhoneBookStr);
  1864. }
  1865. //下载电话本结束
  1866. else if(data.left(2)== QString("PC"))
  1867. {
  1868. d->initializeAutoCancelTimer();
  1869. if(d->m_AutoCancelTimer->isActive())
  1870. {
  1871. d->m_AutoCancelTimer->stop();
  1872. }
  1873. if(d->m_SyncType == BRT_PhoneBook){
  1874. emit onSyncPhoneBook();
  1875. }
  1876. }
  1877. //下载通话记录
  1878. else if(data.contains("PD"))
  1879. {
  1880. QStringList _AllCallList = data.split("�");
  1881. if(_AllCallList.size() < 3){
  1882. return;
  1883. }
  1884. struct CallLogInfo _AllCallStr;
  1885. _AllCallStr.callType = QString(_AllCallList.at(0)).left(3).right(1).toInt();
  1886. _AllCallStr.name = QString(_AllCallList.at(0)).right(QString(_AllCallList.at(0)).size()-3);
  1887. _AllCallStr.phoneNumber = QString(_AllCallList.at(1));
  1888. if(_AllCallStr.name.size()==0)
  1889. {
  1890. _AllCallStr.name = _AllCallStr.phoneNumber;
  1891. }
  1892. QStringList _DataTimeList = QString(_AllCallList.at(2)).left(QString(_AllCallList.at(2)).size()-1).split("T");
  1893. if(_DataTimeList.size()>= 2)
  1894. {
  1895. _AllCallStr.data = QString(_DataTimeList.at(0));
  1896. _AllCallStr.time = QString(_DataTimeList.at(1));
  1897. }
  1898. else{
  1899. _AllCallStr.data = QString(_AllCallList.at(2)).left(QString(_AllCallList.at(2)).size()-1);
  1900. }
  1901. d->m_AllCallList.append(_AllCallStr);
  1902. }
  1903. //下载通话记录结束
  1904. else if(data.left(2)== QString("PE"))
  1905. {
  1906. d->initializeAutoCancelTimer();
  1907. if(d->m_AutoCancelTimer->isActive())
  1908. {
  1909. d->m_AutoCancelTimer->stop();
  1910. }
  1911. if(d->m_SyncType == BRT_Incoming){
  1912. d->syncOutComingCallLog();
  1913. }
  1914. else if(d->m_SyncType == BRT_Outgoing){
  1915. d->syncMissedCallLog();
  1916. }
  1917. else if(d->m_SyncType == BRT_Missed){
  1918. emit onSyncAllCallLog();
  1919. }
  1920. }
  1921. else if(data.contains("IO"))
  1922. {
  1923. d->m_BtMicMuteStatus = data.right(3).right(1).toInt();
  1924. }
  1925. //Hicar无线连接
  1926. else if(data.contains("DB")){
  1927. d->m_LocalAddress = data.left(data.size()-1).right(12);
  1928. QFile addressfile(QString("/data/bluetoothaddress"));
  1929. if(!addressfile.exists())
  1930. {
  1931. QString _BtAddress = d->m_LocalAddress;
  1932. if(_BtAddress.size() == 12)
  1933. {
  1934. _BtAddress = d->m_LocalAddress.mid(0,2) +(QString(":")) + d->m_LocalAddress.mid(2,2) +(QString(":"))+
  1935. d->m_LocalAddress.mid(4,2) +(QString(":")) + d->m_LocalAddress.mid(6,2) +(QString(":"))+
  1936. d->m_LocalAddress.mid(8,2) +(QString(":")) + d->m_LocalAddress.mid(10,2);
  1937. }
  1938. if (addressfile.open(QFile::WriteOnly)) {
  1939. QString localAddress = _BtAddress;
  1940. addressfile.write(localAddress.toLocal8Bit().data(), localAddress.length());
  1941. addressfile.flush();
  1942. addressfile.close();
  1943. }
  1944. }
  1945. qDebug()<<"=====_AddrStr=========="<<d->m_LocalAddress;
  1946. }
  1947. else if(data.left(2)== QString("SR")){
  1948. qDebug()<<"========Hicar无线连接SR======="<<data.left(data.size()-1);
  1949. g_Link->requestBluetoothCmd(data.left(data.size()-1).toStdString());
  1950. }
  1951. else if(data.left(2)== QString("SI")){
  1952. qDebug()<<"========Hicar无线连接SI======="<<data.left(data.size()-1);
  1953. g_Link->requestBluetoothCmd(data.left(data.size()-1).toStdString());
  1954. }
  1955. else if(data.left(2)== QString("SV")){
  1956. qDebug()<<"========Hicar无线连接SV======="<<data.left(data.size()-1);
  1957. g_Link->requestBluetoothCmd(data.left(data.size()-1).toStdString());
  1958. }
  1959. else if(data.left(2)== QString("SS")){
  1960. qDebug()<<"========Hicar无线连接SS======="<<data.left(data.size()-1);
  1961. g_Link->requestBluetoothCmd(data.left(data.size()-1).toStdString());
  1962. }
  1963. else if(data.left(3)== QString("MX0")){
  1964. qDebug()<<"========Hicar无线连接MX0======="<<data.left(data.size()-1);
  1965. d->m_HicarBackLinkMac = data.left(15).right(12);
  1966. d->m_HicarBackLinkCmd = data.left(data.size()-1);
  1967. d->m_RemoteBtAddress = data.mid(3).left(12);
  1968. qDebug() << "============ m_RemoteBtAddress" << d->m_RemoteBtAddress;
  1969. onRemoteDeviceNameChange(d->m_RemoteBtAddress);
  1970. //d->m_ProcessedRemoteBtAddr = Get_MAC_addr(d->m_RemoteBtAddress,2,QString(":"));
  1971. }
  1972. else if(data.left(4)== QString("MZ12")){
  1973. qDebug()<<"========Hicar无线连接MZ12======="<<data.left(data.size()-1);
  1974. g_Link->requestBluetoothCmd(data.left(data.size()-1).toStdString());
  1975. }
  1976. }
  1977. QString BluetoothPrivate::getBtManufacturer()
  1978. {
  1979. string value;
  1980. string fileName("/data/bluetoothType");
  1981. LoadConfigString(value, fileName);
  1982. QString btManufacturer = QString::fromStdString(value);
  1983. return btManufacturer;
  1984. }
  1985. QString Bluetooth::getBtType()
  1986. {
  1987. Q_D(Bluetooth);
  1988. QString _BtType = d->getBtManufacturer();
  1989. return _BtType;
  1990. }