{"text_format":"2","workbook":"xlsx","n_sheets":6,"sheets":["网站链接","QT命令","嵌入式设备操作命令","进制算法","Git操作","开发程序（涉及到设备和前端界面）"],"not_rendered":{"charts":0,"images":0,"macros":0,"external_links":0,"defined_names":0,"comments":0,"pivot_tables":0},"unopened":[],"bounds":{"document_bytes":16777216,"sheet_cells":100000,"run_cost":"one","rows_first":2000,"rows_last":500,"rows_between":2000,"halvings":0,"cell_chars":16384,"cell_head_chars":4096},"cells_cut":0,"cells_raw":0,"read":"whole","date_system":"1900"}

{"sheet":"网站链接","index":0,"n_rows":19,"n_cols":4,"rows_kept":19,"cut":false,"hidden":false,"merged":[]}
["视频监控程序","http://101.133.214.75:3000/hanzhengyi/ytCam.git","james    123456"]
[]
["程序设置电脑开机自启动","https://blog.csdn.net/qq_35568099/article/details/88656149?utm_medium=distribute.pc_relevant_download.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-baidujs-1.nonecase","在 我的电脑 输入 %APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup  在这个目录下创建一个文本txt文件，然后  在文件中输入启动配置信息\nD:\ncd \\weixin\nstart wechat.exe \n   以上程序自启动配置完毕   再将文件名后缀 .txt改成 .bat 就可以了","D:\ncd \\zyj\\xunjianhezhoujiegaojing\\xungeng\\EXE\\USIAS\nstart DaemonProcess_EVAL.exe\nstart DaemonProcess_LAND.exe"]
[]
["阿里云盘","https://www.aliyundrive.com/drive/"]
[]
[]
["下载 DB.Browser.for.SQLite","https://download.sqlitebrowser.org/DB.Browser.for.SQLite-3.12.2-win32.msi","数据看板程序要在自己的电脑上配置"]
[]
["Oracle VM VirtualBox 安装CentOS7操作系统的教程图解","https://www.jb51.net/article/174468.htm"]
["虚拟机镜像下载","mirrors.163.com"]
["Oracle VM VirtualBox下安装Linux的增强功能(鼠标无缝切换等)","1、打开终端(命令行、Terminal)，挂载光驱到/mnt\nmount /dev/cdrom /mnt\n2、进入到/mnt下面，直接运行VBoxLinuxAdditions.run即可，剩下的就不用你管了，等着就对了\n./VBoxLinuxAdditions.run  运行这个命令报 “modprobe vboxguest failed”（安装kernel-devel，并将kernel和kernel-devel更新至同一版本  1、yum install -y kernel-devel gcc  2、yum -y upgrade kernel kernel-devel 3、reboot）"]
["测试服务端websocket连接：","http://coolaf.com/tool/chattest","ws://47.98.201.187:52007/ajaxchattest"]
[]
["Qt QtCreator 所有版本官方下载地址","1.所有版本QT下载地址 ：\n  http://download.qt.io/archive/qt/\n2. 所有Qt Creator下载地址：\nhttp://download.qt.io/archive/qtcreator/"]
[]
["连接测试WEBSOCKET服务端","http://coolaf.com/tool/chattest","无证书 用 ws开头   有证书用wss开头"]
[]
["环境变量设置","2.环境变量的设置\n一般来说，配置交叉编译工具链的时候需要指定编译工具的路径，此时就需要设置环境变量。例如我的mips-linux-gcc编译器在“/opt /au1200_rm/build_tools/bin”目录下，build_tools就是我的编译工具，则有如下三种方法来设置环境变量：\n2.1、直接用export命令：\nexport PATH=$PATH:/opt/au1200_rm/build_tools/bin\n查看是否已经设好，可用命令export查看：\n可以看到，环境变量已经设好，PATH里面已经有了我要加的编译器的路径。\n2.2、修改profile文件：\nvi /etc/profile\n在里面加入:\nexport PATH=\"$PATH:/opt/au1200_rm/build_tools/bin\"\n让环境变量立即生效需要执行如下命令：\nsource /etc/profile\n2.3. 修改.bashrc文件：\nvi /root/.bashrc\n在里面加入：\nexport PATH=\"$PATH:/opt/au1200_rm/build_tools/bin\"\n后两种方法一般需要重新注销系统才能生效，最后可以通过echo命令测试一下：\necho $PATH\n看看输出里面是不是已经有了/my_new_path这个路径了。","http://eleaction01.spaces.eepw.com.cn/articles/article/item/188064"]

{"sheet":"QT命令","index":1,"n_rows":57,"n_cols":3,"rows_kept":57,"cut":false,"hidden":false,"merged":[[6,0,9,0],[51,0,52,0],[55,0,56,0]]}
["日志格式和获取系统时间","logThread->appendLog(QString(\"[ %1 datacenter ] get data： %2\").arg(QDateTime::currentDateTime().toString(\"yyyy-MM-dd HH:mm:ss.zzz\")).arg(data));","QDate::currentDate().toString(\"yyyy-MM-dd\")"]
["解析和拼装JSON数组","https://www.cnblogs.com/whik/p/11234889.html"]
[]
["工具\\语言\\数据库学习教程","http://www.json.cn/"]
[]
["qt中，如何让自己写的程序每天定时运行","在windows下：\ntask scheduler里添加schedule事件，在事件里启动可执行文件\n在linux下：\n自己写一个控制台程序并保持其始终运行并一直检查时间，如果时间到则启动程序。"]
["WINDOW中启动和杀死进程命令","#include <QProcess>\n                //开启进程\n                QProcess newProg;\n                newProg.start(exeName, QStringList()<<\"command\");\n\n                Sleep(5000);\n                //杀死进程\n                QProcess taskkill;\n                taskkill.execute(\"taskkill\", QStringList()<<\"-im\"<<exeName<<\"-f\");","参考巡更系统中的守护进程程序"]
[null,"system(\"taskkill /F /T /IM uugw04040003.exe\");"]
[null,"system(\"start /b uugw04040003.exe\");"]
[null,"system(exeAbsPath.toStdString().c_str());","启动进程非常好用，如果遇到要删除这个启动程序进程时，这个方法就不好用了，因为守护进程在启动这个程序进程之前 先启动了cmd窗口 ，要杀死这个程序进程之前 要先杀死cmd进程；如果单纯是启动是好用的  参数为绝对路径可执行文件"]
[]
["连接ACCESS数据库","QString DATABASE = \"QODBC\";\n  QString DRIVER = \"DRIVER={Microsoft Access Driver (*.mdb)}\";\n  QString URL = \"FIL={MS Access}\";\n  QString Name= \"DBQ=//192.21.21.21/data/cue.mdb\";\n  QString databaseName = DRIVER + \";\" + URL + \";\" + Name ;\n  QSqlDatabase::addDatabase(DATABASE);\n  QSqlDatabase::database().setDatabaseName(databaseName);\n\n  if(!QSqlDatabase::database().open())\n        return  false;\n    else\n    {\n        return true;\n    }\n\n其中//192.21.21.21/data/cue.mdb是共享数据库文件的路径","    mainDB = QSqlDatabase::addDatabase(\"QODBC\",\"GuardTour_DB\");\n\n    QString dsn = QString(\"DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=%1;Uid=%2;Pwd=%3\").arg(PathMdb).arg(\"\").arg(PassWd);\n    mainDB.setDatabaseName(dsn);  mainDB.open();  mainDB.exec();"]
[]
["读取配置文件内容","QSettings sets(\"sys.ini\", QSettings::IniFormat);\n    QString pointUrl = sets.value(\"POINT_HTTPURL\").toString();","配置文件sys.ini中内容：\n[General]\nPOINT_HTTPURL=http://121.40.217.77:8081/pt/patrollingPointPush"]
[]
["创建带有子项目的QT项目","打开qt creator工具，文件/新建文件或项目/其他项目/子目录项目，然后一步步往下执行，最后带有一个子项目的项目生成。如果还需要再加子项目，就右击项目名，选择新子项目即可，再往下一步步执行。"]
["新建类","在qt项目中新建类，右击项目名，选择add new… ，C++/C++ Class"]
[]
["查看qt使用说明","http://doc.qt.io"]
["要使用QWebSocket对应的sendTextMessage()函数","发送数据到前端  数据中必须要有 time字段  也就是时间戳 不然数据发送不到前端","Qstring(\"{\\\"time\\\":\\\"%1\\\"}\").arg();"]
["关闭对应端口的防火墙","1、firewall-cmd --zone=public --add-port=6002/tcp --permanent   2、systemctl stop firewalld  3、systemctl start firewalld"]
[]
["【Qt开发】编译时报\"undefined reference to\"问题的解决方案","1. 出现原因分析\n　　Undefined reference to 错误:这类错误是在连接过程中出现的，可能有两种原因∶\n     （1）是使用者自己定义的函数或者全局变量所在源代码文件，没有被编译、连接；\n     （2）干脆还没有定义，这需要使用者根据实际情况修改源程序，给出全局变量或者函数的定义体。\n2. 解决方案\n       最近使用Qt进行开发，出现了多条 Undefined reference to 报错的问题。我使用了extern来扩展变量的使用域，我在mainwindow.h中对变量进行声明，而在另 外的用到该变量的两个文件进行使用，但是忘记加入对变量的定义导致出错。这种出错原因是上述的第（2）种。\n       因此：\n       在使用到该变量的.c或者.cpp文件中，以extern int Name;声明该变量。\n       在需要对该变量赋值的.c或者.cpp文件中，以int Name定义该变量。"]
["QT结构体定义使用","定义的结构体对应的cpp文件中用 #include “client.h”  extern Student student;  Student student;   其他调用该结构体的cpp文件中 #include “client.h”  extern Student student;"]
["CentOS7配置可执行程序运行环境","yum install qt5-*-devel"]
[]
["tar压缩和解压文件或文件夹","1. 使用tar压缩文件\ntar -zcvf test.tar.gz ./test/\n该命令表示压缩当前文件夹下的文件夹test，压缩后缀名为test.tar.gz\n如果不需要压缩成gz，只需要后缀为tar格式的，那么输入如下命令：\ntar -cvf test.tar ./test/"]
[null,"  "]
["将数据库日期字段日期值转换成日期格式"," qry.value(0).toDateTime().toString(\"yyyy-MM-dd HH:mm:ss\").toUtf8().data();   先将字段按类型接收然后再转换"]
["获取小时和分钟","int minute = QDateTime::currentDateTime().time().minute();   if(minute == 00 || minute ==30)  整点或半点"]
[null,"int hour = QDateTime::currentDateTime().time().hour();"]
["虚拟机环境中安装MySQL数据库","yum install mysql    yum install mysql-server   yum install mysql-devel"]
["虚拟机环境中的本地mysql 重启 ","在终端命令行中 重启mysql数据库命令 ： systemctl start mysql.service\n要启动mysql数据库报这样的提示 “Failed to start mysqld.service:Unit not found”\n解决办法如下：\n首先需要安装mariadb-server\nyum install -y mariadb-server\n第二步 启动服务\nsystemctl start mariadb.service\n第三步 添加到开机启动\nsystemctl enable mariadb.service"]
["用常量给字符变量赋值","sprintf(ytStationCount->station[s].StationDevice[d].DeviceStatusNote,\"%s\",Qstring::fromUtf8(\"故障\").toUtf8().data());"]
["获取某个文件夹下所有文件","uint l_time = QDateTime::currentDateTime().toTime_t()-30*86400;\nQDir dir(\"/opt/log\");\nQFileInfoList file_list = dir.entryInfoList(QDir::Files);\nfor(int i=0;i<file_list.size();i++){\n\tQFileInfo f_info = file_list.at(i);\n\tif(f_info.lastModified().toTime_t()<l_time){\n\t\tQFile(f_info.canonicalFilePath()).remove();\n\t}\n}"]
["查看和释放共享内存","ipcs -m 查看共享内存      ipcrm -m shmid       删除shmid对应的共享内存    ipcrm -a  删除所有共享内存"]
[null,"或者重启虚拟机 也可以把所有共享内存都删除"]
[null,"***注意程序中定义的共享内存字段大小和类型不能修改  因为改动就会导致共享内存大小变化 运行程序通过 shmid去寻找共享内存时失败  程序启动不了"]
["在linux下查看有哪些操作系统进程正在使用某一个共享内存段","https://blog.csdn.net/msdnchina/article/details/80641613"]
["注册不识别的类型 (Qlist<QStringList>) ","qRegisterMetaType<QList<QStringList>>(\"QList<QStringList>\")"]
["QList类介绍","https://blog.csdn.net/auragreen/article/details/6060338?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-8.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-8.control"]
[]
["Qstring几个参数选项",".arg((i==0)?\"temp\":((i==1)?\"overa\":((i==2)?\"overv\":((i==3)?\"lowv\":\"leaka\"))))"]
[]
["查看运行的程序所占物理内存大小(chkrootprocmem)","pgrep 进程名 -u root   通过这个命令获取进程号    /proc/进程号/status   找对应name为 VmRSS对应的value值                "]
["解析设备二进制码转成十六进制码打印显示","message 为二进制码，\nQByteArray data = message.payload(); \nQstring commData;    \nfor(int i=0;i<data.length();i++){ \n\tcommData.append(Qstring(\" %1\").arg(data.at(i)&0xff,2,16,Qchar('0'))); \n}   \nprintf(\"commData = %s\\n\",commData.toUtf8().data());"]
["秒级时间戳","QDataTime::currentDateTime().toTime_t()"]
["毫秒级时间戳","QDataTime::currentDateTime().toMSecsSinceEpoch()"]
["int转Qstring","方法1、QSTring str = Qstring::number(80)  默认十进制转Qstring    方法2、Qstring str = Qstring(\"%1\").arg(7b&0xff,2,16,QChar('0'))"]
["时间戳转QDateTime","QDataTime:fromMSecsSinceEpoch(qint64 t)"]
["创建文件","QFile file_list = new QFile(\"log/thread-\"+QDate::currentDate().toString(\"yyyyMMdd\")+“.log”);\nif(file_list->open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text)){\n\tfile_list->write();\n\tfile_list->close();\n}\n\n注意：创建的文件只有在打开文件向文件写数据时才会显示创建好的文件，没有open和close动作，创建好的文件不显示"]
["QT unicode编码转汉字---16进制unicode转汉字","https://smallbird.blog.csdn.net/article/details/90638294?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link"]
[null,"QString dataStr,dataTemp;\n                for(int i=24;i<=data.length()-3;i++)\n                {\n                    dataTemp.append(QString(\"%1\").arg((data.at(i)&0xff),2,16,QChar('0')));\n                    bool ok;\n                    QChar* unicode=new QChar[1];\n\n                    unicode[0]=dataTemp.toInt(&ok,16);\n                    QString str=QString::fromRawData(unicode,1);\n                    dataStr.append(str);\n                    dataTemp.clear();\n                }\n\n                //unicode编码转汉字---16进制unicode转汉字\n                QTextCodec *gb_code = QTextCodec::codecForName(\"GBK\");\n                QTextCodec::setCodecForLocale(gb_code);\n                data_cfg.append(gb_code->toUnicode(dataStr.toLatin1()));"]
["QT utf8与gb2312的相互转换","https://blog.csdn.net/zottffssent123/article/details/114636842"]
[]
["虚拟机突然上不了网，而且右上角网络连接图标也没有了","先解决突然上不了网的问题，是由于我删除了 /lib64 文件夹下面的一个软链接 库文件(libssl.so.10)，重新建立软链接（ln -s libssl.so.1.0.2k libssl.so.10），然后重启虚拟机就好了"]
[null,"可以上网了，右上角网络连接图标也没有的解决办法：https://blog.csdn.net/weixin_45496075/article/details/106455301 （chkconfig network off\nchkconfig network on\nservice NetworkManager stop\nservice NetworkManager start）"]

{"sheet":"嵌入式设备操作命令","index":2,"n_rows":1,"n_cols":2,"rows_kept":1,"cut":false,"hidden":false,"merged":[[0,1,1,1]]}
["嵌入式设备采集程序烧制镜像","操作步骤：1、su命令，输入密码 root，进入root用户；\n2、cd /root/yc335/yc335x-system;\n3、cd home/root/IOT-03/ 将修改优化的可执行文件程序拷贝到 当前目录下;\n4、cd /root/yc335/yc335x-system，先后执行 ./ycmake 和 ./ycmake-emmc，生成img文件镜像;\n5、cd ..   进入上一级目录，会看到 system.img  和 ubi.img 两个镜像文件，将这两个镜像文件拷贝到  /home/yt/ 目录下 ，插入TF卡，然后把这两个文件复制进去；\n6、断开硬件设备电源，插入TF卡，通电开始烧制程序，两个进度条全部烧制完成，断开电源，拿掉TF卡，设备通电；"]

{"sheet":"进制算法","index":3,"n_rows":9,"n_cols":3,"rows_kept":9,"cut":false,"hidden":false,"merged":[]}
["dataView.getInt16(5)","从第5个字节 开始  取两个字节  默认false高位在前"]
["dataView.getInt16(5,true)","从第5个字节 开始  取两个字节  true是低位在前  需要将高位和低位换位  然后转换成整型"]
["上面两个说明","https://blog.csdn.net/weixin_42347346/article/details/117835861?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.control&spm=1001.2101.3001.4242"]
["let value = dataView.getFloat32(startPos,true);","将十六进制转成浮点数  从第startPos个字节 开始  取4个字节  true是低位在前  需要将高位和低位换位（4个字节涉及到低8位和高8位，其中低8位中又有低4位和高4位，高8位中有低4位和高4位，需要先将低8位中的低4位和高4位互换，还有高8位中的低4位和高4位互换，最后是将低8位与高8位互换），  然后转换成浮点型"]
["十六进制转成浮点数在线工具","http://www.speedfly.cn/tools/hexconvert/"]
["十六进制转成浮点数原理","https://blog.csdn.net/m0_37957160/article/details/111569131?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.control&spm=1001.2101.3001.4242"]
[]
["Qstring 转 二进制数据","quint8 SmartLightCommThread::hexstr_to_byte(QString dat)\n{\n    quint8 tmp[2];\n    QByteArray Dat = dat.toLower().toLatin1();\n    quint8 temp;\n    temp = Dat.at(0)&0xff;\n    if((temp>=0x30)&&(temp<=0x39))\n        tmp[0] = temp-0x30;\n    else\n        tmp[0] = temp-0x37;\n    temp = Dat.at(1)&0xff;\n    if((temp>=0x30)&&(temp<=0x39))\n        tmp[1] = temp-0x30;\n    else\n        tmp[1] = temp-0x37;\n    return static_cast<quint8>(((tmp[0]&0x0f)<<4)|(tmp[1]&0x0f));\n}","QString hex1 = QString(\"%1\").arg(heartbeatCycle, 2, 16, QChar('0'));\n        QByteArray Dat1 = QByteArray(1,0x00);\n        Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);"]
["HEX-字符互转","https://the-x.cn/encodings/Hex.aspx"]

{"sheet":"Git操作","index":4,"n_rows":19,"n_cols":2,"rows_kept":19,"cut":false,"hidden":false,"merged":[[4,0,5,0]]}
["新的git仓库地址","http://47.111.81.118:3000/"]
["把线上仓库中的资源下载下来","首先在本地建立一个文件夹，右键 选择Git Bash Here 进入到命令行窗口，然后 输入命令 git clone + 所选仓库的链接  回车 就可以下载到本地新建目录了 比如 git clone http://47.111.81.118:3000/James/ytDashBoard "]
[]
[]
["提交修改后的程序文件到git仓库步骤：","命令行操作：1、git add .  2、git status 3、git commit -m '备注' 4、git pull (操作这一步时，本地仓库与线上仓库可能存在冲突，需要人工操作) 5、git push"]
{"$rows_empty":13}
["新建仓库并上传文件","https://blog.csdn.net/ToBeBestPlayer/article/details/79352951"]

{"sheet":"开发程序（涉及到设备和前端界面）","index":5,"n_rows":6,"n_cols":3,"rows_kept":6,"cut":false,"hidden":false,"merged":[[0,0,1,0]]}
["注意事项：","开发有设备和前端交互的程序时，要注意程序与设备、程序和前端的连接(用户)数，每个连接数要独立的，是那个用户的请求就响应那个用户","连接类型 *pclient = qobject_cast<连接类型 *>(sender())"]
[null,"注意连接设备和前端异常结束时，处理异常结束的线程，特别是要考虑到clientList中的异常用户线程的删除(clientList.removeAll(client)) 和异常用户线程的释放(pclient->deleteLater())"]
[]
["物联网采集程序RTU程序","状态量： 正常数据信息 getIOValue，告警数据信息 getIoReport   模拟量：正常数据信息 getAnalogValue，告警数据信息 getAnalogReport"]
[]
["程序异常中止，显示内存溢出，有几种可能：","1、字段没有初始化，就去使用；\n2、共享内存ftok函数中 proj_id是子序号 重复 被占用；\n3、赋值内容超过了定义字段的长度；\n4、查询数据，当不存在数据时，却要使用某个字段的值；\n5、申请某个内存时，使用完毕后， 没有释放；"]