精华内容
下载资源
问答
  • 基于雾计算的NB-IoT框架关键技术和应用
  • myCoffee IoT框架的其他组件是: 先决条件 安装 蜂巢 插件Jar文件 在调整MySQL数据库设置dbconfig.properties然后将该文件复制到C:\opt\hivemq\plugins\ 构建jar文件: mvn package 将myCoffeeDBPlugin-0.0.1.jar...
  • 适用于 IoT框架的高级移动就绪Web应用程序 介绍 homie-control提供用于管理Homie设备的Web UI以及一系列允许扩展功能的虚拟python设备。 它可以让您做一些有用的事情,例如: 历史记录设备属性 安排活动属性的更改...
  • myCoffee IoT框架的其他组件是: Web应用程序包括三个部分: 模拟器 仪表板 发布者 先决条件 MySQL 5.5与mycoffee数据库 HiveMQ与运行 运行KairosDB的 安装 MySQL数据库 创建数据库mycoffee 从/db/MySQL-...
  • myCoffee IoT框架的其他组件是: 先决条件 带有mycoffee -DatabaseMySQL 5.5。 参见 HiveMQ与运行 安装 Kairos数据库 从下载部分下载tar.gz文件,然后将其解压缩到您希望从中运行的位置 应用程序Jar文件 编辑MQ-...
  • Zetta https://github.com/zettajs/zetta 是一个基于Node的IoT框架,利用zetta 可在树莓派等开发板上实现对于传感器数据的封装、发送和接收。 一般情况下,传感器会以一定的间隔向数据接收端(server)发送数据。这...


    Zetta (zettajs github)是一个基于Node的IoT框架,利用zetta 可在树莓派等开发板上实现对于传感器数据的封装、发送和接收。

    一般情况下,传感器会以一定的间隔向数据接收端(server)发送数据。这个一定间隔更新数据的操作一般使用setInterval()函数实现:

    setInterval(() => {
    		 
     	this._driver.readData(counter).then((result) => {
         		stream.write(result);
         		this.value = result.value;
         		this.result = {'value':this.value};
         		console.log('value: ', this.value);
       	},function(err) {
           		console.log(err);
    			});
    }, this.interval);

    但是如果需要以变化的间隔发送数据,就不能使用setIntervalI()函数了,可以使用递归的调用一个含有setTimeout()函数的方法来实现可变间隔的数据发送:

    setTimeout(()=>{
    			this.setSendingData(this.sensor_data.length, 0, stream, killPortError);
    		}, 300)
    
    mock_sensor.prototype.setSendingData = function(dataLength, index, stream, killPortError) {
    	console.log('index',index);
    
    	if(index < dataLength) {
    		stream.write(this.sensor_data[index]);
    		this.value = this.sensor_data[index].value;
    		this.result = {'value': this.value};
    		console.log('value', this.value);
    		setTimeout(()=>{
    			this.setSendingData(dataLength, index + 1, stream, killPortError);
    		}, this.interval);
    	}else if(index == dataLength) {
    		this.value = 'end';
    		this.result = {'value':this.value};
    		console.log('value: ', this.value);
    		setTimeout(()=>{
    			this.setSendingData(dataLength, index + 1, stream, killPortError);
    		}, 5000);
    	}
    	else {
    		//终止进程
    		var stop_command = 'start "" "' + this.project_path + '/edge/utils/kill_process_with_port" ' + this.port;
    		console.log('killPortError', killPortError);
    		if(!killPortError)
    		{
    			console.log('killPortError_process', killPortError);
    			process.exec(stop_command, function(err, stdout, stderr) {
    				console.log('Command Error: ', err);
    				console.log(stdout);
    				console.log('STD Error: ', stderr);
    				if(err!=null)
    				{
    					killPortError = true;
    					console.log('killPortError_true', killPortError);
    				}
    			});
    		}
    	}
    }

    在setSendingData()函数中有三个分支,第一个分支为以可变间隔正常发送数据;第二个分支为预定数据发送完毕,发送'end'标记告知接收方发送完毕;第三个分支为调用批处理文件终止当前进程。

    展开全文
  • 上一篇主要讲的是lettuce-Land客户端微信小程序的实现原理以及代码讲解而这一篇我来讲最终的lettuce IoT框架整体大联调。 lettuce IoT框架整体联调 在联调一起要确保: 1. lettuce-Sea设备端代码部署为最新,并已...

    上一篇主要讲的是lettuce-Land客户端微信小程序的实现原理以及代码讲解而这一篇我来讲最终的lettuce IoT框架整体大联调。

    lettuce IoT框架整体联调

    在联调一起要确保:

    1. lettuce-Sea设备端代码部署为最新,并已就绪。
    2. lettuce-Air服务端jar包已经部署为最新,并已就绪。
    3. lettuce-Land客户端代码已经上传为体验版本。

    lettuce IoT框架整体大联调!

    建议运行方式
    lettuce-Sea设备端 -> lettuce-Air服务端 -> lettuce-Land客户端

    第一步,运行lettuce-Sea直到显示连接上华为OC平台初始化接收。

    在这里插入图片描述

    第二步,运行lettuce-Air直到运行成功

    在这里插入图片描述

    第三步,打开监控。

    在这里插入图片描述
    有可能监控显示的是设备属于离线状态,那是因为心跳还没有上报上来,等一会就可以了。正常环境下设备端和服务端不会反复启停的。

    最后一步,打开lettuce-Land

    注意,微信小程序的体验版可以在后台扫码二维码,也可以搜索小程序“小程序助手”。在这个小程序中,找到我们创建的那个应用。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    请注意!这时进入小程序是不会有反应的,因为小程序访问的接口要设置到后台的白名单中,不过我这里有个更好的方法!

    在这里插入图片描述
    在这里插入图片描述
    打开调试以后,会自动退出程序,再进一次即可。

    在这里插入图片描述
    这个时候你发现右下角有个绿色的标识,那就是调试模式的标志。
    这时就可以访问所配置的服务器的接口了。
    接下来,我就不多说了,尽情享受IOT的神奇吧!

    在这里插入图片描述
    在这里插入图片描述
    之后别忘记退出哦!
    在这里插入图片描述

    到这节课为止,lettuce IoT框架的所有演示就结束了。但是lettuce IoT框架还没有结束,下一篇我会对一些核心的技术进行总结以及lettuce IoT框架未来的发展方向。

    lettuce IoT框架会在GitHub上持续更新,敬请期待!

    欢迎加入我们的QQ群一起讨论IOT的问题。

    在这里插入图片描述

    展开全文
  • 上一篇主要介绍一下物联网的大环境和什么是Lettuce IOT框架而这一篇将要讲解华为的IOT平台。 华为OceanConnect平台操作一,profile文件与编解码插件的开发 思考一下:当今WEB应用都喜欢做成分布式,因为分布式可以...

    上一篇主要介绍一下物联网的大环境和什么是Lettuce IOT框架而这一篇将要讲解华为的IOT平台。

    华为OceanConnect平台操作一,profile文件与编解码插件的开发

    思考一下:当今WEB应用都喜欢做成分布式,因为分布式可以将压力平均的分发给下面小的服务器去处理。包括hadoop也是,将碎片化的存储和计算能力集中起来利用。但是这些技术都离不开一个组件,那就是监控管理中心,比如SpringCloud的Eureka服务治理以及hadoop的ZooKeeper服务协调。这样就好比一个班里有一个班长一样,大家都听他一个人。他也负责管理迟到,早退,请假等任务。这样一来,原本涣散的班级从此被拧成一股绳。

    在IoT的世界里其实更需要监控管理中心,因为线下硬件不如线上软件。硬件会有非常多一想不到的事情发生,因此更需要有一个去管理他们的平台。

    以往的硬件管理平台都是我们自己搭建的,简陋粗暴,在时间紧任务重的情况下还没有鉴权机制,成为日后安全的隐患。其实硬件管理平台属于必备品组件,但是做一个简单的很容易。如果做一个功能很完善的,那真的是难上加难,因为涉及的东西实在是太多了。不过刚好,华为的OceanConnect全联接平台(以下将简称OC平台)满足了我们硬件管理平台所有需求。

    之所以先讲OC平台是因为,这款IOT框架其实由OC平台提供的项目开发思路,也是以OC平台的功能建模。所以OC平台是这个框架的必要组件,也是框架的开发源头。

    在这里插入图片描述
    这个就是OC平台的项目开发流程图,我们需要先在OC平台把产品设计出来,比如我们演示的这个项目。
    在这里插入图片描述
    最后在手机上可以查看设备是否在线,对灯的操作,以及设备完美退出。
    鉴于这3个需求我们分析出一套完善的产品出来:

    1. 查看设备是否在线,这个需要线下设备定时发送心跳状态来实现。
    2. 灯的操作,需要对线下设备发送开/关命令,
    3. 并且还要定时与线下设备校对灯的状态,那就是需要发送查询灯状态的指令,返回灯的状态。
    4. 设备完美退出,这个主要是开发时用的功能,因为要不断的调试,就要不断的运行和退出。在退出时难免会有一些关闭流,接口之类的操作,所以有这个功能。

    产品功能分析完了,接下来我们进入OC平台

    华为云平台https://www.huaweicloud.com/
    产品 -> IoT物联网 -> IoT开发者专区 -> 免费体验 -> 进入开发中心

    进入平台以后:

    1. 新建一个项目,随意填写,不影响后面流程。
    2. 再创建一个产品,此时可能要填厂商信息。厂商信息随意填写,不影响后面流程。然后继续创建产品。

    在这里插入图片描述
    只有这几个需要注意,其他随意。

    在这里插入图片描述
    产品设计OK,产品创建OK。接下来是开发阶段:
    首先我们再看这个流程图,接下来我们要开发profile配置文件。

    思考一下:以前的无线电电报都是靠发送或接受短/长的电信号来传递消息,而不管是发送方还是接受方都需要有一个翻译电码的标准,抗战时期管这个叫密码本。有了这个密码本,无论是谁都可以翻译出电信号的意思,翻出人能看明白的电报。

    而这个密码本类似于我们要开发的profile文件,这个文件制定的规则,属性名称,命令名称。可以让任何机器都对照profile文件翻译出来。所以不管是设备端,OC平台,服务端都需要以这个文件来理解上行或者下行机器发出的数据是什么意思。

    OC平台一大特点就是,可以帮助开发者更方便的开发,比如我们要想开发这个profile配置文件,是要写JSON文件的,但是OC平台提供了更直观的开发方式。
    在这里插入图片描述
    Profile的结构:

    Profile由基础信息和服务能力构成。
    服务能力我觉得类似于面向对象开发,每一个服务能力都对应着线下硬件的一个模块。
    比如灯有当前状态的属性,属性的数据类型,还有开/关的方法,方法的入参与返回值,因此灯作为一个类的存在,对应着线下灯的模块。

    这次演示我们提供2个服务能力,一个是灯的,一个是树莓派的。
    在这里插入图片描述
    在这里插入图片描述
    Profile文件定义好了,我们还需要一个“译码员”
    这个“译码员”就是下一个要开发的编解码插件,OC平台接收时接到的是二进制数据。编解码插件可以根据Profile文件翻译成我们可以看得懂的json数据。

    数据来源主要有四种:

    1. 设备发给OC平台的数据上报
    2. 数据上报以后OC平台发给设备的响应,告诉设备已接收
    3. OC平台发给设备的命令下发
    4. 命令下发以后设备发给OC平台的响应,告诉OC平台已接收并返回响应的参数。

    在这里插入图片描述

    但是在华为OC平台中开发编解码插件,我们将一个操作产生的上下行数据(发送和响应)作为一个编解码消息模板来收发。

    一般来说一个编解码消息模板对应一个服务能力的一个或多个属性或是一个服务能力一个命令。比如上面那个profile文件中有2个服务能力,每个服务能力都有属性,那么这就是2个数据上报编解码消息模板。profile文件中有2个服务能力,其中SwitchBulb有2个命令, 而OperationPi 有1个,这就对应着有3个命令下发编解码消息模板。

    比如说灯的开/关下发指令这个编解码消息模板:
    在这里插入图片描述
    命令下发与响应是对应的,我们看到下发的value属性和响应的result属性对应的是刚才配置Profile文件中的ON_OFF命令下的属性。
    在这里插入图片描述
    除了Profile文件中的ON_OFF命令下的属性的还有3个字段,分别是messageId以及mid和errcode。

    思考一下:信通常由地址和收信人组成。比如有两封信都邮到一个学校里,学校都有收发室。自然信会统一放到收发室保管。然后收发室里的人会根据收信人把信发到指定人手中。
    现在转换过来,地址是你的华为OC平台。需要用messageId来区分是哪个消息模板来解码这条消息。

    messageId是消息的地址域标识符,用于编解码区分是哪个消息模板。比如SwitchBulb中设备上传status消息,和命令下发ON_OFF,这属于2个消息模板。在创建消息模板时需要添加messageId地址域字段,OC平台会自动给这个字段赋值。用于消息进来时,平台自动用哪个消息模板来解码消息。

    Mid字段主要是命令下发模板使用的,用于区分是哪个命令下发的响应。比如我们连续用ON_OFF这个消息模板连续下发3条命令。当平台接收到响应时,便可以根据mid来对应是3条的哪一条的响应回值。
    Errcode字段主要用于命令下发模板响应时使用的,用来表示执行成功还是失败(0为成功,1为失败)

    注意:命令下发的messageId和Mid必须要位置要对应。messageId字段序号1就要对应响应的序号1,不然会解码失败。
    在这里插入图片描述

    响应字段必须要有回值字段,作者曾经尝试把result字段去掉,但是平台在接收响应时报无法匹配消息模板的错。

    这次演示的编解码插件,我们一共创建5个消息模板。
    在这里插入图片描述
    分别对应Profile文件的2个服务能力的属性和3个命令。
    在这里插入图片描述
    因为我们Profile文件中所有属性和命令内属性都是0/1,因此长度设置1即可。
    messageId,mid和errcode只需要勾选相应选项即可。
    在这里插入图片描述

    添加完消息模板以后,我们还需要将消息模板手动的与profile文件中的值一一对应。这样编解码插件才会将二进制信息处理为json文件。

    在这里插入图片描述
    将右侧的属性和命令拖拽至相应区域,与消息模板中的字段对应即可。
    这样,编解码插件就大功告成了。然后别忘了部署哦

    在这里插入图片描述

    部署好了以后,profile文件与编解码插件的开发就完成了!
    下一章节我们来模拟调测一下。
    欢迎加入我们的QQ群一起讨论IOT的问题。

    在这里插入图片描述

    展开全文
  • IOT框架中的lettuce-Sea设备端代码解析。 lettuce-Sea设备端python代码讲解 上一节课我们虽然让树莓派与移远BC35G模组连接起来了,但是他们之间的通信还需要一个“驱动”来衔接。这个“驱动”要有以下特点: 能不...

    上一篇主要讲的是使用树莓派与移远BC35G模组的初始环境设置及调试而这一篇将要讲 Lettuce
    IOT框架中的lettuce-Sea设备端代码解析。

    lettuce-Sea设备端python代码讲解

    上一节课我们虽然让树莓派与移远BC35G模组连接起来了,但是他们之间的通信还需要一个“驱动”来衔接。这个“驱动”要有以下特点:

    1. 能不间断的接收平台下发的指令。
    2. 能自动初始化NB-IoT的环境。
    3. 能对指令的结果进行解析,失败自动重试
    4. 能定时上报心跳
    5. 能集成硬件的驱动,以便于更好的控制硬件
    6. 能完美退出

    这就是我们lettuce-Sea设备端所提供的能力。

    先提供lettuce-Sea的源代码
    https://github.com/lipuqi/lettuce-Sea

    首先我们要在树莓派上搭建一个可以运行lettuce-Sea的python环境
    所需环境清单

    1. 可运行python的环境,我安装的是3.7.3的版本,现在最新版本是3.7.4
    2. RPi.GPIO模块,这是树莓派使用python对GPIO编程的模块请自行百度安装。我是用pip安装的。
    3. pyserial模块,这是python的串口调试模块,也是必备的。我也是用pip安装的。
    4. 如果你心情好安装个git也没问题,毕竟来回拖拽也怪麻烦的。

    接下来我们来讲一下lettuce-Sea的实现原理

    第四篇我已经讲过了,AT指令有4个类型
    在这里插入图片描述
    常用的就是查询指令,执行指令(有参数),执行指令(无参数)

    查询指令一般都是先返回结果,再返回OK
    例AT+CGATT? -> + CGATT:1 -> OK
    执行指令(有参数)一般是直接返回一个OK
    例AT+CGATT=1 -> OK
    执行指令(无参数)则跟查询指令相同
    例AT+CSQ -> + CSQ:23,99 -> OK
    还有就是接收数据
    例 +NNMI:2,0001

    我们写代码就是要将这种规律写成可以运行的程序。
    lettuce-Sea是如何实现的呢?
    首先lettuce-Sea是有4个线程的
    在这里插入图片描述
    主线程:主要是自动执行一些操作,例如开始运行的初始化,和子线程的开始等等。
    监听线程:主要是在开启串口以后,就不断监听端口。看有没有新数据上报,如果有就进行解析分类,主要分两种。一种是主动执行的指令返回的值,例如查询指令,执行指令这些。
    还有一种是被动接收的数据,比如平台下发一条指令给设备。设备就是从这个线程接收的,然后放到执行序列里。在lettuce-Sea中,执行序列就是一个列表类型的类属性。一会看代码就明白了。
    执行线程:就是不断读取执行序列,看有没有数据,如果有数据,经设备调度分发给相应的设备驱动去执行。
    上报心跳:这个就好理解了,就是定时向平台上报数据,告诉平台我还活着。

    代码目录
    在这里插入图片描述
    我把AT指令,设备,和基础操作分为了不同的区域。
    其中AT指令中ATBase是所有指令的父类,其他都是子类。其中NNMI是没有继承ATBase的,因为这个指令主要用于存放执行队列。
    设备中Drive是调度类,Gpio是封装GPIO模块的类。led是led设备驱动,pi里有初始化方法,退出方法和心跳方法。
    基础操作中SerialPort是封装pyserial模块的类,ReceiveMsg负责接收消息,ATBugUtil是主程序。

    代码主要就是两个流程:一个是自动执行指令一个是被动接收指令
    先讲一下自动执行指令的生命周期
    在这里插入图片描述
    主程序发送一条指令给串口,这时主程序会阻塞等待结果(status属性为结果标识位,0为执行中,1为执行成功,2为失败)

    ATBase.py

    class ATBase:
    
        def __init__(self, serialPort, receiveMsg):
            self.serialPort = serialPort  # 串口基础操作模块
            self.receiveMsg = receiveMsg  # 串口数据接收模块
            self.at_name = ""  # AT指令名称
            self.at_error_result = None  # AT指令返回信息校验(错误结果)
            self.at_suc_result = None  # AT指令返回信息校验(正确结果)
            self.status = 0  # 执行结果(0未执行1执行成功2执行失败)
            self.at_result_pattern = None  # 匹配返回结果的正则类型
            self.error = re.compile('ERROR')  # 普通消息失败
            self.ok = re.compile('OK')  # 普通消息成功
            self.result = None  # 执行结果
            self.retry = 3  # 重试次数
    
        # 发送at基础方法
        def send_at(self, data=None, at_type=None):
            retry = self.retry
            self.serialPort.write_data(self.at_name, data, at_type)  # 调用串口基础操作-写入
            self.receiveMsg.atObj = self  # 将本类基本信息注入串口数据接收以便更新执行情况
            self.status = 0  # 复位执行结果
            time.sleep(1)
            # 执行写入以后,主程序阻塞等待执行结果
            while True:
                if self.retry == 0:
                    print("执行失败,不再重试")
                    self.retry = retry
                    self.off_compile_result()  # 自动复位
                    return 2
                if self.status == 1:
                    print("执行成功")
                    self.retry = retry
                    self.off_compile_result()  # 自动复位
                    return 1
                elif self.status == 2:
                    print("执行失败,重试" + str(4 - self.retry))
                    self.retry -= 1
                    time.sleep(2)
                    return self.send_at(data, at_type)  # 执行失败后递归调用
    

    串口处理后,将结果返回对监听线程接收。监听线程判断此执行的指令是否需要校验(比如带返回值的可能就需要校验,直接返回OK/ERROR的就不需要)。无论是否校验都会返回一个结果标识位status属性,主程序获取到属性以后,如果成功则继续往下执行,失败则重试,我设定为3次重试。

    ReceiveMsg.py

    class ReceiveMsg:
    
        def __init__(self, serialPort, nnmi, qlwevtind):
            super(ReceiveMsg, self).__init__()
            self.nnmi = nnmi   # 接收数据模块
            self.qlwevtind = qlwevtind   # 接收平台状态模块
            self.serialPort = serialPort  # 串口基础操作模块
            self.atObj = None  # 发送AT指令的模块
            self.quit_sys = 0  # 退出(此参数3个线程同步)
            self.is_pause = 0  # 暂停(此参数3个线程同步)
    
        #  处理消息的线程方法
        def receive_data(self):
            while self.quit_sys == 0:
                while self.is_pause == 1:
                    pass
                result = self.serialPort.read_data()  # 接收数据
                if result:
                    # 先匹配是否为上报数据和平台上报状态,不是则匹配是否为发送指令的回值
                    if self.nnmi.at_result_pattern.search(result):
                        at_result = result.split(":")
                        print("接到数据")
                        print(at_result[1])
                        self.nnmi.add_order(at_result[1])
                    elif self.qlwevtind.at_result_pattern.search(result):
                        at_result = result.split(":")
                        print("接到平台状态")
                        print(at_result[1])
                        self.qlwevtind.oc_analysis_msg(at_result[1])
                    elif self.atObj:
                        if self.atObj.compile_result(result):
                            self.atObj = None
                    else:
                        print("未设置匹配项数据")
                        print(result)
    

    被动接收指令的生命周期
    在这里插入图片描述
    华为OC平台下发指令给通信模组,通信模组将消息以串口发给程序。程序的监听线程接收到消息后,添加到执行队列中(NNMI类)。

    NNMI.py

    class NNMI:
    
        def __init__(self):
            self.at_name = "NNMI"
            self.at_result_pattern = re.compile(self.at_name)
            self.wait_list = []  # 待处理信息列表
    
        # 添加待处理信息到列表
        def add_order(self, order):
            if order in self.wait_list:
                return
            else:
                self.wait_list.append(order)
    
        # 从列表删除待处理信息
        def del_order(self, order):
            while order in self.wait_list:
                self.wait_list.remove(order)
    
    

    执行线程检测到执行队列有数据,读取数据后将数据从队列中删除。

    Drive.py

    class Drive:
    
        def __init__(self, nnmi, receiveMsg, led, pi):
            super(Drive, self).__init__()
            self.nnmi = nnmi  # 接收数据模块
            self.receiveMsg = receiveMsg  # 串口数据接收模块
            self.led = led  # 灯
            self.pi = pi  # 树莓派
    
        # 循环处查询列表内任务线程方法
        def order_monitor(self):
            while self.receiveMsg.quit_sys == 0:
                time.sleep(2)
                while self.receiveMsg.is_pause == 1:
                    pass
                if self.nnmi.wait_list:
                    for order in self.nnmi.wait_list:
                        self.nnmi.del_order(order)
                        self.analysis_msg(order)
    

    执行线程解析消息,并将消息调度给对应的设备

    Drive.py

        # 处理任务调度硬件模块
        def analysis_msg(self, data):
            # 分割接收消息
            msg_result = data.split(",")
            msg_len = msg_result[0]
            msg_data = msg_result[1]
            if msg_len == "4":
                message_id = int(msg_data[:2])
                mid = msg_data[2:6]
                value = int(msg_data[6:])
                if message_id == 1:
                    self.led.set_mid(mid)
                    self.led.led_on_off(value)
                elif message_id == 3:
                    self.led.set_mid(mid)
                    self.led.query_status()
                elif message_id == 6:
                    self.pi.set_mid(mid)
                    self.pi.execute_quit()
                else:
                    print("无解析类型")
            else:
                print("命令下发长度不符合")
    

    设备接收到消息后进行相关处理。处理成功以后,发送响应给华为OC平台。

    Led.py

    class Led:
        def __init__(self, ioObj, nmgs):
            super(Led, self).__init__()
            self.status = 0  # 当前灯的状态
            self.ioObj = ioObj  # GPIO设备基础操作模块
            self.nmgs = nmgs  # 发送消息模块
            self.io_id = 4  # 当前设备使用的针脚编号
            self.ioObj.setup_out_io(self.io_id)  # 初始化IO口
            self.mid = None  # 命令下发的响应码
    
        # 处理灯的开关命令
        def led_on_off(self, data):
            suc = "02" + self.mid + "00" + '%02x' % data  # 成功的返回信息
            fail = "02" + self.mid + "01" + '%02x' % data  # 失败的返回信息
            if data != 0 and data != 1:
                print("开关灯只接受0/1")
                self.nmgs.execute_at(fail)
            else:
                # 如果命令下发状态与当前灯状态一致则直接发送成功
                if data == self.status:
                    self.nmgs.execute_at(suc)
                else:
                    execute_result = self.ioObj.execute_output(self.io_id, data)
                    # 如果执行成功就响应成功
                    if execute_result == 1:
                        self.status = data
                        self.nmgs.execute_at(suc)
                    else:
                        self.nmgs.execute_at(fail)
    

    下面解析部分代码

    初始化:
    监听线程和执行线程启动后再执行初始化,进入初始化时会先进入快速初始化,如果快速初始化失败,则会进入默认初始化。默认初始化执行重试3次仍然失败,则进入退出流程。成功则启动心跳线程。

    Pi.py

        # 系统初始化
        def sys_init(self, index=0):
            # 如果重试3次皆失败,判定初始化失败
            if index == 3:
                return 2
            print("开始初始化")
            self.cfun.execute_at("1")  # 开启射频
            self.csq.execute_at()  # 查询信号
            time.sleep(5)
            cg_res = self.cgatt.integration_at("1")  # 入网
            # 查看入网是否成功
            if cg_res == 2:
                print("初始化遇到问题,开始默认初始化")
                self.nconfig.execute_at("AUTOCONNECT,FALSE")  # 手动入网模式
                self.nrb.execute_at()  # 重启
                index += 1
                self.sys_init(index)  # 递归
            print("结束初始化")
            return 1
    

    校验结果:
    校验结果分三种

    1. 普通校验,如果发生没有校验项时则会进入普通校验,也就是校验OK/ERROR,OK为成功,ERROR为失败。
    2. 校验正确值,就是如果结果与设定值相同为执行成功,不相同为失败。这里会调用父类的校验正确值开关方法,将设定值入参。
    3. 校验错误值,就是如果结果与设定值相同为执行失败,不相同为成功。这里会调用父类的校验错误值开关方法,将设定值入参。

    ATBugUtil.py

        # 校验返回结果
        def compile_result(self, result):
            # 有关键字正则表示需要结果校验,没有则只判断成功/失败
            if self.at_result_pattern:
                if self.at_result_pattern.search(result):
                    at_result = result.split(":")
                    if self.at_error_result:
                        self.status = self.compile_error_result(at_result[1])
                        print(result)
                    elif self.at_suc_result:
                        self.status = self.compile_suc_result(at_result[1])
                        print(result)
            else:
                if self.ok.search(result):
                    self.status = 1
                    print(result)
                    return True
                elif self.error.search(result):
                    self.status = 2
                    print(result)
                    return True
            return False  # 返回 True/False是因为表示指令执行成功
    
        # 开启错误校验结果
        def on_compile_error_result(self, error):
            self.at_result_pattern = re.compile(self.at_name)
            self.at_error_result = error
    
        # 校验错误结果
        def compile_error_result(self, data):
            self.result = data
            if data != self.at_error_result:
                return 1
            return 2
    
        # 开启正确校验结果
        def on_compile_suc_result(self, suc):
            self.at_result_pattern = re.compile(self.at_name)
            self.at_suc_result = suc
    
        # 校验正确结果
        def compile_suc_result(self, data):
            self.result = data
            if data == self.at_suc_result:
                return 1
            return 2
    

    在发送指令时,会将指令本身发给监听线程类,监听线程接收到数据以后会读取发给他的指令本身里的校验值。并根据不同的校验值执行不同的校验方法。

    核心点就是这些的,其他的还需要开发者自己去专研。

    下一章节将讲lettuce-Sea在树莓派上的调试,以及使用华为OC平台完成数据的接收和指令的下发。
    欢迎加入我们的QQ群一起讨论IOT的问题。

    在这里插入图片描述

    展开全文
  • 上一篇主要讲的是Lettuce IOT框架中的lettuce-Sea设备端的运行工作原理已经相关核心部分而这一篇将要讲部署lettuce-Sea到树莓派并与华为OC平台进行联调。 使用华为OceanConnect平台与设备端联调 经过上一节课,想必...
  • 框架的Vue.js客户端。 项目范围 该存储库包含的前端客户端的。 该项目的目的是重现Java前端中已经集成的所有功能,可。 要广泛了解其功能,请访问我们的。 屏幕截图 仪表板页面 事物面板 插件面板 自动化面板 移动...
  • 上一篇主要讲的是华为OceanConnect平台profile文件与编解码插件的开发与调试而这一篇将要讲如何使用window电脑调试NB-IoT移远BC35G模组。 移远BC35G模组的初次使用 移远BC35G模组,你可以看成是电脑的网卡。因为有...
  • 上一篇主要介绍一下华为OceanConnect平台的profile文件与编解码插件开发而这一篇将要讲解华为OceanConnect平台调测profile文件与编解码插件。 华为OceanConnect平台操作二,...IoT Platform就是华为OC平台, 设备...
  • 上一篇主要讲的是如何使用window电脑调试NB-IoT移远BC35G模组而这一篇将要讲 使用树莓派与移远BC35G模组的初始环境设置及调试。 树莓派与移远BC35G模组的初始环境设置及调试 树莓派作为一款微型电脑,只有信用卡...
  • 上一篇主要lettuce框架的对外服务lettuce-Air服务端java代码解析而这一篇将要讲,这一篇将讲解如何lettuce-Sea设备端,华为OC平台,lettuce-Air服务端联调。 服务端 + 华为OceanConnect平台 + 设备端联调 前几节课...
  • 如果你能认真看完Lettuce IOT框架 的一系列教程,那么你对物联网一定也有一个更深刻的了解。 框架分为4个部分组成 lettuce-Land 客户端(微信小程序) https://github.com/lipuqi/lettuce-Land lettuce-Air ...
  • 上一篇主要讲的是lettuce-Sea设备端,华为OC平台,lettuce-Air服务端的联调而这一篇将要讲微信小...下节课我会给大家讲解lettuce IoT框架整体联调,这就是最终BOSS了! 欢迎加入我们的QQ群一起讨论IOT的问题。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,201
精华内容 480
关键字:

iot框架