利用Python在码上淘在线转换淘宝链接

淘宝旗下的码上淘,说实话具体干啥我也不懂,总结起来还是为了线下推广。

朋友在做淘宝,有转码的需求。之前他一直是手动的一条链接,一条链接的做转换,工作量很大,很浪费时间。于是需要一个工具来解决这个问题,刚好我最近也是在熟悉Python语言,这个用Python的selenium库实现起来并不难。

更我上一个博客中用到的东西一样,同样是eclipse下搭建的Python开发环境,并没用用到pycharm。先直接上代码:

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
from selenium.webdriver.common.action_chains import ActionChains
import urllib
import requests
import zxing
#from win32com.client import Dispatch  thunder

chrome_driver='chromedriver.exe'
driver = webdriver.Chrome(executable_path= chrome_driver)
#driver.implicitly_wait(10)

wait=WebDriverWait(driver, 10)

driver.get(url="https://ma.taobao.com/")

def ocr_zxing(filename):
    zx = zxing.BarCodeReader()
    zxdata = zx.decode(filename)
    print(filename + ":" + zxdata.parsed)

def downloadfile(str):    
    "转换特定链接"
    driver.get(url="https://ma.taobao.com/web/create_by_url.htm")
    urlle = driver.find_element_by_id('inputUrl')
    urlle.clear()
    urlle.send_keys(str)

    try:
        submit= wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#form-url > div:nth-child(4) > div > button')))
        submit.click()
    except:                        
        print("cant find btnnext")
    
    sleep(3)
    lename = driver.find_element_by_id("inputName")
    lename.clear()
    lename.send_keys("测试题目")
    driver.find_element_by_xpath("/html/body/section/section/article/form/div/div/div[3]/div[2]/div/button").click()
    sleep(1)
#     driver.find_element_by_xpath("/html/body/section/section/article/div/div[1]/div[2]/div[2]/div[3]/div/div[1]/div[2]/a[1]").click()
#     input("下载后请输入  1 ")

    img_url = ''
    findsrc = True

    try:
        img_url = driver.find_element_by_css_selector("body > section > section > article > div > div.data-content.clearfix.step-three > div.success-view > div.sui-form.form-horizontal.pull-left.page-content > div.control-group.mt25 > div > div:nth-child(1) > span > img").get_attribute("src")                                
    except:   
        findsrc = False
        print("cant find btnnext")
        # 保存图片到指定路径  
    if img_url != None and findsrc :
            #保存图片数据  
        data = requests.get(img_url)
        fileurl = str.split('=')[1] + ".png"
        with open(fileurl, 'wb') as f:
            f.write(data.content)  
        ocr_zxing(fileurl)

        
urlstr = ''

while (input("请手动登录,登录完成后请输入  1 ") != '1'):
    sleep(2)
    urlstr = input("请输入要转换的链接,退出直接输入\'exit\'")
while (urlstr != 'exit') :
    urlstr = input("请输入要转换的链接,退出直接输入\'exit\'")
    downloadfile(urlstr)

功能其实也是很简单,就是借用chromedriver.exe调起chrome浏览器,打开
https://ma.taobao.com/ (码上淘的登录界面)。这里就有一个小插曲,因为淘宝做了相应的措施,防止类似的脚本登录,所以有“滑动登录”限制,开始我尝试自己写脚本去实现这个滑动效果,但是多次尝试均失败告终,于是乎放弃,还是有点自知之明的,阿里大神不是我这等门外汉能挑战的。

但是呢,但是我有取巧的办法。就是我不用自动登录,我用手动登录,注意这个手动登录不是简单的手动登录,因为默认情况下这个网站是在测试模式下手动也登陆不来的,不相信的可以测试一下。效果如下图

会直接报错,这个我解决不了。下面注意见证奇迹的时候到了:

这里我的小技巧就是我手动打开一个标签也,扫描登录淘宝,然后刷新码上淘的界面,就可以进入了。(这里是因为我的水平有限才来这一出,按理说保存cookie可以实现登录,我门外汉,不懂 也没有测试。大神可以指导一下)

进入之后在程序的运行界面输入1,开始正式进入转链。

这个时候就哟意思的事情来了,因为我这个只是给朋友做的小工具没有做到很完善,所有调试的时候还有很多细节问题需要解决。win10 下将二维码转换为链接的库运行出错,这个没解决。还有就是因为可以实现读取文件,保存文件的方式自动处理,而不是手动粘贴。

这里还有个小细节,就是在编译器调试的时候,默认是智能复制一条,要是复制多条也会只是识别一条,但是打包成exe后再命令行下可以直接复制多行这个就很方便,也就是够用了。效果类似这样

水平有限,有愿意指导的大神可以直接联系QQ:371359001

使用Python抓取评书网站的小说评书

听评书这种东西真的是上瘾!开始只是上下班路上听,后来在单位上班,也习惯带着耳机听,这样可以屏蔽掉外界的干扰,干活的效率相对要高一些。

最近更是上瘾了,听一个小说,用的是app在线听的,但是现在的app啥都想要开一个VIP,简直了。。。穷人呢总有自己的路子,于是我就想着自己电脑下载好,然后在传到手机里。这里就要说一下现在的评书网站,有的也是需要vip,有的就是乱七八糟的投各种垃圾广告,只能说体验极差。

回想两年前也是做过类似的是,当时就是用一个Excel文件,手动找到规律,然后依赖Excel的编辑填充功能去实现一些网址的整理,然后再统一建立迅雷批量任务下载。但是这个方法在现在已经行不通了。现在的网站的下载放盗链手段还是比较多的,需要网页的交互,链接也有时间限制,原来的方法显然已经行不通了。于是只有另辟蹊径了。

这里我就把眼光放到了Python上了,虽然我个人会的语言是cpp,但是太笨重了,做这种不太合适,虽然我确信可以实现,但是没必要。期间也咨询请教了好几个大牛,但是可能是我语文表达能力不行,大牛只表示了爱莫能助,所以我只能自己动手,丰衣足食了。首先我们先看看迅雷下载界面(这个后加的25是因为脚本运行过程中我在忙别的事,热点切入到了脚本调用的浏览器中,误操作导致漏了一回,后来手动给补上)

这些都很容易实现,我一个没用过Python的几个小时的百度成本加分析成本就写了一个小脚本模板,已经可以正常解析一个网站的链接了。

from selenium import webdriver
from time import sleep
from win32com.client import Dispatch

chrome_driver = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'
driver = webdriver.Chrome(executable_path= chrome_driver)
driver.implicitly_wait(5)
file1 = open('links.txt', 'a')

#替换这里
l = range(43521,43563)
serialName = "G:\\迅雷下载\\评书\\白鹿原"
####
for x in l:
driver.get(url="http://www.pingshu8.com/down_%s.html" %x)
titliename = driver.title
driver.find_element_by_id('clickina').click()
sleep(2)
allHandles = driver.window_handles;
driver.switch_to.window(allHandles[len(allHandles)-1])
print(allHandles)
print(titliename)
addstr = driver.current_url
thunder = Dispatch('ThunderAgent.Agent.1')
thunder.AddTask(addstr, titliename, serialName)
thunder.CommitTasks()
print(addstr)
file1.write(addstr)
file1.write('n')
m = range(1, len(allHandles) - 1)

for y in m:
print(allHandles[y])
driver.switch_to.window(allHandles[y])
sleep(2)
driver.close()
driver.switch_to.window(allHandles[0])
print("close")
file1.close

懂的人自然懂了,不懂的就交vip挺好。感兴趣的可以搭一个Python开发环境,把上面的一段复制上去看看运行的结果是什么样的,这里还有几个小技巧我没有明确点出来,但是都应该是能百度到真确的答案的。说实话,百度真的挺好的,不但能找到合适的答案,还练就了我一双火眼金睛。谷歌不行,一般第一条就是你想要的,其他的都索然无味,好无趣。

我是用eclipse开发的,以前没有用过。我是说eclipse和Python都没有用过。开发的界面如下:

运行起来以后是这样,注意会提示:“Chrome 正受到自动测试软件的控制”

自己动手之首饰的维修

我喜欢自己动手干一些维修活路,所以总能找个理由置办各种千奇百怪的工具。今天就用到了一个一般人是用不到的工具。先亮家伙:

这个东西叫喷火枪,是个很实用的东西。(我觉得就是一个防风打火机的大点的版本,工作时间也可以稍微长点)

再介绍一下我今天要修的东西(修好之前没有把握能修好,就忘了拍照片,自行脑补)

一条金链子!说到修这个,那总有个坏的原因,那锅还是家里的小朋友背,跟我没关系。

而且这还有一个小插曲,之前确实在外边修过两次,第一是个小伙子,给我拆了两环,结果要熔到扣的时候,没把握好,被喷灯的风给吹走了,小伙子弄了个大红脸,又是拿扫帚扫,又是抖落衣服,就差要给我赔钱了,我和媳妇看那个窘迫,赶紧说不用找了,不要了。结果修完了我们给钱人家死活不要。这是第一次,没几天又断了,还是手艺不行啊 。。。。第二次,是找个号称专业的大门店去修的,也好像没顶用,一段时间下来又开了,这个也就是我 的机会了。

好的,核心的工具喷枪是有了,镊子也自不用说,我这里多的是。唯一尴尬的是我这里没有东西能够承受高温,我没有耐火材料。就在我快要放弃的时候,突然考到了一个东西(这个图也是修好之后后补的)

注意看里面的小石头,这个就是个最合适的耐火材料啊

于是开火:

中间的操作就很简单了,只需要找好位置和角度,把握好时间,用镊子扶着点,一切都水到渠成了。

最终结果却是是修好了,但是就是有一个缺陷,有一个大疙瘩。。。。这个某该

其实,话说回来,这个并不是我第一次用这种方法维修了。在很早很早以前,大概我初中时候暑假捉蝎子,用的是这种矿灯。

结果有一次把灯放到三轮上的时候,给磕坏了,给外壳上搞了一个洞,当时觉得是很大的事,又没钱自己买新的灯,我就自己想了了一个自己现在都佩服自己的办法,我用用完油的圆珠笔芯当做吹筒,蜡烛当做火源,随便捡的什么塑料零件当补丁,用嘴噙着圆柱笔芯吹蜡烛,用火苗去烧补丁和灯坏的地方,结果竟然真的修好了。。。。可能我真的有当小炉匠的天赋吧…

就看看下次啥时候能用到喷枪了,话说,电动车的很多塑料件是是阻燃的,是不能用喷枪焊接的。不要问我怎么知道的

家里橱柜的维修

家里的橱柜就是普通的所谓精钢门,这种就是中间一个框是玻璃材质让后四周的铝合金配合塑料的角码组合起来的结构,应该说属于比较低端的成本很低。这样也就是说明了质量就不咋滴了。所有东西会坏的原因都是因为质量不好————沃兹基硕德。

小孩子比较皮自己吊在门上玩,结果角码坏了,小朋友掉下来还把脸划伤了,很难受。

但是东西坏了总是需要修啊,我问了装橱柜的人,告诉我说比较难修,这就有点搞笑了,总不能就这样吧,看来只能自己出手了,于是我就只能动用万能的淘宝了。其实这个东西开始我都不知道叫什么,而且这种东西属于很偏门的,卖家也很少费了好几分钟才找了一家有这种东西,卖家很专业我只用那个卡尺卡出一个尺寸,就可以给到我合适的东西。

东西回来就要开始装了,话说老板的保证很卡哇伊。

拆……

买的很多,因为分左右。各个角的都不一样,质量不好,坏是肯定的了,所以买多点备用。同时这个最好是配合免钉胶使用,我这里忘了拍了,但是我实际使用了的。

先把边条拆下来,然后拿下破了的角码,把新的角码换上,这个过程就比较简单不用多的图了。安装好如下

好了之后,重新装回去这个的维修就完成了。

没拍好,有点模糊。不要在乎那么多细节,知道我把东西修好了就行。就是有一个后遗症,我是直接用手摸的免钉胶,也是注定了手上————

扣了半天也不干净。洗是洗不下来的,只能慢慢扣咯。

 

Qt(C++)调用MATLAB的几种方法

2019.0405增加:
最近做一个项目,测试一个库的运行情况。这个是时候需要把库得到的数据用图像展示出来。但是目前的测试函数做的是命令行下的,所以各种绘图方式都不好加,于是乎又想到了MATLAB的eg调用方式,这个简直就是为了这种情景而生。
很不幸的是好长时间过去了,我都忘了到底怎么调用了,而当我百度的时候,这个文章出现在结果的第二条,我点开看了,突然才发现了好几个错别字,关键是我给的例子不够完善,不能够直接运行。这就很尴尬了。。。
其实我们这里需要的关注就是一下的几个地方
1.包含头文字
#include "engine.h"
这里需要注意的是,我们需要先增加这个文件所在的目录到项目的包含目录(C:\Program Files (x86)\MATLAB\R2015b\extern\include)
2.增加libmx.lib,libmx.lib同时,这里我们先增加这个库到项目的库目录(C:\Program Files (x86)\MATLAB\R2015b\extern\lib\win32\microsoft)
3.增加dll文件到path环境变量中,环境变量的增加就很多种方式了。可以直接增加到系统的环境变量,也可以在系统的运行环境中 增加这些。
这次的增加就这些吧
Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。正如Qt官网的说法:https://www1.qt.io/cn/   
软件开发变得更加智能

创建流畅的、高性能与直观的UI及嵌入式设备——不同平台只需一套代码。

 Qt的优势就是可以一套代码兼容多平台,这个也是我比较亲睐Qt的原因。

MATLAB

MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。

MATLAB语法特征与C++语言极为相似,而且更加简单,更加符合科技人员对数学表达式的书写格式。使之更利于非计算机专业的科技人员使用。而且这种语言可移植性好、可拓展性极强,这也使得MATLAB能够深入到科学研究及工程计算各个领域。

这个也决定了MATLAB也是比较容易在别的语言中集成,这里也就是举例一下几种常见的Qt与MATLAB的交互方式。

1.通过文本文件交互。

这个就是比较简单,各自独立的。只需要分别操作文本文件就行。

MATLAB写文件,和c的语法一样:

fid = fopen('test.txt','a');
test = 10;
fprintf(fid,'%d \t ',baocun);
fprintf(fid,'\r\n'); % 换行
fclose(fid);

Qt读取文件,语法很简单:

QString displayString;
QFile file("test.txt");
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
    qDebug()<<"Can't open the file!"<<endl;
}
while(!file.atEnd())
{
    QByteArray line = file.readLine();
    QString str(line);
    qDebug()<< str;
    displayString.append(str);
}

这样就可以实现MATLAB的数据,缺点是交互很慢。不能处理数据交互频繁的需求。只作为参考,强烈不推荐的方式。

2.调用MATLAB独立引擎的。

Engine *eg = engOpen(NULL);      //打开MATLAB引擎
 
    bool flag =engEvalString(eg, "cd  D:/Qt");                  //向MATLAB发送字符串命令
 
    //修改工作路径
 
mxArray *a = NULL;
 
double init = 2;
a = mxCreateDoubleMatrix(1, 1, mxREAL);
memcpy((void*) mxGetPr(a), (void*)&init, sizeof (double));
engPutVariable(pEng, "A", A);
 
init = 1;
memcpy((void*) mxGetPr(a), (void*)&init, sizeof (double));
engPutVariable(pEng, "b", a);
 
mxDestroyArray(A);
    engEvalString(ep, "s=add(a,b);");                      //求和
 
    engEvalString(ep, "save test.mat;");                    //保存所有变量
 
 
    mxArray *s = engGetVariable(ep, "s");                  //将MATLAB变量传回VS空间
 
    printf("s=%f", *mxGetPr(s));      //打印结果
 
    engClose(ep);                 //关闭精简版MATLAB

这种方法比较适合需要调用图形库的,可以很方便是嫌绘图的功能。但是同样的缺点就是速度比较慢。会有独立的窗口出现,用户体验不够完美。

3.转换MATLAB程序到c/c++语言。

这个方法操作起来很简单,如图:

直接按提示操作就行。这里的简单只是说操作简单,而实际的使用中发现,这个东西很不好用,很多函数或者借口不支持。这个也是不推荐的方法。

4.将MATLAB程序生成dll库

这个方法也是相对比较简单,是比较常用的方法。

具体请参考:https://blog.csdn.net/hongandyi/article/details/79433623

我比较推荐这种用法,数据交互比较快,不会影响程序的整理运行效果。比较需要注意的就是一定要首先调用xxxxInitialize()(xxxx是你的函数库名),因为别的错误编译的时候会报错,很容易就能找到问题,而如果不运行xxxxInitialize()则会在运行的时候报错,新手可能就手足无措,找不到问题了。

 

好了,上边就是据我所知的四种调用MATLAB的方法,文章比较粗糙,当然专注技术这不能成为理由。还是水平有限,需要的人将就着看吧。当然如果有别的方法也欢迎交流。QQ:371359001

文章欢迎转载。

win7系统安装Oracle 11gR2

因为想学习一下Oracle数据库,这里记录一下安装的过程。因为服务器带宽有限,文章中就不过多的插入图片了。

去官网或者论坛下载软件安装包,正常情况下安装包下载下来后会是两个文件,分别命名win32_11gR2_database_1of2、win32_11gR2_database_2of2,需要将这两个文件放到一个目录下,随便解压一个都会自动合并成为名为database的一个文件夹。

进入文件夹找到setup.exe文件,双击运行到如下界面:

安全问题的通知什么的,邮件我不填,接收安全更新我也不要,所以对号去掉后,直接下一步提示未指定电子邮件地址选“是”,下一步到选择安装选项。

这里选择第一个“创建和配置数据库”,继续下一步到系统类。

我这里比较特殊,是个小应用所以我选桌面类,当然服务器的话就得选服务器类了,选择好以后继续下一步到典型安装。 这里就分叉了,桌面和服务器的选项步骤都是不一样的。

毫无疑问又是一个下一步,路径什么的愿意改就改改。我不愿意改,口令也用最简单的admin,然后就直接下一步到先决条件检查了。

检查完成会出一个响应文件,这个文件可以找个地方保存一下,玩意用到了,你说是不。

那么就下一步等待安装完成吧,具体怎么用那就是另外的事了。

LEDE上搭建svn服务器(二)

我这里用的是斐讯K3,本来k3也是支持usb的接入的,但是我又有一台老母鸡(玩客云),感觉移动硬盘挂载到老母鸡上更方便,最最重要的是我看中的老母鸡的脱机下载功能,简直强到没有朋友.
那么问题来了,k3上一些功能就用不了了,比如我打算搭一个svn的代码库,这样就没有足够的磁盘空间来实现。
这个时候就需要有一个折中的实现了,简单的说就是用老母鸡做samba服务器,用k3刷一个lede去挂载,再安装相应的svn的服务器来实现。这里说起来原理很简单,但是实现起来还费了一些事。
首先需要开启老母鸡的Samba服务,这个就需要下载相应的app了,这个是傻瓜式的,在app里找找就能找到。设置完成后顺手在电脑上试着访问一下,这个就比较简单了,直接\\192.168.1.x\。应该可以看到玩客云内的文件,这里我也就顺手映射一个网络驱动器。用起来跟本地磁盘一样一样的 。
其次在k3种安装cifs的支持:
opkg update opkg install kmod-fs-cifs #opkg install kmod-nls-utf8 kmod-nls-base kmod-crypto-hmac kmod-crypto-md5 kmod-crypto-misc cifsmount
这里需要注意的是,这个模块安装完成以后,重启路由器才能生效。
重启后简单使用的示例:
mount -t cifs //cifs-server/share /localfolder -o user=username,password=password
匿名访问:
mount -t cifs //cifs-server/share /localfolder -o guest
然后到挂载的目标路径查看一下有没有看到对应的文件夹文件夹,这里注意,这里的mount重启后会没了,可以ssh登录到系统,编辑/etc/fstab文件
//shwde7xxx.ccr.corp.xxxxx.com/SE_DailyBuild   /home/12/345 cifs auto, username=gli16,password=xxxxx 0 0
然后
mount -a
立即挂载,以后路由器重启以后也可以自动挂载了
随后安装svn到lede上:

SecureCrt连接到路由器

2.  安装subversion-server

opkg update    

    opkg install subversion-server

这里需要在lede的web界面安装,否则会出现依赖错误,原因我没有做深究。

3.  创建第一个repository

mkdir -p /mnt/myrepo/test/

svnadmin create /mnt/myrepo/test/

4.  修改配置文件

vi /mnt/myrepo/test/conf/svnserve.conf

内容改成如下:

[general]

anon-access = none

auth-access = write

realm = My First Repository

password-db = ../../passwd

authz-db= ../../authz

5.  /mnt/myrepo/test/conf/目录下的passwd,authz两个文件移动到/mnt/myrepo/,这样,除了test这个项目外,以后再创建的项目只需要把它自己的svnserve.conf修改成test相同的内容,就可以共享这两个文件进行用户管理。

mv /mnt/myrepo/test/conf/passwd /mnt/myrepo/

mv /mnt/myrepo/test/conf/authz /mnt/myrepo/

6.  修改authz文件

vi /mnt/myrepo/authz

[/]

#harry = rw

#&joe = r

#*= r

test= rw

6.  修改passwd文件

vi /mnt/myrepo/passwd

[users]

#harry = harryssecret

#sally = sallyssecret

test= 123456

7.  使svn支持提交日志的修改。(如果不需要修改提交日志,这一步可以跳过)

cp /mnt/myrepo/test/hooks/pre-revprop-change.tmpl /mnt/myrepo/test/hooks/pre-revprop-change

chmod a+x /mnt/myrepo/test/hooks/pre-revprop-change

8.  启动svn服务

/etc/init.d/subversion start

9.  测试svn服务

随便找台能上网的电脑,装上TortoiseSVN,我这里有个下载地址:http://pan.baidu.com/share/link?shareid=350727&uk=908253079

安装完成之后。打开到D盘,在电脑空白右键,在弹出菜单中点击SVN CheckOut,弹出如下界面:

输入URL of repository,其中test.xicp.net是上一章节自己注册的动态域名。点击OK。

输入刚刚/mnt/myrepo/passwd文件中填写的账号密码:test, 123456。显示CheckOut Finished,再看看d:/test文件夹,显示了绿色的钩,说明svn服务可以使用了。

 

参考链接:

在路由器LEDE系统上安装svn-server版本库(一)

ps:文中提到的k3不是,是斐讯k3刷过lede的固件以后使用。

 

家里有一个斐讯的k3路由器做主路由器,想着能用就这么一直用了。但是目前有时会有公司做不完的工作,需要家里加班,但是拷代码太费劲,版本也不好控制,所以就折腾在路由器上面搭一个。

这个需要考虑的是,我这个路由器上并没有挂载硬盘,因为这个路由器的供电能力实在是太弱了,根本供不起移动硬盘,上次用的固态移动硬盘才是凑合能用,那个硬盘这次还是给别的地方用过了,所以手头暂时没有可以用的硬盘,这里就拿U盘挂载起来当主磁盘用了,虽然寿命是个问题,但是短时间用用应该没啥问题。

首先要说就是我也不是一个大神,就是一个小菜鸟,当然遇到问题首先就是百度解决(也不会搭梯子,墙出不去,问不到古哥。)因为LEDE本身是带有软件包的安装功能,所以我就先去搜索了。搜索svn相关字眼并没有结果,很烦!!搜索git倒是有,但是我的项目是建立在svn上,只能作罢。于是百度关键字“lede svn-server”,也没有合适的结果,后来想到lede是openwrt的衍生版,而openwrt时间长了,应该有大神移植的软件,然后换关键字“openwrt svn-server”,果然不出所望有合适的结果。搜到链接:Openwrt 路由器上 安装 svn server 大神的文章简直就是指路明灯,于是我连命令都不用改的就安装了svn server。

1.opkg update

2.opkg install subversion-server

3.cat /proc/mounts明确挂载点/tmp/mnt/sda4

然后cd到目标挂载点,再就是按流程走了,这里不抄了。。会用就行

arm-linux嵌入式设备上中文输入法的实现

这里要说的是,这里的实现并不是我自己写的,我只是借用了别人的,实际就是syszuxpinyin具体情况,可以自行百度。

这里我先分享下源码链接: https://pan.baidu.com/s/1jHZ13D0 密码: igjw。

这里简单说一下调用方法,我这里没有用dll的方式,而是直接用源码的方式编译到工程中。首先将源码包含到程序中,在需要调用的类中包含input.h文件。同时需要实现一个槽函数

void confirmString(QString gemfield);

具体来说,就是在在.h中定义

void confirmString(QString gemfield);

InputMethod *inputmethod;

在cpp中调用

构造inputmethod = new InputMethod(this);

析构delete inputmethod;

输入inputmethod->open();

获取输入confirmString(QString gemfield)
其中gemfield就是输入的内容

也可以调用inputmethod->setcurrentString(curstr);来获取当前的内容。

这里因为对网络的日志编辑器也不会用,反正就是说明白就行。也可以直接QQ371359001联系交流指导我一下。这里还有个没实现的,我突然想起来应该是可以写成单例模式,这里并没有实现,有空可以改改。还有就是我对源码做了一点更改,原本的是基于4.x做的,我给改了一点改成了5.x的了。反正很简单的改改,也没啥技术含量,所以具体的改哪里我都玩个。

基于致远电子EPC-9600I-L工控主板的qt5.6移植

20180228做了这个项目之后,几个月来没有做过类似技术的,都忘干净了,于是回来有看。这里感慨下,写了博客真好。

并且对文中有解释的不够明确的用黑体字做了补充解释。

 

公司的产品需求,做便携式仪器,最开始使用的wince系统的板子,后来又使用微型的winxp或者win7的桌面操作系统的板子,wince虽然稳定,但是上游厂商已经不做支持。原因有三点:

1、微软原厂的策略,已不在WinCE系统上投入人力;
2、基于微软的策略,IC原厂也不再提供对WinCE BSP的维护,新处理器已经不再提供WinCE BSP;
3、当前各种外围模块厂家不提供对WinCE的驱动支持(比如摄像头、3G/WiFi/4G模块等众多重要外设)。

(参考链接周立功

而winxp  和win7等桌面操作系统的板子,因为系统的原因,在用户强制断电的情况下,经常性的系统奔溃。这里我们不得不投向顺应市场Linux系统产品。这里我们选择了周立功的9600i-l工控主板。

EPC-9600I-L 是广州致远电子有限公司开发的基于 AM3352 处理器的工控主板。 板载 6RS232 串口(两路可通过软件切换,与 RS485 复用),两路 RS485 串口, 4 USB Host 2.0接口, 1 USB OTG1 10/100M 以太网接口、 2 CAN 接口、 1 TF 卡接口, 4 ADC1 路音频输入输出, 还有 16 TFT 液晶接口和 4 线电阻式触摸屏接口。

这个工控主板完全可以满足我们的需求,而这里的编程 就是用的Qt,而以前的程序也是基于Qt开发,移植的工作量也是不会太大。

这样就开始了,配到的屏是LCD_TM070RDH12_24B,一个7寸800×480的。板子拿到手以后,用配的fpc排线连接屏和板子,上电后会发现屏并不能正常亮。这里就是因为开发板烧写的内核是一个480×272的4.3寸屏的内核,所以我们需要烧写一个对于的800×480的7寸屏的内核。这里具体烧写办法,在zlg的资料里面都有,按说明操作就行了。

下来就是调试了,这里就需要连接串口。这个工控板的接口不像一般的开发板一样是ttl电平,这个只能是rs232电平的。链接方法如图

后边就是移植开发板的qt库,因为板子文件系统自带的qt环境是qt4.7.3,而我们的程序是用5.6开发的,这里就需要移植新的qt库,好在zlg对qt5.6做了移植,这里我也拿到了对应的qt库。具体的操作方法如下:

        先使用百度云盘下载做好的qt5,链接: http://pan.baidu.com/s/1bpnNiP5 密码: 6d5t。
        1,首先关闭板内QT环境初始化脚本。
            注释掉/etc/init.d/S90qt内的语句
        2,删除板内原本的4.7.3的固件。
            wr rm /usr/lib/libQt*
            wr rm -rf /usr/lib/qt
          wr rm /usr/bin/libQt*
            wr rm -rf /usr/bin/qt
          wr rm /usr/bin/ts_*
        3,解压qt5.tar.gz与tslib_sw.tar.bz2到/opt目录下,然后拷贝tslib_sw/bin/下的所有文件到/usr/bin/目录下。
这里需要讲一下,因为Linux的软硬链接复制的时候,可能会有问题,所以需要打包复制,打包完成以后可以通过scp传到板子的制定目录下,如:
scp qt5.tar.gz root@192.168.1.111:/opt/home按提示输入密码就行了。
运行是碰到一个bug,国外的网站上找到了解决方案

 

        4,修改/etc/profile文件如下:
        export TSLIB_ROOT=/opt/tslib_sw
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_CALIBFILE=/etc/pointeral
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib/export QT_ROOT=/opt/qt_install
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event0
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts/
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins/
export QWS_MOUSE_PROTO=tslib:/dev/input/event0
export QT_QPA_FB_TSLIB=1
export QWS_DISPLAY=LinuxFB:/dev/fb0
export QWS_SIZE=800X480
export QT_QWS_FONTDIR=$QT_ROOT/lib/fonts
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QT_ROOT/libexport LD_PRELOAD=/lib/preloadable_libiconv.so
然后source /etc/profile
触屏校准。
            wr ts_calibrate
这样环境变量就设置好了,在运行程序就可以正常了。但是在控制台就可以看到有一个iconv_openfailed的错误。这里就说要说到最后一个export LD_PRELOAD=/lib/preloadable_libiconv.so ,因为在编译qt的时候没有加-no-iconv 选项,所以只能单独编译一个libiconv。通过交叉编译工具链生成arm平台上的iconv链接库的方法如下:
下载libiconv-1.14.tar.gz, 解压tar -xvf  libiconv-1.14.tar.gz
./configure –host=arm-none-linux-gnueabi –prefix=xxxxxxx ,完成后make (-j8表示8线程) 进入prefix指定的目录下lib目录下找preload,preload中有preloadable_libiconv.so,复制到上边的LD_PRELOAD路径就行了。
复制进去后,再运行程序就不会报错了但是就有一个问题中文不能显示,这个就是因为没有中文的字库的原因了。这个问题就比较简单了。这个变量QT_QWS_FONTDIR指定的路径中的所有字体删除掉,只放入一个中文字体,重新运行程序 就会发现中文正常显示了。这个是因为系统在没有找到指定的字体的时候,只能用唯一的字体代替。自此,qt在arm-Linux的移植工作就算是完成了。这个要感谢指导过的大神和抱过的大腿了。
也希望我的经历可以帮到后边的朋友。