00:13
在导入完成之后,如果我们没有串口,不方便接串口的话,我们可以使用led,但使用led的时候需要注意,我们和官方的UK开发板led灯的引角不一样,需要修改,那么这里我使用窗口来检测内核是不是一致成功,所以我就不需要修改led了,因为led不演示。呃,那么这个时候我们在创建完工程之后,可以先编译一下,看看有没有错。那么一般情况下来说,肯定是没错的。在确认编译完没错之后,我们进入到从getup上拉下来的源码,那么拉下来源码我们就准备开始复制文件,那么打开这个导入这个工程的位置。
01:24
然后我们在source文件夹下新建一个文件夹,用来存放ten tiny的源码。那么在源码下,我们将刚刚的底层架构、底层CPU架构支持文件复制过来。然后将科脑源码复制过来。那么因为我们用的这个IDE,它是自动把这个文件夹所有的文件包含进去的,所以我们需要删除一些文件。
02:07
比如说将一些,因为我们用的RT1062,它是M7的架构,所以我们只保留M7的架构即可。呃,将其余不需要的删除。M70阿姆V7M架构。这里只保留M7的。那么进来M7之后,可以看到我们官方是支持三种编译器的,那么这里IDE它用的是GCC系列编译器,所以我们只保留GCCGCC的一些适配文件,好这样就可以了。然后这边R文件夹就处理完了,那么在C文件夹之下,呃,C就是我们整个科,呃,整个test s内核的一些源码,那么hell就是我们用来做一些简单的驱动,驱动层适配,呃,然后PM就是我们s tiny尼用来支持低功耗的一些框架,那么这里我们不需要支持低功耗,所以我们将PM文件夹删可以删除。
03:10
呃,这样我们源码文件就复制完了,那么源码复制过来之后,还需要一个配置文件用来裁剪,那么这个配置文件我们就可以从我们官方支持的一些报中来复制过来。这其中有一个MCT组件的配置文件,可以将它先删除。那么这样我们就搞定了一个内核源码的一个复制,可以大家可以看到,其实我们TEN3是非常简洁的,所以在移植起来不需要很长的时间,呃,那么这样把源码文件全部复制过来了之后,我们接下来呃在IDE中进行一些处理,比如说呃,比如说添加C文件,还有呃,添加头文件路径,那么这里C文件它ID已经自动检测检测进来了,所以我们就不需要手动去添加了。
04:06
所以,但是接下来我们还需要添加头文件的路径。在进入设置。在。然后找到include path。那么接下来开始。添加一些空间路径。首先就是R目录下的一些头文件路径添加,大家可以看到,呃,我们pencil tiny内部基本上内核相关的头文件都是放在呃,它相关目录下的文件夹下的,所以我们只需要选到in这一集就可以了。那么这样就添加平成了一个,然后同样的方法把别的也添加进来,比如说Co m7 GCC下里。
05:04
接下来再把kel的一个科,所有的头文件都是在in include的文件夹下的,把它添加进来即可。然后to conig,因为config文件它是一个点H文件,所以也需要将它的头文架构进添加进来。添加完成之后应用。那么这样基本上就完成了我们移植n cos内核的80%的内容,那么接下来我们就需要进行一些适配操作,那么适配的时候,我们一般来说移植一个S,它需要适配两个东西,第一个就是喷的SV中断终端服务函数,那么如果如果你的如果你的逻辑工程中对喷SV中断已经进行了处理,那么需要将你原有的一些喷SV中断的服务中断服务处理函数把它屏蔽掉,因为我们test ting的内核,内核内部已经提供了pen SV的中端中端服务函数,呃,那么接下来。
06:09
SV它是用于任任务调度的,那么接下来我们还需要提供C的支持,比如说像我们呃内核内部是有一些延时函数的,比如TOD,那么这个D的。底层是需要提供一个时钟节拍的,那么这个时钟节拍就需要我们将的中段移植进来。首先我们找到RT102,它的,它对于这个函数的一些。中断服务函数的定义。大家可以看到它的名字叫。那么这个函数在内部它是提供了弱定义的,所以我们需要把它拉出来重新实现一下即可。嗯。
07:08
那么在c handle内部呢?我们需要调用pencil内核,它提供的一个CS处理函数。现在。就在点C文件最后有一个to handle,然后我们需要把这个文件来调用一下即可。那么调用这个文件,首先我们要将pencil内核的头文件包含进来,核的头文件只需要包含一个include。可以点H。可以把内核所有的头文件包含进来。
08:02
那么。这因为这是一个中函,所以它不能像普通逻的中数一样,因为这这已经是涉及到的内核,内核内的一些,所以我们进来时候需要需要判断一下前内核是不是正在跑。如果核正在跑,我们就调用提供的然果内核常。那么这个时候还有一种,还有一个机制需要我们大家注意一下,就是说呃,在ten内部,它对中函数并没有完全的接管,但是我们大家也需要,呃,因为中它比较毕竟是一个比较特殊的东西,所以大家需要调用API来在进入中,进入中的时候告诉内核我进中断了,然后在退出中断的时候来告诉内核我退出中断了。
09:12
那么这个函这个函数的A是。video.c里面。哦,不不。大家可以看到我们提供了这两个A,也就是说你在后面编写一些中务函数的时候,特别需要注意,在进来中函数以后,必须要调用调用这个API来告诉内核已经中断了,然后在你退出中断的时候要调调用这个来告诉内核你退出中了。
10:08
那么这样就基本上完成了我们的移植,那么接下来我们就是完成一些内核,添加一些代码,比如说像内核初始化,然后启动内核就可以了。初始化内核的I同样提供。不用提供,在 toc.C里面有一个to,这个I。然后在完了之后,在这儿我们需要创建一个任务,那么这会我们待会来讲。然后在创建任务完毕之后,我们需要来启动内核。启动内核是to start。
11:04
这里需要注意,我们在这儿start启动调度器了之后,调度器它是一个永不返回的,所以我们后面的基本上没有什么作用,可以把它屏蔽掉。那么这样一个基本的框架就有了,我们可以尝试编译一下,然后看看我们移植有没有错误。可以看到,如果移植成功的话,基本上是没有什么错误,那么接下来我们就开始创建一个任务看看。
12:00
看看任务移植是不是内核移植,是不是真正的成功了,那么创建任务最基本的是需要一个任务控制。然后还需要一个任务站。那么任务站的大小呢?我们可以采用宏定义的方式。嗯。这里如果你在任务函数内部需要调用的话,需要给大一点。那么接下来编写任务入口函数。
13:12
在任务入口函数内部呢,我们来打印一些东西,然后这里打,因为我们自己没有去实现的底层一些函数,所以我们直接调用了。NXP官方。提供的一个叫debug council的一些空间。是用大写的。
14:02
那么这里我们基本上一个任务就创建完成了。那么接下来我们。嗯。我们将这个任务创建起来。这里创建任务,我们需要调用的A是task,然后它提供的肯定是在task。点C里面。对,然后我们就可以照着基本上把参数传入就可以了。首先定义一个返回值。然后接下来创建任务。
15:03
首先第一个进来的参数是任务控制块指针,那么我们将刚创建的任务指针传进来。然后第二个参数是任务的一个名称,那么这个任务名称,呃在内是有限制的,它内只保存的时候只保存16个。15个字符,然后加上一个后面的结束符16个。然后接下来的一个参数是,呃,任务入口函数。也就是说定义的这个函数。在任务入口函数,大家可以看到我们定义创建任务入口函数的时候是带有一个带有一个参数的,那么这个时候我们不需要参数,所以就给它传入一个nu就行。
16:04
接下来就是任务的一个优先级,那么S内部它配置这个任务优先级最大支持的是可以进行配置,也就是这个,这里我们默认默认配置是十,所以我们就可以给他一个,比如说给他一个二或三吧。啊,这个时候大家还需要注意,在指定任务优先级的时候,因为任务优先级最小,比如说这里指定的指定了十个优先级,那么你就可以用零到九,但是九这个任务,呃,用户是不能使用的,就因为这个任务是默认留给空闲任务的。那我们这里创建一个二吧。然后就是占任务站的地址。然后任务占大小。那么最后这个时间片参数,呃,然后这个时间参数,当只有你开启了时间片调度之后,这个时间参数才是有用的,应该默认是关的。
17:08
对,默认时间调度是的,所以这个参数基本上没啥用。那么在创建完成之后,我们可以判断一下这个任务是不是创建成功了。呃,这里大家在使用的时候需要注意,我们内核提供的所有I是杠杠,那么这个类型是一个枚举类型。它在头文件中枚举出来了,所以大家可以用这个枚举来判断。哪里发生了错误?
18:04
对,可以看到基本上所有内核会发生的错误基本上都举出来了,所以大家可以用这个返回值来定位一些问题。那么这样创建任务就完了,我们来看这个任务是不是会跑起来。好,编译没问题,我们准备下载。下载成功,我们来看一下。哦,这没有放几个。
19:01
这里需要放一个。也就是他每隔一秒钟打一次。重新编译下载一下。可以看到每隔一秒钟我们打印一次,所以我们的内核移植成功,然后C也配成功,那么这里大家在一内核的时候,我来给大家。
20:06
分享一些经验吧,也就是说当你这些文件添加或者头文件路径添加完了之后,你进行了一次编译,那么当你编译的时候都发生错误,那么这个时候肯定证明你要么头文件没添加对,然后要么是这里有包含了多余的文件,所以你就要去检查你的包含C文件和头文件路径。那么如果你可以编译成功了,但是下载进去之后发现,呃,发现内核没跑起来,内核没跑起来之后,那么就是你肯定一些,比如说中断配有问题,SV中有配有问题,那么如果你发现你的任务跑起来了,但是这个一一秒不对,那么就是肯定是你C有问题,所以基本上这就是一些呃比较常见的一些问题处理方法。那么到这儿我们的内核适配就适配完成了,呃,接下来我来再给大家教一下。
21:01
因为大家可以看到,我们来给大家看一下pencil的。在我们test源码内部呢,我们提供了非常多的一些事例文件,比如说像事之类的,那么下面我就给大家教怎么把这些DEMO移植进去呢?因为我们DEMO中所有的入口都提供了一个application ENT,那么这个application entry其实就是主任务,呃,因为我们在内,我们通常我们移植的时候,我们会将这个application entry。默认这个任务的入口函数,对这个我们会给它做一个函函数的定义,那么函数的定义,也就是说如果你的工程里面是没有我们提供的DEMO文件的,它就使用你自己定义的这个弱函数。呃,那么如果我们你添加进来了一个example文件,已经重新定义了这个函数入口,那么它就会使用我们example文件的,所以这里只需要我们将这个函数进行定义即可。
22:33
你定义之后,如果没有添加DEMO,它还是正常会编译到这个这个函数入口上的。好,接下来我们将哈格DEMO移植移植进来。The example。直接把这个过来。拉到这边。
23:04
然后把一些多余的文件给它删掉,因为这个clips它是自动包含进去的。可以看到已经有一个点,然后在这边来看一下。C,那么这个时候只有一个C文件,就不需要去添加头文件了,重新编译。好边缘没问题,然后下载。那么这个时候因为有弱定义,所以它这个函数就。
24:09
所以它这个函数就不会再用了,而是他用这个下面的这个函数。对,他就会用这个。然后我们来看一下日志。没跑起来,没跑起来就证明有问题了,肯定是这个函数名不对,我们来看一下。给什么?哦,这里我知道一个这里的问题是因为你看大家看到我们这里的都是正确的,但是这边是没有没没有那个没有日志输出的,所以这个候就证明我们这边的DEMO是有问题的。
25:11
大家可以看到这个DEMO里面使用的全是小写的principle,那么这个时候因为我们底层的使用的是N之普提供的deb council组件,所以我们需要在它里面去使能只能这个小小写的。呃,可以看一下的源码。因为我们在GCC里面重定义那个的时候,它底层需要的是函数。我们一。大家可以看到它其实这段函数它定义了,但是它被它的没开,所以我们需要把这个给开了。
26:09
添加一个红定义进来。好,添加进来之后,我们重新编译一下。
27:16
好,编译完成,我们来下载一下。嗯。加载成功,来看看日志,大家可以看到这个时候DEMO就跑起来了,因为它已经正常输出了,所以如果刚刚定义了这个红之后,我们就可以在我们的DEMO中使用小写的P。那么这个时候,基本上内核相关的一些东西就介绍完毕了。呃,我们要不要在这个时候回答一下内核的一些问题?
28:03
嗯,我们直接开始吧,呃,那么接下来我们就开始讲一些呃,Test关于联网相关的一些东西,那么联网首先第一点我们是需要有一个和模组去交互的一些东西,那么我们大家知道现在的一些通信模组,它都是呃用指令去交互的,比如说像WiFi模组,E26,还有一些最常见的它都是用at去交互的。所以我们test内部实。给提供一个网架,在它上层我们又定义了一个。也就是叫C抽象层,那么这个C层的作用就是它向下。它向下会兼容不同的一些模,比如说像WiFi模N它都会兼容,那么它向上对应用,它会提供一统一的ET通信接口,呃,所以接下来我来就给大家讲讲这个东西怎么。
29:09
那么这个东西它在。然后我们大家可以看到在A里面就是框架的源码,然后我们到时候会把这个源码添加进来,那么在源码源码之外还有我刚刚说的cell,也就说socket抽象层,它的源码非常简单,就一个C和点一个点H。然后那在这个之外呢,还有一些,那它是那个,那它去兼容各种不同模组的代码在哪呢?这里我们在test里面,它称为模组驱动,在device文件夹下面,可大家可以看到我们官方提供了这么嗯,还是但是比较丰富的一个模组的支持,比如说像这个就是大家可以在子上插E20或者C100或C100等都可以插,然后像这个就是E86可以插,然后像这个它是E86腾讯云建,然后兴。
30:01
去把子上的E6。那么这次分享中,我就以这个E826为例,就是说这两个文件为例,那么接下来开始复制代码。首先叫net复制过。Ne复制过来了之后,我们还有一个device。这个时候platform比较我们可以。
31:02
然后还有。添加过。将N叉P的视频添加。这里面我们就配一个对于N的口,它是F库的一些驱动。我们进行了一个简单的。然后那么对于黑层,它的。它的头文件定义是在里面。对,这边。大家可以看到hell里面有一个hell,好,那么现在文件复制完了之后,就刚说的添加C文件,文件也不用怎么添加,添加文路径就行。啊,这个下面还需要把一些多余的东西给它去掉。
32:11
然后在下面要把一些多余的东西去掉。这样基本上就差不多了。接下来我们来添加文件路径。首先是驱动框架的一个文件路径。
33:19
然后是。后京。添加完毕之后。我们来尝试编译一下。
34:07
嗯,编译完成了之后,那么这里我们是需要使用一个检测框架,有没有成功的一个DEMO,那么这个例我们就可以暂时把它的删除掉了。检架有植成功,那么就是。看看TCP和udp的socket是不是OK?对这个问题。那么在这个文件这个DEMO里面呢,我们通过红来选择你当前用的是哪个啊,比如说这个866,就是选择使用E866,然后这使用的是这个。DC20,那么这个时候可以。
35:04
嗯。有一个文件。
36:18
添加九。再来编译一下。
37:12
可以看到编译成功证明我们移植的时候文件没有问题。那么接下来。来给大家看一下,那么at架最底层用到的首先是一个口,我们来给大家看一口配。这里面就包含了。包含了那个底层串口外设的一些初始化,比如说用的串口,它就初始化串口一,然后以及它的一些中断。那么在N的RT1062中,它还存在一个叫引角路由的一个东西,那么这个引角也就是说它初始化的串口外设之后,那么串口外设所对应的哪两个引我们并没有,呃,那个库并没有初始化,所以这个就需要我们自己去呃进行一些初始化,这里我们就可以提供的一个。
38:05
来配置引角路由。那么我们正好我们可以去看一下。我们可以去。去看一下它的窗口是接在哪个哪个引角上的。E8266,它使用的口是使用的口二。也就是说,也就是大家可以在板子上用那个M。它是接在串口二上的,所以这个时候我们就来看一下串口R对应的是哪个引角。窗口2TX对应的是GB021。
39:14
直接来搜索。嗯。这里我们就可以将它作为串口。二的发送引。完成。可以看到在这里已经配置上了,然后接下来同样的方法来配置一下X9 X9是。CPI。APIAB03。怎样搜索一下,然后把它。汉口二的发音。完,那么好,这个时候我们口号已经配置引置完成了,击更源代码,然大家可以看到这个主要新的是P点和PIN。
40:18
更新完成之后再来重新编译一下。然后大家可以在这个点里面看到。刚生成的我们配置工具所对应生成的一些源码,比如说像然后这是一,然后这个是一个通用来单的。
41:02
好,编译完成没问题的话,我们稍,因为大家可以看到这按钮是灰的,因为我们这边没有活跃工程,我们把这个工程点一下,它就变了。那么这个时候大家可以看到我基本上移植进来,没有做任何的修改,就呃把它已经开始编译下载,然后主要是来看一下口有没有正常,大家可以看到这边发出I令之后,并没有任何的一些回复,那么这个这种情况下就大家就可以基本上断定,要么是串口,要么是口中不太对。那么这个时候我们就来检查一下窗口。因为我们底层刚刚引角是口二,然后那么上面我们框架使用的是个个口,我们。
42:08
需要来指定一下。可以看到在进来的时候,这儿我们就指定窗口二,然后在这儿招AP进来。在这儿可以修改一下我们的ID。指定窗口二下来。你看看他底层配。
43:20
中也是有的。哦,这个时候。那么这个时候我一步,因为一步之后就是说我们还需指定一下的口的一些口中,因为这个时候口中这边我们底层的一个简单的驱动框架,只是说去把这个外口外设去初始化了一下,但是对于口中他只是去开一下,但是并没有提供具体的中断服务函。
44:00
大家可以看到它只是只是使能串口二的中断,但是并没有提供串口二的中断处理函数,那这个时候我们就需要来添加一下。首先来查看一下串口二的名字。这个名字,然后我们来实现一下。同样的,在进来串口中断之后,我们需要来告诉中断,我现在已经进中断了。
45:21
那么在口二这边,这边就是一个字节,接收到一个字节之后,我们就需要这一个字节来提供口框么供A。我们可以。给大家看一下。
46:01
Post bike。来给大家看一下。对,这个。那么这个时候我们需要注意,我们需要从口二他进来了之后,我们需要去接接收一个数据。收。直接从这边copy过来。
47:48
接收数据这个供的这个it。
48:22
那么这样就完成了一个从A呃的每一个数据从来,然后通个字节之后扔进窗口中进框架,那么这种效率无疑是最的。因为它是最简单的,也是率,那么率实我们还支持一种机制,比如大家如果呃,比如说像I1062,它是支持硬件口空闲中的,大家就可以用空闲中,然后在空闲中里面直接调用这个input frame来将一帧数据传入到里面,将整个整个数据。
49:14
呃,整块数据到兼容。嗯,不想使用d ma和硬件中,或者说你的平台是没有硬件中断的,你就可以使一些软件模拟的机制,呃,这里我们提供了提供了一个软件模拟机制,大家可以直接去调用。对,像这个not字节,然后这个这个拟。那么在完成数据的输入之后,我们再来尝试编译一下。
50:14
看到错误定义没进来?然后这里这个A。那么这个时候我们再来下载进来。
51:22
大家可以看到,如果有这个就证明框架已经回复过来了。那么这里因为它连不上我的云服务器,是因为云服务器上面没开端口,大家如果看到有这种日志,就证明框架已经接收到口,呃回消息了,就证明at框架是正常的。大家可以看到这种指令是已经执行OK的,那么接下来我们就开始,呃,It框架和cell已经植完毕了之后,那么就证明我们的操作系统里面已经有了一层可以使用的socket通信接口,那么我们对接腾讯云,腾讯对,我们对接腾讯云是用MQTD协议对对接上去的,所以我们这个时候还需要呃,移进来一个MQTT协议站,那么这个时候我们用的是m Qt t create这个组件。
52:14
因为MT它是底层,它是基于TP的嘛,所以我们必须要把TP搞上搞进来,然后把TP搞进来了之后再去搞这个M整个协议,因为这个协议站它整个实还是比较大的,所以你如果一次性从内核到。呃,不这样分布搞,然后直接一次性将框架驱动,然后还有组包含进来就出错了,都不知道在哪里出错,所以不好定位。搞过来。将这个组件给它复制过来。
53:05
那么这个组件里面呢,同样我们也把它一些不需要的东西给它删除掉。只保留它的源码就行。那么这里因为因为这个ID它是自动包含这些文件的,没办法。呃,那么正常情况下还。希望大家在使用这些开源组件的时候,还是保留它的文件的。
54:13
接下来我们文件添加完成了之后来看一下。然后接下来我们来添加一些头浆菌。在添加头文件路径的时候,大家可以用这种方法把这个component这个文件夹对应给它给过来,然后你看一下它里面哪些地方有头文件,哪些地方没有文件。
55:06
嗯。我待会演示完了一起回复。嗯。首先是文件夹。然后接下来。比较容易,因为它这个文文件H文件,它是C文件在一起的,比较分散,所以我们基本上每个都需要添加进来。K。好,添加完成之后,我们来编译一下,看一下。
56:01
文件有没有错误?MM些超时参数啊之类的,我给同样的搞过来。
57:02
重新给。因为这里我们使用M,嗯,MD,不使用TS,所以我们可以里面的这些相关的东西给去掉。重新编译一下。还有。
58:04
这个文件可能被我误删。好,这里头文件固进我们。没有添加对。约一个头文件。重新来编译一下。
59:18
好,编译完成之后,我们看到基本上没有什么大问题。这个日志组件没有包含进来。然后我们将这个日志组件我们用不到,所以我们将这个日志组件给它删掉。大概定义一下。这次应该可以过。
60:00
应该是又遇到问题了。大家看一下。警告。我们暂时先不管,因为呃,这个时候我们将刚的这个DEMO也要给它除掉,所以我们将这个。
61:04
的。他窗口终端的时间地方给他换个位置。换到这个文件里面来。然后将文件。因为这个文件我们待会要这个DEMO,我们待会要删除掉。好,那么接下来我们来去找这个MT的这个DEMO给复制过来。这个DEMO。可以使用。
62:01
原来这个删除。搞进来之后。同样的,先来。我们来修改一下这个DEMO。那么里面还用到了C组,所以我们把C组件也要加进来。A组件在工具。
63:04
加进来之后,我们添加C的。呃,同一件路径。嗯。这里我们选择使用866。哦。那原文件是JP312的,所以会出现一些。然后这里下修改一下六接的是哪个口,这里同样接的口二不用,然后这入网入网的S密码,然后进来。
64:05
然后那么这个完了之后就是一些对接的参数,那么这些对接的参数我们该怎么整呢?下面来给大家教一下。需要去登录一下腾讯云控制台。然后进来之后进入物联网开发平台。
65:02
创建实例。嗯,我要给大家从零开始手把手教程。那么就该。重新重建一个吧。首先是新建一个项目。然后这个项目新建完了之后,然后新建一个产品。然后这个产品。那么新建项目和产品的时候需要特别注意,那么这个时候通信方式基本上这个我们可以随便选,但是你不要选。呃,然后这个时候。腾讯云的接入是有两种方式的,一种是MTS。你可以用CA证书认证上去,那么这种密钥认证,也就是说你可以用普的MT加一平密钥证上去,这里注意一定要密钥认证,然后这样数据协我们要走平台定义的模型的协议,那么如果你觉得模型不能满足你的要求,也就是说因为这个模型就是说M平要去者,你要那么是自定M定自定义一些,呃,发送一些数据,不用循它的格式啊之类的,那么这里我们是推荐使用模型的。
66:46
好,新建产品完了之后,我们接下来就开始定义我的模型,那么我们想做一个,比如说它上报智能的一个DEMO,那么智能灯它是需要上报一个。比如说这里我们需要。
67:01
嗯。我们需要上报一个它的亮度吧。Lightness。然后这标识服务也选功能名称,我们给给一个亮度。因读是零到6535,我们这可以选择整形,然后最大值是6535。那么这个时候这个读写和它是反映在哪里呢?它是反映到。呃,也就是说我们待会会用腾讯小程序,那么腾讯这个小程序上,大家可以在扫码之后这个面板就可以看到,如果你选的是读写,那么小程序上它就会给你一个加和减的这种。按钮你可以来更,随时更改,然后更改完之后它会下下去,那么如果你读的话,它就是说只有一个数值的显示,那么对于这种读数值我们就选择读。
68:08
然后初始值成零,然后不长是一,也就是意味着你可以上报零到6535之间任意一个数,要是整数就行,然后单位是单独值。然后描述就不不用描述了。好,那么这个时候大家可以看到我新建了一个这样一个物模型,那么待会我们就可以把数据上报到这个属性上,也就是说你底层的一个设备和云端这个设备是对应上的,那么接下来这个模型定义好了之后,我们来创建一个设备。比如说我创建一个test device。好,这个设备创建好了之后,大家就可以看到平台会给你一个设备名称,然后产品ID,然后设备密钥,然后待会我们,因为我们MT,这并不是一个三元组,这只是MQTT,呃,它物联网,腾讯云物联网平台。
69:03
需要去对接平台的一些参数,我们需要这三个参数来转,我们M需要参数,就需要Python脚转。这个脚本我们在pencil的源码里面是有提供的,就是这个MKT这个。这个脚本,这个脚本是用PYTHON3。可以用心。微信。那么这个脚本运行了之后,首先第一个我们给他入一个。
70:01
Product ID就是产品ID,给它入进去。然后STEM设备名称传递进去。然后password传递进去。我们选择默认就行,因为这些东西我们不用。大家可以看到它生成的一个,呃,MT的客户端ID是这个意,然后user是这个,然后password是这个,然后我们就只需要这个就行,别的不需要。来,给它复制过来,来一波。ID。对应把ID改了。然后。
71:09
然后是password。我们从脚本里面提取出来这三个对接的信息就可以,然后别的信息就不需要提取,那么接下来就是我们的域名,因为我们的域名是八六,它是支持域名解析的,所以我们这里。更改一下这个product ID。把域名对应更改一下。然后接下来我们将也要更改一下,这个是阅,这个阅我们就可以收到上一些结果,或者是下的一些之类。我们将它这个topic的名称也是定义也是由平台先死的,前面的这些参数我们不用不用动,然后到这儿就是product ID加你的device ID就可以,然后这是product ID加device ID。
72:12
那么这里我是为了方便直接从上面提取,然后大家如果大家也可以从这产品IDID从这。然后同样的我们发布的一个这个也是同样的同样的命名规则。给他改ID。然后UID。给它改改出来。那么接下来我们还需要改一个,这那么这个改完之后我们就可以上,呃,对接到连接到云平台上了,那么我刚刚说的,呃,他对来连接的一个MQT的身份认证是在这个地方身份是有认证的,然后对我们订阅和发布的一个也是有要求的,那么对我们订阅向某个topic发送的内容也是有要求的,它是Jason格式。
73:02
然后这里我们按照这样的一个method,就是说report,这个是线索的,也就是说这条数据是一个上报数据,然后token,这个token就是用来比如说来标识这条消息的,那么为了方便取件,直接用一个写死的ID给它标识出来。那么大家当然这样可以用一个随机改给它生成,呃,然后这个里面,呃,这个就是我们来修改的一些东西,比如说这里面我们它正默认上报有一个brightness和一个的值,那么这里我们就来给它修改一下。大家在修改的时候需要注意这个转移符。比如说这里我们只上报一个。然后上报一个百分号。那么这个,因为这里我们如果按照正常的流程来说,大家是需要用C去拼接一个一个生成一个,呃,生成这一段Jason数据的,那么这里其实是为了节省一些内存资源啊之类的,呃,不需要CS那么复杂,因为拼接拼凑出来一个Jason数据,我们可以用C语言提供的SSP就直接可以把这个拼拼接出来,所以大家可以根据自己的数据模板来。
74:22
随便定义这个数据,只要你符合云这些格式,就可以注意这些符。那么这里我们将它将这个数据给它进来一个,把这个给进来就行。好,我们同时编译。标文件。好,接下来我们编译下载。
75:18
下载完成之后来看一下日志。他在对接云端,然后大家可以看到这样就上报成功,然后来看一下云端。大家可以从设备云端日志里面看到。可以看到等于零,然后也可以通过呃在线调试里面来可以看到实时的一些日志。可以看到实时上报的日志,那么比如说我们想要看某个属性,它上报的一些呢,我们可以直接从这来看,来看一看。对,这就可以看到一个曲线图。那么我们如果想要用连连。
76:03
呃,来看的话,就在这儿点击这个二维码,然后用链接扫这个码,它就可以看到,然后那么腾链接的那个面板,我们也是可以用来配置的,比如说面板配置配置。这样标注面板,然后如果你会前端,你就可以用五自定义面板来写一下。然后这样也可以配置一些,比如说我这里只有一个亮度是否显示你就然后如果你多的话,你就可以控制有些显示,有些不显示。然后样式可以,也可以给他更换样式。好,给它更换成样式一,然后保存。好,那么这个时候我们从。从内核移植到框架移植到这个设备移植。这个对接设备对接腾讯全部植成功,大家可以看到其实上报的数据也是一样的,那么这个时候我再来给大家说一下这个DEMO的逻辑吧,因为因为很多同学的制作的一制作的项目可能都是。
77:04
基于这种上报。上报模型的。来给大家解释一下这个DEMO。那么首先呢,我们如果官方,我们官方提供的一些DEMO,你怎么看呢?你进来之后肯定要看这个application ENT,因为这是相当于我们应用定义的一个主入口,那么进来之后大家可以到m t task,然后他就去调用这个task。这个task进来之后,首先第一步你要把模组这这一步就为模组初始化,那么在模组初始化的时候就可以给它传参数的,比如说你是外挂的一个比说你这里是呃,E6是接在口二的,你就给它定义成二,然后如果你的E86不对,EC200S是接口四的,那么进来就是四,就这样是有对应关系的。呃,然后这个时候。模组初始化完成了之后,接下来呢,模组初化完成之后,肯定就是有tpcket的可以通,可以用了,那么接下来就是初始化MT,那么MMT大家可以初始化的时候,首先是一些对接,比如说你要去连哪云的,云的一些IP域名,然后云的一些端口啊,然后还有这些的ID user,用户名,还有密码这些东西。
78:21
然后这些东西你从云端给它下对应下来,脚本生成,然后copy到这儿来。然后这样你就可以来订阅一些。订阅一些topic,比如说我这义的这个这个,然后订阅的时候需要注意,你订阅之后,那平台下控制指令之后,你会收到,那么收到的时候需要调用一个回调函数,就是这玩意。然后发布的时也比较简单,你发布的时候就直接用一个这个M消息发布。然后你发布完了之后,可以判断一下,呃,发布是不是成功,但是因为我们腾讯云物联网平台是你发布上去之后,他还要给你回一个,也就是说阅这个会给回一条数据,平台来给你回一条应来给你判断,来用于你判断是不是你的上报成功了,那大家可以看到,比如说我这里是有个限制的,比如说我这可以给他改一下。
79:22
比如说我给他改一个平台,不存在的。嗯,比如说改个test,然后让他上报一下。那么这个时候。Publish。那但是这个test大家可以看到我们这个属性,我们在这边定义的这个属性里面。附模型里面。他是根本没有test的这个标识符的,所以云端在收到这个消息之后,他会给你下发下去,你当前是没有这个权限,这来来publish的。
80:11
所以来大家看一下。这是一个比较值得注意的一个点。他正在入网,然后。这个时候大家可以看到它publish是OK,肯定OK,但是当它云端返回的结果返回。就这一堆东西。
81:00
都是云端返回回来的结果,那么云端返回来一个你上报状态是CODE406,然后status是没有找到这个属性,所以大家还需要进一步对云端响应的这个文来进一些进行一些解析,那么这个解析这格式肯定是需要在这个回函里面用C来解析的。所以这个时候我们大家进来之后就可以用C解,那么这个时候因为我只提取这样这个。我只因为我在C里面我只提取了这一个值,并且因为这一条数据它是比较,所以我直接在回调函数里面进行了一个解析,那么当然这个DEMO并不是很完善,如果你定义的一些平台,呃,下的一个。消息量比较大,比如说像这个里面你下发消息量很大,然后还比如说你定义的这个条数也比较多,比如说你把一些平台的一个设备属性上报,控制下发事件,然后动作这些东西全部起来了,那么这个时候你再放到这个回调函数也去解析,那么回调函数它其实。
82:08
呃,并不适合用于干长时间的干活,而且,呃,所以我们这个时候有需要提供另外一种思路,也就是说你在这个回调函数里面仅仅是用来把这个数据保存一下,然后再起一个任务,专门去负责C的这些解析,然后在这些任务消息之间,你可以通过邮箱把这个你。回调里面收到的这些数据,把它通过箱发出去,或者把它过消息指消息队列发出去,然后专门由一个C解任务来把它完成解一些解析,那么这样的话你就可以中间用来缓,比如说当你控制,比如说现在的这种形式,你在小程序上连连点两下那个开关的话,你肯定是肯定是废的,因为第二条肯定被丢掉了,你第二条回的时候,他第一条还在没执行完那。所以当你中间有一缓冲的时候,你快速的时候,比如说你三次四次,那么只要你的足可以缓四五次数据,那么你的每次数据都不会被丢掉。
83:11
所以这就是大家在实际使用的时候需要注意的一些东西,然后这个时候我是用了一个事件,因为这两个是一个分开的任务嘛,然后在这个MC task主任务完毕之后,呃,他完毕之后,他会等一个这个事件,然后这个事件来告诉他有没有上报成功,也就是说这个事件它是。这一段。这段是用来等待事件,就是看云端给我返返回的响应报文,是不是真的返回到我上报成功了。那大概就是这么这么多东西,嗯,今天的分享就到这里吧,然后看大家有没有什么问题。
84:00
呃,这个。为什么需要保留文件,那么因为我们内部它呃本身自身就是一个呃开源项目嘛,所以大家在平常那个使用开源组件的时候,也不一定是你非要保留吧,就是养成一个比较好的习惯,你可以把人家的就是保留。对,这是一个比较好的习惯,但是如果你你说你非要不保留,你就直接用,那也是也是可以的,对吧。然后第二个,一般用户怎么知道哪些文件夹是必须的。嗯,这些文件夹它是必须的,就我们每个组件都提供了一个在dock,在dock下面。在这个下面都提供了一些常用组件的一些文档,然后大家可以参照去参照这些文档,因为我们为了保证这个操作系统的简洁性,然后我们是并没有提供一个构建系统的,所以大需要大家自己手动去移植,因为呃我们将,所以我们也就将这些组件的移植做了。
85:08
做的反正比较比较简洁吧,保证保证一个操作系统的简洁性。嗯,一般比如四五个task,需要怎么定义每个的优先级,然后这里我刚说我们配置文件里面,它是默认支持十个优先级,如果你任务比较多的话,你可以把它开到20或者32的,这都是没问题的,它最大,反正你你你只要你开的任务多,你需要你就往大开,我默认是十个,然后你如果要定义45TASK的话。优先级你是可以定义,比如说你隔一级定一个,隔一级定一个,这样就我们以后你的产品有一些功能扩展的时候会留有一些余地,然后比如说你可以定义13579这种。呃,然后比如说呃,你后期想扩展再加一个任务的话,你就可以加到二上加到上,然后呃,比如说你有的任务,你甚至可以用把时间片调度给他开了,然后你用一些。
86:07
同优先级的任务都是可以的,但是要注意你在编写任务的时候一定要就让他不干,就要遵循这么一个原则,及时的把C出来,不要。呃,下发指令如何做?那么下发指令这个我其实也提供了一个DEMO进来。呃,也就是说你在刚刚的这个C,因为这个进来的时候和这个都是自由的,所以你在这。你就可以解析解析进来,那么我在官方。我在官方的这个DEMODEMO里面是有提供的。来给大家看一下代码吧。
87:00
可以看到我进来之后,我就解析了,首先解析这个method method method解析进来了之后,呃,哎,我这里给大家教一下怎么看下文吧先。你看可以点击调试,然后在线调试。呃,我这是没有开关,我先搞个开关。硬件定义功能。Led吧。行,只有开和关行。好,新建一个开关值,然后在这。太高。然后在线调试,然后这个时候你可以在这来试试看到云端下发个什么东西,比如说你在这led。然后下发,然后这个时候你就可以看到它云端下发下去的这个数据。是。我先把这个板子电断一下。
88:01
一直上报。诶,大家可以看到云端下发下去的指令也是一条Jason method,就是control,然后token,这个其实你不解析也OK,然后你可以把这个led的值先解析这个参数,然后再解析led,然后把这个值提取出来就可以,然后也就是对应到刚刚这个DEMO里面。先解析method。然后method进来之后,它因为是有两种消息可以收到的,一种是你上报的响应,然后另一种就是CTRL指令,然后CTRL进来了之后,你再解析这个,然后再解析一个L你的led属性,然后把它值提取出来,然后如果那就点个嘛。能不能照一下连WiFi的代码?连WiFi其实就是连WiFi,其实就是一条at指令嘛,加C,因为你在这。
89:02
调用。A,然后下去之后。就执行一下这条加CP这条指令,然后指令回复到OK就OK。嗯,好,那大家如果没有其他问题的话,那今天直播就到这到这。
我来说两句