EEE.DOG 呓喵酱の博客 - IoTcat's Blog 2020-09-07T08:33:46.083Z https://www.eee.dog/ IoTcat Hexo GRE备考核心矛盾分析 https://www.eee.dog/life/gre.html 2020-08-20T16:00:00.000Z 2020-09-07T08:33:46.083Z

我的GRE备考从8.21正式开始,8.28首考(成绩未提交),预计于9月底完成,目标155+170W3.5,总过程历时一个月半。本文阐述了在我的GRE备考过程中,提炼出的矛盾与方法论的汇总。

My GRE preparation started from 8.21, and the first test was 8.28 (scores not submitted). It is expected to be completed by the end of September. The goal is 155+170W3.5. The total process lasts one and a half months. This article explains the contradictions and methodologies that were extracted during my GRE preparation process.

备考定位

我备考GRE的主要目的是,借助GRE的备考过程,有效提升英语词汇量与论文阅读水平(速度)。于此同时,此次备考过程也将成为Tomato Proj的有效试验,为今后实现有序和谐的生活节奏提供经验参考。此外,申请一些美国学校则也需要提供GRE成绩。

备考矛盾分析

时间不足

由于暑假投入大量时间,准备申研材料,学习积累专业知识,准备FYP,我只留下了1个月左右的时间准备GRE。因此,时间不足的问题需要由方法论的精进来弥补。

数学矛盾分析

跳过机制

GRE数学的关键对于我们经理过理科高考的人来说,通过一定量的练习回顾,将期望调节到170左右,是比较轻松的。但是这并不意味着就可以对GRE数学掉以轻心。在备考GRE数学时,除了提高期望外,更加重要的是如何缩小方差。考虑到GRE数学在设计上时间较为紧张,只有35分钟,而且有可能会遇到一些很难的题,或者看不懂的题,这时就要果断跳过,及时止损。因此,在数学的备考过程中,需要形成一套判断是否跳过的判断机制,且判断耗时越少越好

题型解析机制

在数学的备考过程中,除了减小方差,也要有效提高期望。与高考不同的是,GRE数学的语言是英语,且还有一系列的逻辑陷阱。因此,要提高GRE数学的期望,需要对以下三点进行”程序化”处理,提炼出相应方法论。

  • 数学常用英语
  • 各种题型解题方法套路
  • 选择方法的方法

查错机制

尽管GRE数学的考试时间是否有限,但并不排除有时间会剩下的可能性。因此,可以注意锻炼一套有利于利用剩余时间差错的机制。比如,合理规划使用演草纸等。

阅读矛盾分析

一遍读懂

通过这几天的训练,我发现了一个现象,及如果最开始看文章没有看懂,那么后面做题基本靠蒙。因此,GRE阅读一定要先将文章看懂。要实现这一点,可以通过提炼句子的s3版本,通过居间关系连接词对下一句内容进行预判,以此递归。

提高速度

在有限的时间内把文章看懂。。

填空矛盾分析

词汇量

先把3000刷熟,再把托福词汇刷过。。然后再看看。刷单词时一定要批量(比如以500词为一组),多变。一天过好几遍,闪现就行,几天后就会见效。

公式化处理

把题目抽象成公式处理。。

Test preparation positioning

My main purpose of preparing for the GRE is to effectively improve my English vocabulary and paper reading level (speed) with the help of the GRE preparation process. At the same time, this test preparation process will also become an effective test of Tomato Proj, providing an experience reference for the realization of an orderly and harmonious life rhythm in the future. In addition, GRE scores are also required to apply to some American schools.

Test preparation contradiction analysis

deficiency of time

Since I invested a lot of time during the summer vacation, preparing application materials, learning and accumulating professional knowledge, and preparing for FYP, I only left about 1 month to prepare for GRE. Therefore, the problem of insufficient time needs to be compensated by methodological refinement.

Mathematical contradiction analysis

Skip mechanism

The key to GRE mathematics is relatively easy for our managers who have passed the science college entrance examination to adjust their expectations to about 170 through a certain amount of exercise review. But this does not mean that GRE math can be taken lightly. When preparing for the GRE math test, in addition to raising expectations, it is more important to reduce variance. Considering that GRE mathematics is relatively tight in design time, only 35 minutes, and there may be some difficult or unintelligible questions, then you must skip it decisively and stop the loss in time. Therefore, in the preparation process of mathematics, it is necessary to form a judging mechanism for judging whether to skip, and the less time-consuming judgment, the better.

Question type analysis mechanism

In the preparation process of mathematics, in addition to reducing variance, we must also effectively raise expectations. Unlike the college entrance examination, the language of GRE math is English, and there are a series of logical traps. Therefore, in order to increase the expectation of GRE mathematics, the following three points need to be “programmed” to refine the corresponding methodology.

  • Common English for Mathematics
  • Various problem solving methods
  • Method of choosing method

Error checking mechanism

Although the time for the GRE math test is limited, it does not rule out the possibility that time will be left. Therefore, you can pay attention to exercise a set of mechanisms that are conducive to using the remaining time error. For example, rationally plan the use of cursive paper.

Reading contradiction analysis

Read it again

Through the training of the past few days, I have discovered a phenomenon, and if I did not understand the article at the beginning, then I basically rely on misunderstanding to do the questions later. Therefore, GRE reading must first understand the article. To achieve this, the s3 version of the sentence can be refined, and the content of the next sentence can be pre-judged through the intermediate relational connectives, so as to recurse.

accelerate

Read the article in a limited time. .

Fill in the blank contradiction analysis

Vocabulary

First brush 3000, and then brush the TOEFL vocabulary. . Then look again. When scanning words, be sure to batch (for example, 500 words as a group), changeable. Pass it several times a day, just flash, and it will be effective in a few days.

Formula processing

Abstract the topic into formula processing. .

]]>
<span class=".zh"> <p>我的GRE备考从8.21正式开始,8.28首考(成绩未提交),预计于9月底完成,目标155+170W3.5,总过程历时一个月半。本文阐述了在我的GRE备考过程中,提炼出的矛盾与方法论的汇总。</p> </span> <span class=".en"> <p>My GRE preparation started from 8.21, and the first test was 8.28 (scores not submitted). It is expected to be completed by the end of September. The goal is 155+170W3.5. The total process lasts one and a half months. This article explains the contradictions and methodologies that were extracted during my GRE preparation process.</p> </span>
CS, ECE硕士项目调研 https://www.eee.dog/life/cs-ece-master-programs.html 2020-06-24T02:25:39.000Z 2020-09-05T12:27:00.458Z

为了准备2021硕士申请,我对一些喜欢的项目做了一些调查,并汇总在这里。

To prepare for my master’s application in 2021, I did some research on some of my favorite projects and summarized them here.

排名来源:QS2020, USNews2020, 上海交大2019,csrank.global.2010-2020
四个排名代表四种视角(QS->英国,USNews->美国,上海交大->中国,csrank->cs专业贡献)

以下信息部分摘自互联网,可能有错误!!

英国 (选2-3所)

帝国理工

QS: 9
USNews: 20
上海交大: 23
csrank: 73

申请模式:

两个志愿,录取时可以看到你的第二志愿。一年只能提交一次申请。

MSc Computing Science

  • 学费£33,250
  • 时长一年

条件

  • 任何专业一等学位
  • 雅思6.5小分6/托福92小分20

案例

  • 均分85, con 85 (校友利)
  • gre330 (优留)

MSc Applied Machine Learning

  • 学费£32,500
  • 时长一年

条件

  • EEE专业一等学位
  • 雅思6.5小分6/托福92小分20

UCL

QS: 8
USNews: 21
上海交大: 15
csrank: 50

申请模式:

可以申请多次。申请由授课老师处理,不同院系不互通。

MSc Integrated Machine Learning Systems

  • 学费£28,530
  • 时长一年

条件

  • EE/CS专业二等一学位
  • 雅思6.5小分6/托福92小分读写24-30听说20-30

案例

  • 88均分 (校友利)
  • 85通信(优留)

MSc Computer Science

  • 学费£30,400
  • 时长一年

条件

  • 非CS专业二等一学位
  • 雅思7.0小分6.5/托福100小分读写24-30听说20-30

爱丁堡大学

QS: 20
USNews: 28
上海交大: 31
csrank: 33

MSc Computer Science

  • 学费-
  • 时长一年

条件

  • 大部分工程理学专业二等一学位
  • 雅思6.5小分6.0/托福92小分20

案例

  • 无录取案例,据说因为与军工有关不收亚裔

MSc Signal Processing and Communications

  • 学费-
  • 时长一年

条件

  • EE与信号相关专业二等一学位
  • 雅思6.5小分6.0/托福92小分20

美国 (选1-2所)

康奈尔大学

QS: 14
USNews: 23
上海交大: 13
csrank: 7 (参考清华8)

M.Eng. Electrical and Computer Engineering (Ithaca)

  • 学费$56,550
  • 时长一年(大部分延期一年半)

条件

  • GPA 3.8+
  • GRE 320+
  • 雅思7.0/托福小分说22读20听15写20
  • 两封推荐信

案例

  • gre320,强科研

M.Eng. Electrical and Computer Engineering (NewYork)

  • 学费$58,586
  • 时长一年

条件

  • GPA 3.8+
  • GRE 320+
  • 雅思7.0/托福小分说22读20听15写20
  • 两封推荐信

卡耐基梅隆大学

QS: 48
USNews: 82
上海交大: 95
csrank: 1

Master of Science in Information Networking

  • 学费$50,100
  • 时长两年

条件

  • GPA 3.9+
  • GRE 330+
  • 托福102
  • 三封推荐信

案例

  • 宁诺85+gre326美国暑研(优留)

哥伦比亚大学

QS: 18
USNews: 7
上海交大: 8
csrank: 15

Master of Science in Electrical Engineering

条件

  • GPA 3.7+
  • GRE 320+
  • 托福102
  • 三封推荐信
  • 可能有面试

新加坡 (选1-2所)

新加坡国立大学

QS: 11
USNews: 34
上海交大: 67
csrank: 16

  • 不同学院可申请多个专业

Master of Technology in Software Engineering

  • 学费S$5,350.00
  • 时长一年
  • 偏向有工作经验者

条件

  • GPA 3.8+
  • GRE 320+
  • 雅思6.0/托福85
  • 面试

Msc. Electrical Engineering - CE方向

  • 偏向有工作经验者

条件

  • GPA
  • 雅思6.0/托福90 (可免)

Msc. Computer Science

  • 偏向有工作经验者
  • 转专业可能有限制

条件

  • GPA 3.8+
  • GRE 320+
  • 雅思6.0/托福90 (可免)

南洋理工大学

QS: 11
USNews: 43
上海交大: 73
csrank: 53

  • 不同学院可申请多个专业

Msc Artificial Intelligence

  • 学费S$58,000.00
  • 时长一年

条件

  • GPA 3.8+
  • 雅思6.5/托福100 (可免)

MSc Computer Control & Automation

  • 学费S$3,350.00
  • 时长一年

条件

  • GPA 3.6+
  • 雅思6.5/托福100

加拿大 (选0-1所)

多伦多大学

QS: 29
USNews: 18
上海交大: 24
csrank: 18

MEng. Electrical and Computer Engineering

  • 时长12-24
  • 学费+生活费40万/年

条件

  • GPA 3.6+
  • 雅思6.5小分6.0/托福100写作22
  • gre
  • 三封推荐信

瑞士 (选0-2所)

苏黎世联邦理工

QS: 6
USNews: 25
上海交大: 19
csrank: 10

  • 转专业不友好
  • 本科学校很重要
  • 每个地区人数有配额

Master Electrical Engineering and Information Technology

  • 时长1.5年

条件

  • GPA 3.8+ (top 5-10%)
  • 雅思7.0/托福100
  • gre 320+ (不强制)
  • 三封学术推荐信
  • 学费生活费一共20-30
  • 有奖学金

洛桑联邦理工

QS: 18
USNews: 45
上海交大: 78
csrank: 28

  • 只能申一个专业
  • 没有地区配额,全球申请者竞争

Electrical and electronic Engineering

  • 时长1.5年
  • 转专业不友好
  • 学费生活费一共20-30
  • 有奖学金

条件

  • GPA 3.8+
  • 雅思7.0/托福100
  • 三封推荐信
  • gre 320+ (不强制)

Ranking Source:QS2020, USNews2020, ARWU2019,csrank.global.2010-2020
The four rankings represent four perspectives (QS->UK,USNews->US,ARWU->China,csrank->cs Industry)

The following information section is taken from the Internet and may contain errors!!

UK

Imperial College London

QS: 9
USNews: 20
ARWU: 23
csrank: 73

Application mode:

Two choices. You can see your second choice when you are admitted.Applications can only be submitted once a year.

MSc Computing Science

  • Fee£33,250
  • 1 year

Condition

  • A first class degree in any major
  • Ielts 6.5 score 6/ TOEFL 92 score 20

Case

  • con 85 (校友利)
  • gre330 (优留)

MSc Applied Machine Learning

  • Fee£32,500
  • 1 year

Condition

  • EEE first class
  • Ielts 6.5 score 6/ TOEFL 92 score 20

UCL

QS: 8
USNews: 21
ARWU: 15
csrank: 50

Apply Method:

You can apply multiple times.The application is handled by the instructor and is not interchangeable between different departments.

MSc Integrated Machine Learning Systems

  • Fee£28,530
  • 1 year

Condition

  • First class degree in EE/CS
  • Ielts 6.5 score 6/ TOEFL 92 score reading and writing 24-30 listening and speaking 20-30

Case

  • con 88 (校友利)
  • 85 Telecom(优留)

MSc Computer Science

  • Fee£30,400
  • 1 year

Condition

  • One second class degree in a non-CS major
  • Ielts 7.0 score 6.5/ TOEFL 100 score reading and writing 24-30 listening and speaking 20-30

University of Edinburgh

QS: 20
USNews: 28
ARWU: 31
csrank: 33

MSc Computer Science

  • Fee-
  • 1 year

Condition

  • First class degree in most engineering majors
  • Ielts 6.5 score 6.0/ TOEFL 92 score 20

Case

  • No case of admission, it is said that because of military industry related not to accept Asians

MSc Signal Processing and Communications

  • Fee-
  • 1 year

Condition

  • EE and signal related major first class degree
  • Ielts 6.5 score 6.0/ TOEFL 92 score 20

USA

Cornell University

QS: 14
USNews: 23
ARWU: 13
csrank: 7

M.Eng. Electrical and Computer Engineering (Ithaca)

  • Fee$56,550
  • Duration: one year (most extensions: one and a half years)

Condition

  • 3.8 GPA
  • the GRE 320 +
  • IELTS 7.0/ TOEFL small say 22 Read 20 listen 15 write 20
  • Two letters of recommendation

Case

  • gre320,Strong scientific research

M.Eng. Electrical and Computer Engineering (NewYork)

  • Fee$58,586
  • 1 year

Condition

  • GPA 3.8+
  • GRE 320+
  • IELTS 7.0/ TOEFL small say 22 Read 20 listen 15 write 20
  • Two letters of recommendation

Carnegie Mellon University

QS: 48
USNews: 82
ARWU: 95
csrank: 1

Master of Science in Information Networking

  • Fee$50,100
  • 2 Years

Condition

  • GPA 3.9+
  • GRE 330+
  • Toefl 102
  • Three letters of recommendation

Case

  • 宁诺85+gre326(优留)

Columbia University

QS: 18
USNews: 7
ARWU: 8
csrank: 15

Master of Science in Electrical Engineering

Condition

  • GPA 3.7+
  • GRE 320+
  • the toefl 102
  • Three letters of recommendation
  • There might be an interview

Singapore

National University of Singapore

QS: 11
USNews: 34
ARWU: 67
csrank: 16

  • Different colleges can apply for multiple majors

Master of Technology in Software Engineering

  • FeeS$5,350.00
  • 1 year
  • Prefer people with work experience

Condition

  • GPA 3.8+
  • GRE 320+
  • IELTS 6.0/ TOEFL 85
  • the interview

Msc. Electrical Engineering - CE

  • Prefer people with work experience

Condition

  • GPA
  • Ielts 6.0/ TOEFL 90

Msc. Computer Science

  • Prefer those with work experience
  • There may be restrictions on changing majors

Condition

  • GPA 3.8+
  • GRE 320+
    • IELTS 6.0/ TOEFL 90 (optional)

Nanyang Technological University

QS: 11
USNews: 43
ARWU: 73
csrank: 53

  • Different colleges may apply for multiple majors

Msc Artificial Intelligence

  • FeeS$58,000.00
  • 1 year

Condition

  • GPA 3.8+
    • IELTS 6.5/ TOEFL 100 (optional)

MSc Computer Control & Automation

  • FeeS$3,350.00
  • 1 year

Condition

  • GPA 3.6+
    • IELTS 6.5/ TOEFL 100

Canada

University of Toronto

QS: 29
USNews: 18
ARWU: 24
csrank: 18

MEng. Electrical and Computer Engineering

  • Length12-24months
  • All Fee400,000 RMB/year

Condition

  • GPA 3.6+
    • IELTS 6.5 score 6.0/ TOEFL 100 writing 22
  • gre
    • Three letters of recommendation

Switzerland

Eth Zurich

QS: 6
USNews: 25
ARWU: 19
csrank: 10

  • Switching majors is not friendly
  • Undergraduate school is important
  • There is a quota for each region

Master Electrical Engineering and Information Technology

  • 1.5 year

Condition

  • GPA 3.8+ (top 5-10%)
    • IELTS 7.0/ TOEFL 100
    • GRE 320+ (not mandatory)
    • Three academic letters of recommendation
    • Total tuition and living expenses are 200,000 to 300,000 YUAN
    • With a scholarship.

Federal Institute of Technology in Lausanne

QS: 18
USNews: 45
ARWU: 78
csrank: 28

  • Only one major
  • No regional quotas, global competition for applicants

Electrical and electronic Engineering

  • 1.5 year
    • Switching majors is not friendly
    • Total tuition and living expenses are 200,000 to 300,000 YUAN
    • With a scholarship.

Condition

  • 3.8 GPA
  • IELTS 7.0/ TOEFL 100
  • Three letters of recommendation
  • GRE 320+ (not mandatory)
]]>
<span class=".zh"> <p>为了准备2021硕士申请,我对一些喜欢的项目做了一些调查,并汇总在这里。</p> </span> <span class=".en"> <p>To prepare for my master’s application in 2021, I did some research on some of my favorite projects and summarized them here.</p> </span>
Hello Hexo https://www.eee.dog/tech/hello-hexo.html 2020-06-16T07:43:54.000Z 2020-09-05T10:20:53.837Z

将blog从Typecho迁移到了Hexo。

Migrated blog from Typecho to Hexo.

]]>
<span class=".zh"> <p>将blog从Typecho迁移到了Hexo。</p> </span> <span class=".en"> <p>Migrated blog from Typecho to Hexo.</p> </span>
认知派生论 https://www.eee.dog/thoughts/cognitive-derived-theory.html 2020-02-16T16:00:00.000Z 2020-09-05T09:49:39.948Z

拜读了毛主席的实践论和矛盾论,第一次系统地接触了辩证唯物论这一方法论,深感其强大与自然。综合我自己先前的所经所悟,提炼出认知派生这一观点。

After reading Chairman Mao’s theory of practice and contradiction, it was the first time to systematically come into contact with the methodology of dialectical materialism, and I deeply felt its power and nature. Combining my own previous experience and understanding, I refined the view of cognitive derivation.

从巴甫洛夫的狗铃实验[1],到上世纪50年代费斯汀格的认知失调理论[2],再到1971年津巴多教授主导的斯坦福监狱实验[3],这一系列打破预期的心理学生理学实验,一步一步揭示出,人们心理的作用形式,似乎并非大多数人所认为的那样。实际上,这看似重大的心理学发现,其实早在两个世纪前,便已被马克思,恩格斯等人从社会学角度提出,并完善成为理论。后经列宁,斯大林等人通过实践进行完善。传入国内后,被毛泽东所集大成,结合了中国传统文化的底蕴,发展成为唯物辩证法的毛泽东思想。这一论理的形成,源自于这些人对自己所观察到的社会现象以及自己基于论理所实践的社会运动的归纳总结。而这一论理,又指导了中国共产党建国,扎实地完成国内资本原始积累地奇迹。

辩证唯物论是一套自洽的方法论,它能够有效地指导我们生活实践,从实践中总结论理,再将论理运用于实践的过程。而这一循环的高效运转,正是人类进化出认知的终极意义。

结论

方法论是一种十分有效而重要的工具,它为人们提供了一套范式(习惯),帮助人们更有效地践行“社会实践->认识->论理->社会实践”这一模式。

参考文献

[1] 巴甫洛夫 - 维基百科
[2] 認知失調 - 维基百科
[3] 斯坦福监狱实验 - 维基百科

Preface

From Pavlov’s dog bell experiment[1] to Festinger’s cognitive dissonance theory in the 1950s[2], to the Stanford prison experiment led by Professor Zimbardo in 1971[3], this A series of psychology students’ physical experiments that broke expectations reveals step by step that the role of people’s psychology does not seem to be what most people think. In fact, this seemingly important psychological discovery was actually put forward by Marx, Engels and others from a sociological point of view two centuries ago and perfected it into a theory. Later, Lenin, Stalin and others improved it through practice. After being introduced to China, it was collected by Mao Zedong, combined with the heritage of Chinese traditional culture, and developed into Mao Zedong’s thought of materialist dialectics. The formation of this theory stems from these people’s summary of the social phenomena they observe and the social movements they practice based on the theory. And this reasoning guided the founding of the Communist Party of China and solidly completed the miracle of domestic capital accumulation.

Dialectical materialism is a set of self-consistent methodology, which can effectively guide our life practice, conclude the theory from practice, and then apply the theory to the process of practice. The efficient operation of this cycle is precisely the ultimate meaning of human cognition.

in conclusion

Methodology is a very effective and important tool. It provides people with a set of paradigms (habits) to help people practice the model of “social practice -> knowledge -> theory -> social practice” more effectively.

references

[1] 巴甫洛夫 - 维基百科
[2] 認知失調 - 维基百科
[3] 斯坦福监狱实验 - 维基百科

]]>
<span class=".zh"> <p>拜读了毛主席的实践论和矛盾论,第一次系统地接触了辩证唯物论这一方法论,深感其强大与自然。综合我自己先前的所经所悟,提炼出认知派生这一观点。</p> </span> <span class=".en"> <p>After reading Chairman Mao’s theory of practice and contradiction, it was the first time to systematically come into contact with the methodology of dialectical materialism, and I deeply felt its power and nature. Combining my own previous experience and understanding, I refined the view of cognitive derivation.</p> </span>
左宗棠鸡块 https://www.eee.dog/cook/zuozongtang-chiken.html 2020-02-16T16:00:00.000Z 2020-09-05T12:04:36.759Z

分享一下改进版炸鸡块做法哦~

Share the improved version of fried chicken nuggets~

材料准备

  • 鸡胸肉
  • 一个鸡蛋
  • 葱末蒜末

预备步骤

  • 鸡肉切小块,加料酒,生抽,淀粉,鸡蛋清,搅匀腌10分钟
  • 鸡块在面粉中打滚

核心步骤

  • 热油炸鸡块至焦黄
  • 植物油蒜末炝锅
  • 加入一勺生抽,一勺多白醋,一把白糖,番茄酱翻一下
  • 加入鸡块,让鸡块上沾上酱汁
  • 撒上葱末

成品图

左宗棠鸡块 2020-02-17

Material preparation

  • Chicken breast
  • An egg
  • Chopped green onion and garlic

Preliminary steps

  • Cut chicken into small pieces, add cooking wine, light soy sauce, starch, egg white, stir well and marinate for 10 minutes
  • Chicken nuggets rolled in flour

Core steps

  • Hot fried chicken nuggets until browned
  • Vegetable oil minced garlic pot
  • Add a spoonful of light soy sauce, a spoonful of white vinegar, a handful of sugar and ketchup
  • Add chicken nuggets, so that the chicken nuggets are covered with sauce
  • Sprinkle with chopped green onions

Finished picture

Zuo Zongtang Chicken Nuggets 2020-02-17

]]>
<span class=".zh"> <p>分享一下改进版炸鸡块做法哦~</p> </span> <span class=".en"> <p>Share the improved version of fried chicken nuggets~</p> </span>
欧洲旅行支票兑换攻略 https://www.eee.dog/travel/traveler-cheque.html 2020-02-08T16:00:00.000Z 2020-09-05T11:58:11.077Z

之前去欧洲旅游办签证,由于没有三个月的银行流水,不得已购买了旅行支票作为资金证明。可是到了欧洲才发现旅行支票很难使用,如果不了解行情会被骗收15%-20%的手续费。这篇Blog记录了我们发现的兑换旅行支票的坑和Tips!

Before I went to Europe for a tourist visa, I had to buy a traveler’s cheque as a proof of funds because I did not have a three-month bank flow. However, when I arrived in Europe, I found that traveler’s cheques were difficult to use. If I didn’t understand the market, I would be defrauded of 15%-20% handling fees. This blog records the pits and Tips we found in redeeming traveler’s checks!

[scode type=”info”]经验一: 尽可能不使用旅行支票[/scode]
[scode type=”info”]经验二: 旅支兑换最低手续费在4%左右[/scode]

若不想看经历,可直接调至文末兑换旅行支票的Tips处哦!

我的经历

圣诞假和室友一行四人一起DIY游欧洲,去了意大利和奥地利两个国家,共5个城市。由于英国的银行卡还没有使用到三个月,无法通过打印流水来办签证,我们选择了另一种方法—购买American Express的欧元的旅行支票。殊不知啊,兑换和使用旅行支票真真是一个大坑。

最开始据旅行支票的官网上所说,欧洲很多城市的店铺里都能直接使用旅行支票,照这样来说,旅游时花掉它肯定比回英国后把它换回英镑划算的多(换回英镑的过程需要损失8%)。然鹅,出发前我们通过看他人的游记发现,欧洲现在很多店都无法直接花旅行支票(按我们后来实际旅行情况来看,只在威尼斯的好几家店看到了旅行支票的标识),于是我们决定去了就在机场红色标识的Change那里将它们全数换成欧元。

Change

可到了第一站罗马找到了红色的Change后(如图),却发现700欧元只能给我们590多欧元。这可真的亏的不是一丁半点儿。我对象现场查到了American Express的电话,打过去发现人家现在在意大利没有设点,不过对方建议去银行换,说是可以毫无亏损(注意这也是个坑,,,)。由于有两人已经换了,为了止损,我们决定先不换剩下两人的700欧旅行支票,留着去银行换。

到了第三天,我们去了梵蒂冈那块儿玩,顺便去了附近American Express工作人员推荐的银行,还给中国银行打电话,结果均被告知不接受旅支。这可咋整?

这时刚好发现梵蒂冈周围有一堆change,于是又去问了问报价。其中有一家本来只报590多的,听见我们说另一家给了610多的价,说他们能给我们一个student discount,然后还算了算,报了个640。这下可好,我们开始发现这里面的门道了:其实哪有什么折扣,不过想找个借口吸引你罢了。这些change都是盈利性质的,你把旅支给了他们,他们再通过自己的途径卖给别的地方的American Express,中间可能有一点税收,但只要他们以比扣掉税收低的价格从你这里买下,他就一定能赚(一般还赚不少),不过是多赚点少赚点的区别罢了。而且当地有好几家change,我们主要发现了红色change标识的一家和蓝色的一家。若这家嫌你要求高不接受,那钱就让别家赚了呗。

所以这种时候,我们要想拿到高点的报价,就要掐准人家能接受的度(真的逼太狠了断了人家财路那就没辙了呀),然后通过让他们产生危机意识而提高报价。可以先问个几家,看他们一般会给多少,然后跟他说,别家给我了一个多少的价格。接下来这人可能就会开始打电话给上面的看能给个什么更高的价,叭叭一堆后给你一个略高一点的价格哈哈,你如果不太满意,可以再去找一家问问(不过要注意,如果是同一家的不同店面,要稍微注意点,毕竟他们上面的人可能是一个,说不定就记住你了)。一般来说,大致估估,如果说税可能是百分之二或三,那你起码还是得让人赚个20或30磅(当然你想试试再砍砍也可以,但可能难度会更大)。

于是我们最后两笔分别换的是640欧和645欧(645欧换了一家用类似方法换到的)。

Tips

  • 现在意大利可用旅支消费的地方真不太多,我们去的罗马,佛罗伦萨,威尼斯中,只有威尼斯有几家;
  • 去意大利想兑换欧元旅支,只能在标有change牌子的地方换(当然有的change是不接受旅支的,但很少)。American Express的直接兑换点,至少在意大利应该是没有了,所以没法无损失地换。但意大利的change的确不少,梵蒂冈附近就尤其多;
  • 不要遇见一家,他报个很低的价你就接受了,也不要太信他的话,要知道这很可能是在坑你不清楚内情;
  • 可以先问个两家,了解一下情况。大致估估如果说税可能是百分之二或三,那你起码还是得让人赚个20或30磅,先问问他们的报价,你可以把这个价格说成别家给你的价,去问他们能不能给你高点的价格。当然如果你脸皮薄不好意思胡扯,也可以就只是在这家价格比别家低的情况下把别家价格拿出来激激他们。

总结

以上就是所有关于旅支兑换的一些个人经历和小tips啦,当然这只是结合我们的个人体会总结的一些东西,还是要结合具体情况分析了。出去游玩肯定主要还是想多走走看看感受下,所以在经济条件允许的状况下也不建议大家在这件事上浪费太多时间,只要你自己觉得差不多能接受就行了。最后,还是想说,去意大利玩能不用旅行支票就还是别用了,毕竟真的挺麻烦还处处是坑!

[scode type=”info”]Experience One: Do not use traveler’s checks if possible[/scode]
[scode type=”info”]Experience Two: The minimum handling fee for travel exchange is around 4%[/scode]

If you don’t want to see the experience, you can directly transfer to the Tips where you can redeem traveler’s cheques at the end of the article!

My experience

During the Christmas holiday, I went to Europe with my roommates and a group of four on a DIY trip to 5 cities in Italy and Austria. Since the UK bank card has not been used for three months, it is not possible to apply for a visa by printing the record, so we chose another method-buying American Express’s Euro traveler’s cheque. As everyone knows, exchanging and using traveler’s checks is really a big pit.

According to the official website of traveler’s cheques, traveler’s cheques can be used directly in shops in many European cities. In this way, it’s definitely more cost-effective to spend it when traveling than to exchange it back in British pounds after returning to the UK. The British pound process requires a loss of 8%). Ran goose, we found through reading other people’s travel notes before departure that many stores in Europe cannot directly spend traveler’s checks (according to our actual travel situation later, we only saw the traveler’s check logo in several stores in Venice), so we When I decided to go, I changed all of them to Euros at the Red Marked Change at the airport.

Change

But after I found the red Change at the first stop in Rome (pictured), I found that 700 euros could only give us more than 590 euros. This is really not the slightest loss. My subject checked the phone number of American Express on the spot. I called it and found that there is no location in Italy, but the other party suggested to change to the bank, saying that there is no loss (note that this is also a pit,,,). Since two people have already exchanged them, in order to stop the loss, we decided not to exchange the 700 Euro traveler’s cheques of the remaining two people, and kept them to the bank for exchange.

On the third day, we went to the Vatican to play. By the way, we went to the bank recommended by the staff of American Express nearby. We also called the Bank of China, but we were all told not to accept travel. How can this be neat?

At this time, I just found a bunch of changes around the Vatican, so I asked for a quote again. One of them originally only reported more than 590, but we heard that the other offered us a student discount of more than 610, and then it was a good deal and reported a 640. This is great, we are beginning to discover the doorway inside: there are actually no discounts, but I want to find an excuse to attract you. These changes are all profitable. You give them your travel, and they sell them to American Express elsewhere. There may be a little tax in the middle, but as long as they charge you at a lower price than the tax deducted If you buy it here, he will definitely make a profit (generally, he will make a lot of money), but it’s just the difference between earning more and less. And there are several changes in the local area. We mainly found the one with red change and the one with blue. If this family thinks that you are demanding and unacceptable, then the money will be made by others.

Therefore, at this time, if we want to get a higher offer, we have to pinpoint what is acceptable to others (it’s really too cruel to cut off people’s wealth, then it’s okay), and then let them have a sense of crisis. Increase the offer. You can ask a few companies first to see how much they generally give, and then tell him how much other companies give me a price. Next, this person may start to call the above to see what a higher price can be offered, and after a bunch of them, they will give you a slightly higher price. Haha, if you are not satisfied, you can ask another one. Ask (but be careful, if it is a different store in the same store, be careful, after all, there may be one person above them, maybe I will remember you). Generally speaking, if you say that the tax may be two or three percent, then you still have to earn a 20 or 30 pounds. (Of course, you can try to chop and chop again, but it may be more difficult. Big).

So our last two transactions were 640 Euros and 645 Euros respectively (645 Euros were replaced by a similar method).

Tips

  • There are not too many places in Italy for travel and consumption. Among the Rome, Florence, and Venice we go to, there are only a few in Venice;
  • If you want to exchange for Euro travel in Italy, you can only change it at the place marked with the change sign (Of course, some changes do not accept travel, but very few). There should be no direct exchange points for American Express, at least in Italy, so there is no way to exchange them without loss. But there are indeed many changes in Italy, especially near the Vatican;
  • Don’t meet a family, if he quotes a very low price, you will accept it, and don’t believe him too much. You must know that this is probably because you don’t know the inside story;
  • You can ask two families first to find out the situation. A rough estimate. If the tax may be two or three percent, then you still have to make people earn 20 or 30 pounds. First ask them for their quotation. You can say that the price is given to you by another family. Ask if they can give you a higher price. Of course, if you have a thin skin and are embarrassed to talk nonsense, you can just give them the price of this one when the price is lower than that of others.

to sum up

The above is all the personal experiences and small tips about the exchange of travel expenses. Of course, these are just some things summarized based on our personal experience, we still need to analyze the specific situation. If you want to go out and play, you still want to walk around more to see how you feel. Therefore, it is not recommended that you waste too much time on this matter when economic conditions permit, as long as you feel that it is almost acceptable. Finally, I still want to say that if you don’t need traveler’s checks to play in Italy, you should not use it. After all, it is really troublesome and there are pits everywhere!

]]>
<!--![](https://api.yimian.xyz/img/?path=imgbed/img_6ae04a26_721x412_8_null_normal.png)--> <span class=".zh"> <p>之前去欧洲旅游办签证,由于没有三个月的银行流水,不得已购买了旅行支票作为资金证明。可是到了欧洲才发现旅行支票很难使用,如果不了解行情会被骗收15%-20%的手续费。这篇Blog记录了我们发现的兑换旅行支票的坑和Tips!</p> </span> <span class=".en"> <p>Before I went to Europe for a tourist visa, I had to buy a traveler’s cheque as a proof of funds because I did not have a three-month bank flow. However, when I arrived in Europe, I found that traveler’s cheques were difficult to use. If I didn’t understand the market, I would be defrauded of 15%-20% handling fees. This blog records the pits and Tips we found in redeeming traveler’s checks!</p> </span>
一键激活win10 https://www.eee.dog/tech/kms.html 2020-02-06T16:00:00.000Z 2020-09-05T12:59:47.713Z

一键激活win10家庭版,专业版,企业版,教育版 φ( ̄∇ ̄o)

Activate win10 Home Edition, Professional Edition, Enterprise Edition, Education Edition with one click φ( ̄∇ ̄o)

方法一(自动安装)

  • 使用此方法请先关闭所有杀毒软件
  • 使用此方法请先关闭所有杀毒软件
  • 使用此方法请先关闭所有杀毒软件

p.s. 如果不放心,请使用 方法二-源码安装



  • 运行刚下载的程序。(请不要修改解压路径)
  • 运行刚下载的程序。(请不要修改解压路径)

  • 点击 更多信息->仍然运行


  • 输入数字进行选择。(可输入数字4获取汉语翻译!!)


  • 耐心等待激活完成~ ::aru:proud::

脚本已发送到桌面kms.bat,如果不需要您可以删除它~

方法二(源码安装)

  • 点击这里下载压缩文件。

  • 解压压缩文件(请务必解压,否则无法运行)
  • 解压压缩文件(请务必解压,否则无法运行)
  • 解压压缩文件(请务必解压,否则无法运行)

  • 双击运行文件夹中的kmskms.bat

压缩文件示例

  • 点击 更多信息->仍然运行


  • 输入数字进行选择。(可输入数字4获取汉语翻译!!)


  • 耐心等待激活完成~ ::aru:proud::

进阶

激活码

您的激活码将保存在C:\Windows\kms.key

运行日志

  • 激活日志 %temp%\kms.log
  • 在本机尝试过的激活码 %temp%\kms.tried_keys
  • kms服务器配置 %temp%\kms.skms
  • ato输出信息 %temp%\kms.ato

恢复未激活状态

  • 进入kms.bat选择3
  • 等待完成卸载!!!

源码

Method one (automatic installation)

  • To use this method, please close all antivirus software
  • To use this method, please close all antivirus software
  • To use this method, please close all antivirus software

p.s. If you are not assured, please use Method Two-Source Installation


  • Click here to download the exe program

  • Run the program you just downloaded. (Please do not modify the decompression path)
  • Run the program you just downloaded. (Please do not modify the decompression path)

  • Click More info -> still running


  • Enter numbers to select. (You can enter the number 4 to get a Chinese translation!!)


  • Wait patiently for the activation to complete~ ::aru:proud::

The script has been sent to the desktop kms.bat, you can delete it if you don’t need it~

Method two (source installation)

  • Click here to download the compressed file.

  • Unzip the compressed file (please unzip, otherwise it will not run)
  • Unzip the compressed file (please unzip, otherwise it will not run)
  • Unzip the compressed file (please unzip, otherwise it will not run)

  • Double-click kms or kms.bat in the run folder.

Compressed file example

  • Click More info -> still running


  • Enter numbers to select. (You can enter the number 4 to get a Chinese translation!!)


  • Wait patiently for the activation to complete~ ::aru:proud::

Advanced

Activation code

Your activation code will be saved in C:\Windows\kms.key

Run log

  • Activation log %temp%\kms.log
  • Tried activation code %temp%\kms.tried_keys on this machine
  • kms server configuration %temp%\kms.skms
  • ato output information %temp%\kms.ato

Restore inactive state

  • Enter kms.bat and select 3
  • Wait for the uninstallation to complete! ! !

Source code

]]>
<span class=".zh"> <p>一键激活win10家庭版,专业版,企业版,教育版 φ( ̄∇ ̄o)</p> </span> <span class=".en"> <p>Activate win10 Home Edition, Professional Edition, Enterprise Edition, Education Edition with one click φ( ̄∇ ̄o)</p> </span>
部署新型冠状病毒API https://www.eee.dog/tech/coro.html 2020-02-03T16:00:00.000Z 2020-09-05T12:21:41.176Z

一分钟快速部署你自己的新型冠状病毒API ୧(๑•̀⌄•́๑)૭

Deploy your own new coronavirus API in one minute ୧(๑•̀⌄•́๑)૭

coro-api

新型冠状病毒 实时数据 api
项目Git地址: iotcat/coro-api
项目npm地址: iotcat/coro-api

API示例

获取全部

https://api.yimian.xyz/coro

根据省份

https://api.yimian.xyz/coro?province=山东

根据城市

https://api.yimian.xyz/coro?city=泰安

根据省和城(推荐)

https://api.yimian.xyz/coro?province=山东&city=泰安

快速部署

环境要求

  • nodeJS支持express任意版本
  • git任意版本

下载文件

1
$ git clone https://github.com/iotcat/coro-api.git & cd coro-api

安装依赖

1
$ npm install

启动

1
$ node index.js

访问

1
http://localhost:17676

进阶

GET参数

参数描述示例
province省份(国家)山东
city城市泰安

修改端口

index.js第9行修改默认端口。

禁止跨域

注释掉index.js第13行。

使用pm2守护进程

1
2
$ npm i -g pm2
$ pm2 start index.js --name coro-api -o /var/log/coro/api.out -e /var/log/coro/api.err --watch

Nginx配置

将以下内容加入server{}

1
2
3
location / {
proxy_pass http://127.0.0.1:17676;
}

如果你不是从根目录映射,记得去index.js中第11行app.get('/', f)修改成你的路径。

爬虫配置

爬虫使用coro-py, 请参考其文档。

开源协议

本项目使用MIT协议,允许非署名商业非商业使用。武汉加油!中国加油!!❤

coro-api

Novel coronavirus real-time data api
Project Git address: iotcat/coro-api
Project npm address: iotcat/coro-api

API example

Get all

https://api.yimian.xyz/coro

According to province

https://api.yimian.xyz/coro?province=Shandong

According to the city

https://api.yimian.xyz/coro?city=泰安

https://api.yimian.xyz/coro?province=Shandong&city=Taian

Quick deployment

Environmental requirements

  • nodeJS supports any version of express
  • Any version of git

download file

1
$ git clone https://github.com/iotcat/coro-api.git & cd coro-api

Installation dependencies

1
$ npm install

start up

1
$ node index.js

Access

1
http://localhost:17676

Advanced

GET parameters

ParametersDescriptionExample
provinceProvince (Country)Shandong
city ​​cityTai’an

Modify port

Modify the default port from line 9 of index.js.

Cross-domain prohibited

Comment out line 13 of index.js.

Use pm2 daemon

1
2
$ npm i -g pm2
$ pm2 start index.js --name coro-api -o /var/log/coro/api.out -e /var/log/coro/api.err --watch

Nginx configuration

Add the following content to server{}

1
2
3
location / {
proxy_pass http://127.0.0.1:17676;
}

If you are not mapping from the root directory, remember to go to the 11th line of index.js and change app.get('/', f) to your path.

Crawler configuration

The crawler uses coro-py, please refer to its documentation.

Open Source Agreement

This project uses the MIT protocol, allowing non-signed commercial and non-commercial use. Go Wuhan! Go China! ! ❤

]]>
<span class=".zh"> <p>一分钟快速部署你自己的新型冠状病毒API ୧(๑•̀⌄•́๑)૭</p> </span> <span class=".en"> <p>Deploy your own new coronavirus API in one minute ୧(๑•̀⌄•́๑)૭</p> </span>
香辣牛肉面 https://www.eee.dog/cook/awesome-beef-noodle.html 2020-01-18T16:00:00.000Z 2020-09-05T10:35:07.294Z

自研香辣牛肉面做法~

Self-developed spicy beef noodle practice~

材料准备(两人份)

  • 面条
  • 两个鸡蛋
  • 两根英国大葱切末
  • 两片姜切末
  • 适量牛肉切丁
  • 准备小碗放一个八角,桂皮,白扣,少许白胡椒粒

预备步骤

  • 热锅植物油香油煎鸡蛋
  • 热水焯一下牛肉

核心步骤

  • 热锅植物油香油,放入葱白部分炝锅
  • 加入开水和牛肉粒,加入碗中的调料,焖3分钟
  • 加入一勺生抽,半勺老抽,一勺蚝油
  • 加入适量鸡精和盐调鲜
  • 加适量红油藤椒油调辣
  • 放入面条,煮到熟

后续

  • 面条添至碗中,盖上鸡蛋
  • 加剩下的葱绿末

配图

香辣牛肉面-2020-01-19

Material preparation (for two persons)

  • Noodles
  • Two eggs
  • Two British scallions, minced
  • Two slices of ginger minced
  • Dice beef
  • Prepare a small bowl with anise, cinnamon, white button, and a little white pepper

Preliminary steps

  • Hot pot vegetable oil fragrant fried eggs
  • Blanch the beef in hot water

Core steps

  • Hot pot vegetable oil sesame oil, put the scallion part into the pot
  • Add boiling water and beef cubes, add the seasoning in the bowl, and simmer for 3 minutes
  • Add a spoonful of light soy sauce, half a spoonful of dark soy sauce, and a spoonful of oyster sauce
  • Add appropriate amount of chicken essence and salt to adjust fresh
  • Add appropriate amount of red vine pepper oil to adjust spicy
  • Add the noodles and cook until cooked

Follow up

  • Add the noodles to the bowl and cover with eggs
  • Add the remaining green onion

With pictures

Spicy Beef Noodle-2020-01-19

]]>
<span class=".zh"> <p>自研香辣牛肉面做法~</p> </span> <span class=".en"> <p>Self-developed spicy beef noodle practice~</p> </span>
英国意大利申根签攻略 https://www.eee.dog/travel/ivisa-checklist.html 2019-10-29T16:00:00.000Z 2020-09-05T13:00:54.980Z

在英国留学,圣诞去欧洲旅游,DIY了意大利申根签证。现在游完归来,总结一份申根签攻略。

I studied in the UK, traveled to Europe on Christmas, and DIYed an Italian Schengen visa. Now come back from the tour, summarize a Schengen sign strategy.

大致流程

材料类别

常规签证材料

  • Visa申请表
  • 身份证明
  • 居住证明
  • 照片

附加签证材料

  • 工作证明
  • 财产证明
  • 旅行证明
  • 住宿证明
  • 保险证明

材料CheckList

  • visa申请表原件(在线生成后打印)
  • 护照原件+复印件(黑白)
  • BRP原件+复印件(黑白)
  • 一张证件照-与英国签证一致(要求)
  • student letter
  • 旅行支票原件+复印件或三个月银行流水
  • 往返机票(姓名,日期,to&from)
  • 火车票(姓名,日期,to&from)
  • 住宿证明(姓名,日期,地址)
  • 同行者名单
  • 旅行保险证明(姓名,地理范围,保额)
  • 面签预约证明复印件

  • 旅行行程单(方便跟签证官解释)
  • joint travel confirmation letter(如果某个车票或住宿证明上没有你的名字)
  • 买票者的护照签名页复印件(如果某个车票或住宿证明上没有你的名字)

材料说明

visa申请表

  • 在线填写完第一页记得点SAVE, 记下页面右上角的Reference Number ::aru:shy::
  • 下一次登录后点击上方RETRIEVE INCOMPLETE FILLED VAF即可继续填写
  • 填写参考这篇攻略
  • 单面黑白A4打印
  • 打印好不要填写,不要签字,不要贴照片,到现场签证官会告诉你怎么办
  • 不要装订,建议用环形针

Student Letter

  • 去学校FB开
  • 需要有人签名,电子打印的签名不行
  • 抬头需要写Italy Consulate

旅行证明

  • 需要提供付过款的机票和跨城市的火车票
  • 票的底部需要有网站链接
  • 所有票上需要有你的名字
  • 如果某张票没有你的名字,需要票上有名字的人提供签过字的joint travel confirmation letter护照复印件
  • 可参考我们的joint travel confirmation letter
    joint letter

住宿证明

  • Booking Confirmation上需要有paid字样
  • 底部需要有网站链接
  • 所有材料上需要有你的名字
  • 如果没有你的名字,需要有名字的人提供签过字的joint travel confirmation letter护照复印件
  • 建议从Booking等知名网站订购

保险证明

  • 一定要覆盖旅程
  • 保期越长,签证时间越长。。
  • 我们选择的太平保险申根应急签证,供参考

预约证明

  • 到楼下前台拿着预约信挂号
  • 之后预约信就没用了

成果

最后展示一下我拿到的签证 ::aru:cheer::
visa

General process

Material category

Regular visa materials

  • Visa application form
  • personal I.D
  • Proof of residence
  • Photos

Additional visa materials

  • Proof of employment
  • Proof of property
  • Travel certificate
  • Proof of accommodation
  • Insurance certificate

Material CheckList

  • Original visa application form (print after online generation)
  • Original passport + photocopy (black and white)
  • BRP original + copy (black and white)
  • A passport photo-consistent with the UK visa (Requirements)
  • student letter
  • Original traveler’s check + copy or three-month bank account
  • Round-trip air ticket (name, date, to&from)
  • Train ticket (name, date, to&from)
  • Proof of accommodation (name, date, address)
  • Companion list
  • Travel insurance certificate (name, geographic area, insurance amount)
  • Copy of appointment certificate

  • Travel itinerary (for easy explanation with visa officer)
  • joint travel confirmation letter (if your name is not on a certain ticket or accommodation certificate)
  • Copy of the passport signature page of the ticket purchaser (if your name is not on the ticket or accommodation certificate)

Material Description

visa application form

  • After filling out the first page online, remember to click SAVE, and write down the Reference Number ::aru:shy::
  • Click RETRIEVE INCOMPLETE FILLED VAF above to continue to fill in after logging in next time
  • Fill in the reference this guide
  • Single-sided black and white A4 printing
  • After printing, do not fill in, do not sign, do not post photos, the visa officer will tell you what to do
  • Do not staple, it is recommended to use a loop pin

Student Letter

  • Go to school FB to open
  • A signature is required, and an electronically printed signature will not work
  • Head up to write Italy Consulate

Travel Proof

  • Need to provide paid air tickets and inter-city train tickets
    • A website link is required at the bottom of the ticket
  • All tickets need to have your name
  • If a ticket does not have your name, the person named on the ticket is required to provide a signed joint travel confirmation letter and a copy of passport
  • Please refer to our joint travel confirmation letter
    joint letter

Proof of Accommodation

  • paid is required on Booking Confirmation
  • A website link is required at the bottom
  • All materials need to have your name
  • If you do not have your name, the person who has the name needs to provide a signed joint travel confirmation letter and a copy of passport
  • It is recommended to order from well-known websites such as Booking

Insurance Certificate

  • Be sure to cover the journey
  • The longer the guarantee period, the longer the visa period. .
  • We chose Taiping Insurance Schengen emergency visa for reference

Appointment Proof

  • Go to the front desk downstairs to register with the appointment letter
  • After that, the appointment letter is useless

Results

Finally, let me show the visa I got~
visa

]]>
<span class=".zh"> <p>在英国留学,圣诞去欧洲旅游,DIY了意大利申根签证。现在游完归来,总结一份申根签攻略。</p> </span> <span class=".en"> <p>I studied in the UK, traveled to Europe on Christmas, and DIYed an Italian Schengen visa. Now come back from the tour, summarize a Schengen sign strategy.</p> </span>
今天很开心,在这里留个空 https://www.eee.dog/life/happy.html 2019-10-18T16:00:00.000Z 2020-09-05T10:19:26.721Z

先在这里留个空,以后慢慢填~

Leave a blank here first, then fill it in slowly~

φ( ̄∇ ̄o)

φ( ̄∇ ̄o)

]]>
<span class=".zh"> <p>先在这里留个空,以后慢慢填~</p> </span> <span class=".en"> <p>Leave a blank here first, then fill it in slowly~</p> </span>
Liverpool 学生公寓条件调研 https://www.eee.dog/life/liverpool-accom-inves.html 2019-10-09T16:00:00.000Z 2020-09-05T10:35:20.216Z

为了更清晰更直观的选择出明年居住的公寓,本文汇总了网络上对各公寓的评价信息,供决策参考。

In order to more clearly and intuitively choose the apartment to live in next year, this article summarizes the evaluation information of each apartment on the Internet for decision-making reference.

[scode type=”green”]大家积极在评论区补充哦,评论推荐使用qq邮箱[/scode]
[scode type=”yellow”]持续更新中…[/scode]
[scode type=”blue”]望大家能够补充更多房源,以便调查[/scode]

所有步行距离以Guild为中心!!

Dover Court (我们的最终选择)

  • 步行距离: 8 min (西北)
  • google地图: Dover Court
  • Official Guide: Dover Court
  • 优点: 距Lidl近,安静,管理好,安全,定期有人清洁,social place好,楼下自习室很安静
  • 缺点: 房间隔音一般,部分房间小,有的地方天花板低
  • 价格: £155.54 pw (Last Year)

Horizon Heights

St Luke’s View

Apollo Court

  • 步行距离: 11 min (西北)
  • 同学反映: 不安静(老雷)

Capital Gate

  • 步行距离: 7 min (西北)

Grand Central

  • 步行距离: 12 min (西)

Philharmonic Court

  • 步行距离: 12 min (南)

The Railyard

  • 步行距离: 9 min (东)

Myrtle Court

  • 步行距离: 9 min (东)

Larch House

  • 步行距离: 7 min (西)

IQ

  • 步行距离: 9 min (西北)
  • 人脉: 老叶,灯泡

The Arch

  • 步行距离: 18 min (西南)

Albert Court

  • 步行距离: 10 min (北)

St Andrews Place

  • 步行距离: 10 min (西南)

The Ascent

  • 步行距离: 13 min (西)

Lee Court

  • 步行距离: 10 min (北)

X1 Liverpool One

  • 步行距离: 18 min (西)

X1 The Edge

  • 步行距离: 12 min (西北)
  • 其它: 快递可以寄到Cambridge Court (梁斌)

Cambridge Court

  • 步行距离: 8 min (南)
  • google地图: Cambridge Court
  • 缺点: 隔音不好,地毯潮湿,条件差

Vita Student Liverpool

  • 步行距离: 21 min (西)

Liberty Park

  • 缺点: 一楼二楼隔音不好
  • 优点: 回字形楼中间有一个小花园(娇娇,欣怡)

[scode type=”green”] Everyone is actively adding in the comment area, comments recommend using qq mailbox[/scode]
[scode type=”yellow”]Continuously updating…[/scode]
[scode type=”blue”]I hope you can add more listings for investigation[/scode]

All walking distances are centered on Guild! !

Dover Court (Our final choice)

  • walking distance: 8 min (Northwest)
  • google map: Dover Court
  • Official Guide: Dover Court
  • Pros: Close to Lidl, quiet, well managed, safe, cleaned regularly, good social place, quiet study room downstairs
  • Disadvantages: Room soundproofing is average, some rooms are small, and some places have low ceilings
  • Price: £155.54 pw (Last Year)

Horizon Heights

St Luke’s View

Apollo Court

  • Walking distance: 11 min (Northwest)
  • Classmates' reflections: Not quiet (Lao Lei)

Capital Gate

  • walking distance: 7 min (Northwest)

Grand Central

  • walking distance: 12 min (West)

Philharmonic Court

  • Walking distance: 12 min (South)

The Railyard

  • walking distance: 9 min (East)

Myrtle Court

  • walking distance: 9 min (East)

Larch House

  • walking distance: 7 min (West)

IQ

  • walking distance: 9 min (Northwest)
  • Connection: Lao Ye, Bulb

The Arch

  • walking distance: 18 min (southwest)

Albert Court

  • walking distance: 10 min (north)

St Andrews Place

  • Walking distance: 10 min (Southwest)

The Ascent

  • walking distance: 13 min (West)

Lee Court

  • walking distance: 10 min (north)

X1 Liverpool One

  • walking distance: 18 min (West)

X1 The Edge

  • Walking distance: 12 min (Northwest)
  • Others: Express can be sent to Cambridge Court (Liang Bin)

Cambridge Court

  • walking distance: 8 min (south)
  • google map: Cambridge Court
  • Disadvantages: Poor sound insulation, damp carpets, poor conditions

Vita Student Liverpool

  • walking distance: 21 min (West)

Liberty Park

  • Disadvantages: Sound insulation is not good on the first and second floors
  • Advantages: There is a small garden in the middle of Huizi Building (Jiaojiao, Xinyi)
]]>
<span class=".zh"> <p>为了更清晰更直观的选择出明年居住的公寓,本文汇总了网络上对各公寓的评价信息,供决策参考。</p> </span> <span class=".en"> <p>In order to more clearly and intuitively choose the apartment to live in next year, this article summarizes the evaluation information of each apartment on the Internet for decision-making reference.</p> </span>
公共开支结算系统 https://www.eee.dog/tech/crown-place-erp.html 2019-09-21T16:00:00.000Z 2020-09-05T13:04:51.789Z

在英国留学与4个室友合租,为了更好的控制和监管公共支出,以及维持彼此之间的公共支出平衡,我利用迎新周三天时间设计并开发除了此ERP公共开支计划系统。希望此系统能够便捷接下来一年的生活,减少大家之间的矛盾,促使充满幸福感的公共支出项目持久化OωO

I studied in the UK and shared with 4 roommates. In order to better control and monitor public expenditures and maintain the balance of public expenditures between each other, I designed and developed this ERP public expenditure planning system during the welcome Wednesday. I hope that this system will make life easier for the next year, reduce conflicts between everyone, and promote the sustainability of public expenditure projects full of happiness OωO

1.功能介绍

  • 统计日均周均流水,让公共支出可视化
  • 用户申报一次公共支出,并提交发票照片留证
  • 监视各成员间支出不均衡程度,计算方差,并可视化显示
  • 对比本周与上周的开支,给出增减比例
  • 当存在一人支出超出均值阈值,并且存在至少一人支出少于均值阈值,则会邮件这两个人产生一次内部交易
  • 当上例中收款人收到款项后,需要到平台确认收到
  • 平台所有历史公共开支及发票可查

2.系统架构

2.1 前端

前端基于一个网上找到的比特币网站平台模板,深度改造实现。值得一提的是,前端使用Ushio-js项目作为安全及日志插件,并得到了Ushio系统做背后支持。

2.2 后端

后端使用php语言编写。提供5个接口,分别提供获取账户事件,获取内部流通信息,获取公共支出信息,获取周报表,操作的功能。

mail系统使用Yimian Mail API快速构建。

2.3 数据库

数据库使用yimian-db/mysql。构建了三个表,分别用于存储流水,公共支出详情,内部流通。

2.4 图片上传

直接引用呓喵酱の图床代码,少量改写。

2.5 用户系统

目前用额外网页简单实现,等待ushio-auth项目完成后统一整合。

3. 外观

没啥可说的,摆图,自己看
imgbed_ed08c497

imgbed_ea04ad82

imgbed_a8b3adb0

1. Function introduction

  • Calculate the daily average weekly flow rate to visualize public expenditure
  • The user declares a public expenditure and submits the invoice photo certificate
  • Monitor the disequilibrium of expenditure among members, calculate the variance, and display it visually
  • Compare spending this week and last week, and give the percentage increase or decrease
  • When there is one person whose expenditure exceeds the average threshold, and there is at least one person whose expenditure is less than the average threshold, the two people will be emailed to generate an internal transaction
  • When the recipient receives the money in the above example, he needs to go to the platform to confirm receipt
  • All historical public expenditures and invoices on the platform can be checked

2. System Architecture

2.1 Frontend

The front end is based on a Bitcoin website platform template found on the Internet, and a deep transformation is realized. It is worth mentioning that the front end uses Ushio-js project as a security and logging plug-in, and got Ushio The system does behind the scenes.

2.2 Backend

The backend is written in php language. Provides 5 interfaces, which respectively provide the functions of obtaining account events, obtaining internal circulation information, obtaining public expenditure information, obtaining weekly statements, and operating.

The mail system is quickly constructed using Yimian Mail API.

2.3 Database

The database uses yimian-db/mysql. Three tables are constructed, which are used to store flow, public expenditure details, and internal circulation.

2.4 Image upload

Directly quote the code of 呓喵酱の图床 with a small amount of rewriting.

2.5 User System

At present, it is simple to implement with additional web pages, waiting for the ushio-auth project to complete the unified integration.

3. Appearance

Nothing to say, show the picture, see for yourself
imgbed_ed08c497

imgbed_ea04ad82

imgbed_a8b3adb0

]]>
<span class=".zh"> <p>在英国留学与4个室友合租,为了更好的控制和监管公共支出,以及维持彼此之间的公共支出平衡,我利用迎新周三天时间设计并开发除了此ERP公共开支计划系统。希望此系统能够便捷接下来一年的生活,减少大家之间的矛盾,促使充满幸福感的公共支出项目持久化OωO</p> </span> <span class=".en"> <p>I studied in the UK and shared with 4 roommates. In order to better control and monitor public expenditures and maintain the balance of public expenditures between each other, I designed and developed this ERP public expenditure planning system during the welcome Wednesday. I hope that this system will make life easier for the next year, reduce conflicts between everyone, and promote the sustainability of public expenditure projects full of happiness OωO</p> </span>
呓喵酱的一言API https://www.eee.dog/tech/words-api.html 2019-07-29T16:00:00.000Z 2020-09-07T15:16:37.656Z

这里是呓喵酱的语录API哦~

Hi~ This is the API of IoTcat’s Motto..

参数

  • lang: (可选)语言 e.g. lang=en(英语)/zh(中文)

请求地址

1
GET https://api.yimian.xyz/words/

示例

1
2
3
4
//随机获取一句中文语录
https://api.yimian.xyz/words/
//随机获取一句英文语录
https://api.yimian.xyz/words/?lang=en

返回值(plaintext)

1
随机一句话

Parameters

  • lang: (optional) Language setting. e.g. lang=en(English)/zh(Chinese)

Request address

1
GET https://api.yimian.xyz/words/

Example

1
2
3
4
//Get a random Chinese quotation
https://api.yimian.xyz/words/
//Get a random English quotation
https://api.yimian.xyz/words/?lang=en

Return value (plaintext)

1
Random sentence..
]]>
<span class=".zh"> <p>这里是呓喵酱的语录API哦~</p> </span> <span class=".en"> <p>Hi~ This is the API of IoTcat’s Motto..</p> </span>
网易云音乐获取API https://www.eee.dog/tech/music-api.html 2019-07-28T16:00:00.000Z 2020-09-07T15:16:36.478Z

封装好的网易云音乐API,欢迎大家调用━(`∀´)ノ亻!

The packaged NetEase Cloud Music API, welcome everyone to use ━(`∀´)ノ亻!

参数

  • type: (必填)模式类型 type=single单曲信息/playlist歌单歌曲信息/url获取歌曲/cover获取封面/lrc获取歌词
  • id: (必填,搭配type使用)歌单或歌曲id e.g. id=198401123
  • random: 仅对playlist有效,返回的歌曲是否打乱顺序,默认false. e.g. random=true
  • limit: 返回歌单最大长度 e.g. limit=10

歌单和歌曲的id可以从云音乐网页版获取。点开歌单或歌曲,查看浏览器地址栏,如下图:
Playlist Id
Single Song Id

请求地址

1
GET https://api.yimian.xyz/msc/

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//获取id为36308263的歌曲信息
https://api.yimian.xyz/msc/?type=single&id=36308263
//获取id为808097971的歌单所有歌曲信息
https://api.yimian.xyz/msc/?type=playlist&id=808097971
//获取808097971歌单前14首歌曲信息
https://api.yimian.xyz/msc/?type=playlist&id=808097971&limit=14
//随机从808097971歌单获取14首歌曲信息
https://api.yimian.xyz/msc/?type=playlist&id=808097971&limit=14&random=true
//获取36308263的mp3音乐文件
https://api.yimian.xyz/msc/?type=url&id=36308263
//获取id为3384296792803059的封面图片
https://api.yimian.xyz/msc/?type=cover&id=3384296792803059
//获取36308263歌曲的lrc歌词文件
https://api.yimian.xyz/msc/?type=lrc&id=36308263

返回值(json格式)

  • single单曲模式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
    id: "歌曲id",
    name: "歌曲名称",
    artist: "第一作者",
    album: "专辑名称",
    url: "单曲地址",
    cover: "封面地址",
    lrc: "歌词地址"
    }
  • playlist歌单模式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [
    {
    id: "歌曲id",
    name: "歌曲名称",
    artist: "第一作者",
    album: "专辑名称",
    url: "单曲地址",
    cover: "封面地址",
    lrc: "歌词地址"
    },
    {歌曲2..},
    {歌曲3..}
    ]
  • 错误:

    1
    {code: 500, err: "错误信息"}

Parameters

  • type: (Required) Mode type type=single single information/playlist song information/url get song/cover get cover/lrc get lyrics
  • id: (Required, used with type) Playlist or song id e.g. id=198401123
  • random: Only valid for playlist, whether the returned songs are out of order, the default is false. e.g. random=true
  • limit: return the maximum length of the playlist e.g. limit=10

Playlist and song id can be obtained from Cloud Music Web Version. Click to open a playlist or song, and check the browser address bar, as shown below:
Playlist Id
Single Song Id

Request address

1
GET https://api.yimian.xyz/msc/

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Get song information with id 36308263
https://api.yimian.xyz/msc/?type=single&id=36308263
//Get all song information of the playlist with id 808097971
https://api.yimian.xyz/msc/?type=playlist&id=808097971
//Get information about the first 14 songs of the 808097971 playlist
https://api.yimian.xyz/msc/?type=playlist&id=808097971&limit=14
//Get 14 song information randomly from 808097971 playlist
https://api.yimian.xyz/msc/?type=playlist&id=808097971&limit=14&random=true
//Get 36308263 mp3 music file
https://api.yimian.xyz/msc/?type=url&id=36308263
//Get the cover image with id 3384296792803059
https://api.yimian.xyz/msc/?type=cover&id=3384296792803059
//Get the lrc lyrics file of 36308263 song
https://api.yimian.xyz/msc/?type=lrc&id=36308263

Return value (json format)

  • single mode:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
    id: "Song id",
    name: "Song name",
    artist: "First Author",
    album: "Album Name",
    url: "Single address",
    cover: "Cover Address",
    lrc: "Lyrics address"
    }
  • Playlist playlist mode:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [
    {
    id: "Song id",
    name: "Song name",
    artist: "First Author",
    album: "Album Name",
    url: "Single address",
    cover: "Cover Address",
    lrc: "Lyrics address"
    },
    {Song 2..},
    {Song 3..}
    ]
  • Error:

    1
    {code: 500, err: "error message"}
]]>
<span class=".zh"> <p>封装好的网易云音乐API,欢迎大家调用━(<em>`∀´</em>)ノ亻!</p> </span> <span class=".en"> <p>The packaged NetEase Cloud Music API, welcome everyone to use ━(<em>`∀´</em>)ノ亻!</p> </span>
在家中部署智慧家庭系统 https://www.eee.dog/tech/smart-home.html 2019-07-27T16:00:00.000Z 2020-09-05T13:05:36.029Z

基于Home Assisstant搭建综合家庭照明系统,多媒体系统,水流系统的智慧家庭。技术点:天猫精灵交互,LoRa通信,MQTT协议,frp内网穿透,NAS存储,拨动开关电路改造。

Based on Home Assisstant, build a smart home with integrated home lighting system, multimedia system and water flow system. Technical points: Tmall Genie interaction, LoRa communication, MQTT protocol, FRP intranet penetration, NAS storage, and toggle switch circuit transformation.

结合所学知识,运用前沿技术,造福生活,是我长期以来的不懈追求。为了让家人体验到更加稳定、舒适智能的生活方式,同时也为了巩固憨实先前在学校smartfarm项目和我自己的ushio系统中所积累的技术基础以及架构经验,我决定在出国前,使用20到23整天时间,重构家中老旧的物联网系统。采用分层架构和面向接口、面向测试、面向文档开发原则,以稳定性(Available)可靠性(Reliable)为最优先指标,搭建一个运行目标3年以上的高度模块化的,易于远程操控的,开源的家庭软件硬件智能传感控制系统。

0 架构综述

1 硬件设计

1.1 单片机选材

使用Arduino UNO作为计算单元。一方面,Arduino Uno拥有高可靠性,我之前的智慧窗帘系统使用Arduino Uno作为主控板,平稳运行1年半未出现硬件问题。另一方面,Arduino Uno拥有较大的RAM,无需为了争夺RAM而在单片机编程上煞费苦心。

Arduino UNO的缺陷主要是价格高,但是为保障长期稳定运行,这个成本是必要的。

1.2 WiFi通信模块选材

使用ESP-01作为WiFi的通信模块。主要原因是之前学校课程使用过ESP-01搭建遥控小车,对其工作方式和性能比较了解,降低开发成本。

1.3 LoRa通信模块选材

使用安信可 LORA RA-02 LORA作为LoRa节点和LoRa网关通信模块。原因是surf项目使用的就是这个模块,比较了解它。

1.4 智能音箱选材

智能音箱作为此物联网系统人机交互的最主要界面,发挥着举足轻重的作用。经研究,我使用天猫精灵方糖R作为家用智能音箱。一方面,天猫精灵的性价比摆在那里,非常便宜。第二,与小米开发小爱同学不同,阿里开发天猫精灵的目的是提供平台,它允许开发者以各种形式接入其网络,这一点对我至关重要。

1.5 灯拨动开关

初期设想: 单向控制+复位器。
实际实现:将原有单开改造为双开,一路与继电器串联,另一路与两个pin口相连。

2 通信设计

网络拓扑图

采用WiFi+LoRa两种通信模式。在需要高速高质量通信的场景,如天猫精灵,手机,笔记本,使用WiFi作为通信手段。在WiFi信号不稳定的地方,使用LoRa进行通信。使用MQTT为应用层协议。

3 主控系统设计

使用python3开源项目Home Assistant 为基础搭建本项目的主控系统。

4 多媒体系统设计

多媒体主要由天猫精灵提供。此外,通过小米盒子,家庭网盘中的视频,图片,音乐实现了电视与音响上的播放。

5 云端支持系统设计

dns.yimian.xyz提供dns解析服务。

6 NAS存储系统设计

通过挂载从老电脑上拆卸的闲置500G机械硬盘到老IBM服务器,实现存储系统的搭建。
对局域网内,由于家里都是win系统,使用smb作为共享协议实现文件传输,支持局域网内挂载。速度稳定,全网读写10MB/s左右。对外网访问,通过http,frp反代实现,但速度较慢。


2020.6 更新

RNN实现对灯控制

基于先前积累的人体传感器数据,通过LSTM模型,使用keras训练神经网络,实现对开灯状态的预测。

Combining the knowledge I have learned and using cutting-edge technology to benefit life has been my unremitting pursuit for a long time. In order to let my family experience a more stable, comfortable and intelligent lifestyle, and to consolidate the technical foundation and architecture experience accumulated in the school smartfarm project and my own ushio system, I decided to use 20 to 23 before going abroad. All day long, reconstruct the old IoT system at home. Adopt a layered architecture and interface-oriented, test-oriented, and document-oriented development principles, with Available and Reliable as the highest priority indicators to build an operational target 3. A highly modular, easy-to-remote control, open source home software and hardware intelligent sensor control system for more than years.

0 Architecture overview

1 Hardware Design

1.1 Single Chip Microcomputer Material Selection

Use Arduino UNO as the calculation unit. On the one hand, Arduino Uno has high reliability. My previous smart curtain system used Arduino Uno as the main control board, and it ran smoothly for one and a half years without hardware problems. On the other hand, Arduino Uno has a larger RAM, so there is no need to bother to program the microcontroller in order to compete for RAM.

The main disadvantage of Arduino UNO is its high price, but this cost is necessary to ensure long-term stable operation.

1.2 WiFi communication module selection

Use ESP-01 as the WiFi communication module. The main reason is that the ESP-01 has been used to build a remote control car in the previous school courses, and I have a better understanding of its working methods and performance to reduce development costs.

1.3 LoRa communication module selection

Use Anxinke LORA RA-02 LORA as the communication module between LoRa node and LoRa gateway. The reason is that this module is used in the surf project, so I understand it better.

1.4 Smart speaker selection

As the most important interface for human-computer interaction in this Internet of Things system, smart speakers play a pivotal role. After research, I use Tmall Elf Sugar R as a home smart speaker. On the one hand, the price/performance ratio of Tmall Genie is very cheap. Second, unlike Xiaomi’s development of Xiao Ai, the purpose of Ali’s development of Tmall Genie is to provide a platform that allows developers to access its network in various forms, which is very important to me.

1.5 Light toggle switch

Initial idea: one-way control + reset device.
Actual realization: The original single-opening is transformed into double-opening, one is connected in series with the relay, and the other is connected with two pin ports.

2 Communication Design

Network Topology Diagram

Two communication modes of WiFi+LoRa are adopted. In scenarios that require high-speed and high-quality communication, such as Tmall Genie, mobile phones, and notebooks, use WiFi as a means of communication. In places where the WiFi signal is unstable, use LoRa for communication. Use MQTT as the application layer protocol.

3 Main control system design

Use the python3 open source project Home Assistant as the basis to build the main control system of this project.

4 Multimedia system design

Multimedia is mainly provided by Tmall Genie. In addition, through the Xiaomi box, the video, pictures, and music in the home network disk can be played on the TV and stereo.

5 Cloud support system design

dns.yimian.xyz provides dns resolution service.

6 NAS storage system design

By mounting the idle 500G mechanical hard disk removed from the old computer to the old IBM server, the storage system is built.
In the local area network, since the home is a win system, smb is used as a sharing protocol to realize file transfer and supports mounting in the local area network. The speed is stable, and the whole network reads and writes about 10MB/s. Access to the external network is realized through http and frp reverse generation, but the speed is slow.


2020.6 update

RNN realizes light control

Based on the previously accumulated human sensor data, the LSTM model is used to train the neural network using keras to realize the prediction of the light state.

]]>
<span class=".zh"> <p>基于Home Assisstant搭建综合家庭照明系统,多媒体系统,水流系统的智慧家庭。技术点:天猫精灵交互,LoRa通信,MQTT协议,frp内网穿透,NAS存储,拨动开关电路改造。</p> </span> <span class=".en"> <p>Based on Home Assisstant, build a smart home with integrated home lighting system, multimedia system and water flow system. Technical points: Tmall Genie interaction, LoRa communication, MQTT protocol, FRP intranet penetration, NAS storage, and toggle switch circuit transformation.</p> </span>
2019 SURF SmartFarming Proj 架构说明 https://www.eee.dog/tech/smartfarming-surf.html 2019-07-25T16:00:00.000Z 2020-09-06T16:09:30.505Z

本文详细介绍了XJTLU大学2019暑期科研SmartFarming Proj物联网架构的设计思路,实施情况以及缺陷反思。

This article introduces in detail the design ideas, implementation status and defect reflections of the SmartFarming Proj IoT architecture of XJTLU University’s 2019 summer scientific research.

1 背景

1.1 需求

为了探究农业物联网技术的可行性,Alam Mohammed导师希望我们能够提供一个稳定(Available)可靠(Reliable)的物联网系统,以实现对农田的智能监控和管理。这个系统将能够适时地探测土壤以及空气中与植物健康相关的参数,处理并存储这些数据(由Alam提出)。同时,自动化控制的灌溉功能(由Caleb提出)以及一些数据展示方法(由Alam提出的可选需求)也被期待由本系统提供。

1.2 定位

由于是针对农业物联网设计的小型科研项目,项目的目标是对农业物联网的可行性进行探究,愿景是模拟最普遍的小型农业物联网应用场景。因此本架构的定位是适用于大部分具备感知,控制和展示功能的小型农业物联网工程

2 名词解释

  • MQTT: MQTT消息队列遥测传输(Message Queuing Telemetry Transport)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议[1]。
  • LoRa: LoRa是当前市场上的一种新兴技术,其在1 GHz以下的公共频段中运行,用于远距离低功耗通信[2]。

3 设计目标

3.1 实现功能

本架构功能性需求主要包括土地数据采集,气象数据采集,灌溉系统控制,与无人机小组系统进行交互,网页控制台(可查看实时和历史传感数据,指标数据;能够控制系统)。

3.2 性能指标

  • 通信范围(测试):半径不低于1km
  • 通信范围(生产):半径不低于3km
  • 延时:平均小于1s
  • 超时率:不超过5%
  • 资源占用:节点RAM不超过2k
  • 运行周期:1分 (测试) | 15分 (生产)

4 系统环境

4.1 相关软件及硬件

节点名称 硬件设施 软件集群
土地节点
Ground Nodes
Arduino Nano Arduino.h
SX1278 LORA模块 SPI.h
LM35DZ 温度传感 LoRa.h
土壤湿度传感 LoRa-Socket.h
四分电磁阀 LoRa-mqtt.h
vector.h
气象站节点
Air Station
Arduino Nano Arduino.h
SX1278 LORA模块 SPI.h
BME280 温度,湿度,大气压强传感 LoRa.h
GY-30 光强传感 LoRa-Socket.h
MQ-135 空气质量传感 LoRa-mqtt.h
MQ-7 一氧化碳传感 vector.h
雨量传感
LoRa 网关
LoRa Gateway
SX1278 Arduino.h
SPI.h
WiFi.h
LoRa.h
LoRa-Socket.h
LoRa-mqtt.h
vector.h
PubSubClient.h
内网控制器/MQTT代理
Controler/MQTT Proxy
树莓派3B - RASPBIAN Python3.7
直流变频水泵 NodeJS
sf-mqtt-proxy@npm
sf-pump@npm
forever@npm
云服务器
Cloud Server
华为云主机 - Centos7.4 Nginx/1.12.2
NodeJS/12.4.0
Redis/3.2.12
sf-mqtt-broker@npm
sf-web-api@npm
forever@npm
数据库
Database
华为云数据库 MySQL 5.7.23

4.2 数据规模预估

按照生产场景预估,每15分钟产生一组数据集合,一组数据集合约占用253-291字节。按照291计算,每天将新增27.93KB数据。

5 设计思路

5.1 理念

  • 面向文档
  • 面向接口
  • 面向测试

5.2 关键问题

  • 土地节点RAM资源稀缺,只有2K
  • LoRa通信采用433MHz,单信道收发,干扰多
  • 服务器需要采集聚合来自多节点的散列数据
  • 预留与无人机AI小组的交互方法
  • 实时消息向前端浏览器推送

5.3 方案选择

为了优先确保通信以及服务的稳定性可拓展性,我们选取分层模型作为架构的设计模式。整个系统分成多个层级,层级之间具备必要的交互行为。每个层级都独立运行,崩溃时会迅速重启,具备高度的可靠性。

安全上,采取内外网隔离的方法。内网中考虑到部分设备计算资源稀缺,与内网服务器的交互采用不加密的通信模式。内网服务器通过SSL加密的方式与云服务器进行交互。为了确保客户端的资料安全,云服务器API只接受具备SSL加密的HTTP和WebSocket请求。

6 架构设计

6.1 基础介绍

本架构的主要目的是提供一个稳定(Available)可靠(Reliable)的物联网系统,通过采集农田中的实时数据,结合通过无人机采集的图片以及CNN判断的植物健康情况,实现对灌溉系统以及植物健康状况的智能管理。本架构理论上适用于大部分农场环境。测试环境半径2~5km(取决于天线)以内,风力3级以下。本系统通过传感器获取农田数据,通过晶体管电路,继电器等控制灌溉系统,通过网页与API与管理者进行交互。

6.2 系统层级图

Smart Farm 系统分层结构图

此图展示了此架构的抽象层级结构。正如其所指出的,此分层架构可明确为感知层网络层应用层三个横向操作层以及一个纵向错误处理层

其中,感知层又可细化为环境层以及硬件层。环境层中包含植物,土壤,空气,水流等我们要检测和控制的自然物体,硬件层通过传感器、控制器等人造电气设备为系统对自然要素的交互行为(检测,控制)提供了底层技术可行性。当感知层实现对自然信息的交互后,相应的数字信息被传往网络层进行通信。相应的,感知层也会从网络层接受相应的控制信息,并根据这些指令做出相应的控制行为。

网络层分为三层。其中最低一层为预处理层,它的主要任务是对感知层采集的数据进行打包处理,转变成网络流通所适合的形式,如套接字。因此,预处理层需要少量的计算存储资源,比如单片机,EEPROM等。经过预处理层的封装后,数据被传往物理层。基于物理层中的网关、路由器等设备,这些数据包得以被有秩序的分发和传递。通信层中的MQTT协议的应用,使得这些数据包分发的管理更加高效与便利。此外,通信层中QoS服务质量检测体系的实施也使得网络层的性能更加的容错和可靠。

应用层主要负责一些应用层面的服务于业务逻辑,比如数据分析,事件处理等。在应用层的最底端,服务层在长期的运转着。服务层是应用层中最近接网络层的部分,它的主要目的是实时处理从网络层传入的数据,并对相应的请求及错误事件进行快速响应。同时,服务层也负责将传感器采集的数据进行整理分析并传递到数据库层进行存储。为了保证服务的可靠性,服务层的实现程序被注册为系统服务并由专门的守护进程进行守护。与服务层的长期运行不同,业务层则是按需唤起。当界面层有新的请求传入或服务层发生特定的事件时,业务层将会被调用并处理它们。除了一些基础的数据分析外,业务层也有权限向AI层进行分析请求。AI层通过分析从无人机传回的图像数据后,会传回一个判断结果给业务层。根据请求的具体内容,业务层会将图像识别结果,历史传感器数据等进行整理,并传递到界面层。界面层则主要用来提供不同形式的接口,比如HTTP接口和WebSocket接口,以方便客户端调用。

6.3 系统拓扑图

Smart Farm 系统拓扑图

从拓扑结构来看,如上图所示,整个系统物理上可划分为土地节点,气象节点,LoRa网关,内网服务器,云服务器,数据库和用户终端。

从功能机制上看,整个系统包含:传感器模块,LoRa通信模块,LoRa网关模块,MQTT-Proxy代理模块,水泵控制模块,MQTT+数据处理模块,web接口模块,守护进程模块和数据库模块。

土地节点
土地节点部署于不同区域的农田中,用于探测土壤温度,湿度参数,并能够提供对相应位置水流电磁阀的控制。土地节点使用Arduino Nano作为计算单元,使用LoRa作为通信方式连接LoRa网关(和其它节点),使用电池供电。其数量较多,工作环境恶劣,无线通信不稳定,是系统中最大的不确定性来源。

气象节点
气象节点部署于农田特定位置,用于探测空气温度,湿度,大气压,降雨量,光照,NH3浓度,CO浓度等气象参数。气象节点使用Arduino Nano作为计算单元,使用LoRa作为通信方式连接LoRa网关(和土地节点),使用电池或有线供电。其工作环境较为恶劣,无线通信质量一般。

LoRa网关
LoRa网关部署于室内,为扩大有效通信半径,其天线可延伸至室外。LoRa网关通过LoRa连接各土地节点和气象节点,通过WiFi连接内网服务器。LoRa网关能够将通过LoRa传入的socket包转换为mqtt消息并传递给内网服务器,以及将内网服务器传来的mqtt消息转换为socket包通过LoRa发送至指定节点。

内网服务器
内网服务器是一个树莓派3B,它包含三个功能模块:MQTT-Proxy代理模块,水泵控制模块以及守护进程模块。

MQTT-Proxy代理模块能够接收由LoRa网关通过WiFi发送的mqtt消息,对其进行SSL加密并转发至云服务器。同时,MQTT-Proxy代理模块也将接受指定的来自云服务器的mqtt消息,将其解密并转发至LoRa网关。

水泵控制模块通过树莓派的GPIO通过继电器控制水泵的状态。与水泵控制模块直接与云服务器进行mqtt通信,不经过MQTT-Proxy代理。

守护进程模块运行在Linux上,用于监视MQTT-Proxy代理模块和水泵控制模块。当探测到模块停止运行时,守护进程模块会及时重启这些模块,以确保服务的稳定性和连续性。

云服务器
云服务器运行在位于北京的华为云上,包含MQTT+数据处理模块,web接口模块和守护进程模块。

MQTT+数据处理模块包含了层级结构中的Service层和Business层。这个模块通过mqtt与内网进行通信,通过mqtt, redis与web接口模块(和AI模块)进行交互。当收到来自内网的各种散列的数据后,本模块会自动对它们进行聚合,整理成一条一条的数据,存入数据库,并通过redis推送给web接口模块。此外,本模块会定时向各节点发送请求以获取它们的数据,这些请求将被追踪以计算延时。

web接口模块提供一系列的HTTP和WebSocket接口。这些接口可用于获取数据,发送指令,刷新数据以及获取推送消息。

守护进程模块运行在Linux上,用于监视MQTT+数据处理模块和web接口模块。当探测到模块停止运行时,守护进程模块会及时重启这些模块,以确保服务的稳定性和连续性。

7 模块说明

7.1 LoRa通信模块

LoRa通信模块用于在单信道情况下实现稳定可靠的socket通信。本模块包含LoRa-socket和LoRa-mqtt。

LoRa-socket是在LoRa-Arduino的基础上进行了数据包的封装,实现了简单的udp和tcp通信,让传统的LoRa通信更加可靠。通过在数据包的head添加收发ip地址,以及在数据包的最后添加hash校验值,LoRa-socket支持点对点通信和广播通信,并且具有强大的噪音处理能力和数据防篡改能力。
项目地址iotcat/LoRa-socket

LoRa-mqtt是在LoRa-socket基础上对mqtt协议进行的一个简单再现。基于udp和tcp,LoRa-mqtt支持qos为0和1的mqtt通信。
项目地址iotcat/LoRa-mqtt

7.2 MQTT-Proxy代理模块

本模块运行在内网服务器,实现了对内网mqtt的加密转发。
项目地址iotcat/sf-mqtt-proxy

7.3 水泵控制模块

本模块运行在内网服务器,实现了通过GPIO对继电器水泵的控制。
项目地址iotcat/sf-pump

7.4 mqtt+数据处理模块

本模块运行在云服务器,实现了对来自底层mqtt消息的数据聚合,处理和存储。
项目地址iotcat/sf-mqtt-broker

7.5 web接口模块

本模块运行在云服务器,实现了功能性接口的提供。
项目地址iotcat/sf-web-api

8 开发文档

8.1 mqtt主题

8.2 http接口

8.3 websocket接口

9 运行状态

9.1 系统延时

qos

上图展示了土地节点(左),气象节点(右),水泵(下)的延时统计折线图。由图可以看出,土地节点的平均延时在730ms左右,气象节点延时在900ms左右,水泵的延时较低,在45ms左右。

9.2 传感器数据

点击这里查看2019-7-31的气象传感器数据


Reference List:

[1] OASIS, (2015,12.10). MQTT Version 3.1.1 Plus Errata 01 [Online]. Available: https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt-v3.1.1-errata01-os-complete.html

[2] Sinha, R.S., Wei, Y. and Hwang, S.H., “A survey on LPWA technology: LoRa and NB-IoT”, in Ict Express, 3(1), pp.14-21, 2017.

1 Background

1.1 Requirements

In order to explore the feasibility of agricultural Internet of Things technology, instructor Alam Mohammed hopes that we can provide a Available and Reliable Internet of Things system to realize intelligent monitoring and management of farmland. This system will be able to timely detect the parameters related to plant health in the soil and the air, process and store these data (proposed by Alam). At the same time, the automatic control irrigation function (proposed by Caleb) and some data display methods (optional requirements proposed by Alam) are also expected to be provided by this system.

1.2 Positioning

As it is a small scientific research project designed for the agricultural Internet of Things, the goal of the project is to explore the feasibility of the agricultural Internet of Things, and the vision is to simulate the most common small-scale agricultural Internet of Things application scenarios. Therefore, the positioning of this architecture is applicable to most small agricultural IoT projects with sensing, control and display functions.

2 Glossary

  • MQTT: MQTT Message Queuing Telemetry Transport is a message protocol based on the publish/subscribe paradigm under the ISO standard (ISO/IEC PRF 20922). It works on the TCP/IP protocol suite and is a publish/subscribe message protocol designed for remote devices with low hardware performance and poor network conditions [1].
  • LoRa: LoRa is an emerging technology in the current market, which operates in the public frequency band below 1 GHz for long-distance low-power communication [2].

3 Design goals

3.1 Implementing functions

The functional requirements of this architecture mainly include land data collection, weather data collection, irrigation system control, interaction with the drone group system, web console (can view real-time and historical sensor data, index data; be able to control the system).

3.2 Performance indicators

  • Communication range (test): the radius is not less than 1km
  • Communication range (production): the radius is not less than 3km
  • Delay: average less than 1s
  • Timeout rate: no more than 5%
  • Resource occupation: Node RAM does not exceed 2k
  • Run cycle: 1 minute (test) | 15 minutes (production)

4 System Environment

Node name Hardware facilities Software cluster
Ground Nodes
Ground Nodes
Arduino Nano Arduino.h
SX1278 LORA module SPI.h
LM35DZ temperature sensor LoRa.h
土壤湿度传感 LoRa-Socket.h
Four-point solenoid valve td> LoRa-mqtt.h
vector.h
weather station node
Air Station
Arduino Nano Arduino.h
SX1278 LORA module SPI.h
BME280 温度,湿度,大气压强传感 LoRa.h
GY-30 light intensity sensor LoRa-Socket.h
MQ-135 air quality sensor LoRa-mqtt.h
MQ-7 carbon monoxide sensor< /a> vector.h
rainfall sensor
LoRa Gateway
LoRa Gateway
SX1278 Arduino.h
SPI.h
WiFi.h
LoRa.h
LoRa-Socket.h
LoRa-mqtt.h
vector.h
PubSubClient.h
Intranet Controller/MQTT Proxy
Controler/MQTT Proxy
Raspberry Pi 3B-RASPBIAN Python3.7
DC frequency conversion water pump NodeJS
sf-mqtt-proxy@npm
sf-pump@npm
forever@npm
Cloud Server
Cloud Server
Huawei Cloud Host-Centos7.4 Nginx/1.12.2
NodeJS/12.4.0
Redis/3.2.12
sf-mqtt-broker@npm
sf-web-api@npm
forever@npm
Database
Database
Huawei Cloud Database MySQL 5.7.23

4.2 Data size estimation

According to the production scenario, a data set is generated every 15 minutes, and a data set occupies about 253-291 bytes. According to 291 calculation, 27.93KB of data will be added every day.

5 Design Ideas

5.1 Idea

  • Document-oriented
  • Interface-oriented
  • Test-oriented

5.2 Key Issues

  • Land node RAM resources are scarce, only 2K
  • LoRa communication adopts 433MHz, single-channel transceiving, much interference
  • The server needs to collect and aggregate hash data from multiple nodes
  • Reserve a method of interaction with the drone AI team
  • Push real-time messages to the front-end browser

5.3 Scheme selection

In order to prioritize to ensure the stability and scalability of communication and services, we select layered model as the design mode of the architecture. The entire system is divided into multiple levels, with necessary interactions between levels. Each level runs independently, restarts quickly when it crashes, and has a high degree of reliability.

In terms of safety, the method of internal and external network isolation is adopted. Taking into account the scarcity of computing resources of some devices in the intranet, the interaction with the intranet server adopts an unencrypted communication mode. The intranet server interacts with the cloud server through SSL encryption. To ensure the security of the client’s data, the cloud server API only accepts HTTP and WebSocket requests with SSL encryption.

6 Architecture Design

6.1 Basic introduction

The main purpose of this architecture is to provide a stable (Available) and reliable Internet of Things system, which collects real-time data in farmland, combines pictures collected by drones and judged by CNN Plant health, realize intelligent management of irrigation system and plant health. This framework is theoretically suitable for most farm environments. The test environment is within a radius of 2~5km (depending on the antenna), and the wind is below level 3. This system acquires farmland data through sensors, controls the irrigation system through transistor circuits, relays, etc., and interacts with managers through web pages and APIs.

6.2 System hierarchy diagram

Smart Farm system hierarchical structure diagram

This figure shows the abstract hierarchy of this architecture. As pointed out, this layered architecture can be clearly defined as the perception layer, network layer, application layer, three horizontal operation layers, and a vertical error handling layer.

Among them, the perception layer can be further refined into environment layer and hardware layer. The environment layer contains plants, soil, air, water and other natural objects that we want to detect and control. The hardware layer provides the underlying technology for the system’s interactive behavior (detection, control) of natural elements through artificial electrical devices such as sensors and controllers. Sex. When the perception layer realizes the interaction of natural information, the corresponding digital information is transmitted to the network layer for communication. Correspondingly, the perception layer will also receive corresponding control information from the network layer, and make corresponding control actions according to these instructions.

Network layer is divided into three layers. The lowest layer is the preprocessing layer. Its main task is to package the data collected by the perception layer and transform it into a form suitable for network circulation, such as sockets. Therefore, the pre-processing layer requires a small amount of computing storage resources, such as a single-chip microcomputer, EEPROM, etc. After encapsulation by the preprocessing layer, the data is transmitted to the physical layer. Based on devices such as gateways and routers in the physical layer, these data packets can be distributed and transmitted in an orderly manner. The application of the MQTT protocol in the communication layer makes the management of these data packet distribution more efficient and convenient. In addition, the implementation of the QoS service quality detection system in the communication layer also makes the performance of the network layer more fault-tolerant and reliable.

Application layer is mainly responsible for some application-level services for business logic, such as data analysis, event processing, etc. At the bottom of the application layer, the service layer is running for a long time. The service layer is the closest part of the application layer to the network layer. Its main purpose is to process the incoming data from the network layer in real time and respond quickly to corresponding requests and error events. At the same time, the service layer is also responsible for sorting and analyzing the data collected by the sensors and passing it to the database layer for storage. In order to ensure the reliability of the service, the implementation program of the service layer is registered as a system service and guarded by a special daemon. Unlike the long-term operation of the service layer, the business layer is invoked on demand. When a new request comes in from the interface layer or a specific event occurs in the service layer, the business layer will be called and processed. In addition to some basic data analysis, the business layer also has the authority to make analysis requests to the AI ​​layer. AI layer After analyzing the image data returned from the drone, it will send back a judgment result to the business layer. According to the specific content of the request, the business layer will organize the image recognition results, historical sensor data, etc., and pass them to the interface layer. Interface layer is mainly used to provide different forms of interfaces, such as HTTP interface and WebSocket interface, to facilitate client calls.

6.3 System Topology Diagram

Smart Farm system topology diagram

From the topological structure, as shown in the figure above, the entire system can be physically divided into land nodes, weather nodes, LoRa gateways, intranet servers, cloud servers, databases and user terminals.

From the perspective of functional mechanism, the entire system includes: sensor module, LoRa communication module, LoRa gateway module, MQTT-Proxy proxy module, water pump control module, MQTT+ data processing module, web interface module, daemon module and database module.

Land Node
Land nodes are deployed in farmland in different regions to detect soil temperature and humidity parameters, and can provide control of water flow solenoid valves at corresponding locations. The land node uses Arduino Nano as the computing unit, uses LoRa as the communication method to connect to the LoRa gateway (and other nodes), and uses battery power. Its large number, harsh working environment and unstable wireless communication are the biggest source of uncertainty in the system.

Weather Node
Meteorological nodes are deployed at specific locations in farmland to detect meteorological parameters such as air temperature, humidity, atmospheric pressure, rainfall, light, NH3 concentration, and CO concentration. The weather node uses Arduino Nano as the computing unit, uses LoRa as the communication method to connect to the LoRa gateway (and the land node), and uses battery or wired power. The working environment is harsh and the wireless communication quality is average.

LoRa Gateway
The LoRa gateway is deployed indoors. In order to expand the effective communication radius, its antenna can be extended outdoors. The LoRa gateway connects to various land nodes and weather nodes through LoRa, and connects to the intranet server through WiFi. The LoRa gateway can convert the socket packet incoming through LoRa into an mqtt message and pass it to the intranet server, and convert the mqtt message from the intranet server into a socket packet and send it to the designated node through LoRa.

Intranet server
The intranet server is a Raspberry Pi 3B, which contains three functional modules: MQTT-Proxy proxy module, water pump control module and daemon process module.

MQTT-Proxy proxy module can receive the mqtt message sent by the LoRa gateway via WiFi, encrypt it with SSL and forward it to the cloud server. At the same time, the MQTT-Proxy proxy module will also accept the specified mqtt message from the cloud server, decrypt it and forward it to the LoRa gateway.

Water pump control module The state of the water pump is controlled through a relay through the GPIO of the Raspberry Pi. The mqtt communication with the water pump control module directly communicates with the cloud server without passing through the MQTT-Proxy proxy.

Daemon module runs on Linux and is used to monitor the MQTT-Proxy proxy module and the water pump control module. When modules are detected to stop running, the daemon module will restart these modules in time to ensure the stability and continuity of services.

Cloud Server
The cloud server runs on Huawei Cloud located in Beijing and includes MQTT+ data processing module, web interface module and daemon module.

MQTT+data processing module includes the Service layer and the Business layer in the hierarchical structure. This module communicates with the intranet through mqtt, and interacts with the web interface module (and AI module) through mqtt and redis. After receiving various hashed data from the intranet, this module will automatically aggregate them, organize them into one piece of data, store it in the database, and push it to the web interface module through redis. In addition, this module will periodically send requests to each node to obtain their data, and these requests will be tracked to calculate the delay.

web interface module provides a series of HTTP and WebSocket interfaces. These interfaces can be used to get data, send instructions, refresh data, and get push messages.

Daemon module runs on Linux and is used to monitor MQTT+ data processing module and web interface module. When modules are detected to stop running, the daemon module will restart these modules in time to ensure the stability and continuity of services.

7 Module description

7.1 LoRa communication module

The LoRa communication module is used to realize stable and reliable socket communication in a single channel. This module includes LoRa-socket and LoRa-mqtt.

LoRa-socket encapsulates data packets on the basis of LoRa-Arduino, realizes simple udp and tcp communication, and makes traditional LoRa communication more reliable. By adding the sending and receiving ip address to the head of the data packet, and adding the hash check value at the end of the data packet, LoRa-socket supports point-to-point communication and broadcast communication, and has powerful noise processing capabilities and data tamper resistance.
Project address: iotcat/LoRa-socket

LoRa-mqtt is a simple reproduction of the mqtt protocol based on LoRa-socket. Based on udp and tcp, LoRa-mqtt supports mqtt communication with qos 0 and 1.
Project address: iotcat/LoRa-mqtt

7.2 MQTT-Proxy proxy module

This module runs on the intranet server and realizes the encrypted forwarding of the intranet mqtt.
Project address: iotcat/sf-mqtt-proxy

7.3 Water pump control module

This module runs on the intranet server and realizes the control of the relay water pump through GPIO.
Project address: iotcat/sf-pump

7.4 mqtt+data processing module

This module runs on the cloud server and realizes the data aggregation, processing and storage of the underlying mqtt messages.
Project address: iotcat/sf-mqtt-broker

7.5 web interface module

This module runs on the cloud server and realizes the provision of functional interfaces.
Project address: iotcat/sf-web-api

8 Development Document

8.1 mqtt theme

8.2 http interface

8.3 websocket interface

9 Running status

9.1 System delay

qos

The figure above shows the line graphs of the delay statistics of the land node (left), the weather node (right), and the water pump (bottom). It can be seen from the figure that the average delay of the land node is about 730ms, the delay of the weather node is about 900ms, and the delay of the water pump is relatively low, about 45ms.

9.2 Sensor data

Click here to view the weather sensor data of 2019-7-31


Reference List:

[1] OASIS, (2015,12.10). MQTT Version 3.1.1 Plus Errata 01 [Online]. Available: https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt -v3.1.1-errata01-os-complete.html

[2] Sinha, R.S., Wei, Y. and Hwang, S.H., “A survey on LPWA technology: LoRa and NB-IoT”, in Ict Express, 3(1), pp.14-21, 2017.

]]>
<span class=".zh"> <p>本文详细介绍了XJTLU大学2019暑期科研SmartFarming Proj物联网架构的设计思路,实施情况以及缺陷反思。</p> </span> <span class=".en"> <p>This article introduces in detail the design ideas, implementation status and defect reflections of the SmartFarming Proj IoT architecture of XJTLU University’s 2019 summer scientific research.</p> </span>
Arduino中[]=重载导致的String调用问题 https://www.eee.dog/tech/arduino-operator-string-issue.html 2019-07-20T16:00:00.000Z 2020-09-05T09:49:43.136Z

最近在物联网开发中使用Arduino搭建LoRa网关和节点,发现在调用String时总遇到一些奇奇怪怪的现象。经过排查,发现是由于其它地方[]=运算符的重载所导致。

Recently, I have used Arduino to build LoRa gateways and nodes in the development of the Internet of Things, and I found that some strange phenomena are always encountered when calling String. After investigation, it was found that it was caused by overloading of the []= operator elsewhere.

为了方便,在开发节点时,我们使用了LoRa-SocketArduinoJSON作为依赖。我们发现这两个依赖分别使用时表现良好,但如果在同一个项目文件中使用,则会导致一些怪异的问题。

情况一

通过指针调用函数时String参数传递异常。代码如下:

1
2
3
inline static void _onReceived(const String& msg, const String& from, const String& to, const String& type){
(*_f)(msg, from, to, type);
};

在这个案例中,我们发现msg等String在此函数中的数值是一切正常的,可是却没有能够成功传递到_f中。经过一系列骚操作,我们得出如下结论:

  • 发现如果将String换成int或其它类型,则参数传递至_f一切正常。有问题的只有String和char类型。
  • 我们尝试过将String转换为其它类型,再转回,但是没有效果。
  • String或char类型全局变量的声明会使单片机崩溃。
  • 当我们将ArduinoJSON依赖删去,String参数的传递则一切正常。

我们从而可以得出,这种怪异现象是由于与ArduinoJSON包的冲突所致。

情况二

在使用ArduinoVector制作String类型Vector时,我们也发现了String类型的不稳定现象。神奇的是,这种现象只出现在String的使用中,其它如int类型运作良好。

这些不稳定现象可以总结如下:

  • 赋值时被截断
  • String值局部乱序
  • String值部分乱码
  • 作为参数传给函数时会失败,读取出来是空(与案例一类似)

综述

通过上述两个案例,我们可以初步总结出,这是由于[]=赋值运算符的重载与String有冲突。只要使用[]=重新定义String,即有可能出现String怪异的问题。

For convenience, we used LoRa-Socket and ArduinoJSON as dependencies when developing nodes. We found that these two dependencies perform well when used separately, but if used in the same project file, it will cause some weird problems.

Situation One

When calling a function through a pointer, the String parameter passing is abnormal. code show as below:

1
2
3
inline static void _onReceived(const String& msg, const String& from, const String& to, const String& type){
(*_f)(msg, from, to, type);
};

In this case, we found that the value of msg and other String in this function is all normal, but it was not successfully passed to _f. After a series of Sao operations, we come to the following conclusions:

  • Found that if you change String to int or other types, the parameters passed to _f are all normal. Only the String and char types are problematic.
  • We tried to convert String to other types, and then back, but to no avail.
  • The declaration of global variables of type String or char will crash the microcontroller.
  • When we delete the ArduinoJSON dependency, the passing of String parameters is normal.

We can conclude that this strange phenomenon is caused by the conflict with the ArduinoJSON package.

Situation Two

When using ArduinoVector to make a String type Vector, we also discovered the instability of the String type. The magic is that this phenomenon only occurs in the use of String, other types such as int work well.

These instabilities can be summarized as follows:

  • Truncated during assignment
  • String values ​​are locally out of order
  • Part of the String value is garbled
  • It will fail when passed as a parameter to the function, and it will be empty (similar to case 1)

Summary

Through the above two cases, we can preliminarily conclude that this is due to the conflict between the overload of the []= assignment operator and String. As long as you use []= to redefine String, string weird problems may occur.

]]>
<span class=".zh"> <p>最近在物联网开发中使用Arduino搭建LoRa网关和节点,发现在调用String时总遇到一些奇奇怪怪的现象。经过排查,发现是由于其它地方[]=运算符的重载所导致。</p> </span> <span class=".en"> <p>Recently, I have used Arduino to build LoRa gateways and nodes in the development of the Internet of Things, and I found that some strange phenomena are always encountered when calling String. After investigation, it was found that it was caused by overloading of the []= operator elsewhere.</p> </span>
随机图片API https://www.eee.dog/tech/rand-pic-api.html 2019-07-09T16:00:00.000Z 2020-09-06T16:12:46.077Z

本API基于华为云对象存储,使用华为CDN云加速,全球平均下载速度达10MB/s。API中已收录1100+张二次元图片,20+张Bing壁纸(每日自动抓取),150+张二次元头像,10+张图床上传图片。

This API is based on Huawei Cloud Object Storage and uses Huawei CDN Cloud acceleration. The global average download speed is 10MB/s. The API has included 1100+ two-dimensional pictures, 20+ Bing wallpapers (automatically captured daily), 150+ two-dimensional avatars, and 10+ pictures uploaded on the bed.

本API不承诺永久维护,使用前请务必斟酌使用风险!!

1 API地址

  • https://api.yimian.xyz/img

2 快速入门

随机二次元图片

随机Bing壁纸

随机二次元头像

随机图床图片

随机1920x1080尺寸二次元图片

3 参数列表

名称描述格式示例
type图片种类moe/wallpaper/head/imgbedtype=moe
size根据图片大小筛选??x??;
*x??;
*x*;
??-??x??;
??-??x??-??;
??-??x*
display=1920x1080;
display=1920x*;
display=1920-1950x230-500;
display=1920-1950x*;
range尺寸误差范围numberrange=100
id根据图片id筛选numberid=15
path根据路径提取图片abs pathpath=wallpaper/img_··mal.jpg
display是否以网页格式展示true/false(default)display=true
R18是否显示18禁图片true/false(default)R18=true

4 参数详解

4.1 type

二次元(默认)

bing每日壁纸

二次元头像

呓喵酱图床

こいぬちゃん

EasyVer人机验证

4.2 display

如果本参数置为true,则会禁用302跳转,直接返回完整图片编码。本方法效率极低,速度很慢,请慎用。

false(默认)

true

4.3 size

使用本参数限制图片尺寸。本参数支持以下格式:

??x??

??x*

\x??*

\x**

??-??x??

??x??-??

??-??x??-??

??-??x*

\x??-??*

4.4 range

本参数规定允许的size的误差,需搭配size使用,默认为0。

对于??型size参数

对于??-??型size参数

对于*型size参数

  • GET/POST /img?size=*x*&range=100
  • 描述: range无效

4.5 id

每一个种类都有自己的id系统,同一种类下不同图片id唯一。

二次元

bing每日壁纸

二次元头像

呓喵酱图床

4.6 path

使用绝对路径直接提取图片,优先级高于type,效率最高

4.7 R18

是否显示18禁图片,默认为false。

5 报错格式

5.1 找不到指定type类型

若找不到指定的type类型,将会自动返回一个moe类型的图片。

5.2 找不到符合条件的图片

返回JSON

1
2
3
{
"err": "错误信息"
}

每台设备每天全局调用上限500次!!

This API does not promise permanent maintenance, please be sure to consider use risks before use! !

1 API address

  • https://api.yimian.xyz/img

2 Quick start

Random two-dimensional picture

Random Bing Wallpaper

Random two-dimensional avatar

Random bed pictures

Random 1920x1080 size two-dimensional picture

3 Parameter list

NameDescriptionFormatExample
typeImage typemoe/wallpaper/head/imgbedtype=moe
sizeFilter by image size??x??;
*x??;
*x*;
??-??x??;
??-??x??-??;
??-??x*
display=1920x1080;
display=1920x*;
display=1920-1950x230-500;
display=1920-1950x*;
rangeSize error rangenumberrange=100
idFilter by image idnumberid=15
pathExtract pictures based on pathabs pathpath=wallpaper/img_··mal.jpg
displayWhether to display in web page formattrue/false(default)display=true
R18Whether to display 18 prohibited picturestrue/false(default)R18=true

4 Detailed parameters

4.1 type

Two-dimensional (default)

bing daily wallpaper

Two-dimensional avatar

Miao meow sauce picture bed

こいぬちゃん

EasyVer man-machine verification

4.2 display

If this parameter is set to true, 302 jump will be disabled and the complete picture encoding will be returned directly. This method is very low and slow. Please use it carefully.

false (default)

true

4.3 size

Use this parameter to limit the image size. This parameter supports the following formats:

??x??

??x*

\x??*

\x**

??-??x??

??x??-??

??-??x??-??

??-??x*

\x??-??*

4.4 range

This parameter specifies the allowable size error, which needs to be used with size, and the default is 0.

For the?? type size parameter

For??-?? type size parameter

For *type size parameter

  • GET/POST /img?size=*x*&range=100
  • Description: Invalid range

4.5 id

Each category has its own id system, and different image ids under the same category are unique.

*Two-dimensional *

bing daily wallpaper

Two-dimensional avatar

Miao meow sauce picture bed

4.6 path

Use absolute path to directly extract pictures, priority is higher than type, highest efficiency.

4.7 R18

Whether to display 18 prohibited pictures, the default is false.

5 Error format

5.1 Cannot find the specified type

If the specified type cannot be found, a moe type picture will be automatically returned.

5.2 Can’t find matching images

Return JSON

1
2
3
{
"err": "error message"
}

The maximum number of global calls for each device is 500 per day!!

]]>
<span class=".zh"> <p>本API基于华为云对象存储,使用华为CDN云加速,全球平均下载速度达10MB/s。API中已收录1100+张二次元图片,20+张Bing壁纸(每日自动抓取),150+张二次元头像,10+张图床上传图片。</p> </span> <span class=".en"> <p>This API is based on Huawei Cloud Object Storage and uses Huawei CDN Cloud acceleration. The global average download speed is 10MB/s. The API has included 1100+ two-dimensional pictures, 20+ Bing wallpapers (automatically captured daily), 150+ two-dimensional avatars, and 10+ pictures uploaded on the bed.</p> </span>
wIoT - 轻松物联 https://www.eee.dog/tech/wiot.html 2019-05-19T16:00:00.000Z 2020-09-06T16:14:13.377Z

基于NodeJS搭建的物联网系统,配合D1 MINI单片机,帮助你灰常快速实现物联~

The Internet of Things system based on NodeJS, combined with D1 MINI microcontroller, helps you quickly realize the Internet of Things~

正式开发文档见这里

wIoT for NodeJS

适用于NodeJS的wIoT服务器控制组件,轻松物联

项目简介

立项初衷

本项目旨在帮助不熟悉固件编程的网络开发者实现出自己的物联网应用。您仅需要一台网络内部的服务器(比如树莓派),以及若干个支持可联网(通过串口,WiFi,LoRa,蓝牙,Zigbee等)的单片机,即可轻松创建并管理属于您自己的物联网集群。

支持功能

  • ota (隔空自动更新固件)
  • 自动扫描网络内单片机
  • 通过wifi连接设置
  • 使用socket/HTTP通信

todo List

  • 支持python界面
  • 开发web面板,图像化管理
  • 支持更多单片机,比如esp8266等
  • 开发nodeJS wiot-cli 命令行程序
  • 支持nodeJS自动烧写固件,并自动配置(很重要)

使用方法

先觉条件

  • 拥有烧录好wIoT固件D1 MINI单片机
  • 一台或多台无线WiFi路由器2.4G/5G
  • 局域网内拥有一台装有NodeJS的服务器或电脑 (NodeJS装法非常简单, 请自行Google或百度)
  • 配置好npm

快速开始

单片机接入

  1. 使用MicroUSB, 5V, 或3V pin脚给单片机供电
  2. 用一根导线连接D0脚与3V3脚,持续一秒以上拔出,以重置单片机
  3. 用手机或电脑搜索它的WiFi热点,名称格式wiot-xx:xx:xx:xx:xx:xx
  4. 连接上此热点,密码为1234567890
  5. 用浏览器打开网址http://192.168.0.1,记录网页中的MAC地址,这将用于识别此单片机
  6. 配置你无线路由器的ssid(即wifi名称,注意不能有非ASCII字符,比如汉字)和密码
  7. 配置完成后热点将自动断开,单片机将连接到你的无线路由器

依赖安装

在你的项目文件夹下打开命令行,输入以下指令安装wiot:

1
$ npm install wiot

使用方法

在你的项目文件夹中新建一个app.js文件,输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var wiot = require('wiot'); //引入wiot依赖包

// 新建一个单片机对象
// 这里使用了两个参数,MAC是单片机的MAC地址,pin中指定需要OUTPUT输出的端口
// 请自行修改MAC地址的值
var MyMCU = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx", pin: {D4: wiot.OUTPUT}});


// 以下代码将实现,板载led亮1秒,灭1秒的循环

// 等待所有单品即准备就绪
wiot.begin([MyMCU], ()=>{ // 第一个参数为要等待的单片机对象数组,第二个参数为要执行的函数
// 设置计时器,每隔2000毫秒, MyMCU的3号pin口将拉高一次电平
setInterval(()=>{
MyMCU.write(wiot.D4, wiot.HIGH);
}, 2000);

// 设置计时器,延时1000毫秒后开始执行大括号中指令
setTimeout(()=>{
// 设置计时器,每隔2000毫秒,MyMCU的3号pin口将拉低一次电平
setInterval(()=>{
MyMCU.write(wiot.D4, wiot.LOW);
}, 2000);
}, 1000);
});

开始执行

在项目文件夹中打开命令行,输入以下指令:

1
node app.js

预期结果

如果一切顺利,你现在应该会发现你的板载led在闪烁了

社区支持

也许你会觉得上述代码难以理解,这是正常的,由于delay功能在JS中难以实现。但是不用担心,这些问题将会由社区中的其它开发者帮你解决。

wIoT在实现基本的单片机控制同时,也提供了丰富的扩展功能。更神奇的是,任何人都可以在wIoT中编写自己的扩展并与全世界共享它们。在这里我们可以使用wIoT官方提供的led扩展轻松实现上例功能!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var wiot = require('wiot'); //引入wiot依赖包

// 新建一个单片机对象
var MyMCU = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx", pin: {D4: wiot.OUTPUT}});

// 新建一个led模块
var led = new wiot.led(MyMCU, wiot.D4);

// 以下代码将实现,板载led亮1秒,灭1秒的循环

// 等待所有单品即准备就绪
wiot.begin([MyMCU], ()=>{

// 调用led模块构建亮1秒灭1秒的动作
led.set([wiot.HIGH, wiot.LOW], [1000, 1000]);
});

进阶设置

wiot.client

参数说明

名称默认值描述
MAC“”单片机的MAC地址
pin{D1: 0, D2: 0, D3: 0, D4: 0, D5: 0, D6: 0, D7: 0, D8: 0}pin脚的模式, 0为INPUT, 1为OUTPUT, 2为INPUT_PULLUP
hinttrue是否显示状态提示
debugfalse是否开启debug模式
ip“default”指定单片机IP, 请在长时间搜索不到IP时尝试此选项
port8848Client的TCP Socket通信端口,默认8848
ip_range“192.168.0”IP搜索字段,请在长时间搜索不到IP时尝试此选项
localIP“127.0.0.1”本机IP
OnlyHTTPfalse是否仅使用HTTP模式连接单片机
errDelayTime2000遇到网络错误时重试间隔时间(毫秒)
okDelayTime30收到网络请求后延时等待时间(毫秒)
resetDelayTime4500向单片机发送重置指令后多久不再发送新消息(毫秒)
noTryMaxTime15000经过此时间单片机仍未响应则重新发送消息(毫秒)
IntervalTime2000监听行为心跳间隔
MaxToReScanTime180000经过此事件单片机无响应则从新扫描IP地址(毫秒)
MinResearchTime5000搜索IP经过一此轮询后间隔时间(毫秒)
IpScanTimeout1IP扫描时的Ping检测超时时间(秒)
pingTimeout2心跳Ping检测的超时时间(秒)
MaxTraceBackTimes8判断连接状态所向前追溯的历史心跳个数

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var MyMCU = new wiot.client({
MAC: "xx:xx:xx:xx:xx:xx",
pin: {
D1: 0,
D2: 0,
D3: 1,
D4: 1,
D5: 0,
D6: 1,
D7: 0,
D8: 0
},
hint: true,
debug: false,
ip: "192.168.0.55",
port: 6666,
ip_range: "192.168.0",
localIP: "127.0.0.1",
errDelayTime: 2000,
okDelayTime: 30,
resetDelayTime: 4500,
noTryMaxTime: 15000,
IntervalTime: 2000,
MaxToReScanTime: 180000,
MinResearchTime: 5000,
IpScanTimeOut: 1,
pingTimeout: 2,
MaxTraceBackTimes: 8
});

方法列表

  • .write(pin: wiot.pin/number, state: iot.state/number): 向指定pin口输出状态指令,状态可以是wiot.HIGH/wiot.LOW或PWM调制(0-255数字)
  • wiot.read(pin: wiot.pin/number): 读取指定pin口状态,数字pin返回wiot.HIGH/wiot.LOW,模拟pin返回0-1024数值

事件绑定

.on(event, handler)

client事件列表

  • begin 开始于单片机正常交互
  • disConnected 与单片机断开连接
  • reConnected 与单片机恢复连接
1
2
3
4
5
6
var MCU = new wiot.client({"MAC": "xx:xx:xx:xx:xx:xx"});

MCU.on('disConnected', function () {
// 当与MCU失联时会执行此处指令
console.log('Disconnected with MCU!!');
});

.pinOn(pin, event, handler)

pin事件列表

  • on pin口电位从低到高
  • off pin口电位从高到低
  • change pin口电位变化
1
2
3
4
5
6
var MCU = new wiot.client({"MAC": "xx:xx:xx:xx:xx:xx"});

MCU.pinOn(wiot.D2, 'on', function () {
// 当MCU的D2电位由低到高时会执行
console.log('D2 from LOW to HIGH!!');
});

API

  • wiot.begin(): 单片机准备完成后开始执行
1
2
3
4
5
6
7
MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx", pin: {D4: wiot.OUTPUT}});
MCU1 = new wiot.client({MAC: "xx:xx:xx:xx:xx:ww"});

wiot.begin([MCU0, MCU1], ()=>{
//这里放你要执行的指令
//这些指令将会在MCU0和MCU1准备就绪后开始执行
});
  • wiot.loop(): 循环执行的指令,适合于条件控制语句
1
2
3
4
5
6
7
8
9
10
11
12
13
MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx", pin: {D4: wiot.OUTPUT}});
MCU1 = new wiot.client({MAC: "xx:xx:xx:xx:xx:ww"});

// 以下代码将实现: 当MCU0的D5接收到HIGH,MCU1的D4将会输出HIGH
// 当MCU0的D5接收到LOW, MCU1的D4将会输出LOW
// 本函数接受两个参数: 第一个是MCU对象数组, 第二个是参数为MCU对象数组的函数
wiot.loop([MCU0, MCU1], () => {
if(MCU1.read(wiot.D5) == wiot.HIGH){
MCU0.write(wiot.D4, wiot.HIGH);
}else{
MCU0.write(wiot.D4, wiot.LOW);
}
});

注册表

  • wiot.register.set(status1, status2, function): 向注册表中添加一条规则, status可以是值或函数,当status1==status2时会触发function。
    注册表的设计是为了方便协调各扩展模块的使用,详见下文扩展模块
  • wiot.register.set(status, function): 你也可以传入两个函数,其中status的返回值是bool型,变为true时触发function
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var myLED = wiot.led(MyMCU, wiot.D4);
var pir = wiot.pir(MyMCU, wiot.D2);

//注册一条规则,当pir探测到人时,myLED亮
wiot.register.set(pir.getStatus, wiot.HIGH, ()=>{
myLED.set(wiot.HIGH);
});

//注册一条规则,当人离开时,myLED灭
wiot.register.set(()=>{
return (wiot.LOW == pir.getStatus);
}, ()=>{
myLED.clear();
});

传感器扩展模块

LED

  • wiot.led(MCU, pin): 声明一个led模块
  • wiot.led.getStatus(): 获取led状态
  • wiot.led.set(status, time = 0, isSmooth = false): 设置led状态,起始状态,中间状态,最终状态,周期
  • wiot.led.breath(period): 设置一个呼吸灯
  • wiot.led.clear(): 重置led
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx", pin: {D4: wiot.OUTPUT}});

var myLED = wiot.led(MCU0, wiot.D4); //新建一个led对象,使用MCU0上的D4口

/* 如果myLED不亮,则点亮它 */
if(!myLED.getStatus()){
myLED.set(wiot.HIGH);
}

/* 设置一个周期为2秒的呼吸灯 */
myLED.breath(2000);

/* 设置一个亮三秒,灭四秒的led */
myLED.set([wiot.HIGH, wiot.LOW], [3000, 4000]);

/* 设置一个呼1秒吸3秒的呼吸渐变灯 */
myLED.set([wiot.LOW, wiot.HIGH], [1000, 3000], true);

/* 自定义一个先半亮2秒再全亮3秒再熄灭2秒的led灯 */
myLED.set([100, wiot.HIGH, wiot.LOW], [2000, 3000, 2000]);

/* 熄灭led */
myLED.clear();

PIR 红外人体传感器

  • wiot.pir(MCU, pin): 声明一个PIR模块
  • wiot.pir.getStatus(): 获取PIR状态,返回值wiot.HIGH(有人),wiot.LOW(无人)

事件触发器

  • wiot.pir.on(event, handler)

事件列表

  • detected 探测到人
  • undetected 人体移动出探测范围
  • change 状态改变,包括有人到无人和无人到有人
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx"});

var myPIR = wiot.pir(MCU0, wiot.D2); //新建一个pir对象,使用MCU0上的D2口

/* 输出pir状态到控制台 */
console.log(myPIR.getStatus());

/* 当探测到人,打印 "Detected People!" 到控制台 */
myPIR.on("detected", ()=>{
console.log("Detected People!");
});

/* 人移动出探测范围,打印 "No People!!" 到控制台 */
myPIR.on("undetected", ()=>{
console.log("No People!!");
});

/* 当状态改变,执行指令 */
myPIR.on("change", ()=>{
/* 你的指令 */
});

IR 红外循迹/障碍传感器

  • wiot.ir(MCU, pin): 声明一个IR模块,pin可以是模拟或数字端口
  • wiot.ir.getStatus(): 获取IR状态,返回值wiot.HIGH(有障碍),wiot.LOW(无障碍),或者0-1024数值(限模拟端口)

事件触发器

  • wiot.ir.on(event, handler)

事件列表

  • detected 探测到障碍
  • undetected 障碍消失
  • change 状态改变
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx"});

var myIR = wiot.ir(MCU0, wiot.D2); //新建一个ir对象,使用MCU0上的D2口

/* 输出ir状态到控制台 */
console.log(myIR.getStatus());

/* 当探测到物体,打印 "Detected Object!" 到控制台 */
myIR.on("detected", ()=>{
console.log("Detected Object!");
});

/* 物体移动出探测范围,打印 "No Object!!" 到控制台 */
myIR.on("undetected", ()=>{
console.log("No Object!!");
});

/* 当状态改变,执行指令 */
myIR.on("change", ()=>{
/* 你的指令 */
});

lightSensor 光敏传感器

  • wiot.lightSensor(MCU, pin): 声明一个lightSensor模块, pin可以是模拟或数字端口
  • wiot.lightSensor.getStatus(): 获取lightSensor状态,返回值wiot.HIGH(有光),wiot.LOW(无光),或者0-1024数值(限模拟端口)

事件触发器

  • wiot.light.on(event, handler)

事件列表

  • light 由暗到明
  • dark 由明到暗
  • change 状态改变
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx"});

var myLightSensor = wiot.lightSensor(MCU0, wiot.D1); //新建一个pir对象,使用MCU0上的D2口

/* 输出LightSensor状态到控制台 */
console.log(mylightSensor.getStatus());

/* 当由暗到明,打印 "Light!!!" 到控制台 */
myLightSensor.on("light", ()=>{
console.log("Light!");
});

/* 由明到暗,打印 "Dark!!" 到控制台 */
myLightSensor.on("dark", ()=>{
console.log("Dark!!");
});

/* 当状态改变,执行指令 */
myLightSensor.on("change", ()=>{
/* 你的指令 */
});

网络扩展模块

mail 邮件模块

使用本模块向指定邮箱发送邮件。自豪地引用Yimian API构建!

  • wiot.mail(to, from = "wIoT"): 声明一个mail模块,参数收件地址,发件人名称
  • wiot.mail.send(subject, body): 发送邮件,需传入主题,邮件内容
1
2
3
var mail = wiot.mail("i@iotcat.me", "wIoT Test");

mail.send("Test", "Test from wiot!!");

guguji 咕咕机模块

使用本模块向指定咕咕机发送消息。咕咕机是一款便携式私人打印机,详见官网。使用本模块需要在官网提前申请好自己的开发者ak, 详见这里。自豪地引用Yimian API构建!

  • wiot.guguji(ak, userID, memobirdID): 声明一个guguji模块,参数: 开发者ak, 用户id, 咕咕机id
  • wiot.guguji.send(msg): 发送消息,需传入待发送的消息
1
2
3
var gugu = wiot.guguji("9e55121803474371bfa25d20e554b31f", "832598", "b3ee06a8bd9b49e1");

gugu.print("This is from wIoT!!");

Quick Start

Current Support devices

  • D1 MINI

Node.js Install Node.js

Node.js is a widely used programming language for web developers. To make use of wIoT, you should first install Node.js to your computer.

For windows user, you can follow the instruction in this website

Install wIoT package

After install Node.js and configure npm successfully, you should then use npm to download wIoT package by enter following command in your command window.

1
npm install wiot

Windows user can use cmd or powershell.It should be notice that this may report error for some users. The solution is to open your cmd window as administrator. You can right click on cmd and choose run as an administrator. You can also press windows+R and input cmd then press Ctrl+Shift+Enter to open it as administrator.

Burn firmware

Connect your device to D1 MINI

  • After burning the firmware, you should try to connect your device to D1 MINI
    Follow the steps below, I’m sure it would not be a problem for such a smart person like you

1. Reset your D1 MINI

  • Find pin D0 on your D1 MINI, it should be in the middle of A0 and D5.
  • Use a wire to connect 3V3 to D0. If your MINI works normally, you would see its BUILT-IN LED blink.
  • You don’t have to wait until it stops blink, just stay for 2s, then you can pull out the wire and your MINI would reset.

2.Find your D1 MINI on your device

  • After you finish step 1, your MINI would work in AP mode, which means you can search it with your smart phone or personal computer by scanning the Wi-Fi around
  • If your MINI was reset successfully, you would find a Wi-Fi with SSID in the form of wiot-xx:xx:xx:xx:xx:xx.
    Example:
    ssid
    “xx:xx:xx:xx:xx:xx” is the MAC address of this MINI, please try to remember the address for you may use it later

The default password for D1 MINI is 1234567890, enter the password and you should be able to connect to your MINI.

Connect D1 MINI to your Wi-Fi

Congratulations, you have successfully connect your device to D1 MINI
However, this is not the end, you should now try to connect D1 MINI to your Wi-Fi
Use the device which had just been connected to D1 MINI and follow the steps below

1. Visit the control page of D1 MINI

Visit http://192.168.0.1 with the browser on your device
Normally, you would see a webpage like this:
webpage
In this page, you can see the MAC Address and wIoT version of your MINI
Again, please remember the MAC Address

2.Submit SSID and password to your MINI

From the page, you can see two blanks that ask the SSID and password of your Wi-Fi
Input information of the Wi-FI which you would like to connect your MINI, click Submit
If you have input the right SSID and password, you will see a page showing the message: Set Successfully!! Rebooting!!
Then, after a minute, you will see the SSID of D1 MINI has vanished

If you submitted the wrong message, do not try to directly reconnect to D1 MINI. Restart the whole procedure from the reset part of the last section

Execute Example Code

If you have successfully connect D1 MINI to your Wi-Fi, you can execute the example code below to realize a simple function of wIoT
Before executing the code, you should first connect a LED to D1 MINI with positive pole connect to pin D4 and negative pole connect to GND

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var wiot = require('wiot'); //Import wiot package from npm

// Create an object of single chip
// Here are two parameters, MAC is the MAC adress of single chip, the output port should be defined in pin
// The MAC address should be editted by user
var MyMCU = new wiot.client({MAC: "3C:71:BF:3A:F6:CF", pin: {D4 : 1}, hint : true});


// The following code can let the BUILTIN_LED turn on for one second and off for one second periodically

// Wait for all the chips to get ready
wiot.begin([MyMCU], ()=>{
// First parameter is the name of chip, second parameter is the function that is going to be executed

// Set timer, pin 3 of MyMCU will pull up every 2 seconds
setInterval(()=>{
MyMCU.write(wiot.D4, wiot.HIGH);
}, 2000);

// Set timer, executer the command in {} after a one-second delay
setTimeout(()=>{

// Set timer, pin 3 of MyMCU will pull down every 2 seconds
setInterval(()=>{
MyMCU.write(wiot.D4, wiot.LOW);
}, 2000);
}, 1000);
});

The LED is expected to blink after you execute the code

Advanced development

Parameters

NameDefault ValueDeclaration
MAC“”MAC Address of MCU
pin{D1: 0, D2: 0, D3: 0, D4: 0, D5: 0, D6: 0, D7: 0, D8: 0}Mode of each pin, 0 is INPUT, 1 is OUTPUT, 2is INPUT_PULLUP
hinttrueWhether print the status prompt
debugfalseWhether open the debug mode
ip“default”Specify MCU IP, please try this option when you cannot find IP for a long time
port8848TCP Socket communication port for Client, default 8848
ip_range“192.168.0”IP search field, try this option if you cannot find IP for a long time
localIP“127.0.0.1”local IP
errDelayTime2000Retry interval when network error is encountered (milliseconds)
okDelayTime30Waiting time after receiving the network request (milliseconds)
resetDelayTime4500Waiting time for stop sending new messages after sending reset instructions to MCU (milliseconds)
noTryMaxTime15000If the MCU fails to respond after this time, the message will be sent again (milliseconds).
IntervalTime2000Interval between monitoring (heartbeat)
MaxToReScanTime180000After this time, if the MCU has no response, it will scan the IP address again (in milliseconds).
MinResearchTime5000Interval between each polling
IpScanTimeout1Ping detection timeout for IP scanning (seconds)
pingTimeout2Timeout of Heartbeat Ping detection (seconds)
MaxTraceBackTimes8Determine the number of historical heartbeats traced back to the connection state

Parameters Declaration Example

General Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var MyMCU = new wiot.client({
MAC: "xx:xx:xx:xx:xx:xx",
pin: {
D1: 0,
D2: 0,
D3: 1,
D4: 1,
D5: 0,
D6: 1,
D7: 0,
D8: 0
},
hint: true,
debug: false,
ip: "192.168.0.55",
port: 6666,
ip_range: "192.168.0",
localIP: "127.0.0.1",
errDelayTime: 2000,
okDelayTime: 30,
resetDelayTime: 4500,
noTryMaxTime: 15000,
IntervalTime: 2000,
MaxToReScanTime: 180000,
MinResearchTime: 5000,
IpScanTimeOut: 1,
pingTimeout: 2,
MaxTraceBackTimes: 8
});

Event Binding

Client

.on(event, handler)

Event List of client

  • begin It begins when MCU starts to interact normally
  • disConnected Disconnect from MCU
  • reConnected Connection with MCU restored
1
2
3
4
5
6
7
8
js
var MCU = new wiot.client({"MAC": "xx:xx:xx:xx:xx:xx"});

MCU.on('disConnected', function () {

// Execute the command below when lost connection with MCU
console.log('Disconnected with MCU!!');
});

Pin

.pinOn(pin, event, handler)

Event List of pin

  • on Change output of pin from LOW to HIGH
  • off Change output of pin from HIGH to LOW
  • change Change the output of pin
1
2
3
4
5
6
7

var MCU = new wiot.client({"MAC": "xx:xx:xx:xx:xx:xx"});

MCU.pinOn(wiot.D2, 'on', function () {
// Execute when the output of D2 changes from LOW to HIGH
console.log('D2 from LOW to HIGH!!');
});

API

  • wiot.begin(): Execute when MCU is ready
1
2
3
4
5
6
7
8
9

MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx", pin: {D4: wiot.OUTPUT}});
MCU1 = new wiot.client({MAC: "xx:xx:xx:xx:xx:ww"});

wiot.begin([MCU0, MCU1], ()=>{

//Write the command you want to execute here
//These command would execute once MCU0 and MCU1 are ready
});

+
wiot.loop(): A loop command,Suitable for conditional control statements

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx", pin: {D4: wiot.OUTPUT}});
MCU1 = new wiot.client({MAC: "xx:xx:xx:xx:xx:ww"});


// Following code would realize: When pin D5 of MCU0 receive HIGH,D4 of MCU1 would output HIGH
// When pin D5 of MCU0 receive LOW,D4 of MCU1 would output LOW

// This function receives two parameters: first is an array of objects for MCU, second is a function which use MCU array of objects as its parameter

wiot.loop([MCU0, MCU1], () => {
if(MCU1.read(wiot.D5) == wiot.HIGH){
MCU0.write(wiot.D4, wiot.HIGH);
}else{
MCU0.write(wiot.D4, wiot.LOW);
}
});

Register

  • wiot.register.set(status1, status2, function): Add a rule to register that status can be either value or function,
    function would trigger if status1 == status2
    The registry is designed to facilitate the use of various extension modules, See [extension module] below (# Sensor Extension Module).

  • wiot.register.set(status, function): You can also pass in two functions, where the return value of status is of type bool, it would trigger the function if it changes to true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

var myLED = wiot.led(MyMCU, wiot.D4);
var pir = wiot.pir(MyMCU, wiot.D2);

//Sign up for a rule that says myLED lights up when pir detects a person
wiot.register.set(pir.getStatus, wiot.HIGH, ()=>{
myLED.set(wiot.HIGH);
});

//Sign up for a rule that when people leave, myLED goes off
wiot.register.set(()=>{
return (wiot.LOW == pir.getStatus);
}, ()=>{
myLED.clear();
});

Sensor extension module

LED

  • wiot.led(MCU, pin): Declare a LED module

  • wiot.led.getStatus(): Get status of LED

  • wiot.led.set(status, time = 0, isSmooth = false): Set led state, initial state, intermediate state, final state, period

  • wiot.led.breath(period): Set a breathing LED

  • wiot.led.clear(): Reset LED

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var wiot = require('wiot'); //Import wiot package from npm
MCU0 = new wiot.client({MAC: "3C:71:BF:3A:F6:CF", pin: {D4: wiot.OUTPUT}});

var myLED = wiot.led(MCU0, wiot.D4); //Create a new led object using the D4 port on MCU0

/* If myLED is not shining, light it up*/
if(!myLED.getStatus()){
myLED.set(wiot.HIGH);
}

/* Set a breathing light with cycle of 2s */
myLED.breath(2000);

/* Set a LED which light 3 seconds and off 4 seconds */
myLED.set([wiot.HIGH, wiot.LOW], [3000, 4000]);

/* Set a breathing light which use 1 second to light and 3 second to extinguish */
myLED.set([wiot.LOW, wiot.HIGH], [1000, 3000], true);

/* Set a LED which shine with half brightness for 2 seconds, shine with full brightness for 3 seconds and then dextinguish for 2 seconds */
myLED.set([100, wiot.HIGH, wiot.LOW], [2000, 3000, 2000]);

/* Turn off LED */
myLED.clear();

PIR (Passive Infrared Sensor)

  • wiot.pir(MCU, pin): Declare a PIR module
  • wiot.pir.getStatus(): Gets the PIR state, returns the value wiot.high (have people), wiot.low (no people)

Event Trigger

  • wiot.pir.on(event, handler)

Events List

  • detected Person detected
  • undetected People out of the detective field
  • change State change, includes from detected to undetected and from undetected to detected
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var wiot = require('wiot'); //Import wiot package from npm

MCU0 = new wiot.client({MAC: "3C:71:BF:3A:F6:CF"});

var myPIR = wiot.pir(MCU0, wiot.D2); //Create an object of pir, use the D2 port on MCU0

/* Output the status of pir to console */
console.log(myPIR.getStatus());

/* When human is detected,print "Detected People!" to console */
myPIR.on("detected", ()=>{
console.log("Detected People!");
});

/* When human is out of the detection zone,print "No People!!" to console */
myPIR.on("undetected", ()=>{
console.log("No People!!");
});

/* When there is a change to status, execute your command */
myPIR.on("change", ()=>{
/* Write command in here */
});

IR Infrared Sensor

  • wiot.ir(MCU, pin): Declare an IR module, pin can be analog or digital port
  • wiot.ir.getStatus(): Get IR state, return value wiot.high (with a barrier), wiot.low (with no barrier), or a value of 0-1024 (only for analog port)

Event Trigger

  • wiot.ir.on(event, handler)

Event List

  • detected Barrier detected
  • undetected Barrier vanished
  • change Change state
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx"});

var myIR = wiot.ir(MCU0, wiot.D2); //Create a new ir object using the D2 port on MCU0

/* Output ir status to console */
console.log(myIR.getStatus());

/* When an object is detected, print "Detected Object!" to the console */
myIR.on("detected", ()=>{
console.log("Detected Object!");
});

/* When the object move out of the detective area, print "No Object!!" to the console */
myIR.on("undetected", ()=>{
console.log("No Object!!");
});

/* Execute the command when state changes */
myIR.on("change", ()=>{
/* Your command */
});

lightSensor

  • wiot.lightSensor(MCU, pin): Declare a lightSensor module, pin can be analog or digital port
  • wiot.lightSensor.getStatus(): Get lightSensor state, return value wiot.HIGH(light), wiot.LOW(dark), or a value of 0-1024 (limited to analog port)

Event Trigger

  • wiot.light.on(event, handler)

Event List

  • light From dark to light
  • dark From light to dark
  • change Change state
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx"});
var myLightSensor = wiot.lightSensor(MCU0, wiot.D1); //Create a new pir object using the D2 port on MCU0

/* Output the LightSensor state to the console */
console.log(mylightSensor.getStatus());

/* When going from dark to Light, print "Light!!!" to the console */
myLightSensor.on("light", ()=>{
console.log("Light!");
});

/* When going from light to Dark, print "Dark!!" to the console */
myLightSensor.on("dark", ()=>{
console.log("Dark!!");
});

/* When the state changes, execute the command */
myLightSensor.on("change", ()=>{
/* Your command */
});

Internet Extension Module

Mail module

Use this module to send messages to the specified mailbox. Proudly built with reference to Yimian API!

  • wiot.mail(to, from = "wIoT"): Declare an mail module with sender’s name and reveiver’s address
  • wiot.mail.send(subject, body): Send email with a subject and content
1
2
3
var mail = wiot.mail("i@iotcat.me", "wIoT Test");

mail.send("Test", "Test from wiot!!");

guguji

Use this module to send messages to the specified cooing machine.Goo goo is a portable private printer, see official website.
To use this module, you need to apply for your own developer ak in advance on the official website. See here. Proudly reference Yimian API!

  • wiot.guguji(ak, userID, memobirdID): Declare a goo goo chicken module, parameter: developer’s ak, user id, cooing machine id
  • wiot.guguji.send(msg): Send message, need to pass in the message to be sent
1
2
3
var gugu = wiot.guguji("9e55121803474371bfa25d20e554b31f", "832598", "b3ee06a8bd9b49e1");

gugu.print("This is from wIoT!!");
]]>
<span class=".zh"> <p>基于NodeJS搭建的物联网系统,配合D1 MINI单片机,帮助你灰常快速实现物联~</p> </span> <span class=".en"> <p>The Internet of Things system based on NodeJS, combined with D1 MINI microcontroller, helps you quickly realize the Internet of Things~</p> </span>