本帖最后由 link8001 于 2018-8-18 14:01 编辑
韶华易逝,光阴苒冉。曲指一算,与二姨家相识已有十年。
十年之间,由青涩小伙到步入中年,由满脸稚气到略显沧桑,时间总能在脸上留下自己的印章
十年之间,由四处漂泊到定居一处,由心浮气噪到略显稳当,心灵总要经过岁月的洗礼才能成长
十年之间,由孑然一身到儿女双全,由辟重就轻到敢做敢当,当了父亲才明白自已的责任与担当
十年之前,我是二姨家的常客,每天必做的事是从论坛寻找自己喜欢的书下载,跟随T叔的脚步,我也渐渐有了自己的大书包,虽然当时真正能读懂的不多,但把硬盘里塞满电子图书总能让人乐此不疲。而我也由此步入了电子的大门。
八年之前,初入社会的我心比天高,总以为自己能凭一已之力走上人生的巅峰,但现实与梦想的巨大落差轻易就能撕碎一颗不怎么坚强的心,唯有电子游戏能让人短暂沉迷。
六年之前,如梦初醒,重新注册了二姨家帐号,一切重新开始。跟老欧学单片机,跟春阳学电源,成长路上当然也少不了T叔的大书包支持,发表论文,拿专利,只要能沉下心来,短短的时间就能造就一个勉强过得去的攻城狮。
三年之前,勉强过得去的攻城狮依旧勉强过得去,微薄的收入也依旧微薄,于是攻城狮变程序猿,与二姨家也短暂离别。
三年之间,由亲戚口中的在电子厂上班,变成了修电脑的,面子总算长了点
三年之间,由从不加班到加班到天明,孩子奶粉钱总算有了着落
三年之间,不常登录,甚是想念!
偶然看到【21ic第二届设计大赛】的消息,仅以此文此物,纪念与二姨家的这十年
一 项目方案的构想和实施计划
近期在做嵌入式linux方面的工作,使用Qt开发相关嵌入式软件;便简单写了个程序,实现天气实时显示,二姨家十大热门贴实时显示
二 硬件设计过程分享
手头有10.4寸触摸屏,LVDS接口;EM3352开发板,板载linux系统;RT3070无线wifi模块,USB接口;RGB转LVDS模块;5V升12V背光模块;几个模块组合,硬件平台基本不费力气
三 搭建平台
需要编译嵌入式linux版Qt4.8和RT3070模块驱动,网上教程大把,不细述;
四 程序设计
使用了Qt的network模块,包括QNetworkReply QNetworkRequest QNetworkAccessManager三个类来访问二姨家取回数据;
Qt4.8没有json类,移植了QJson模块来解析天气信息
代码共享在github;https://github.com/bloglink/app-ictest
五 调试过程
01 调试wifi由于没有USB转接头,用杜邦线直接焊在了背板上
初次登录需要使用串口(此处貌似有加分),linux下的串口工具为minicom,开一个终端,使用如下命令打开minicom
打开电源,一堆开机信息闪过后如下
输入下面的命令加载rt3070的驱动
insmod /lib/modules/rt3070sta.ko
成功后输入
此时输入ifconfig会发现网口设备中多了一个名为ra0的网卡;
输入
周围所有的wifi信号都会显示出来
为了便于使用,我们使用wpa工具和启动脚本来配置wifi,wpa的配置文件名为wpa_supplicant.conf,用vi命令打开,里面可以配置wifi名称和密码
配置完成后我们写一个启动脚本来实现开机自动连接wifi,脚本如下:
重启系统,加载脚本,wifi连接成功后,我们输入ifconfig查看wifi连接
至此wifi模块调试成功
注:若没有串口,也可使用telnet远程登录,登录命令为
输入帐号密码后即可操作,操作方法与串口操作一致
02 调试天气
使用Qt的network模块获取本地天气信息非常简单,获取只需3行代码wether = new QNetworkAccessManager(this);
connect(wether,SIGNAL(finished(QNetworkReply*)),this,SLOT(replayWether(QNetworkReply*)));
wether->get(QNetworkRequest(QUrl("http://wthrcdn.etouch.cn/weather_mini?citykey=101120201")));
从中国天气网获取天气数据,青岛的代码为101120201
然后在replayWether函数中解析返回的天气数据,天气数据为json类型,我们已提前移植了QJson模块,将返回值导入QJson类即可解析
void AppWindow::replayWether(QNetworkReply *reply)
{
if(reply->error() == QNetworkReply::NoError)
{
QByteArray bytes = reply->readAll();
QString result = QString::fromLocal8Bit(bytes);
QJsonObject info = QJsonDocument::fromJson(result.toUtf8()).object();
QJsonObject data = info.take("data").toObject();
QJsonValue forecast1 = data.take("forecast");
QJsonArray forecast2 = forecast1.toArray();
QJsonObject today = forecast2.at(0).toObject();
wethershow.at(3)->setText(today.value("fengli").toString().mid(9, 4));
wethershow.at(5)->setText(today.value("fengxiang").toString());
wethershow.at(7)->setText(data.value("wendu").toString());
wethershow.at(9)->setText(today.value("type").toString());
}
}
03 调试热门贴二姨家热门贴的获取方式与获取天气相同
icblog = new QNetworkAccessManager(this);
connect(icblog,SIGNAL(finished(QNetworkReply*)),this,SLOT(replayIcblog(QNetworkReply*)));
icblog->get(QNetworkRequest(QUrl("https://bbs.21ic.com")));
然后在replayIcblog函数中解析返回的帖子数据,返回的数据为xml类型,直接使用Qt的xml模块解析总是出错,估计是Qt4.8版本过低,没办法,直接字符串解析提取数据
void AppWindow::replayIcblog(QNetworkReply *reply)
{
if(reply->error() == QNetworkReply::NoError)
{
techo->clear();
QByteArray bytes = reply->readAll();
QString result = QString::fromLocal8Bit(bytes);
qDebug() << result;
QStringList tmp = result.split("\n");
int k = 0;
int g = 0;
for (int i=0; i < tmp.size(); i++) {
if (tmp.at(i).contains(tr("十大热门-技术贴"))) {
techo->insertHtml(tr("十大热门-技术贴") + "<br><br/>");
for (int t=0; t < 50; t++) {
if (QString(tmp.at(i+t)).contains("<a href=")) {
QString str = tmp.at(i+t);
QStringList tt = str.split("\"");
int x = tt.indexOf(" title=");
QString dat = "<a style='font-size:19px;color:cyan;' href=\"0\">";
dat += tr("%1 ").arg(k, 2, 10, QChar('0'));
dat += tt.at(x+1);
techo->insertHtml(dat + "<br><br/>");
k++;
if (k >= 10) {
techo->insertHtml("<br><br/>");
break;
}
}
}
}
if (tmp.at(i).contains(tr("十大热门-生活贴"))) {
techo->insertHtml(tr("十大热门-生活贴") + "<br><br/>");
for (int t=0; t < 50; t++) {
if (QString(tmp.at(i+t)).contains("<a href=")) {
QString str = tmp.at(i+t);
QStringList tt = str.split("\"");
int x = tt.indexOf(" title=");
QString dat = "<a style='font-size:19px;color:cyan;' href=\"0\">";
dat += tr("%1 ").arg(g, 2, 10, QChar('0'));
dat += tt.at(x+1);
techo->insertHtml(dat + "<br><br/>");
g++;
if (g>= 10)
break;
}
}
}
}
}
}
六 作品展示
总结:基本都是学嵌入式必会的知识点,没什么核心技术,当作练手还是极好的.
后续升级方案:
1 理论上可实现触摸屏查看和输入wifi连接信息,类似手机或笔记本的wifi连接方式,功能开发中
2 电池供电和低功耗模式,板块本身使用5V电源,一个充电宝即可搞定电池供电,低功耗可通过PWM控制屏幕亮度来实现
3 显示内容可配置,参数配置Qt有QSetting模块,很容易实现
4 语音播报,只有一个蜂鸣器,估计只能播放音乐,音频不熟,时间太紧,有时间就加上,没时间就算了
|
牛逼了
这个厉害了