//本程序是基于EZX平台的对时程序,使用简单网络对时协议(sntp)。
//part1:通过SNTP获取时间。
//part2:通过向/dev/mux4发送AT指令修改系统时间。否则直接使用settimeofday()函数会导致一重启手机
//时间回到调试以前。
//程序在A780上测试通过,程序有点乱。但是原理很简单相信大家能看懂。
//有问题欢迎联系我,mail:duff33@163.com qq:123961459
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <time.h>
#include <unistd.h>
#include <qtextcodec.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <qwsevent_qws.h>
#include <zapplication.h>
#include <zmainwidget.h>
#include <zmessagebox.h>
#include <ezxutilcst.h>
#include <ezxres.h>
#include <qlabel.h>
#include <qsocket.h>
#include <qpushbutton.h>
#include <qtextview.h>
#include <zdatasessionmanager.h>
#include <ZDateTimePicker.h>
#include <ezxtapi.h>
#include <QSocketNotifier.h>
#include <QSocketDevice.h>
static QTextCodec* gbk_codec = QTextCodec::codecForName("GBK");
static QString un_gbk(const char*ChnStr)
{
return gbk_codec->toUnicode(ChnStr);
}
static void getError(QSocketDevice * qsd)
{
char ErrorList[10][20]={"NoError", "AlreadyBound", "Inaccessible", "NoResources",
"Bug", "Impossible","NoFiles", "ConnectionRefused",
"NetworkFailure", "UnknownError"}
fprintf(stderr,"socket status:%s\n",ErrorList[qsd->error()]);
}
static void makeATTime(struct tm * time_s,char * timestr,int maxsize)
{
strftime(timestr,maxsize,"at+cclk=\"%y/%m/%d,%X+00\"",time_s);
}
unsigned long net_readLong(char *l)
{
unsigned long t_1,t_2,t_3,t_4;
t_1=*l<0?*l+256:*l;
t_2=*(l+1)<0?*(l+1)+256:*(l+1);
t_3=*(l+2)<0?*(l+2)+256:*(l+2);
t_4=*(l+3)<0?*(l+3)+256:*(l+3);
return t_4+(t_3<<8)+(t_2<<16)+(t_1<<24);
}
static void WriteDate(char* date)
{
fd_set writeble;
struct timeval tv;
tv.tv_sec=5;
tv.tv_usec=0;
FD_ZERO(&writeble);//描述集合(writeble)初始化为空。
int mux4;
mux4=open("/dev/mux4",O_RDWR|O_NONBLOCK|O_NOCTTY);
FD_SET(mux4,&writeble);//将mux4描述器添加进集合。
if(mux4==-1)
{
fprintf(stderr,"can't open /dev/mux4");
}
if(select(mux4+1,NULL,&writeble,NULL,&tv)>0)//判断mux4是否可写。。范围要是最大描述器加1
{
fprintf(stderr,"the file writeable\n");
write(mux4,date,strlen(date));
close(mux4);
}
}
class MyWidget:public ZMainWidget
{
Q_OBJECT
public:
ZDataSessionManager * z;
QLabel * q;
QPushButton * qpb;
QSocketDevice * qsd;
QSocketNotifier * sn;
MyWidget(QWidget * parent);
void DateOperation();
public slots:
void vistNet(int,ZLinkInfo&);
void receive();
void slotConnected();
};
MyWidget::MyWidget(QWidget * parent):ZMainWidget("Tile Bar", true, parent, NULL, 0)
{
showFullScreen();
q=new QLabel("t",this,NULL);
setContentWidget(q);
setCSTWidget(NULL);
qpb=new QPushButton(this,"ttt");
qpb->setText(un_gbk("退出"));
qpb->resize(120,40);
qpb->move(0,280);
connect(qpb,SIGNAL(clicked()),qApp,SLOT(quit()));
qpb->show();
q->show();
showMaximized();
z=new ZDataSessionManager(this);
z->init();
connect(z,SIGNAL(connected(int,ZLinkInfo&)),SLOT(vistNet(int,ZLinkInfo&)));
QString s;
getProfileNamebySelect(s);//注意接入点要选择CMNET,CMWAP无法使用SNTP协议。
z->openLink(s);
}
void MyWidget::vistNet(int linkid,ZLinkInfo&)
{
QHostAddress qh,ds;
int lkid=linkid;
qsd=new QSocketDevice(QSocketDevice::Datagram);
z->bindSocket2Link(lkid,qsd->socket());
ds.setAddress("221.7.129.79");
char * header=new char[48];
memset(header,0,48);
header[0]=0x1b;
sn=new QSocketNotifier (qsd->socket(),QSocketNotifier::Read, 0, 0 );
connect( sn, SIGNAL(activated(int)),SLOT(receive()));
fprintf(stderr,"%d", qsd->writeBlock(header,48,ds,123));
getError(qsd);
}
void MyWidget::slotConnected()
{
}
void MyWidget::receive()
{
int ByteCount,ReadCount;
char *IncommingChar;
fprintf(stderr,"Load a piece of Message! %d \n",sizeof(time_t));
ByteCount=qsd->bytesAvailable();
fprintf(stderr,"%d\n",ByteCount);
IncommingChar=new char[ByteCount];
ReadCount=qsd->readBlock(IncommingChar,ByteCount);
unsigned long time=net_readLong(&IncommingChar[40])-2208988800;
time_t * timestamp=(time_t *)(&time);
struct tm * time_s=gmtime(timestamp);
char* timestr=new char[128];
makeATTime(time_s,timestr,128);
WriteDate(timestr);
struct timeval tv;
tv.tv_sec=time;
tv.tv_usec=0;
settimeofday(&tv,NULL);
stime(timestamp);
q->setText(QString(timestr));
delete timestr;
}
void MyWidget::DateOperation()
{
}
int main(int argc, char** argv)
{
ZApplication app (argc, argv);
MyWidget *wp = new MyWidget(NULL);
app.setMainWidget(wp);
wp->show();
return app.exec();
}
#include"helloworld.moc"
ezx ( A780 / E680 )网络对时程序源码(使用 SNTP 协议AT指令实现)
3星 · 超过75%的资源 需积分: 10 88 浏览量
2010-11-30
15:25:53
上传
评论 1
收藏 2KB RAR 举报
dusluff
- 粉丝: 0
- 资源: 2
最新资源
- apk.tw_LineLite_v8a_v.2.17.1_sign.apk
- Elasticsearch实战:构建高效搜索系统的秘诀.zip
- HTML+CSS+JS网页设计:从入门到精通.zip
- 数据库课程设计:从理论到实践的全面指南.zip
- Python闭包:深入理解与应用场景解析.zip
- Win64OpenSSL-3-3-0.exe
- 课高分程设计-基于C++实现的民航飞行与地图简易管理系统-南京航空航天大学
- 航天器遥测数据故障检测系统python源码+文档说明+数据库(课程设计)
- 北京航空航天大学操作系统课设+ppt+实验报告
- 基于Vue+Echarts实现风力发电机中传感器的数据展示监控可视化系统+源代码+文档说明(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈