ME909 之 gps/gsm

  1. #ifndef USER_INTERFACE_H  
  2. #define USER_INTERFACE_H  
  3.   
  4. #include <QWidget>  
  5. #include <QLabel>  
  6. #include <QMouseEvent>  
  7. #include <qpropertyanimation.h>  
  8. #include <QProcess>  
  9. #include <QTimer>  
  10. #include <QString>  
  11. #include <QDebug>  
  12. #include <QTime>  
  13. #include <QUdpSocket>  
  14. #include <QtSql>  
  15. #include <stdio.h>//標準io定義  
  16. #include <fcntl.h>//文件控制定義  
  17. #include <unistd.h>//unix標準函數定義  
  18. #include <stdlib.h>//標準函數庫定義  
  19. #include <termios.h>//PPSIX終端控制定義  
  20. #include <sys/types.h>  
  21. #include <sys/time.h>//kill函數需要用到的頭文件  
  22. #include <signal.h>//kill函數需要用到的頭文件  
  23. #include <errno.h>//錯誤號定義  
  24. #include <string.h>  
  25. #include <sys/socket.h>  
  26. #include <netinet/in.h>  
  27. #include <arpa/inet.h>  
  28. #include <QThread>  
  29. #include <QMessageBox>  
  30. #include <QtNetwork/QUdpSocket>  
  31. #include <malloc.h>  
  32.   
  33. void gps_open(void);//打開gps模塊  
  34. void gps_set_serial(int fd, int speed, int bits, char event, int stop);//gps模塊串口參數設置  
  35. void gps_close(void);//關閉gps模塊  
  36. void gsm_open(void);//打開gsm模塊設備節點  
  37. void gsm_close(void);//關閉gsm模塊設備節點  
  38. void gsm_set_serial(int fd, int speed, int bit, char event, int stop);//設置串口參數  
  39. void gsm_read(void);//讀取gsm模塊信息  
  40. void gsm_calling(void);//打電話  
  41. void gsm_cut(void);//掛斷電話  
  42. void gsm_apn_set(void);//設置APN無線接入點  
  43. void gsm_ppp_dialing(void);//進行ppp撥號,實現PDP激活和TCPIP的初始化  
  44. void gsm_ip_open(void);//打開一條TCP或UDP連接  
  45. void gsm_data_send(char *p);//發送數據  
  46. void gsm_ip_close(void);//關閉連接  
  47. void gsm_iomode(void);//設置數據模式  
  48. char *gsm_data_transfer(char *data);//轉換髮送數據爲數據ascii碼對應的十六進制數  
  49. void socket_send(char *time,char *latitude,char *N_S ,char *longitude,char *E_W,char *satellite);//發送經緯度  
  50. void socket_close(void);//關閉socket  
  51. void socket_open(void);//創建socket  
  52.   
  53. namespace Ui {  
  54. class user_interface;  
  55. class MyThread;  
  56. }  
  57.   
  58. class MyThread : public QThread  
  59. {  
  60.     Q_OBJECT  
  61. public:  
  62.     int flag_thread;//線程標誌位  
  63.   
  64. protected:  
  65.   
  66. private:  
  67.     void run();//線程函數  
  68.     QUdpSocket *udpsocket_sender;//發送衛星號信息  
  69.     QUdpSocket *udpsocket_sender_traffic;//發送預警信息  
  70. };  
  71.   
  72. class user_interface : public QWidget  
  73. {  
  74.     Q_OBJECT  
  75.       
  76. public:  
  77.     explicit user_interface(QWidget *parent = 0);  
  78.     ~user_interface();  
  79.   
  80. private slots:  
  81.     /******************************home界面槽函數******************************/  
  82.     void on_button_home_clicked();//home按鈕槽函數  
  83.     void on_button_music_clicked();//music按鈕槽函數  
  84.     void on_button_gps_clicked();//gps按鈕槽函數  
  85.   
  86.     /******************************gps界面槽函數******************************/  
  87.     void read_pending_datagrams_1();//獲取經緯度槽函數  
  88.     void read_pending_datagrams_2();//獲取衛星號槽函數  
  89.     void on_button_run_clicked();//run按鈕槽函數  
  90.   
  91.     /******************************music界面槽函數******************************/  
  92.     void timer_traffic_slot();//預警計時器槽函數  
  93.     void timer_music_slot();//從預警播放跳回音樂播放計時器槽函數  
  94.     void catch_output();//進度條滾動槽函數  
  95.     void get_current_time();//獲取當前播放時間槽函數  
  96.     void read_pending_datagrams();//獲取預警信號槽函數  
  97.     void on_button_play_clicked();//play按鈕槽函數  
  98.     void on_button_last_clicked();//last按鈕槽函數  
  99.     void on_button_next_clicked();//next按鈕槽函數  
  100.     void on_button_down_clicked();//down按鈕槽函數  
  101.     void on_button_up_clicked();//up按鈕槽函數  
  102.     void on_timeline_sliderMoved(int position);//歌曲進度條槽函數  
  103.   
  104. private:  
  105.     /******************************home界面******************************/  
  106.     Ui::user_interface *ui;//ui界面指針  
  107.     QPropertyAnimation *propertyanimation_home;//home按鈕動畫指針  
  108.     QPropertyAnimation *propertyanimation_music;//music按鈕動畫指針  
  109.     QPropertyAnimation *propertyanimation_gps;//gps按鈕動畫指針  
  110.     void mousePressEvent(QMouseEvent *);//鼠標點擊時間函數  
  111.     void time_show();//顯示系統時間函數  
  112.     void home_show();//顯示home界面函數  
  113.     void home_hide();//隱藏home界面函數  
  114.     int flag_event;  
  115.   
  116.     /******************************gps界面******************************/  
  117.     MyThread *thread;  //創建一個線程,用於執行有關採集gps的信息函數,若直接使用會導致界面卡死  
  118.     QUdpSocket *udpsocket_receiver1;//創建一個receiver用於接收自己發出去的經緯度信息  
  119.     QUdpSocket *udpsocket_receiver2;//創建一個receiver用於接受自己發出去的衛星號和衛星強度信息  
  120.     void gps_show();//顯示gps界面函數  
  121.     void gps_hide();//隱藏gps界面函數  
  122.     int flag_run;//run按鈕標誌位  
  123.     int flag_strength;//衛星強度標誌位  
  124.   
  125.     /******************************music界面******************************/  
  126.     QProcess *process_music;//音樂進程  
  127.     QProcess *process_record;//錄音進程,即預警信息  
  128.     QTimer *timer_timeline;//音樂時間滑動條計時器  
  129.     QTimer *timer_traffic;//預警計時器  
  130.     QTimer *timer_music;//音樂計時器  
  131.     QString string_player;//  
  132.     QString string_name;  
  133.     QString time_transfer(int string_time);  
  134.     QUdpSocket *udpsocket_receiver;  
  135.     QStringList stringlist_song;  
  136.     QStringList stringlist_event;  
  137.     QStringList stringlist_record;  
  138.     QSqlDatabase db;  
  139.     QSqlQuery *query;  
  140.     QFileInfoList fileinfolist;  
  141.     int flag_play;  
  142.     int flag_loop;  
  143.     int flag_name;  
  144.     int time;  
  145.     int int_current_time;  
  146.     char back_name[20];  
  147.     char back_time[10];  
  148.     void music_show();//顯示music界面函數  
  149.     void music_hide();//隱藏music界面函數  
  150.     void traffic_warning();//預警播放初始化函數  
  151. };  
  152.   
  153. #endif // USER_INTERFACE_H  


函數實現

[html] view plain copy
 print?
  1. #include "user_interface.h"  
  2. #include "ui_user_interface.h"  
  3. #define SIZE 1024  
  4. #define IP "127.0.0.1"  
  5. #define PORT1 10000  
  6. #define PORT2 20000  
  7. #define PORT3 30000  
  8. #define GPS "/dev/ttyUSB0"  
  9. #define GSM "/dev/ttyUSB1"  
  10.   
  11. int gps_fd;//gps設備文件描述符  
  12. int gsm_fd;//gsm模塊句柄  
  13. char a[100];//用於保存轉碼後的gps數據  
  14. int socket_fd;  
  15.   
  16. user_interface::user_interface(QWidget *parent) :  
  17.     QWidget(parent),  
  18.     ui(new Ui::user_interface)  
  19. {  
  20.     /******************************home界面******************************/  
  21.     ui->setupUi(this);  
  22.     home_show();//顯示出home界面  
  23.     time_show();//顯示實時時間  
  24.     flag_event = 0;//鼠標事件標誌位  
  25.   
  26.     propertyanimation_home = new QPropertyAnimation(ui->button_home, "geometry");  
  27.     propertyanimation_music = new QPropertyAnimation(ui->button_music, "geometry");  
  28.     propertyanimation_gps = new QPropertyAnimation(ui->button_gps, "geometry");  
  29.   
  30.     /******************************gps界面******************************/  
  31.     thread = new MyThread();//爲線程開闢空間並且初始化  
  32.   
  33.     udpsocket_receiver1 = new QUdpSocket(this);//爲udpsocket開闢空間並且初始化  
  34.     udpsocket_receiver1->bind(PORT1, QUdpSocket::ShareAddress);//綁定端口  
  35.     connect(udpsocket_receiver1, SIGNAL(readyRead()),this, SLOT(read_pending_datagrams_1()));  
  36.   
  37.     udpsocket_receiver2 = new QUdpSocket(this);//爲udpsocket開闢空間並且初始化  
  38.     udpsocket_receiver2->bind(PORT2, QUdpSocket::ShareAddress);//綁定端口  
  39.     connect(udpsocket_receiver2, SIGNAL(readyRead()),this, SLOT(read_pending_datagrams_2()));  
  40.   
  41.     ui->strength1->setValue(0);  
  42.     ui->strength1->setRange(0, 99);  
  43.     ui->strength2->setValue(0);  
  44.     ui->strength2->setRange(0, 99);  
  45.     ui->strength3->setValue(0);  
  46.     ui->strength3->setRange(0, 99);  
  47.     ui->strength4->setValue(0);  
  48.     ui->strength4->setRange(0, 99);  
  49.     ui->strength5->setValue(0);  
  50.     ui->strength5->setRange(0, 99);  
  51.     ui->strength6->setValue(0);  
  52.     ui->strength6->setRange(0, 99);  
  53.   
  54.     flag_run = 0;  
  55.     flag_strength = 0;  
  56.   
  57.     gps_open();//打開gps模塊設備節點  
  58.     gsm_open();//打開gsm模塊設備節點  
  59.     socket_open();  
  60.     gps_set_serial(gps_fd, 4800, 8, 'N', 1);//設置gps串口參數  
  61.     gsm_set_serial(gsm_fd, 9600, 8, 'N', 1);//設置gsm串口參數  
  62.     thread->flag_thread = 1;  
  63.     thread->start();  
  64.   
  65.     /******************************music界面******************************/  
  66.     udpsocket_receiver = new QUdpSocket(this);  
  67.     udpsocket_receiver->bind(PORT3, QUdpSocket::ShareAddress);  
  68.     connect(udpsocket_receiver, SIGNAL(readyRead()),this, SLOT(read_pending_datagrams()));  
  69.   
  70.     process_music = new QProcess(this);  
  71.     connect(process_music, SIGNAL(readyReadStandardOutput()), this, SLOT(catch_output()));  
  72.   
  73.     timer_timeline = new QTimer(this);  
  74.     connect(timer_timeline, SIGNAL(timeout()), this, SLOT(get_current_time()));  
  75.   
  76.     process_record = new QProcess(this);  
  77.   
  78.     timer_traffic = new QTimer(this);  
  79.     connect(timer_traffic, SIGNAL(timeout()), this, SLOT(timer_traffic_slot()));  
  80.   
  81.     timer_music = new QTimer(this);  
  82.     connect(timer_music, SIGNAL(timeout()), this, SLOT(timer_music_slot()));  
  83.   
  84.     flag_play = 0;  
  85.     flag_loop = 1;  
  86.     time = 0;  
  87.   
  88.     traffic_warning();  
  89. }  
  90.   
  91. user_interface::~user_interface()  
  92. {  
  93.     delete ui;  
  94. }  
  95.   
  96. void user_interface::on_button_home_clicked()  
  97. {  
  98.     music_hide();  
  99.     gps_hide();  
  100.     home_show();  
  101.   
  102.     flag_event = 0;  
  103. }  
  104.   
  105. void user_interface::on_button_music_clicked()  
  106. {  
  107.     home_hide();  
  108.     gps_hide();  
  109.     music_show();  
  110.   
  111.     flag_event = 0;  
  112. }  
  113.   
  114. void user_interface::on_button_gps_clicked()  
  115. {  
  116.     home_hide();  
  117.     music_hide();  
  118.     gps_show();  
  119.   
  120.     flag_event = 0;  
  121. }  
  122.   
  123. void user_interface::time_show()  
  124. {  
  125.     QTime time_current = QTime::currentTime();  
  126.     QString string_time = time_current.toString("hh:mm ");  
  127.     QPalette palette_time;  
  128.     palette_time.setColor(QPalette::WindowText,Qt::black);//配置顏色  
  129.     ui->time->setPalette(palette_time);//設置顏色  
  130.     ui->time->setFont(QFont( "Timers" , 30 ,  QFont::Bold) );//設置字體  
  131.     ui->time->setText (string_time);  
  132.   
  133.     QDate date_date = QDate::currentDate();  
  134.     QString string_date = date_date.toString("dddd");  
  135.     palette_time.setColor(QPalette::WindowText,Qt::black);//配置顏色  
  136.     ui->day->setPalette(palette_time);//設置顏色  
  137.     QFont font_date("Timers" , 15 ,  QFont::Light);//配置字體  
  138.     ui->day->setFont(font_date);//設置字體  
  139.     ui->day->setText(string_date);  
  140.     ui->date->setPalette(palette_time);  
  141.     ui->date->setFont(QFont( "Timers" , 15 ,  QFont::Light));//設置字體  
  142.     string_date = date_date.toString("MM/dd");  
  143.     ui->date->setText(string_date);  
  144. }  
  145.   
  146. void user_interface::home_show()  
  147. {  
  148.     ui->time->show();//顯示時間  
  149.     ui->time->setGeometry(QRect(30, 30, 121, 35));  
  150.   
  151.     ui->date->show();//顯示日期  
  152.     ui->date->setGeometry(QRect(30, 60, 61, 31));  
  153.   
  154.     ui->day->show();//顯示星期幾  
  155.     ui->day->setGeometry(QRect(85, 60, 100, 31));  
  156.   
  157.     ui->background->show();//顯示背景  
  158.     ui->background->setStyleSheet("border-image: url(./image/home_background.png);");  
  159.     ui->background->setGeometry(QRect(0, 0, 480, 272));  
  160.   
  161.     ui->sun->show();//顯示太陽  
  162.     ui->sun->setStyleSheet("border-image: url(./image/sun.png);");  
  163.     ui->sun->setGeometry(QRect(340, 5, 128, 128));  
  164.   
  165.     ui->temperature->show();//顯示溫度  
  166.     ui->temperature->setGeometry(QRect(385, 45, 50, 50));  
  167.     ui->temperature->setText("18");  
  168.     ui->temperature->setStyleSheet("color:white");  
  169.     QFont font_temperature;  
  170.     font_temperature.setPointSize(30);  
  171.     ui->temperature->setFont(font_temperature);  
  172. }  
  173.   
  174. void user_interface::home_hide()//隱藏home界面  
  175. {  
  176.     ui->time->hide();  
  177.     ui->date->hide();  
  178.     ui->day->hide();  
  179.     ui->sun->hide();  
  180.     ui->temperature->hide();  
  181.     ui->button_gps->hide();  
  182.     ui->button_home->hide();  
  183.     ui->button_music->hide();  
  184.     ui->background_mh->hide();  
  185. }  
  186.   
  187. void user_interface::mousePressEvent(QMouseEvent *)//鼠標點擊事件槽函數  
  188. {  
  189.     if( flag_event==0 ){  
  190.         ui->button_home->show();  
  191.         ui->button_home->setStyleSheet("QPushButton{border-image: url(./image/home.png);}"  
  192.                                        "QPushButton:hover{border-image: url(./image/home.png);}"  
  193.                                        "QPushButton:pressed{border-image: url(./image/home1.png);}");  
  194.         ui->button_home->setFocusPolicy(Qt::NoFocus);  
  195.         propertyanimation_home->setDuration(100);  
  196.         propertyanimation_home->setStartValue(QRect(176, -128, 128, 128));  
  197.         propertyanimation_home->setEndValue(QRect(176, 72, 128, 128));  
  198.         propertyanimation_home->start();  
  199.   
  200.         ui->button_music->show();  
  201.         ui->button_music->setStyleSheet("QPushButton{border-image: url(./image/music.png);}"  
  202.                                         "QPushButton:hover{border-image: url(./image/music.png);}"  
  203.                                         "QPushButton:pressed{border-image: url(./image/music1.png);}");  
  204.         ui->button_music->setFocusPolicy(Qt::NoFocus);  
  205.         propertyanimation_music->setDuration(100);  
  206.         propertyanimation_music->setStartValue(QRect(-128, 72, 128, 128));  
  207.         propertyanimation_music->setEndValue(QRect(18, 72, 128, 128));  
  208.         propertyanimation_music->start();  
  209.   
  210.         ui->button_gps->show();  
  211.         ui->button_gps->setStyleSheet("QPushButton{border-image: url(./image/gps.png);}"  
  212.                                       "QPushButton:hover{border-image: url(./image/gps.png);}"  
  213.                                       "QPushButton:pressed{border-image: url(./image/gps1.png);}");  
  214.         ui->button_gps->setFocusPolicy(Qt::NoFocus);  
  215.         propertyanimation_gps->setDuration(100);  
  216.         propertyanimation_gps->setStartValue(QRect(608, 72, 128, 128));  
  217.         propertyanimation_gps->setEndValue(QRect(334, 72, 128, 128));  
  218.         propertyanimation_gps->start();  
  219.   
  220.         ui->background_mh->show();  
  221.         ui->background_mh->setStyleSheet("border-image: url(./image/home_background_mh.png);");  
  222.         ui->background_mh->setGeometry(QRect(0, 0, 480, 272));  
  223.   
  224.         flag_event = 1;  
  225.     }else{  
  226.         ui->button_gps->hide();  
  227.         ui->button_home->hide();  
  228.         ui->button_music->hide();  
  229.         ui->background_mh->hide();  
  230.   
  231.         flag_event = 0;  
  232.     }  
  233. }  
  234.   
  235.   
  236. void user_interface::on_button_play_clicked()  
  237. {  
  238.     int i = 0;  
  239.     QDir dir("music");  
  240.     QFileInfo fileinfo;  
  241.     QString string_song;  
  242.   
  243.     if( flag_play==0 )  
  244.     {  
  245.         string_player = "mplayer";  
  246.   
  247.         stringlist_song << "-slave";  
  248.         stringlist_song << "-quiet";  
  249.         stringlist_song << "-srate";//設置採樣率  
  250.         stringlist_song << "48000";  
  251.         stringlist_song << "-ac";  
  252.         stringlist_song << "mad";  
  253.         stringlist_song << "*.mp3";  
  254.         dir.setNameFilters(stringlist_song);  
  255.         fileinfolist = dir.entryInfoList();  
  256.         while( i<fileinfolist.length() ){  
  257.             fileinfo = fileinfolist.at(i);  
  258.             string_song = fileinfo.filePath();  
  259.             stringlist_song << string_song;  
  260.             i++;  
  261.         }  
  262.   
  263.         process_music->setProcessChannelMode(QProcess::MergedChannels);//設置播放模式  
  264.         process_music->start(string_player, stringlist_song);  
  265.         process_music->write("get_time_length\n");//獲取當前歌曲的播放時長  
  266.         flag_play = 1;  
  267.   
  268.         ui->button_play->setStyleSheet("QPushButton{border-image: url(./image/pause.png);}"  
  269.                                        "QPushButton:hover{border-image: url(./image/pause.png);}"  
  270.                                        "QPushButton:pressed{border-image: url(./image/pause1.png);}");//設置按鈕背景,分別爲常態,鼠標經過態和按下態  
  271.         ui->button_play->setFocusPolicy(Qt::NoFocus);//使圖標按下時沒焦點  
  272.         ui->button_play->setGeometry(QRect(3, 111, 50, 50));  
  273.   
  274.         timer_timeline->start(1000);//進度條一秒後開始動  
  275.     }else if( flag_play==1 ){  
  276.         process_music->write("pause\n");  
  277.         flag_play = 2;  
  278.   
  279.         ui->button_play->setStyleSheet("QPushButton{border-image: url(./image/play.png);}"  
  280.                                        "QPushButton:hover{border-image: url(./image/play.png);}"  
  281.                                        "QPushButton:pressed{border-image: url(./image/play1.png);}");  
  282.         ui->button_play->setFocusPolicy(Qt::NoFocus);//使圖標按下時沒焦點  
  283.         ui->button_play->setGeometry(QRect(3, 111, 50, 50));  
  284.   
  285.         timer_timeline->stop();  
  286.     }else if( flag_play==2 ){  
  287.         process_music->write("pause\n");  
  288.         flag_play = 1;  
  289.   
  290.         ui->button_play->setStyleSheet("QPushButton{border-image: url(./image/pause.png);}"  
  291.                                        "QPushButton:hover{border-image: url(./image/pause.png);}"  
  292.                                        "QPushButton:pressed{border-image: url(./image/pause1.png);}");  
  293.         ui->button_play->setFocusPolicy(Qt::NoFocus);//使圖標按下時沒焦點  
  294.         ui->button_play->setGeometry(QRect(3, 111, 50, 50));  
  295.   
  296.         timer_timeline->start(1000);//進度條一秒後開始動  
  297.     }  
  298. }  
  299.   
  300. void user_interface::on_button_last_clicked()  
  301. {  
  302.     flag_loop--;  
  303.     if( flag_loop!=0 ){  
  304.         process_music->write("pausing pt_step -1\n");  
  305.         ui->label->setPixmap(QPixmap(QString("./image/song" + QString::number(flag_loop).toUtf8() + ".png")));//設置背景  
  306.     }else if( flag_loop==0 ){  
  307.         process_music->write(QString("pausing pt_step +" + QString::number(fileinfolist.length()-1)).toUtf8() + "\n");  
  308.         ui->label->setPixmap(QPixmap(QString("./image/song" + QString::number(flag_loop+6).toUtf8() + ".png")));//設置背景  
  309.         flag_loop = fileinfolist.length();  
  310.     }  
  311.   
  312.     process_music->write("get_time_length\n");//獲取當前歌曲的播放時長  
  313. }  
  314.   
  315. void user_interface::on_button_next_clicked()  
  316. {  
  317.     if( flag_loop<fileinfolist.length() ){  
  318.         process_music->write("pausing pt_step +1\n");  
  319.         ui->label->setPixmap(QPixmap(QString("./image/song" + QString::number(flag_loop + 1).toUtf8() + ".png")));//設置背景  
  320.     }else if( flag_loop==fileinfolist.length() ){  
  321.         process_music->write(QString("pausing pt_step -" + QString::number(fileinfolist.length()-1) + "\n").toUtf8());  
  322.         ui->label->setPixmap(QPixmap("./image/song1.png"));//設置背景  
  323.         flag_loop = 0;  
  324.     }  
  325.     flag_loop++;  
  326.   
  327.     process_music->write("get_time_length\n");//獲取當前歌曲的播放時長  
  328. }  
  329.   
  330. void user_interface::on_button_down_clicked()  
  331. {  
  332.     process_music->write("volume -1\n");  
  333. }  
  334.   
  335. void user_interface::on_button_up_clicked()  
  336. {  
  337.     process_music->write("volume +1\n");  
  338. }  
  339.   
  340. void user_interface::on_timeline_sliderMoved(int position)  
  341. {  
  342.     process_music->write(QString("seek " + QString::number(position) + " 2\n").toUtf8());  
  343. }  
  344.   
  345. void user_interface::catch_output()//進度條滾動函數  
  346. {  
  347.     while(process_music->canReadLine()){  
  348.         QByteArray bytearray_buffer(process_music->readLine());  
  349.   
  350.         if(bytearray_buffer.startsWith("Playing music/")){  
  351.             bytearray_buffer.remove(0,14);  
  352.             bytearray_buffer.replace(QByteArray("'"), QByteArray(""));  
  353.             bytearray_buffer.replace(QByteArray(" "), QByteArray(""));  
  354.             bytearray_buffer.replace(QByteArray("."), QByteArray(""));  
  355.             bytearray_buffer.replace(QByteArray("mp3"), QByteArray(""));//把mp3替換成空  
  356.             bytearray_buffer.replace(QByteArray("\n"), QByteArray(""));  
  357.             bytearray_buffer.replace(QByteArray("\r"), QByteArray(""));  
  358.             ui->song_info->setText(bytearray_buffer);  
  359.             bytearray_buffer.append(".mp3");  
  360.             string_name = QString::fromAscii(bytearray_buffer.data());  
  361.         }  
  362.   
  363.         if(bytearray_buffer.startsWith("ANS_VIDEO_RESOLUTION")){  
  364.             bytearray_buffer.remove(0, 21); // vire ANS_VIDEO_RESOLUTION=  
  365.             bytearray_buffer.replace(QByteArray("'"), QByteArray(""));  
  366.             bytearray_buffer.replace(QByteArray(" "), QByteArray(""));  
  367.             bytearray_buffer.replace(QByteArray("\n"), QByteArray(""));  
  368.             bytearray_buffer.replace(QByteArray("\r"), QByteArray(""));  
  369.         }  
  370.   
  371.         if(bytearray_buffer.startsWith("ANS_LENGTH")){  
  372.             bytearray_buffer.remove(0, 11); // vire ANS_LENGTH=  
  373.             bytearray_buffer.replace(QByteArray("'"), QByteArray(""));  
  374.             bytearray_buffer.replace(QByteArray(" "), QByteArray(""));  
  375.             bytearray_buffer.replace(QByteArray("\n"), QByteArray(""));  
  376.             bytearray_buffer.replace(QByteArray("\r"), QByteArray(""));  
  377.             float maxTime = bytearray_buffer.toFloat();  
  378.             int string_timeLength = (int)bytearray_buffer.toFloat();  
  379.             QString string_time = time_transfer(string_timeLength);  
  380.             ui->end->setText(string_time);  
  381.             ui-> timeline->setMaximum(static_cast<int>(maxTime+1));  
  382.         }else if(bytearray_buffer.startsWith("ANS_TIME_POSITION")){  
  383.             bytearray_buffer.remove(0, 18); // vire ANS_TIME_POSITION=  
  384.             bytearray_buffer.replace(QByteArray("'"), QByteArray(""));  
  385.             bytearray_buffer.replace(QByteArray(" "), QByteArray(""));  
  386.             bytearray_buffer.replace(QByteArray("\n"), QByteArray(""));  
  387.             bytearray_buffer.replace(QByteArray("\r"), QByteArray(""));  
  388.             float float_current_time = bytearray_buffer.toFloat();//進度條  
  389.             int_current_time = (int)bytearray_buffer.toFloat();//播放實時時間  
  390.             QString string_current_time = time_transfer(int_current_time);  
  391.             ui->start->setText(string_current_time);  
  392.             ui->timeline->setValue(static_cast<int>(float_current_time+1));  
  393.         }  
  394.     }  
  395. }  
  396.   
  397. void user_interface::get_current_time()//獲取當前播放時間  
  398. {  
  399.     process_music->write("get_time_pos \n");  
  400.     process_music->write("get_time_length\n");//獲取當前歌曲的播放時長  
  401. }  
  402.   
  403. QString user_interface::time_transfer(int string_time)  
  404. {  
  405.     int time1;  
  406.     int time2;  
  407.     QStringList stringlist_time;  
  408.   
  409.     time1 = (string_time / 60)% 60;  
  410.     if(time1<10){  
  411.         stringlist_time << "0";  
  412.         stringlist_time << QString::number((unsigned int)((string_time / 60)% 60));  
  413.     }else{  
  414.         stringlist_time << QString::number((unsigned int)((string_time / 60)% 60));  
  415.     }  
  416.   
  417.     stringlist_time <<":";  
  418.   
  419.   
  420.     time2 = string_time%60;  
  421.     if(time2 < 10){  
  422.         stringlist_time <<"0";  
  423.         stringlist_time << QString::number((unsigned int)(string_time%60));  
  424.     }else{  
  425.         stringlist_time << QString::number((unsigned int)(string_time%60));  
  426.     }  
  427.   
  428.     QString string_return = stringlist_time.join("");  
  429.   
  430.     return string_return;  
  431. }  
  432.   
  433. void user_interface::music_show()  
  434. {  
  435.     ui->background->show();  
  436.     ui->background->setStyleSheet("border-image: url(./image/music_background.png);");//設置背景  
  437.     ui->background->setGeometry(QRect(0, 0, 480, 272));  
  438.   
  439.     ui->button_play->show();  
  440.     if( flag_play==0 ){  
  441.         ui->button_play->setStyleSheet("QPushButton{border-image: url(./image/play.png);}"  
  442.                                    "QPushButton:hover{border-image: url(./image/play.png);}"  
  443.                                    "QPushButton:pressed{border-image: url(./image/play1.png);}");//設置按鈕背景,分別爲常態,鼠標掃過和按下三種狀態  
  444.     }else if( flag_play==1 ){  
  445.         ui->button_play->setStyleSheet("QPushButton{border-image: url(./image/pause.png);}"  
  446.                                    "QPushButton:hover{border-image: url(./image/pause.png);}"  
  447.                                    "QPushButton:pressed{border-image: url(./image/pause1.png);}");//設置按鈕背景,分別爲常態,鼠標掃過和按下三種狀態  
  448.     }  
  449.     ui->button_play->setFocusPolicy(Qt::NoFocus);  
  450.     ui->button_play->setGeometry(QRect(3, 111, 50, 50));  
  451.     ui->button_play->setFlat(true);  
  452.   
  453.     ui->button_up->show();  
  454.     ui->button_up->setStyleSheet("QPushButton{border-image: url(./image/up.png);}"  
  455.                                  "QPushButton:hover{border-image: url(./image/up.png);}"  
  456.                                  "QPushButton:pressed{border-image: url(./image/up1.png);}");  
  457.     ui->button_up->setFocusPolicy(Qt::NoFocus);  
  458.     ui->button_up->setGeometry(QRect(3, 1, 50, 50));  
  459.   
  460.     ui->button_down->show();  
  461.     ui->button_down->setStyleSheet("QPushButton{border-image: url(./image/down.png);}"  
  462.                                    "QPushButton:hover{border-image: url(./image/down.png);}"  
  463.                                    "QPushButton:pressed{border-image: url(./image/down1.png);}");  
  464.     ui->button_down->setFocusPolicy(Qt::NoFocus);//使圖標按下時沒焦點  
  465.     ui->button_down->setGeometry(QRect(3, 216, 50, 50));  
  466.   
  467.     ui->button_last->show();  
  468.     ui->button_last->setStyleSheet("QPushButton{border-image: url(./image/last.png);}"  
  469.                                    "QPushButton:hover{border-image: url(./image/last.png);}"  
  470.                                    "QPushButton:pressed{border-image: url(./image/last1.png);}");  
  471.     ui->button_last->setFocusPolicy(Qt::NoFocus);  
  472.     ui->button_last->setGeometry(QRect(3, 56, 50, 50));  
  473.   
  474.     ui->button_next->show();  
  475.     ui->button_next->setStyleSheet("QPushButton{border-image: url(./image/next.png);}"  
  476.                                    "QPushButton:hover{border-image: url(./image/next.png);}"  
  477.                                    "QPushButton:pressed{border-image: url(./image/next1.png);}");  
  478.     ui->button_next->setFocusPolicy(Qt::NoFocus);  
  479.     ui->button_next->setGeometry(QRect(3, 161, 50, 50));  
  480.   
  481.     ui->song_info->show();  
  482.     ui->song_info->setGeometry(QRect(230, -5, 100, 30));  
  483.     ui->song_info->setStyleSheet("color:white");//設置字體爲白色  
  484.     QFont font_song_info;  
  485.     font_song_info.setPointSize(13);  
  486.     ui->song_info->setFont(font_song_info);  
  487.   
  488.     ui->timeline->show();  
  489.     ui->timeline->setStyleSheet("background:");  
  490.     ui->timeline->setGeometry(QRect(105, 250, 330, 30));  
  491.   
  492.     ui->start->show();  
  493.     ui->start->setGeometry(QRect(73, 255, 40, 20));  
  494.     ui->start->setStyleSheet("color:white");  
  495.     QFont font_start;  
  496.     font_start.setPointSize(10);  
  497.     ui->start->setFont(font_start);  
  498.   
  499.     ui->end->show();  
  500.     ui->end->setGeometry(QRect(440, 255, 40, 20));  
  501.     ui->end->setStyleSheet("color:white");  
  502.     QFont font_end;  
  503.     font_end.setPointSize(10);  
  504.     ui->end->setFont(font_end);  
  505.   
  506.     ui->label->show();  
  507.     ui->label->setStyleSheet("border-image: url(./image/song1.png);");  
  508.     ui->label->setGeometry(QRect(130, 35, 280, 210));  
  509. }  
  510.   
  511. void user_interface::music_hide()  
  512. {  
  513.     ui->button_down->hide();  
  514.     ui->button_last->hide();  
  515.     ui->button_next->hide();  
  516.     ui->button_play->hide();  
  517.     ui->button_up->hide();  
  518.     ui->label->hide();  
  519.     ui->end->hide();  
  520.     ui->song_info->hide();  
  521.     ui->start->hide();  
  522.     ui->timeline->hide();  
  523.     ui->button_gps->hide();  
  524.     ui->button_music->hide();  
  525.     ui->button_home->hide();  
  526.     ui->background_mh->hide();  
  527.   
  528. }  
  529.   
  530. void user_interface::traffic_warning()  
  531. {  
  532.     stringlist_event << "traffic lights" << "traffic accidents" << "tunnel" << "dialing";  
  533.     stringlist_record << "record/record1.mp3" << "record/record2.mp3" << "record/record3.mp3" << "record/record4.mp3" << "record/record5.mp3" << "record/record6.mp3" << "record/record7.mp3" << "record/record8.mp3";  
  534.   
  535.     db = QSqlDatabase::addDatabase("QSQLITE"); //添加數據庫驅動  
  536.     db.setDatabaseName("traffic_warning.db"); //數據庫連接命名  
  537.     if( db.open()==0 ) //打開數據庫  
  538.     {  
  539.         perror("open db error\n");  
  540.     }  
  541.   
  542.     query = new QSqlQuery(db);  
  543. }  
  544.   
  545. void user_interface::read_pending_datagrams()  
  546. {  
  547.     int i = 0;  
  548.     int j = -1;  
  549.     int k = 0;  
  550.     int longitude;  
  551.     int latitude;  
  552.     QString string_type;  
  553.     QByteArray bytearray_receiver;  
  554.   
  555.     while(udpsocket_receiver->hasPendingDatagrams()){//擁有等待的數據報  
  556.         bytearray_receiver.resize(udpsocket_receiver->pendingDatagramSize());//讓bytearray_receiver的大小爲等待處理的數據報的大小,這樣才能接收到完整的數據  
  557.         udpsocket_receiver->readDatagram(bytearray_receiver.data(),bytearray_receiver.size());//接收數據報,將其存放到gps_receive中  
  558.         QString string_data(bytearray_receiver);//將數據報內容顯示出來  
  559.         if( time%90==0 ){  
  560.             if(string_data.contains(",",Qt::CaseSensitive)){//當收到符合條件的數據時執行以下語句  
  561.                 QStringList stringlist_data = string_data.split(",");//開始對數據進行加工處理 舉例如下原始數據:2305.8111,11339.9111 加工後的數據23058,113399  
  562.                 QString string_latitude = stringlist_data[1];  
  563.                 string_latitude.remove(4,1);  
  564.                 string_latitude.remove(5,3);  
  565.                 QString string_longitude = stringlist_data[0];  
  566.                 string_longitude.remove(5,1);  
  567.                 string_longitude.remove(6,3);  
  568.                 longitude = string_longitude.toInt();  
  569.                 latitude = string_latitude.toInt();  
  570.                 QString string_longitude1 = QString::number(longitude-1, 10);//調整經緯度範圍,滿足此範圍的數據就播放預警信息  
  571.                 QString string_longitude2 = QString::number(longitude+1, 10);  
  572.                 QString string_latitude1 = QString::number(latitude-1,10);  
  573.                 QString string_latitude2 = QString::number(latitude+1,10);  
  574.                 QString string_sqlite = "select * from location where";  
  575.                 string_sqlite.append("(" + string_longitude1 + "<=" + "longitude) and (longitude <=" + string_longitude2 + ") and (" + string_latitude1 + " <= latitude) and (latitude <=" + string_latitude2 +")");// (longitude-1 <= longtitude)&&(longtitude <= longitude+1)&&(latitude-1 <= latitude)&& (latitude <= latitude);  
  576.   
  577.                 //通過執行數據庫語句返回所需要的結果集  
  578.                 query->exec(string_sqlite);  
  579.                 while( query->next() ){       //當取到的數據與數據庫匹配,獲取數據庫的相應的事件類型,即表的第三項(event_type)的值  
  580.                     string_type = query->value(2).toString();  
  581.                 }  
  582.                 QStringList stringlist_record_play;  
  583.                 for(i=0; i<4; i++){  
  584.                     k = QString::compare(string_type, stringlist_event[i]);//將事件類型與原有的數組進行匹配,進而確定播放的預警信息  
  585.                     if( k==0 ){  
  586.                         j = i;  
  587.                         break;  
  588.                     }  
  589.                 }  
  590.   
  591.                 if( j>-1 && j<4 ){  
  592.                     string_player = "mplayer";//設置播放信息  
  593.                     stringlist_record_play << "-slave";  
  594.                     stringlist_record_play << "-quiet";  
  595.                     stringlist_record_play << "-ac";  
  596.                     stringlist_record_play << "mad";  
  597.                     stringlist_record_play << stringlist_record[j];  
  598.                     stringlist_record_play << stringlist_record[j+4];  
  599.   
  600.                     process_music->write("quit\n");  
  601.   
  602.                     process_record->write("volume +10\n");  
  603.                     process_record->setProcessChannelMode(QProcess::MergedChannels);//設置播放模式  
  604.                     process_record->start(string_player, stringlist_record_play);//進程開始工作,播放音樂  
  605.                     timer_traffic->start(1000);  
  606.   
  607.                     if( flag_play==1 ){  
  608.                         strcpy(back_name, string_name.toLatin1());  
  609.                         string_name.sprintf("music/%s", back_name);  
  610.                         for(i=0; i<stringlist_song.length(); i++){  
  611.                             QString string_tmp(stringlist_song[i]);  
  612.                             if( QString::compare(string_name, string_tmp)==0 ){  
  613.                                 flag_name = i;  
  614.                             }  
  615.                         }  
  616.                         timer_music->start(9000);  
  617.                     }  
  618.                 }  
  619.             }  
  620.         }  
  621.     }  
  622. }  
  623.   
  624. void user_interface::timer_traffic_slot()  
  625. {  
  626.     time++;  
  627.     if( time==90 ){  
  628.         time = 0;  
  629.         timer_traffic->stop();  
  630.     }  
  631. }  
  632.   
  633. void user_interface::timer_music_slot()  
  634. {  
  635.     int i = 0;  
  636.     char tmp[64];  
  637.     QDir dir("music");  
  638.     QStringList stringlist_song;  
  639.     QFileInfoList fileinfolist;  
  640.     QFileInfo fileinfo;  
  641.     QString string_song;  
  642.   
  643.     timer_music->stop();  
  644.   
  645.     string_player = "mplayer";  
  646.   
  647.     stringlist_song << "-slave";  
  648.     stringlist_song << "-quiet";  
  649.     stringlist_song << "-srate";//設置採樣率  
  650.     stringlist_song << "48000";  
  651.     stringlist_song << "-ac";  
  652.     stringlist_song << "mad";  
  653.     stringlist_song << "*.mp3";  
  654.     dir.setNameFilters(stringlist_song);  
  655.     fileinfolist = dir.entryInfoList();  
  656.     while( i<fileinfolist.length() ){  
  657.         fileinfo = fileinfolist.at(i);  
  658.         string_song = fileinfo.filePath();  
  659.         stringlist_song << string_song;  
  660.         i++;  
  661.     }  
  662.   
  663.     process_music->setProcessChannelMode(QProcess::MergedChannels);//設置播放模式  
  664.     process_music->start(string_player, stringlist_song);  
  665.   
  666.     if( (flag_name-7)!=0 ){  
  667.         sprintf(tmp, "pausing pt_step +%d\n", flag_name - 7);  
  668.         QByteArray bytearray_name(tmp);  
  669.         process_music->write(bytearray_name);  
  670.     }  
  671.   
  672.     if( int_current_time!=0 ){  
  673.         sprintf(tmp, "seek %d\n", int_current_time);  
  674.         QByteArray bytearray_time(tmp);  
  675.         process_music->write(bytearray_time);  
  676.     }  
  677. }  
  678.   
  679. void user_interface::on_button_run_clicked()  
  680. {  
  681.   
  682.     if( thread->flag_thread==0 ){  
  683.         gps_open();//打開gps模塊設備節點  
  684.   
  685.         gsm_open();//打開gsm模塊設備節點  
  686.   
  687.         socket_open();  
  688.   
  689.         gps_set_serial(gps_fd, 4800, 8, 'N', 1);//設置gps串口參數  
  690.   
  691.         gsm_set_serial(gsm_fd, 9600, 8, 'N', 1);//設置gsm串口參數  
  692.   
  693.         thread->flag_thread = 1;  
  694.         thread->start();  
  695.     }else{  
  696.         gps_close();//關閉gps模塊設備節點  
  697.   
  698.         gsm_close();//關閉gsm模塊設備節點  
  699.   
  700.         socket_close();  
  701.   
  702.         thread->flag_thread = 0;  
  703.         thread->wait();  
  704.     }  
  705. }  
  706.   
  707. void MyThread::run()  
  708. {  
  709.     char *p = NULL;//strtok函數返回指針,以"$"分割  
  710.     int i = -1;  
  711.     int j = -1;  
  712.     int k = 1;  
  713.     char *data[20];  
  714.     fd_set readfd;  
  715.     struct timeval timeout;  
  716.     char *buf;  
  717.     QHostAddress hostaddress = QHostAddress(IP);  
  718.   
  719.     udpsocket_sender = new QUdpSocket();  
  720.     udpsocket_sender_traffic = new QUdpSocket();  
  721.   
  722.     buf = (char*)malloc(SIZE);  
  723.   
  724.     FD_ZERO(&readfd);//初始化readfd  
  725.     FD_SET(gps_fd, &readfd);//把gps_fd加入readfd  
  726.     timeout.tv_sec = 3;//設置3秒超時  
  727.     timeout.tv_usec = 0;  
  728.   
  729.     while(flag_thread){  
  730.         j = select(gps_fd+1, &readfd, NULL, NULL, &timeout);//用select對gps_fd進行輪循  
  731.         if( j>0 ){  
  732.             if( FD_ISSET(gps_fd, &readfd) ){//如果gps_fd可讀  
  733.                 i = read(gps_fd, buf, SIZE);  
  734.                 buf[i] = '\0';  
  735.             }  
  736.         }  
  737.         sleep(1);  
  738.   
  739.         if( buf==NULL ){  
  740.             break;  
  741.         }  
  742.   
  743.         p = strtok(buf, "$,");//把buf中的數據以"$"爲分隔符分割  
  744.         while(flag_thread){  
  745.             if( p==NULL ){//strtok函數會在最後返回一次NULL指針,所以需要判斷然後跳出循環,否則會出現段錯誤  
  746.                 break;  
  747.             }  
  748.   
  749.             if( strcmp(p, "GPGSV")==0 ){  
  750.                 for(k=0; k<20; k++){  
  751.                     data[k] = NULL;  
  752.                 }  
  753.   
  754.                 for(k=1; k<16; k++){  
  755.                     p = strtok(NULL, "$,");  
  756.                     data[k] = p;  
  757.                 }  
  758.   
  759.                 if( data[4]==NULL || data[7]==NULL || data[8]==NULL || data[11]==NULL || data[12]==NULL || data[15]==NULL ){  
  760.                     break;  
  761.                 }  
  762.   
  763.                 QString string_1(data[4]);  
  764.                 QString string_2(data[8]);  
  765.                 QString string_3(data[12]);  
  766.                 if( string_1.toInt()<=32 && string_2.toInt()<=32 && string_3.toInt()<=32 ){  
  767.                     sprintf(data[4], "%s,%s,%s,%s,%s,%s", data[4], data[7], data[8], data[11], data[12], data[15]);  
  768.                     QString string_satellite_data(data[4]);  
  769.                     QByteArray bytearray_datagram = string_satellite_data.toAscii();  
  770.                     udpsocket_sender->writeDatagram(bytearray_datagram.data(), bytearray_datagram.size(), hostaddress, PORT2);  
  771.                 }  
  772.             }  
  773.   
  774.             if( p==NULL ){//strtok函數會在最後返回一次NULL指針,所以需要判斷然後跳出循環,否則會出現段錯誤  
  775.                 break;  
  776.             }  
  777.   
  778.             if( strcmp(p, "GPGGA")==0 ){//比較字符串,若p中的字符串爲GPGGA則執行以下代碼  
  779.                 for(k=0; k<20; k++){  
  780.                     data[k] = NULL;  
  781.                 }  
  782.   
  783.                 for(k=1; k<10; k++){  
  784.                     p = strtok(NULL, "$,");//執行第一次strtok時需要寫變量,之後調用strtok第一個變量填NULL  
  785.                     data[k] = p;//把k指針中的值保存在data數組中  
  786.                 }  
  787.   
  788.                 if( data[1]==NULL || data[2]==NULL || data[3]==NULL || data[4]==NULL || data[5]==NULL || data[7]==NULL ){  
  789.                     break;  
  790.                 }  
  791.   
  792.                 if( strcmp(data[3], "N")==0 || strcmp(data[3], "S")==0 ){//比較data[3]中的字符串是否爲N或S,若是則執行以下代碼  
  793.                     if( strcmp(data[5], "E")==0 || strcmp(data[5], "W")==0 ){//比較data[5]中的字符串是否爲E或W,若是則執行以下代碼,兩次if是爲了確保經緯度數據正常纔打印和發送  
  794.                         socket_send(data[1], data[2], data[3], data[4], data[5], data[7]);//把經緯度傳參給socket_send函數  
  795.                         sprintf(data[4], "%s,%s", data[4], data[2]);  
  796.   
  797.                         QString string_traffic(data[4]);  
  798.                         QByteArray bytearray_traffic = string_traffic.toAscii();  
  799.                         udpsocket_sender_traffic->writeDatagram(bytearray_traffic.data(), bytearray_traffic.size(), hostaddress, PORT3);  
  800.   
  801.                         data[4] = gsm_data_transfer(data[4]);//gsm數據轉碼  
  802.                         gsm_apn_set();//設置APN無線接入點  
  803.                         gsm_ppp_dialing();//進行ppp撥號,實現PDP激活和TCPIP的初始化  
  804.                         gsm_ip_open();//打開一條TCP或UDP連接  
  805.                         gsm_iomode();//設置數據模式  
  806.                         gsm_data_send(data[4]);//gsm數據發送  
  807.                         gsm_ip_close();//關閉udp連接  
  808.                     }  
  809.                 }  
  810.             }  
  811.             p = strtok(NULL, "$,");//再次以"$"分割buf中的數據,等於獲取下一行數據  
  812.             usleep(100000);  
  813.         }  
  814.         usleep(100000);  
  815.     }  
  816.     free(buf);  
  817.     delete(udpsocket_sender);  
  818.     delete(udpsocket_sender_traffic);  
  819. }  
  820.   
  821. void user_interface::read_pending_datagrams_1()//獲取經緯度函數  
  822. {  
  823.     QByteArray bytearray_receiver;  
  824.   
  825.     while(udpsocket_receiver1->hasPendingDatagrams()){  //擁有等待的數據報  
  826.         bytearray_receiver.resize(udpsocket_receiver1->pendingDatagramSize());               //讓 bytearray_receiver 的大小爲等待處理的數據報的大小,這樣才能接收到完整的數據  
  827.         udpsocket_receiver1->readDatagram(bytearray_receiver.data(),bytearray_receiver.size());   //接收數據報,將其存放到bytearray_receiver中  
  828.   
  829.         QString string_data1(bytearray_receiver);                                                    //將數據報內容顯示出來  
  830.         QStringList stringlist_data = string_data1.split(",");  
  831.         QString string_data2 = stringlist_data[0];  
  832.         string_data2.remove(2,8);  
  833.         stringlist_data[0].remove(0,2);  
  834.   
  835.         int hour = string_data2.toInt(0,10);  
  836.         hour = hour+8;  
  837.         if(hour > 24){  
  838.             hour = hour-24;  
  839.         }  
  840.   
  841.         QString string_time = QString::number(hour, 10);  
  842.         stringlist_data[0].insert(0,QString(string_time));  
  843.         stringlist_data[0].insert(2,QString(":"));  
  844.         stringlist_data[0].insert(5,QString(":"));  
  845.         stringlist_data[1].remove(4,1);  
  846.         stringlist_data[3].remove(5,1);  
  847.         stringlist_data[1].insert(2,QString("."));  
  848.         stringlist_data[3].insert(3,QString("."));  
  849.   
  850.         ui->latitude->setText(stringlist_data.at(1));  
  851.         ui->label_latitude->setText(stringlist_data.at(2));  
  852.         ui->longitude->setText(stringlist_data.at(3));  
  853.         ui->label_longitude->setText(stringlist_data.at(4));  
  854.         ui->satellite->setText(stringlist_data.at(5));  
  855.     }  
  856. }  
  857.   
  858. void user_interface::read_pending_datagrams_2()//獲取衛星號函數  
  859. {  
  860.     QByteArray bytearray_receiver;  
  861.   
  862.     while(udpsocket_receiver2->hasPendingDatagrams()){//擁有等待的數據報  
  863.         bytearray_receiver.resize(udpsocket_receiver2->pendingDatagramSize());  
  864.         udpsocket_receiver2->readDatagram(bytearray_receiver.data(), bytearray_receiver.size());  
  865.   
  866.         QString string_data(bytearray_receiver);  
  867.         if( string_data.contains("G", Qt::CaseInsensitive) ){  
  868.             continue;  
  869.         }  
  870.   
  871.         if( string_data.contains(",", Qt::CaseInsensitive) ){  
  872.             QStringList stringlist_data = string_data.split(",");  
  873.             QString string_1 = stringlist_data[0];  
  874.             QString string_2 = stringlist_data[1];  
  875.             int number1 = string_2.toInt();  
  876.             QString string_3 = stringlist_data[2];  
  877.             QString string_4 = stringlist_data[3];  
  878.             int number2 = string_4.toInt();  
  879.             QString string_5 = stringlist_data[4];  
  880.             QString string_6 = stringlist_data[5];  
  881.             int number3 = string_6.toInt();  
  882.   
  883.             if( flag_strength==0 ){  
  884.                 ui->dot1->setStyleSheet("border-image: url(./image/red_dot.png);");  
  885.                 ui->dot2->setStyleSheet("border-image: url(./image/red_dot.png);");  
  886.                 ui->dot3->setStyleSheet("border-image: url(./image/red_dot.png);");  
  887.                 ui->dot4->setStyleSheet("border-image: url(./image/red_dot.png);");  
  888.                 ui->dot5->setStyleSheet("border-image: url(./image/red_dot.png);");  
  889.                 ui->dot6->setStyleSheet("border-image: url(./image/red_dot.png);");  
  890.   
  891.                 ui->dot1->setStyleSheet("border-image: url(./image/green_dot.png);");  
  892.                 QFont font_strength1;  
  893.                 font_strength1.setPointSize(9);  
  894.                 ui->dot1->setFont(font_strength1);  
  895.                 ui->dot1->setAlignment(Qt::AlignCenter);//居中顯示  
  896.                 ui->dot1->setText(string_1);  
  897.                 ui->strength1->setValue(number1);//實時顯示衛星信號強度  
  898.   
  899.                 ui->dot3->setStyleSheet("border-image: url(./image/green_dot.png);");  
  900.                 QFont font_strength2;  
  901.                 font_strength2.setPointSize(9);  
  902.                 ui->dot3->setFont(font_strength2);  
  903.                 ui->dot3->setAlignment(Qt::AlignCenter);//居中顯示  
  904.                 ui->dot3->setText(string_3);  
  905.                 ui->strength3->setValue(number2);//實時顯示衛星信號強度  
  906.   
  907.                 ui->dot5->setStyleSheet("border-image: url(./image/green_dot.png);");  
  908.                 QFont font_strength3;  
  909.                 font_strength3.setPointSize(9);  
  910.                 ui->dot5->setFont(font_strength3);  
  911.                 ui->dot5->setAlignment(Qt::AlignCenter);//居中顯示  
  912.                 ui->dot5->setText(string_5);  
  913.                 ui->strength5->setValue(number3);//實時顯示衛星信號強度  
  914.   
  915.                 flag_strength = 1;  
  916.             }else if( flag_strength==1 ){  
  917.                 ui->dot1->setStyleSheet("border-image: url(./image/red_dot.png);");  
  918.                 ui->dot2->setStyleSheet("border-image: url(./image/red_dot.png);");  
  919.                 ui->dot3->setStyleSheet("border-image: url(./image/red_dot.png);");  
  920.                 ui->dot4->setStyleSheet("border-image: url(./image/red_dot.png);");  
  921.                 ui->dot5->setStyleSheet("border-image: url(./image/red_dot.png);");  
  922.                 ui->dot6->setStyleSheet("border-image: url(./image/red_dot.png);");  
  923.   
  924.                 ui->dot4->setStyleSheet("border-image: url(./image/green_dot.png);");  
  925.                 QFont font_strength1;  
  926.                 font_strength1.setPointSize(9);  
  927.                 ui->dot4->setFont(font_strength1);  
  928.                 ui->dot4->setAlignment(Qt::AlignCenter);//居中顯示  
  929.                 ui->dot4->setText(string_1);  
  930.                 ui->strength4->setValue(number1);//實時顯示衛星信號強度  
  931.   
  932.                 ui->dot2->setStyleSheet("border-image: url(./image/green_dot.png);");  
  933.                 QFont font_strength2;  
  934.                 font_strength2.setPointSize(9);  
  935.                 ui->dot2->setFont(font_strength2);  
  936.                 ui->dot2->setAlignment(Qt::AlignCenter);//居中顯示  
  937.                 ui->dot2->setText(string_3);  
  938.                 ui->strength2->setValue(number2);//實時顯示衛星信號強度  
  939.   
  940.                 ui->dot6->setStyleSheet("border-image: url(./image/green_dot.png);");  
  941.                 QFont font_strength3;  
  942.                 font_strength3.setPointSize(9);  
  943.                 ui->dot6->setFont(font_strength3);  
  944.                 ui->dot6->setAlignment(Qt::AlignCenter);//居中顯示  
  945.                 ui->dot6->setText(string_5);  
  946.                 ui->strength6->setValue(number3);//實時顯示衛星信號強度  
  947.   
  948.                 flag_strength = 2;  
  949.             }else if( flag_strength==2 ){  
  950.                 ui->dot1->setStyleSheet("border-image: url(./image/red_dot.png);");  
  951.                 ui->dot2->setStyleSheet("border-image: url(./image/red_dot.png);");  
  952.                 ui->dot3->setStyleSheet("border-image: url(./image/red_dot.png);");  
  953.                 ui->dot4->setStyleSheet("border-image: url(./image/red_dot.png);");  
  954.                 ui->dot5->setStyleSheet("border-image: url(./image/red_dot.png);");  
  955.                 ui->dot6->setStyleSheet("border-image: url(./image/red_dot.png);");  
  956.   
  957.                 ui->dot6->setStyleSheet("border-image: url(./image/green_dot.png);");  
  958.                 QFont font_strength1;  
  959.                 font_strength1.setPointSize(9);  
  960.                 ui->dot6->setFont(font_strength1);  
  961.                 ui->dot6->setAlignment(Qt::AlignCenter);//居中顯示  
  962.                 ui->dot6->setText(string_1);  
  963.                 ui->strength6->setValue(number1);//實時顯示衛星信號強度  
  964.   
  965.                 ui->dot3->setStyleSheet("border-image: url(./image/green_dot.png);");  
  966.                 QFont font_strength2;  
  967.                 font_strength2.setPointSize(9);  
  968.                 ui->dot3->setFont(font_strength2);  
  969.                 ui->dot3->setAlignment(Qt::AlignCenter);//居中顯示  
  970.                 ui->dot3->setText(string_3);  
  971.                 ui->strength3->setValue(number2);//實時顯示衛星信號強度  
  972.   
  973.                 ui->dot2->setStyleSheet("border-image: url(./image/green_dot.png);");  
  974.                 QFont font_strength3;  
  975.                 font_strength3.setPointSize(9);  
  976.                 ui->dot2->setFont(font_strength3);  
  977.                 ui->dot2->setAlignment(Qt::AlignCenter);//居中顯示  
  978.                 ui->dot2->setText(string_5);  
  979.                 ui->strength2->setValue(number3);//實時顯示衛星信號強度  
  980.   
  981.                 flag_strength = 0;  
  982.             }  
  983.         }  
  984.     }  
  985. }  
  986.   
  987. void user_interface::gps_show()  
  988. {  
  989.     ui->satellite->show();  
  990.     ui->satellite->setStyleSheet("color:white");  
  991.     ui->satellite->setGeometry(QRect(73, 225, 30, 10));  
  992.     QFont font_satellite;  
  993.     font_satellite.setPointSize(10);  
  994.     ui->satellite->setFont(font_satellite);  
  995.   
  996.     ui->label_satellite->show();  
  997.     ui->label_satellite->setStyleSheet("color:white");  
  998.     ui->label_satellite->setGeometry(QRect(3, 225, 70, 10));  
  999.     QFont font_label_satellite;  
  1000.     font_label_satellite.setPointSize(10);  
  1001.     ui->label_satellite->setFont(font_label_satellite);  
  1002.   
  1003.     ui->latitude->show();  
  1004.     ui->latitude->setStyleSheet("color:white");  
  1005.     ui->latitude->setGeometry(QRect(33, 240, 100, 10));  
  1006.     QFont font_latitude;  
  1007.     font_latitude.setPointSize(10);  
  1008.     ui->latitude->setFont(font_latitude);  
  1009.   
  1010.     ui->label_latitude->show();  
  1011.     ui->label_latitude->setStyleSheet("color:white");  
  1012.     ui->label_latitude->setGeometry(QRect(3, 235, 30, 20));  
  1013.     QFont font_label_latitude;  
  1014.     font_label_latitude.setPointSize(10);  
  1015.     ui->label_latitude->setFont(font_label_latitude);  
  1016.   
  1017.     ui->longitude->show();  
  1018.     ui->longitude->setStyleSheet("color:white");  
  1019.     ui->longitude->setGeometry(QRect(33, 255, 100, 10));  
  1020.     QFont font_longitude;  
  1021.     font_longitude.setPointSize(10);  
  1022.     ui->longitude->setFont(font_longitude);  
  1023.   
  1024.     ui->label_longitude->show();  
  1025.     ui->label_longitude->setStyleSheet("color:white");  
  1026.     ui->label_longitude->setGeometry(QRect(3, 250, 30, 20));  
  1027.     QFont font_label_longitude;  
  1028.     font_label_longitude.setPointSize(10);  
  1029.     ui->label_longitude->setFont(font_label_longitude);  
  1030.   
  1031.     ui->background->show();  
  1032.     ui->background->setStyleSheet("border-image: url(./image/gps_background.png);");//設置背景  
  1033.     ui->background->setGeometry(QRect(0, 0, 480, 272));  
  1034.   
  1035.     ui->earth->show();  
  1036.     ui->earth->setStyleSheet("border-image: url(./image/earth.png);");  
  1037.     ui->earth->setGeometry(QRect(25, -20, 250, 250));  
  1038.   
  1039.     ui->button_run->show();  
  1040.     ui->button_run->setStyleSheet("QPushButton{border-image: url(./image/run.png);}"  
  1041.                                   "QPushButton:hover{border-image: url(./image/run.png);}"  
  1042.                                   "QPushButton:pressed{border-image: url(./image/run1.png);}");  
  1043.     ui->button_run->setFocusPolicy(Qt::NoFocus);  
  1044.     ui->button_run->setGeometry(QRect(400, 222, 40, 40));  
  1045.   
  1046.     ui->dot1->show();  
  1047.     ui->dot1->setStyleSheet("border-image: url(./image/red_dot.png);");  
  1048.     ui->dot1->setFocusPolicy(Qt::NoFocus);  
  1049.     ui->dot1->setGeometry(QRect(90, 40, 26, 26));  
  1050.   
  1051.     ui->dot2->show();  
  1052.     ui->dot2->setStyleSheet("border-image: url(./image/red_dot.png);");  
  1053.     ui->dot2->setFocusPolicy(Qt::NoFocus);  
  1054.     ui->dot2->setGeometry(QRect(133, 80, 26, 26));  
  1055.   
  1056.     ui->dot3->show();  
  1057.     ui->dot3->setStyleSheet("border-image: url(./image/red_dot.png);");  
  1058.     ui->dot3->setFocusPolicy(Qt::NoFocus);  
  1059.     ui->dot3->setGeometry(QRect(178, 53, 26, 26));  
  1060.   
  1061.     ui->dot4->show();  
  1062.     ui->dot4->setStyleSheet("border-image: url(./image/red_dot.png);");  
  1063.     ui->dot4->setFocusPolicy(Qt::NoFocus);  
  1064.     ui->dot4->setGeometry(QRect(159, 159, 26, 26));  
  1065.   
  1066.     ui->dot5->show();  
  1067.     ui->dot5->setStyleSheet("border-image: url(./image/red_dot.png);");  
  1068.     ui->dot5->setFocusPolicy(Qt::NoFocus);  
  1069.     ui->dot5->setGeometry(QRect(80, 132, 26, 26));  
  1070.   
  1071.     ui->dot6->show();  
  1072.     ui->dot6->setStyleSheet("border-image: url(./image/red_dot.png);");  
  1073.     ui->dot6->setFocusPolicy(Qt::NoFocus);  
  1074.     ui->dot6->setGeometry(QRect(200, 108, 26, 26));  
  1075.   
  1076.     ui->strength1->show();  
  1077.     ui->strength1->setGeometry(QRect(310, 30, 10, 150));  
  1078.     ui->strength1->setOrientation(Qt::Vertical);  
  1079.     ui->strength1->setTextVisible(false);  
  1080.   
  1081.     ui->strength2->show();  
  1082.     ui->strength2->setGeometry(QRect(330, 30, 10, 150));  
  1083.     ui->strength2->setOrientation(Qt::Vertical);  
  1084.     ui->strength2->setTextVisible(false);  
  1085.   
  1086.     ui->strength3->show();  
  1087.     ui->strength3->setGeometry(QRect(350, 30, 10, 150));  
  1088.     ui->strength3->setOrientation(Qt::Vertical);  
  1089.     ui->strength3->setTextVisible(false);  
  1090.   
  1091.     ui->strength4->show();  
  1092.     ui->strength4->setGeometry(QRect(370, 30, 10, 150));  
  1093.     ui->strength4->setOrientation(Qt::Vertical);  
  1094.     ui->strength4->setTextVisible(false);  
  1095.   
  1096.     ui->strength5->show();  
  1097.     ui->strength5->setGeometry(QRect(390, 30, 10, 150));  
  1098.     ui->strength5->setOrientation(Qt::Vertical);  
  1099.     ui->strength5->setTextVisible(false);  
  1100.   
  1101.     ui->strength6->show();  
  1102.     ui->strength6->setGeometry(QRect(410, 30, 10, 150));  
  1103.     ui->strength6->setOrientation(Qt::Vertical);  
  1104.     ui->strength6->setTextVisible(false);  
  1105. }  
  1106.   
  1107. void user_interface::gps_hide()  
  1108. {  
  1109.     ui->button_run->hide();  
  1110.     ui->earth->hide();  
  1111.     ui->label_latitude->hide();  
  1112.     ui->label_longitude->hide();  
  1113.     ui->label_satellite->hide();  
  1114.     ui->latitude->hide();  
  1115.     ui->longitude->hide();  
  1116.     ui->satellite->hide();  
  1117.     ui->dot1->hide();  
  1118.     ui->dot2->hide();  
  1119.     ui->dot3->hide();  
  1120.     ui->dot4->hide();  
  1121.     ui->dot5->hide();  
  1122.     ui->dot6->hide();  
  1123.     ui->strength1->hide();  
  1124.     ui->strength2->hide();  
  1125.     ui->strength3->hide();  
  1126.     ui->strength4->hide();  
  1127.     ui->strength5->hide();  
  1128.     ui->strength6->hide();  
  1129.     ui->button_gps->hide();  
  1130.     ui->button_home->hide();  
  1131.     ui->button_music->hide();  
  1132.     ui->background_mh->hide();  
  1133. }  
  1134.   
  1135. void gps_open(void)//打開gps設備節點  
  1136. {  
  1137.     gps_fd = open (GPS, O_RDONLY);  
  1138.     if( gps_fd==-1 ){  
  1139.         perror("open gps error\n");  
  1140.     }else{  
  1141.         printf("open gps successfully\n");  
  1142.     }  
  1143. }  
  1144.   
  1145. void gps_close(void)//關閉gps設備節點  
  1146. {  
  1147.     int i = -1;  
  1148.   
  1149.     i = close(gps_fd);  
  1150.     if( i!=0 ){  
  1151.         perror("close gps fail\n");  
  1152.     }else if( i==0 ){  
  1153.         printf("close gps successfully\n");  
  1154.     }  
  1155. }  
  1156.   
  1157. void gps_set_serial(int fd, int speed, int bit, char event, int stop)//設置串口參數  
  1158. {  
  1159.     int i = -1;  
  1160.     int j = -1;  
  1161.     struct termios serial;//串口類  
  1162.     int speed_in;//輸入波特率  
  1163.     int speed_out;//輸出波特率  
  1164.     static int speed_array[] = {0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200,230400};//如果不加static會出現重定義錯誤  
  1165.   
  1166.     i = tcgetattr(fd, &serial);//用tcgetattr函數獲取串口終端參數  
  1167.     if( i!=0 ){  
  1168.         perror("get gps serial data error\n");  
  1169.     }else if( i==0 ){  
  1170.         printf("get gps serial data successfully\n");  
  1171.     }  
  1172.   
  1173.     memset(&serial, 0, sizeof(struct termios));  
  1174.     serial.c_cflag |= CLOCAL | CREAD;//設置數據接收器使能和本地模式  
  1175.     serial.c_cflag &= ~CSIZE;//通過位掩碼的方式激活  
  1176.   
  1177.     switch( bit )//設置字符大小  
  1178.     {  
  1179.         case 8 : serial.c_cflag |= CS8;  
  1180.                  break;  
  1181.         case 7 : serial.c_cflag |= CS7;  
  1182.                  break;  
  1183.     }  
  1184.   
  1185.     switch( speed )//設置波特率  
  1186.     {  
  1187.         case 2400 : cfsetispeed(&serial, B2400);  
  1188.                     cfsetospeed(&serial, B2400);  
  1189.                     break;  
  1190.         case 4800 : cfsetispeed(&serial, B4800);  
  1191.                     cfsetospeed(&serial, B4800);  
  1192.                     break;  
  1193.         case 9600 : cfsetispeed(&serial, B9600);  
  1194.                     cfsetospeed(&serial, B9600);  
  1195.                     break;  
  1196.         case 115200 : cfsetispeed(&serial, B115200);  
  1197.                       cfsetospeed(&serial, B115200);  
  1198.                       break;  
  1199.     }  
  1200.   
  1201.     switch( event )//設置奇偶校驗位  
  1202.     {  
  1203.         case 'O' : //奇數  
  1204.                    serial.c_cflag |= PARENB;  
  1205.                    serial.c_cflag |= PARODD;  
  1206.                    serial.c_iflag |= (INPCK | ISTRIP);  
  1207.                    break;  
  1208.         case 'E' : //偶數  
  1209.                    serial.c_iflag |= (INPCK | ISTRIP);  
  1210.                    serial.c_cflag |= PARENB;  
  1211.                    serial.c_cflag &= ~PARODD;  
  1212.                    break;  
  1213.         case 'N' : //無奇偶校驗位  
  1214.                    serial.c_cflag &= ~PARENB;  
  1215.                    break;  
  1216.     }  
  1217.   
  1218.     if( stop==1 ){//設置停止位  
  1219.         serial.c_cflag &= ~CSTOPB;  
  1220.     }else if( stop==2 ){  
  1221.         serial.c_cflag |= CSTOPB;  
  1222.     }  
  1223.   
  1224.     serial.c_cc[VTIME] = 0;//設置等待時間  
  1225.     serial.c_cc[VMIN] = 0;//設置最少接受字符  
  1226.     tcflush(fd,TCIFLUSH);//用tcflush函數重置緩存  
  1227.     j = tcsetattr(fd, TCSANOW, &serial);//用tcsetattr函數設置串口終端參數  
  1228.     if( j!=0 ){  
  1229.         perror("set gps serial data error\n");  
  1230.     }else if( j==0 ){  
  1231.         printf("set gps serial data successfully\n");  
  1232.         speed_in = cfgetispeed(&serial);//獲取輸入波特率  
  1233.         speed_out = cfgetospeed(&serial);//獲取輸出波特率  
  1234.         printf("speed_in=%d, speed_out=%d, gps_fd=%d\n\n", speed_array[speed_in], speed_array[speed_out], fd);  
  1235.     }  
  1236. }  
  1237.   
  1238. void socket_send(char *time,char *latitude,char *N_S ,char *longitude,char *E_W,char *satellite)  
  1239. //發送gps數據函數  
  1240. {  
  1241.     int numbytes;  
  1242.     struct sockaddr_in server;  
  1243.     const char *server_ip = IP;//主機ip地址 在socket_init處被引用  
  1244.     char buf[128];  
  1245.   
  1246.     server.sin_family = AF_INET;//協議簇,AF_INET表示TCP/IP協議  
  1247.     server.sin_port = htons(PORT1);//設置端口  
  1248.     server.sin_addr.s_addr = inet_addr(server_ip);//設置ip地址  
  1249.     bzero(&(server.sin_zero), 8);//把其餘部分設置爲0  
  1250.   
  1251.     sprintf(buf, "%s,%s,%s,%s,%s,%s", time, latitude, N_S, longitude, E_W, satellite);  
  1252.   
  1253.     numbytes = sendto(socket_fd, buf, 128, 0, (struct sockaddr *)&server, sizeof(server));//發送經度  
  1254.     if( numbytes==-1 ){  
  1255.         perror("send error\n");  
  1256.     }  
  1257. }  
  1258.   
  1259. void gsm_open(void)//打開gsm模塊設備節點  
  1260. {  
  1261.     gsm_fd = open(GSM, O_RDWR);  
  1262.     if( gsm_fd==-1 ){  
  1263.         perror("open gsm error\n");  
  1264.     }else{  
  1265.         printf("open gsm successfully\n");  
  1266.     }  
  1267. }  
  1268.   
  1269. void gsm_close(void)//關閉gsm模塊設備節點  
  1270. {  
  1271.     int i = -1;  
  1272.   
  1273.     i = close(gsm_fd);  
  1274.     if( i==-1 ){  
  1275.         perror("close gsm error\n");  
  1276.     }else if( i==0 ){  
  1277.         printf("close gsm successfully\n");  
  1278.     }  
  1279. }  
  1280.   
  1281. void gsm_set_serial(int fd, int speed, int bit, char event, int stop)//設置串口參數  
  1282. {  
  1283.     int i = 0;  
  1284.     int j = 0;  
  1285.     struct termios serial;//串口參數類  
  1286.     int speed_in;//輸入波特率  
  1287.     int speed_out;//輸出波特率  
  1288.     static int speed_array[] = {0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200,230400};//如果不加static會出現重定義錯誤  
  1289.   
  1290.     i = tcgetattr(fd, &serial);//用tcgetattr函數獲取串口終端參數  
  1291.     if( i!=0 ){  
  1292.         perror("get gsm serial data error\n");  
  1293.     }else if( i==0 ){  
  1294.         printf("get gsm serial data successfully\n");  
  1295.     }  
  1296.   
  1297.     memset(&serial, 0, sizeof(struct termios));  
  1298.     serial.c_cflag |= CLOCAL | CREAD;//數據接收器使能和打開本地模式  
  1299.     serial.c_cflag &= ~CSIZE;//通過位掩碼的方式激活  
  1300.   
  1301.     switch( speed )//設置波特率  
  1302.     {  
  1303.         case 0 : cfsetispeed(&serial, B0);  
  1304.                  cfsetospeed(&serial, B0);  
  1305.                  break;  
  1306.         case 50 : cfsetispeed(&serial, B50);  
  1307.                   cfsetospeed(&serial, B50);  
  1308.                   break;  
  1309.         case 75 : cfsetispeed(&serial, B75);  
  1310.                   cfsetospeed(&serial, B75);  
  1311.                   break;  
  1312.         case 110 : cfsetispeed(&serial, B110);  
  1313.                    cfsetospeed(&serial, B110);  
  1314.                    break;  
  1315.         case 134 : cfsetispeed(&serial, B134);  
  1316.                    cfsetospeed(&serial, B134);  
  1317.                    break;  
  1318.         case 150 : cfsetispeed(&serial, B150);  
  1319.                    cfsetospeed(&serial, B150);  
  1320.                    break;  
  1321.         case 200 : cfsetispeed(&serial, B200);  
  1322.                    cfsetospeed(&serial, B200);  
  1323.                    break;  
  1324.         case 300 : cfsetispeed(&serial, B300);  
  1325.                    cfsetospeed(&serial, B300);  
  1326.                    break;  
  1327.         case 600 : cfsetispeed(&serial, B600);  
  1328.                    cfsetospeed(&serial, B600);  
  1329.                    break;  
  1330.         case 1200 : cfsetispeed(&serial, B1200);  
  1331.                     cfsetospeed(&serial, B1200);  
  1332.                     break;  
  1333.         case 1800 : cfsetispeed(&serial, B1800);  
  1334.                     cfsetospeed(&serial, B1800);  
  1335.                     break;  
  1336.         case 2400 : cfsetispeed(&serial, B2400);  
  1337.                     cfsetospeed(&serial, B2400);  
  1338.                     break;  
  1339.         case 4800 : cfsetispeed(&serial, B4800);  
  1340.                     cfsetospeed(&serial, B4800);  
  1341.                     break;  
  1342.         case 9600 : cfsetispeed(&serial, B9600);  
  1343.                     cfsetospeed(&serial, B9600);  
  1344.                     break;  
  1345.         case 19200 : cfsetispeed(&serial, B19200);  
  1346.                      cfsetospeed(&serial, B19200);  
  1347.                      break;  
  1348.         case 38400 : cfsetispeed(&serial, B38400);  
  1349.                      cfsetospeed(&serial, B38400);  
  1350.                      break;  
  1351.         case 57600 : cfsetispeed(&serial, B57600);  
  1352.                      cfsetospeed(&serial, B57600);  
  1353.                      break;  
  1354.         case 115200 : cfsetispeed(&serial, B115200);  
  1355.                       cfsetospeed(&serial, B115200);  
  1356.                       break;  
  1357.         case 230400 : cfsetispeed(&serial, B230400);  
  1358.                       cfsetospeed(&serial, B230400);  
  1359.                       break;  
  1360.     }  
  1361.   
  1362.     switch( bit )//設置字符大小  
  1363.     {  
  1364.         case 8 : serial.c_cflag |= CS8;//8位  
  1365.                  break;  
  1366.         case 7 : serial.c_cflag |= CS7;//7位  
  1367.                  break;  
  1368.     }  
  1369.   
  1370.     switch( event )//設置奇偶校驗位  
  1371.     {  
  1372.         case 'O' : //奇數  
  1373.                    serial.c_cflag |= PARENB;  
  1374.                    serial.c_cflag |= PARODD;  
  1375.                    serial.c_iflag |= (INPCK | ISTRIP);  
  1376.                    break;  
  1377.         case 'E' : //偶數  
  1378.                    serial.c_iflag |= (INPCK | ISTRIP);  
  1379.                    serial.c_cflag |= PARENB;  
  1380.                    serial.c_cflag &= ~PARODD;  
  1381.                    break;  
  1382.         case 'N' : //無奇偶校驗位  
  1383.                    serial.c_cflag &= ~PARENB;  
  1384.                    break;  
  1385.     }  
  1386.   
  1387.     if( stop==1 ){//設置停止位  
  1388.         serial.c_cflag &= ~CSTOPB;//1位  
  1389.     }else if( stop==2 ){  
  1390.         serial.c_cflag |= CSTOPB;//兩位  
  1391.     }  
  1392.   
  1393.     serial.c_cc[VTIME] = 1;//設置等待時間,單位百毫秒,此處必須延時至少0.1秒,否則讀取不到數據  
  1394.     serial.c_cc[VMIN] = 128;//設置最少接受字符,單位字節,此處最少接受字節數必須大於接接收到的數據字節數  
  1395.     tcflush(fd,TCIFLUSH);//用tcflush函數重置緩存  
  1396.   
  1397.     j = tcsetattr(fd, TCSANOW, &serial);//用tcsetattr函數設置串口終端參數  
  1398.     if( j!=0 ){  
  1399.         perror("set gsm serial data error\n");  
  1400.     }else if( j==0 ){  
  1401.         printf("set gsm serial data successfully\n");  
  1402.         speed_in = cfgetispeed(&serial);//獲取輸入波特率  
  1403.         speed_out = cfgetospeed(&serial);//獲取輸出波特率  
  1404.         printf("speed_in=%d, apeed_out=%d, gsm_fd=%d\n\n", speed_array[speed_in], speed_array[speed_out], fd);  
  1405.     }  
  1406. }  
  1407.   
  1408. void gsm_read(void)//讀取gsm模塊信息  
  1409. {  
  1410.     int i = -1;  
  1411.     char r[128];  
  1412.     fd_set readfd;  
  1413.     struct timeval timeout;  
  1414.   
  1415.     memset(r, 0, 128);//初始化數組  
  1416.     FD_ZERO(&readfd);//初始化用於檢查可讀性的fd_set  
  1417.     FD_SET(gsm_fd, &readfd);//把gsm模塊fd加入監聽行列  
  1418.     timeout.tv_sec = 3;//設置3秒輪詢  
  1419.     timeout.tv_usec = 0;//  
  1420.   
  1421.     i = select(gsm_fd+1, &readfd, NULL, NULL, &timeout);//select函數對行列中的fd輪詢  
  1422.     if( i>0 ){  
  1423.         if( FD_ISSET(gsm_fd, &readfd) ){//當gsm模塊fd可讀  
  1424.             read(gsm_fd, r, 128);  
  1425.         }  
  1426.     }  
  1427.   
  1428.     printf("%s\n", r);  
  1429. }  
  1430.   
  1431. void gsm_calling(void)//打電話  
  1432. {  
  1433.     char w[128];  
  1434.     int i = -1;  
  1435.   
  1436.     strcpy(w , "atd15521219871;\r");  
  1437.     i = write(gsm_fd, w, strlen(w));  
  1438.     if( i==-1 ){  
  1439.         perror("write ATD error\n");  
  1440.     }  
  1441.   
  1442.     gsm_read();  
  1443.     sleep(1);  
  1444. }  
  1445.   
  1446. void gsm_cut(void)//掛斷電話  
  1447. {  
  1448.     char w[128];  
  1449.     int i = -1;  
  1450.   
  1451.     strcpy(w , "ATH\r");  
  1452.     i = write(gsm_fd, w, strlen(w));  
  1453.     if( i==-1 ){  
  1454.         perror("write ATH error\n");  
  1455.     }  
  1456.   
  1457.     gsm_read();  
  1458.     sleep(1);  
  1459. }  
  1460.   
  1461. void gsm_apn_set(void)//設置APN無線接入點  
  1462. {  
  1463.     char w[128];  
  1464.     int i = -1;  
  1465.   
  1466.     strcpy(w , "at+cgdcont=1,\"IP\",\"CMNET\"\r");  
  1467.     i = write(gsm_fd, w, strlen(w));  
  1468.     if( i==-1 ){  
  1469.         perror("write AT+CGDCONT error\n");  
  1470.     }  
  1471.   
  1472.     gsm_read();  
  1473.     sleep(1);  
  1474. }  
  1475.   
  1476. void gsm_ppp_dialing(void)//進行ppp撥號,實現PDP激活和TCPIP的初始化  
  1477. {  
  1478.     char w[128];  
  1479.     int i = -1;  
  1480.   
  1481.     strcpy(w , "at%etcpip=\"\",\"\"\r");  
  1482.     i = write(gsm_fd, w, strlen(w));  
  1483.     if( i==-1 ){  
  1484.         perror("write AT%ETCPIP error\n");  
  1485.     }  
  1486.   
  1487.     gsm_read();  
  1488.     sleep(1);  
  1489. }  
  1490.   
  1491. void gsm_ip_open(void)//打開一條TCP或UDP鏈接  
  1492. {  
  1493.     char w[128];  
  1494.     int i = -1;  
  1495.   
  1496.     strcpy(w , "at%ipopen=\"UDP\",\"58.215.187.148\",8000\r");  
  1497.     i = write(gsm_fd, w, strlen(w));  
  1498.     if( i==-1 ){  
  1499.         perror("write AT%IPOPEN error\n");  
  1500.     }  
  1501.   
  1502.     gsm_read();  
  1503.     sleep(1);  
  1504. }  
  1505.   
  1506. void gsm_data_send(char *p)//發送數據  
  1507. {  
  1508.     char w[128];  
  1509.     int i = -1;  
  1510.   
  1511.     sprintf(w, "at%%ipsend=\"%s\"\r", p);  
  1512.     i = write(gsm_fd, w, strlen(w));  
  1513.     if( i==-1 ){  
  1514.         perror("write AT%IPSEND error\n");  
  1515.     }  
  1516.   
  1517.     gsm_read();  
  1518.     sleep(1);  
  1519. }  
  1520.   
  1521. void gsm_ip_close(void)//關閉連接  
  1522. {  
  1523.     char w[128];  
  1524.     int i = -1;  
  1525.   
  1526.     strcpy(w , "at%ipclose=5\r");  
  1527.     i = write(gsm_fd, w, strlen(w));  
  1528.     if( i==-1 ){  
  1529.         perror("write AT%IPCLOSE error\n");  
  1530.     }  
  1531.   
  1532.     gsm_read();  
  1533.     sleep(1);//需要延時一下,關閉連接需要時間  
  1534. }  
  1535.   
  1536. void gsm_iomode(void)//設置數據模式  
  1537. {  
  1538.     char w[128];  
  1539.     int i = -1;  
  1540.   
  1541.     strcpy(w , "at%iomode=1,1,1\r");  
  1542.     i = write(gsm_fd, w, strlen(w));  
  1543.     if( i==-1 ){  
  1544.         perror("write AT%IOMODE error\n");  
  1545.     }  
  1546.   
  1547.     gsm_read();  
  1548.     sleep(1);  
  1549. }  
  1550.   
  1551. char *gsm_data_transfer(char *data)//轉換髮送數據爲數據ascii碼對應的十六進制數  
  1552. {  
  1553.     unsigned int i = 0;  
  1554.     char b[100];  
  1555.     char *p = data;  
  1556.   
  1557.     memset(a, 0, 100);  
  1558.     memset(b, 0, 100);  
  1559.   
  1560.     while( i<strlen(p) ){//對傳入的gps數據進行轉碼  
  1561.         switch( p[i] )  
  1562.         {  
  1563.             case ',' : strcpy(b, "2c");  
  1564.                        sprintf(a, "%s%s", a, b);  
  1565.                        break;  
  1566.             case '.' : strcpy(b, "2e");  
  1567.                        sprintf(a, "%s%s", a, b);  
  1568.                        break;  
  1569.             case '0' : strcpy(b, "30");  
  1570.                        sprintf(a, "%s%s", a, b);  
  1571.                        break;  
  1572.             case '1' : strcpy(b, "31");  
  1573.                        sprintf(a, "%s%s", a, b);  
  1574.                        break;  
  1575.             case '2' : strcpy(b, "32");  
  1576.                        sprintf(a, "%s%s", a, b);  
  1577.                        break;  
  1578.             case '3' : strcpy(b, "33");  
  1579.                        sprintf(a, "%s%s", a, b);  
  1580.                        break;  
  1581.             case '4' : strcpy(b, "34");  
  1582.                        sprintf(a, "%s%s", a, b);  
  1583.                        break;  
  1584.             case '5' : strcpy(b, "35");  
  1585.                        sprintf(a, "%s%s", a, b);  
  1586.                        break;  
  1587.             case '6' : strcpy(b, "36");  
  1588.                        sprintf(a, "%s%s", a, b);  
  1589.                        break;  
  1590.             case '7' : strcpy(b, "37");  
  1591.                        sprintf(a, "%s%s", a, b);  
  1592.                        break;  
  1593.             case '8' : strcpy(b, "38");  
  1594.                        sprintf(a, "%s%s", a, b);  
  1595.                        break;  
  1596.             case '9' : strcpy(b, "39");  
  1597.                        sprintf(a, "%s%s", a, b);  
  1598.                        break;  
  1599.         }  
  1600.         i++;  
  1601.     }  
  1602.   
  1603.     return a;  
  1604. }  
  1605.   
  1606. void socket_close(void)  
  1607. {  
  1608.     int i;  
  1609.   
  1610.     i = close(socket_fd);  
  1611.     if( i==-1 ){//關閉socket  
  1612.         perror("close socket error\n");  
  1613.     }else if( i==0 ){  
  1614.         printf("close socket successfully\n");  
  1615.     }  
  1616. }  
  1617.   
  1618. void socket_open(void)  
  1619. {  
  1620.     socket_fd = socket(AF_INET, SOCK_DGRAM, 0);  
  1621.     if( socket_fd==-1 ){//創建socket  
  1622.         perror("socket create error!\n");  
  1623.     }else{  
  1624.         printf("open socket successfully\n");  
  1625.     }  
  1626. }  

主函數

[html] view plain copy
 print?
  1. #include <QApplication>  
  2. #include <QWSServer>  
  3. #include "user_interface.h"  
  4.   
  5. int main(int argc, char *argv[])  
  6. {  
  7.     QApplication a(argc, argv);  
  8.     user_interface w;  
  9.     w.setWindowFlags(Qt::FramelessWindowHint);  
  10.     QWSServer::setCursorVisible(false);  
  11.     w.show();  
  12.       
  13.     return a.exec();  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章