CN105335155B - 一种仅需配置云端脚本即可实现不同IoT应用的方法 - Google Patents
一种仅需配置云端脚本即可实现不同IoT应用的方法 Download PDFInfo
- Publication number
- CN105335155B CN105335155B CN201510683033.5A CN201510683033A CN105335155B CN 105335155 B CN105335155 B CN 105335155B CN 201510683033 A CN201510683033 A CN 201510683033A CN 105335155 B CN105335155 B CN 105335155B
- Authority
- CN
- China
- Prior art keywords
- lua
- function
- uart
- data
- script
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000013515 script Methods 0.000 title claims abstract description 85
- 238000000034 method Methods 0.000 title claims abstract description 15
- 230000006870 function Effects 0.000 claims abstract description 170
- 230000002093 peripheral effect Effects 0.000 claims abstract description 43
- 238000000605 extraction Methods 0.000 claims abstract description 22
- 238000012545 processing Methods 0.000 claims abstract description 8
- 230000005540 biological transmission Effects 0.000 claims abstract description 7
- 230000003139 buffering effect Effects 0.000 claims description 16
- 230000003068 static effect Effects 0.000 claims description 12
- 238000004891 communication Methods 0.000 claims description 9
- 241001269238 Data Species 0.000 claims description 6
- 238000003860 storage Methods 0.000 claims description 5
- 241001123862 Mico Species 0.000 claims description 4
- 238000012937 correction Methods 0.000 claims description 4
- 238000007667 floating Methods 0.000 claims description 4
- 239000000284 extract Substances 0.000 claims description 2
- FHQVHHIBKUMWTI-ZCXUNETKSA-N 1-palmitoyl-2-oleoyl phosphatidylethanolamine Chemical compound CCCCCCCCCCCCCCCC(=O)OCC(COP(O)(=O)OCCN)OC(=O)CCCCCCC\C=C/CCCCCCCC FHQVHHIBKUMWTI-ZCXUNETKSA-N 0.000 claims 1
- 238000012795 verification Methods 0.000 claims 1
- 238000013459 approach Methods 0.000 abstract description 2
- 239000004065 semiconductor Substances 0.000 description 4
- 230000003993 interaction Effects 0.000 description 3
- 238000009826 distribution Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000004519 manufacturing process Methods 0.000 description 2
- 239000000203 mixture Substances 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 239000000463 material Substances 0.000 description 1
- 230000013011 mating Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000000630 rising effect Effects 0.000 description 1
- 238000005070 sampling Methods 0.000 description 1
- 238000004513 sizing Methods 0.000 description 1
Landscapes
- Computer And Data Communications (AREA)
Abstract
本发明公开了一种仅需配置云端脚本即可实现不同IoT应用的方法,该方法包括以下步骤:根据使用的实时操作系统RTOS类型创建一个独立任务,用于完成云模块的读写调度;利用Lua提供的接口函数启动脚本引擎,并创建Lua虚拟机;编写预执行命令脚本;实现串口、传感器硬件底层驱动;定义供脚本调用的C操作函数,并将其和Lua脚本文件加载到Lua虚拟机中;后续发送或者接收操作命令时,利用虚拟栈完成对脚本数据的提取或对接收缓冲区数据的处理,进而将发送缓冲区内容发给外围设备或调用虚拟机中的C函数进行判断、处理。本发明中云模块具有功能可定制化特性,无需重新修改固件代码即可通过云端脚本来实现对不同厂商、不同型号的外设进行自由控制。
Description
技术领域
本发明涉及物联网智能远程控制技术,尤其涉及了多厂商不同型号的外设应用问题,提出了一种只需配置云端脚本文件、无需修改固件代码甚至移动端App即可实现不同的IoT外围设备的数据交互功能的方法。
背景技术
Lua语言是一种源码开放、免费的、轻量级的脚本语言。它是由标准C编写而成,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。由于Lua的定位是嵌入到应用程序中,所以他没有提供强大的功能库,并且一个完整的Lua解释器不超过200KB便于用于嵌入式设备中。此外,Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。
目前市场上大部分使用的智能设备都是传统意义上产品,即满足特定功能、使用某一厂商生产的外围设备组成的。这些设备具有一般嵌入式设备所具有的大部分优点。但是,现阶段众多半导体厂家“百花齐放”,他们的产品也各具特色,多元化的生活、工作环境已经形成。
在很多场景下,可能需要对多个半导体厂家的外围设备进行相关控制操作。这时,传统的做法是使用多个与外围设备箱配套的智能设备,以实现一对一的精准控制操作。这样,不仅会使得操作控制变的复杂、加大购置设备成本,而且使得操作人员对多个智能设备的管理存在隐患。因为不同的半导体厂家生产的外围设备的通信数据格式并不相同,所以对于智能设备生产厂家来说,多种不同的外围设备对其软件的定型造成了一定的困难,使得智能设备的灵活性不够理想。
发明内容
本发明的目的是针对现有技术的不足而提供的一种仅需配置云端脚本即可实现不同IoT应用的方法,该方法通过为不同的外围设备设置相对应的通信的数据格式的脚本文件,将该脚本文件放在云端服务器上,通过连接网络下载到智能设备上,即可做到无需修改固件代码实现多种IoT应用。
本发明的目的是这样实现的:
一种仅需配置云端脚本即可实现不同IoT应用的方法,该方法包括以下步骤:
步骤一:首先根据所使用的实时操作系统RTOS来创建一个独立的任务,用于完成云模块的读写调度操作,即后续步骤中函数的调用将在该独立任务中执行;
步骤二:在步骤一创建的任务中调用Lua语言提供的lua_open接口函数实现启动脚本引擎和创建Lua虚拟机的操作;
步骤三:在遵循Lua语法的条件下,将用户需要云模块实现的操作编写到Lua脚本中;即在脚本中编写包含各种操作C函数的Lua命令代码;
步骤四:实现串口和传感器的硬件底层驱动;
步骤五:定义步骤三中C函数,并将其注册到Lua虚拟机中;然后将Lua脚本文件加载到Lua虚拟机中;
步骤六:当给云模块发送操作命令时,利用调度任务和Lua虚拟机合作完成对Lua脚本数据的提取;然后,根据提取的数据设置发送缓冲区内容进而调用串口驱动程序将其发给外围设备;
步骤七:当外围设备反馈给云模块数据消息时,首先,外围设备将数据消息发送到接收缓冲区;其次,C函数调用Lua脚本函数来处理接收缓冲区的数据;然后,C函数返回接收到的数据值;最后,对返回值进行判断并处理。
步骤一所述使用实时操作系统RTOS来创建一个任务是根据所使用的RTOS的种类来新建任务;即后续步骤中函数的调用将在该任务中执行;具体使用Mico实时操作系统,新建任务如下:
mico_rtos_create_thread(plua_usr_usart_thread,MICO_DEFAULT_WORKER_PRIORITY,"lua_main_thread",lua_main_thread,0x300,0);
其中,各个参数的含义:第一个参数plua_usr_usart_thread是指向任务实现函数的指针;第二个参数MICO_DEFAULT_WORKER_PRIORITY代表任务执行的优先级;第三个参数"lua_main_thread"是任务名称;第四个参数lua_main_thread是任务的句柄;第五个参数0x300是为该任务分配的堆栈空间大小;第六个参数0表示将要传给任务函数的参数。
步骤二所述的lua_open接口函数能够完成对包含各个状态变量的结构体的设置操作和虚拟机的创建;lua_State*L=lua_open(),该函数的返回值是一个指向包含各个状态变量的结构体的指针。
步骤四所述实现串口和传感器的硬件底层驱动是指温湿度传感器驱动及UART串口驱动。
所述步骤五具体包括:
步骤A1:在UART串口下,按以下格式定义C函数:设置发送缓冲区函数Buffer_Send_Tx、读取缓冲区函数Buffer_Receive_Rx、以及正确接收数据后的处理函数Uart_Ok_Cope;
static int Buffer_Send_Tx(lua_State*L);
static int Buffer_Receive_Rx(lua_State*L);
static int Uart_Ok_Cope(lua_State*L);
步骤A2:将C函数注册到Lua虚拟机中
首先,需要定义一个C函数表,表中每个元素由C函数和其在Lua脚本中被调用的名称组成;如下所示:
其次,需要调用函数luaL_register对C函数表uart_map进行注册:luaL_register(L,“uart”,uart_map);其中,第一个参数L为创建虚拟机时的函数返回值,第二个参数“uart”为C函数表注册到虚拟机后的库函数名,第三个参数uart_map为步骤A2中所示表,其为需要注册的C函数表;
步骤A3:将Lua脚本文件加载到Lua虚拟机中
利用Lua提供的luaL_loadfile函数,进行脚本文件的加载:luaL_loadfile(L,“..\uart_init.lua”);其中,参数L为创建虚拟机时的返回值,第二个参数为相应目录下的Lua脚本文件。
在说明步骤六之前,先简单介绍Lua虚拟机的工作原理,有助于后面对虚拟机操作的理解。本发明引用虚拟栈机制实现Lua和C的交互,在二者交互中,函数的参数以及返回值都利用虚拟栈来负责传递。在Lua中采用类似于数据结构中的栈操作原理—后进先出(LIFO,Last In First Out)原则;而在C中除此之外还可以通过索引的方式进行数据的读写操作,即虚拟栈中存储入栈参数和参数索引值。
所述步骤六具体包括:
步骤B1:利用调度任务和Lua虚拟机合作完成对Lua脚本数据的提取
首先,假设脚本中的数据为串口通信协议的配置参数,且格式如下:依次为使能位、数据位数、停止位、奇偶校验标识和波特率;在Lua脚本中用表即类似于C语言中的结构体来存储以上配置参数,如下所示:
uart_p1={
enable=1,→使能位
dataBits=8,→数据位数
stopBits=1,→停止位数
parityBit=0,→奇偶校验
baudRate=115200→波特率
};
上述表中意思为,将uart外设使能,定义数据格式为八位数据位、一位停止位、采用无校验(0:无校验,1:奇校验,2:偶校验)以及波特率采用115200;
其次,调用Lua接口函数获取表中某一(以dataBits为例)属性字段的值;先将表名和属性字段名分别入栈:lua_getglobal(L,“uart_p1”)、lua_getglobal(L,“dataBits”);然后提取dataBits属性字段的值:lua_gettable(L,-1),其中“-1”代表该属性字段在栈中的索引号,正数为入栈、负数为出栈操作,该操作看做先出Lua栈,后入C栈;最后取出栈顶中该属性字段的值,并调用出栈函数恢复调用函数现场:p1_enable=(int)lua_tonumber(L,-1)、lua_pop(L,1),对栈中取出的浮点型字段数值进行类型转换为整型数据,lua_pop中参数1带便从栈中将1个元素出栈;类似上述描述,获取其他参数;
步骤B2:根据提取的数据设置发送缓冲区内容进而调用串口驱动程序将其发给外围设备
首先,将上述数据定义为数组存储,即完成发送缓冲区内容的设置;然后,在Lua脚本中使用uart.uart_send函数将串口配置数据发送到外围设备即在Lua脚本中执行uart_send函数时,实际调用了其对应的C函数Buffer_Send_Tx。
所述步骤七具体包括:
步骤C1:外围设备通过串口驱动程序将数据发送到云模块的接收缓冲区;
步骤C2:在C函数中调用Lua自带的脚本函数来处理接收的数据以及接收数据的大小:lua_getglobal(L,“uart_p1_cope_readBuf”)、lua_pushnumber(L,size)、ret=lua_pcall(L,1,1,0)、data[i]=uart.uart_receive(port,index);其中,参数uart_p1_cope_readBuf为脚本中定义的缓冲区数据处理函数名;size为在缓冲区取出的一个参数,size作为参数传入uart_p1_cope_readBuf函数;lua_pcall为执行函数;在uart_p1_cope_readBuf函数中可调用注册的Buffer_Receive_Rx函数来获取接收缓冲区内容;
步骤C3:在C函数Buffer_Receive_Rx中,调用脚本函数返回接收到的数据值:port=(int)lua_tonumber(L,1)、index=(int)lua_tonumber(L,2)、data=uart_port_rx_buf[port].data[index]、lua_pushnumber(L,data);分别是获取端口号,获取索引值,将端口为port、索引值为index的数值即返回值入栈;
步骤C4:对接收到的数据进行正确性判断,若判断正确,则调用之前注册的C函数Uart_Ok_Cope进行处理。
本发明的有益效果:
将本发明植入智能设备,仅需一个智能设备就可以控制多个厂家的外围设备。不仅节省了大量的材料成本、免除了操作人员对多个智能设备的繁琐操作和管理,而且对智能设备生产厂家的软件定型提供了很大的方便,同时也不需要经常烧录不同半导体厂家的固件代码进行对外围设备的一对一匹配。本发明通过为不同的外围设备设置相对应的通信的数据格式的脚本文件,将该脚本文件放在云端服务器上,通过互联网下载到智能设备上,即可做到无需修改固件代码实现多种IoT应用。
附图说明
图1为应用本发明的结构框图;
图2为本发明流程图;
图3为虚拟机栈结构图。
具体实施方式
以下结合附图和具体实施例,对本发明作进一步的详细说明。
实施例1
以采用RS232串行通信方式与云模块交互的外围设备为例,进一步说明实施步骤:
步骤一:按照使用的RTOS的类型进行相应的新建任务操作。具体使用Mico操作系统内核,新建任务如下:
mico_rtos_create_thread(plua_usr_usart_thread,MICO_DEFAULT_WORKER_PRIORITY,"lua_main_thread",lua_main_thread,0x300,0);
其中,各个参数的含义:第一个参数是指向任务实现函数的指针;第二个参数代表任务执行的优先级;第三个参数是任务名称;第四个参数是任务的句柄;第五个参数是为该任务分配的堆栈空间大小;第六个参数表示将要传给任务函数的参数。
步骤二:在步骤一中建立的任务中调用lua_open函数即可完成对包含各个状态变量的结构体的设置操作和虚拟机的创建。lua_State*L=lua_open(),该函数的返回值是一个指向包含各个状态变量的结构体的指针。
步骤三:将要对云模块的各种操作C函数写入Lua脚本中,便于后面读写调度任务对脚本中数据的提取和对接收缓冲区数据的解析。
步骤四:实现云模块使用到的外设驱动函数,例如温湿度传感器驱动、UART串口驱动等。步骤五:定义步骤三中C函数,并将其注册到Lua虚拟机中;然后将Lua脚本文件加载到Lua虚拟机中。具体包括:
步骤A1:以UART串口为例,按以下格式定义C函数:设置发送缓冲区函数Buffer_Send_Tx、读取缓冲区函数Buffer_Receive_Rx、以及正确接收数据后的处理函数Uart_Ok_Cope。
static int Buffer_Send_Tx(lua_State*L);
static int Buffer_Receive_Rx(lua_State*L);
static int Uart_Ok_Cope(lua_State*L);
步骤A2:将C函数注册到Lua虚拟机中。首先,需要声明一个结构数组,每个数组元素由C函数和其在Lua脚本中被调用的名称组成。如下所示:
其次,需要调用该函数对C函数库进行注册:luaL_register(L,“uart”,uart_map)。其中,L为创建虚拟机时的函数返回值,字符串“uart”为C函数注册到虚拟机中的库函数名,uart_map为步骤A2中所述的表,对应需要注册的库函数列表。
步骤A4:将Lua脚本文件加载到Lua虚拟机中。利用Lua提供的luaL_loadfile函数,进行脚本文件的加载:luaL_loadfile(L,“..\uart_init.lua”)。其中,参数L为创建虚拟机时的返回值,第二个参数为相应目录下的Lua脚本文件。
步骤六:当给云模块发送操作命令时,利用调度任务和Lua虚拟机合作完成对Lua脚本数据的提取;然后,根据提取的数据设置发送缓冲区内容进而调用串口驱动程序将其发给外围设备。具体包括:
步骤B1:利用调度任务和Lua虚拟机合作完成对Lua脚本数据的提取。首先,假设脚本中的数据为串口通信协议的配置参数,且格式如下:依次为使能位、数据位数、停止位、奇偶校验标识和波特率。在Lua脚本中用表(类似于C语言中的结构体)来存储以上配置参数,如下所示:
uart_p1={
enable=1,→使能位
dataBits=8,→数据位数
stopBits=1,→停止位数
parityBit=0,→奇偶校验
baudRate=115200→波特率
};
上述表中意思为,将uart外设使能,定义数据格式为八位数据位、一位停止位、采用无校验(0:无校验,1:奇校验,2:偶校验)以及波特率采用115200。
步骤B2:利用调度任务和Lua虚拟机合作完成对Lua脚本数据的提取。其次,调用Lua接口函数获取表中某一(以dataBits为例)属性字段的值。首先将表名和属性字段名分别入栈:lua_getglobal(L,“uart_p1”)、lua_getglobal(L,“dataBits”);然后提取dataBits属性字段的值:lua_gettable(L,-1),其中‘-1’代表该属性字段在栈中的索引号,正数为入栈、负数为出栈操作(该操作可看做先出Lua栈,后入C栈);最后取出栈顶中该属性字段的值,并调用出栈函数恢复调用函数现场:p1_enable=(int)lua_tonumber(L,-1)、lua_pop(L,1),对栈中取出的浮点型字段数值进行类型转换为整型数据,lua_pop中参数1带便从栈中将1个元素出栈。类似上述描述,获取其他参数。
步骤B3:根据提取的数据设置发送缓冲区内容进而调用串口驱动程序将其发给外围设备。首先,将上述数据定义为数组存储,即完成发送缓冲区内容的设置;然后,在Lua脚本中使用uart.uart_send函数将串口配置数据发送到外围设备(在Lua脚本中执行uart_send函数时,实际调用了其对应的C函数Buffer_Send_Tx)。
步骤七:当外围设备反馈给云模块数据消息时,首先,外围设备将数据消息发送到接收缓冲区;其次,C函数调用Lua脚本函数来处理接收缓冲区的数据;然后,C函数返回接收到的数据值;最后,对返回值进行判断并处理。具体包括:
步骤C1:首先,外围设备通过串口驱动程序将数据发送到云模块的接收缓冲区。
步骤C2:其次,在C函数中调用Lua自带的脚本函数来处理接收的数据以及接收数据的大小:lua_getglobal(L,“uart_p1_cope_readBuf”)、lua_pushnumber(L,size)、ret=lua_pcall(L,1,1,0)、data[i]=uart.uart_receive(port,index)。其中,参数uart_p1_cope_readBuf为脚本中定义的缓冲区数据处理函数名;size为在缓冲区取出的一个参数,size作为参数传入uart_p1_cope_readBuf函数;lua_pcall为执行函数;在uart_p1_cope_readBuf函数中可调用步骤五中注册的Buffer_Receive_Rx函数来获取接收缓冲区内容。
步骤C3:然后,在C函数Buffer_Receive_Rx中,调用脚本函数返回接收到的数据值:port=(int)lua_tonumber(L,1)、index=(int)lua_tonumber(L,2)、data=uart_port_rx_buf[port].data[index]、lua_pushnumber(L,data);分别是获取端口号,获取索引值,将端口为port、索引值为index的数值(即返回值)入栈。
步骤C4:最后,对接收到的数据进行正确性判断,若判断正确,则调用之前注册的C函数Uart_Ok_Cope进行处理。
实施例2
以采用SPI通信方式与云模块交互的外围设备模块为例,进一步说明实施步骤:
步骤一:按照使用的RTOS的类型进行相应的新建任务操作。具体使用Mico操作系统内核,新建任务如下:
mico_rtos_create_thread(plua_usr_spi_thread,MICO_SPI_WORKER_PRIORITY,"lua_spi_thread",lua_spi_thread,0x400,0);
其中,各个参数的含义:第一个参数是指向任务实现函数的指针;第二个参数代表任务执行的优先级;第三个参数是任务名称;第四个参数是任务的句柄;第五个参数是为该任务分配的堆栈空间大小;第六个参数表示将要传给任务函数的参数。
步骤二:在步骤一中建立的任务中调用lua_open函数即可完成对包含各个状态变量的结构体的设置操作和虚拟机的创建。lua_State*L=lua_open(),该函数的返回值是一个指向包含各个状态变量的结构体的指针。
步骤三:将要对云模块的各种操作C函数写入Lua脚本中,便于后面读写调度任务对脚本中数据的提取和对接收缓冲区数据的解析。
步骤四:实现云模块使用到的外设驱动函数——DAC驱动。
步骤五:定义步骤三中C函数,并将其注册到Lua虚拟机中;然后将Lua脚本文件加载到Lua虚拟机中。具体包括:
步骤A1:按以下格式定义C函数:设置写入函数spi_write、读取函数spi_read。
static intspi_write(lua_State*L);
static int spi_read(lua_State*L);
static int spi_ok_cope(lua_State*L);
步骤A2:将C函数注册到Lua虚拟机中。首先,需要声明一个结构数组,每个数组元素由C函数和其在Lua脚本中被调用的名称组成。如下所示:
其次,需要调用该函数对C函数库进行注册:luaL_register(L,“spi”,spi_map)。其中,L为创建虚拟机时的函数返回值,字符串“spi”为C函数注册到虚拟机中的库函数名,spi_map为步骤A2中所述的表,对应需要注册的库函数列表。
步骤A4:将Lua脚本文件加载到Lua虚拟机中。利用Lua提供的luaL_loadfile函数,进行脚本文件的加载:luaL_loadfile(L,“..\spi_init.lua”)。其中,参数L为创建虚拟机时的返回值,第二个参数为相应目录下的Lua脚本文件。
步骤六:当给云模块发送数据时,利用调度任务和Lua虚拟机合作完成对Lua脚本数据的提取;然后,把提取的数据发给DAC。具体包括:
步骤B1:利用调度任务和Lua虚拟机合作完成对Lua脚本数据的提取。首先,假设脚本中的数据为SPI通信协议的配置参数,且格式如下:依次为串行时钟速率、时钟相位极性、工作模式和位速率、数据宽度。在Lua脚本中用表(类似于C语言中的结构体)来存储以上配置参数,如下所示:
上述表中意思为,将spi外设使能,定义数据格式为采用16M时钟速率、相位极性为低电压上升沿采样、主机发送模式、位速率为100000bit/s以及数据位宽为8。
步骤B2:利用调度任务和Lua虚拟机合作完成对Lua脚本数据的提取。其次,调用Lua接口函数获取表中某一(以sysclock为例)属性字段的值。首先将表名和属性字段名分别入栈:lua_getglobal(L,“spi_p1”)、lua_getglobal(L,“sysclock”);然后提取dataBits属性字段的值:lua_gettable(L,-1),其中‘-1’代表该属性字段在栈中的索引号,正数为入栈、负数为出栈操作(该操作可看做先出Lua栈,后入C栈);最后取出栈顶中该属性字段的值,并调用出栈函数恢复调用函数现场:p1_enable=(int)lua_tonumber(L,-1)、lua_pop(L,1),对栈中取出的浮点型字段数值进行类型转换为整型数据,lua_pop中参数1带便从栈中将1个元素出栈。类似上述描述,获取其他参数。
步骤B3:根据提取的数据设置发送缓冲区内容进而调用spi驱动程序将其发给外围设备。首先,将上述数据定义为数组存储,即完成发送缓冲区内容的设置;然后,在Lua脚本中使用spi.write函数将spi配置参数发送到外围设备(在Lua脚本中执行write函数时,实际调用了其对应的C函数spi_write)。
步骤七:当外围设备反馈给云模块数据消息时,首先,外围设备将数据消息发送到接收缓冲区;其次,C函数调用Lua脚本函数来处理接收缓冲区的数据;然后,C函数返回接收到的数据值;最后,对返回值进行判断并处理。具体包括:
步骤C1:首先,外围设备通过spi驱动程序将数据发送到云模块的接收缓冲区。
步骤C2:其次,在C函数中调用Lua自带的脚本函数来处理接收的数据以及接收数据的大小:lua_getglobal(L,“spi_p1_cope_readBuf”)、lua_pushnumber(L,size)、ret=lua_pcall(L,1,1,0)、data[i]=spi.read(port,index)。其中,参数spi_p1_cope_readBuf为脚本中定义的缓冲区数据处理函数名;size为在缓冲区取出的一个参数,size作为参数传入spi_p1_cope_readBuf函数;lua_pcall为执行函数;在spi_p1_cope_readBuf函数中可调用步骤五中注册的spi_read函数来获取接收缓冲区内容。
步骤C3:然后,在C函数spi_read中,调用脚本函数返回接收到的数据值:port=(int)lua_tonumber(L,1)、index=(int)lua_tonumber(L,2)、data=spi_port_rx_buf[port].data[index]、lua_pushnumber(L,data);分别是获取端口号,获取索引值,将端口为port、索引值为index的数值(即返回值)入栈。
步骤C4:最后,对接收到的数据进行正确性判断,若判断正确,则调用之前注册的C函数spi_ok_cope进行处理。
Claims (7)
1.一种仅需配置云端脚本即可实现不同IoT应用的方法,其特征在于,该方法包括以下步骤:
步骤一:首先根据所使用的实时操作系统RTOS来创建一个独立的任务,用于完成云模块的读写调度操作,即后续步骤中函数的调用将在该独立任务中执行;
步骤二:在步骤一创建的任务中调用Lua语言提供的lua_open接口函数实现启动脚本引擎和创建Lua虚拟机的操作;
步骤三:在遵循Lua语法的条件下,将用户需要云模块实现的操作编写到Lua脚本中;即在脚本中编写包含各种操作C函数的Lua命令代码;
步骤四:实现串口和传感器的硬件底层驱动;
步骤五:定义步骤三中C函数,并将其注册到Lua虚拟机中;然后将Lua脚本文件加载到Lua虚拟机中;
步骤六:当给云模块发送操作命令时,利用调度任务和Lua虚拟机合作完成对Lua脚本数据的提取;然后,根据提取的数据设置发送缓冲区内容进而调用串口驱动程序将其发给外围设备;
步骤七:当外围设备反馈给云模块数据消息时,首先,外围设备将数据消息发送到接收缓冲区;其次,C函数调用Lua脚本函数来处理接收缓冲区的数据;然后,C函数返回接收到的数据值;最后,对返回值进行判断并处理。
2.如权利要求1所述的方法,其特征在于,步骤一所述使用实时操作系统RTOS来创建一个独立任务是根据所使用的RTOS的种类来新建任务;即后续步骤中函数的调用将在该任务中执行;具体使用Mico实时操作系统,新建任务如下:
mico_rtos_create_thread(plua_usr_usart_thread,MICO_DEFAULT_WORKER_PRIORITY,"lua_main_thread",lua_main_thread,0x300,0);
其中,各个参数的含义:第一个参数plua_usr_usart_thread是指向任务函数的指针;第二个参数MICO_DEFAULT_WORKER_PRIORITY代表任务执行的优先级;第三个参数"lua_main_thread"是任务名称;第四个参数lua_main_thread是任务的句柄;第五个参数0x300是为该任务分配的堆栈空间大小;第六个参数0表示将要传给任务函数的参数。
3.如权利要求1所述的方法,其特征在于,步骤二所述的lua_open接口函数能够完成对包含各个状态变量的结构体的设置操作和虚拟机的创建;lua_State*L=lua_open(),该函数的返回值是一个指向包含各个状态变量的结构体的指针。
4.如权利要求1所述的方法,其特征在于,步骤四所述实现串口和传感器的硬件底层驱动是指温湿度传感器驱动及UART串口驱动。
5.如权利要求1所述的方法,其特征在于,所述步骤五具体包括:
步骤A1:在UART串口下,按以下格式定义C函数:设置发送缓冲区函数Buffer_Send_Tx、接收缓冲区函数Buffer_Receive_Rx、以及正确接收数据后的处理函数Uart_Ok_Cope;
static int Buffer_Send_Tx(lua_State*L);
static int Buffer_Receive_Rx(lua_State*L);
static int Uart_Ok_Cope(lua_State*L);
步骤A2:将C函数注册到Lua虚拟机中
首先,需要定义一个C函数表,表中每个元素由C函数和其在Lua脚本中被调用的名称组成;如下所示:
const struct luaR_entry uart_map[]={
{“uart_send”,Buffer_Send_Tx},
{“uart_receive”,Buffer_Receive_Rx},
{“uart_cope”,Uart_Ok_Cope},
};
其次,需要调用函数luaL_register对C函数表uart_map进行注册:luaL_register(L,“uart”,uart_map);其中,第一个参数L为创建虚拟机时的函数返回值,第二个参数“uart”为C函数表注册到虚拟机后的库函数名,第三个参数uart_map为步骤A2中所示表,其为需要注册的C函数表;
步骤A3:将Lua脚本文件加载到Lua虚拟机中
利用Lua提供的luaL_loadfile函数,进行脚本文件的加载:luaL_loadfile(L,“..\uart_init.lua”);其中,参数L为创建虚拟机时的返回值,第二个参数为相应目录下的Lua脚本文件。
6.如权利要求1所述的方法,其特征在于,所述步骤六具体包括:
步骤B1:利用调度任务和Lua虚拟机合作完成对Lua脚本数据的提取
首先,假设脚本中的数据为串口通信协议的配置参数,且格式如下:依次为使能位、数据位数、停止位、奇偶校验标识和波特率;在Lua脚本中用表即类似于C语言中的结构体来存储以上配置参数,如下所示:
uart_p1={
enable=1,使能位
dataBits=8,数据位数
stopBits=1,停止位数
parityBit=0,奇偶校验
baudRate=115200波特率
};
上述表中意思为,将uart外设使能,定义数据格式为八位数据位、一位停止位、采用无校验(0:无校验,1:奇校验,2:偶校验)以及波特率采用115200;
其次,调用Lua接口函数获取表中某一(以dataBits为例)属性字段的值;先将表名和属性字段名分别入栈:lua_getglobal(L,“uart_p1”)、lua_getglobal(L,“dataBits”);然后提取dataBits属性字段的值:lua_gettable(L,-1),其中“-1”代表该属性字段在栈中的索引号,正数为入栈、负数为出栈操作,所述操作看做先出Lua栈,后入C栈;最后取出栈顶中该属性字段的值,并调用出栈函数恢复调用函数现场:p1_enable=(int)lua_tonumber(L,-1)、lua_pop(L,1),对栈中取出的浮点型字段数值进行类型转换为整型数据,lua_pop中参数1表示从栈中将1个元素出栈;
步骤B2:根据提取的数据设置发送缓冲区内容进而调用串口驱动程序将其发给外围设备首先,将提取的数据定义为数组存储,即完成发送缓冲区内容的设置;然后,在Lua脚本中使用uart.uart_send函数将串口配置数据发送到外围设备即在Lua脚本中执行uart_send函数时,实际调用了其对应的C函数Buffer_Send_Tx。
7.如权利要求1所述的方法,其特征在于,所述步骤七具体包括:
步骤C1:外围设备通过串口驱动程序将数据发送到云模块的接收缓冲区;
步骤C2:在C函数中调用Lua自带的脚本函数来处理接收的数据以及接收数据的大小:lua_getglobal(L,“uart_p1_cope_readBuf”)、lua_pushnumber(L,size)、ret=lua_pcall(L,1,1,0)、data[i]=uart.uart_receive(port,index);其中,参数uart_p1_cope_readBuf为脚本中定义的缓冲区数据处理函数名;size为在缓冲区取出的一个参数,size作为参数传入uart_p1_cope_readBuf函数;lua_pcall为执行函数;在uart_p1_cope_readBuf函数中可调用注册的Buffer_Receive_Rx函数来获取接收缓冲区内容;
步骤C3:在C函数Buffer_Receive_Rx中,调用脚本函数返回接收到的数据值:port=(int)lua_tonumber(L,1)、index=(int)lua_tonumber(L,2)、data=uart_port_rx_buf[port].data[index]、lua_pushnumber(L,data);分别是获取端口号,获取索引值,将端口为port、索引值为index的数值即返回值入栈;
步骤C4:对接收到的数据进行正确性判断,若判断正确,则调用之前注册的C函数Uart_Ok_Cope进行处理。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510683033.5A CN105335155B (zh) | 2015-10-20 | 2015-10-20 | 一种仅需配置云端脚本即可实现不同IoT应用的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510683033.5A CN105335155B (zh) | 2015-10-20 | 2015-10-20 | 一种仅需配置云端脚本即可实现不同IoT应用的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105335155A CN105335155A (zh) | 2016-02-17 |
CN105335155B true CN105335155B (zh) | 2018-10-30 |
Family
ID=55285722
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510683033.5A Expired - Fee Related CN105335155B (zh) | 2015-10-20 | 2015-10-20 | 一种仅需配置云端脚本即可实现不同IoT应用的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105335155B (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105704234B (zh) * | 2016-03-23 | 2019-08-13 | 浙江风向标科技有限公司 | 智能设备的控制方法及装置 |
CN106161100B (zh) * | 2016-08-03 | 2019-09-27 | 青岛海信电器股份有限公司 | 一种物联网设备配置方法及物联网终端 |
CN106126359B (zh) * | 2016-08-25 | 2019-10-18 | 成都交大光芒科技股份有限公司 | 进程间共享数据的快速传输方法 |
CN107172013B (zh) * | 2017-04-18 | 2020-08-04 | 北京思特奇信息技术股份有限公司 | 一种数据传输方法及系统 |
CN108810054A (zh) * | 2017-05-04 | 2018-11-13 | 宏碁股份有限公司 | 云端管理系统及其装置配置方法 |
CN108595166B (zh) * | 2018-05-09 | 2020-12-11 | 中国科学院计算技术研究所 | 一种分布式物联网应用执行引擎实现方法及系统 |
CN109814915B (zh) * | 2018-12-29 | 2022-07-22 | 天津字节跳动科技有限公司 | 基于lua的参数配置方法、装置、介质和电子设备 |
CN113810591B (zh) * | 2020-06-15 | 2023-11-21 | 蘑菇车联信息科技有限公司 | 一种高精地图作业系统及云端平台 |
CN114035819A (zh) * | 2021-10-29 | 2022-02-11 | 深圳毅芯半导体有限公司 | 一种物联网串口设备的数据采集控制方法、系统及装置 |
CN117724989B (zh) * | 2024-02-18 | 2024-06-11 | 粤港澳大湾区数字经济研究院(福田) | 一种接口的回归测试方法、装置、终端及存储介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103825811A (zh) * | 2013-10-11 | 2014-05-28 | 江苏飞尚安全监测咨询有限公司 | 一种接入传感器协议自识别的物联网网关实现方案 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9231904B2 (en) * | 2006-09-25 | 2016-01-05 | Weaved, Inc. | Deploying and managing networked devices |
-
2015
- 2015-10-20 CN CN201510683033.5A patent/CN105335155B/zh not_active Expired - Fee Related
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103825811A (zh) * | 2013-10-11 | 2014-05-28 | 江苏飞尚安全监测咨询有限公司 | 一种接入传感器协议自识别的物联网网关实现方案 |
Non-Patent Citations (1)
Title |
---|
面向开放服务的智能家居网关的设计与实现;孙维;《中国优秀硕士学位论文全文数据库 信息科技辑》;20150415(第04期);I139-92 * |
Also Published As
Publication number | Publication date |
---|---|
CN105335155A (zh) | 2016-02-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105335155B (zh) | 一种仅需配置云端脚本即可实现不同IoT应用的方法 | |
CN103456203B (zh) | 一种便携式实物编程方法及系统 | |
CN107463402A (zh) | 虚拟操作系统的运行方法和装置 | |
US9092239B2 (en) | Configuring user interfaces in electronic devices | |
CN102014118B (zh) | 一种实现通用抄读多种电能表的方法 | |
CN105205117A (zh) | 一种数据表迁移方法和装置 | |
CN105404385B (zh) | 一种智能显示终端与体感设备实现数据交互的方法及装置 | |
CN1851641A (zh) | 嵌入式设备用户界面的实现方法 | |
US20140019574A1 (en) | Remote Direct Memory Access Socket Aggregation | |
CN108345493A (zh) | 一种基于多云统管系统Windows虚拟机跨云迁移的方法 | |
CN106790347B (zh) | 一种基于netty的大规模并发数据转发方法 | |
CN102707983A (zh) | 客户端/驱动器通信接口的自动生成 | |
CN106095540A (zh) | 一种基于Quartz框架的任务流程处理方法 | |
CN102915229A (zh) | 一种分布式计算方法及系统 | |
CN107329762A (zh) | 一种描述与集成软件服务的方法和系统 | |
CN108594670A (zh) | 一种机器人跨平台通信协议和控制方法 | |
CN105224483B (zh) | 数据传输方法、电子设备及通用串行总线设备 | |
CN109284093A (zh) | 基于前端技术的跨平台应用开发框架及其实现方法 | |
EP4332754A1 (en) | Automated application deployment | |
CN102819430B (zh) | 一种在linux环境下实现串行通信接口的装置及方法 | |
CN205318371U (zh) | 一种面向安卓系统的硬件检测设备 | |
CN105068792B (zh) | 一种驱动设备管理方法及嵌入式系统 | |
CN106576106A (zh) | 用于利用中间件交换传感器信息的方法、装置和系统 | |
CN109885816A (zh) | 演示文稿的制作方法、装置与存储介质 | |
CN108762765A (zh) | 基于contiki系统的开发板程序编译下载方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20181030 |
|
CF01 | Termination of patent right due to non-payment of annual fee |