毕设(六)——通过pico用NB模块传输测试

简介: 毕设(六)——通过pico用NB模块传输测试

一、使用串口助手的情况如下

二、代码

from machine import UART,Pin
import utime
#串口配置

uart1 = UART(0, baudrate=115200, tx=Pin(12), rx=Pin(13))


while True:
    uart1.write('AT+CREG?\r')
    while uart1.any() > 0:
        rxData_One = uart1.read()
        print(rxData_One)
    utime.sleep(1)

提个醒,这里波特率要设置成115200

嗯,返回成功,很开心

在每一次判断时候加个延时(之后看看能不能到ms秒吧)

from machine import UART,Pin
import utime
#串口配置

uart1 = UART(0, baudrate=115200, tx=Pin(12), rx=Pin(13))
number_part_flag = 0
msgid_part_flag = 0

while True:
    uart1.write('AT+CREG?\r')
    utime.sleep_ms(100)
    while uart1.any() > 0:
        rxData_One = uart1.read()
        str = rxData_One.decode('utf-8')
        while '+CREG: 0,2' in str:
            print("上网失败,再次尝试测试")
            utime.sleep_ms(100)
            uart1.write('AT+CREG?\r')
            while uart1.any() > 0:
                rxData_One = uart1.read()
                str = rxData_One.decode('utf-8')
        print("上网成功")
    utime.sleep_ms(500)
    while uart1.any() > 0:
        rxData_One = uart1.read()
    # 创建实例
    uart1.write('AT+MIPLCREATE\r')
    utime.sleep_ms(100)
    while uart1.any() > 0:
        rxData_two = uart1.read()
        str = rxData_two.decode('utf-8')
        if 'ERROR' in str:
            print("创建实例-失败")
        else:
            print("创建实例-成功")
    utime.sleep_ms(500)
    while uart1.any() > 0:
        rxData_One = uart1.read()
    # 创建对象
    uart1.write('AT+MIPLADDOBJ=0,3301,1,"1",7,1\r')
    utime.sleep_ms(100)
    while uart1.any() > 0:
        rxData_three = uart1.read()
        str = rxData_three.decode('utf-8')
        if 'ERROR' in str:
            print("创建对象-失败")
        else:
            print("创建对象-成功")
    utime.sleep_ms(500)
    while uart1.any() > 0:
        rxData_One = uart1.read()
    # 注册(循环等待,等到0,68719,1,3301,0,-1),提取68719这个位置的数
    uart1.write('AT+MIPLOPEN=0,30,120\r')
    utime.sleep_ms(100)
    while number_part_flag == 0:
        while uart1.any() > 0:
            rxData_four = uart1.read()
            rxData_four_str = rxData_four.decode('utf-8')
            # 检查是否存在 3301
            if '3301' in rxData_four_str:  
                print("响应中存在 3301.")
                comma_index = rxData_four_str.find(',') # 找到第一个逗号的位置
                second_comma_index = rxData_four_str.find(',', comma_index + 1) # 找到第二个逗号的位置
                third_comma_index = rxData_four_str.find(',', second_comma_index + 1)  # 找到第三个逗号的位置
                number_part = rxData_four_str[second_comma_index + 1: third_comma_index] # 提取出数字部分
                try: # 将提取出的部分转换成整数
                    number_one = int(number_part)
                    print("提取的第一次数字为:", number_one)
                    number_part_flag = 1
                except ValueError:
                    print("提取的第一次数字不是有效的整数。")
            else:
                print("响应中不存在 3301.")
    utime.sleep_ms(500)
    while uart1.any() > 0:
        rxData_One = uart1.read()
    # 发送观察结果
    uart1.write('AT+MIPLOBSERVERSP=0,%d,1\r' % (number_one))
    utime.sleep_ms(100)
    while msgid_part_flag == 0:
        while uart1.any() > 0:
            rxData_five = uart1.read()
            rxData_five_str = rxData_five.decode('utf-8')
            if '3301' in rxData_five_str:
                first_comma_index = rxData_five_str.find(',') # 找到第一个逗号的位置
                second_comma_index = rxData_five_str.find(',', first_comma_index + 1) # 找到第二个逗号的位置
                number_part = rxData_five_str[first_comma_index + 1: second_comma_index] # 提取出数字部分
                # 将提取出的部分转换成整数
                try:
                    number_two = int(number_part)
                    print("提取的第二次数字为:", number_two)
                    msgid_part_flag = 1
                except ValueError:
                    print("提取的第二次数字不是有效的整数。")
            else:
                print("失败")
    utime.sleep_ms(500)
    while uart1.any() > 0:
        rxData_One = uart1.read()
    # 发送对象属性
    uart1.write('AT+MIPLDISCOVERRSP=0,%d,1,29,"5700;5601;5602;5603;5604;5701"\r' % (number_two))
    utime.sleep_ms(100)
    while uart1.any() > 0:
        rxData_One = uart1.read()
        
    # 通知属性变化(数字)
    uart1.write('AT+MIPLNOTIFY=0,%d,3301,0,5700,4,4,17.5,0,0,116\r' % (number_one))
    utime.sleep_ms(100)
    while uart1.any() > 0:
        rxData_One = uart1.read()
        rxData_One_str = rxData_One.decode('utf-8')
        if '0,26,116' in rxData_One_str:
            print("修改成功")
        else:
            print("修改失败")
    utime.sleep_ms(100)
    while uart1.any() > 0:
        rxData_One = uart1.read()
#     uart1.write('AT+MIPLNOTIFY=0,%d,3301,0,5601,4,4,25.5,0,0,116\r' % (number_one))
#     uart1.write('AT+MIPLNOTIFY=0,%d,3301,0,5602,4,4,22.5,0,0,116\r' % (number_one))
#     uart1.write('AT+MIPLNOTIFY=0,%d,3301,0,5603,4,4,22.5,0,0,116\r' % (number_one))
    
    # 通知属性变化(文本)
    uart1.write('AT+MIPLNOTIFY=0,%d,3301,0,5701,1,4,29cm,0,0,116\r' % (number_one))
    utime.sleep_ms(100)
    while uart1.any() > 0:
        rxData_One = uart1.read()
        rxData_One_str = rxData_One.decode('utf-8')
        if '0,26,116' in rxData_One_str:
            print("修改成功")
        else:
            print("修改失败")


        

三、对于IPSO的补充

AT+MIPLADDOBJ=0,3301,1,“1”,7,1\r

AT+MIPLADDOBJ=:这是一条AT命令的前缀,用于与模块进行通信。在这个命令中,MIPLADDOBJ表示添加一个新的对象。

0:这是对象实例的ID,指定了新对象的实例ID。在这里,设定为0,表示对象实例的ID为0。

3301:这是新对象的Object ID,指定了新对象的类型。在这里,Object ID为3301,可能对应着某种传感器或者设备状态。

1:这是新对象实例的属性数量,指定了新对象实例包含的属性数量。在这里,属性数量为1。

“1”:这是新对象实例的第一个属性的资源ID。在这个命令中,资源ID被指定为1。

7:这是新对象实例的第一个属性的资源类型,指定了资源的数据类型。在这里,资源类型为7,可能表示float类型的数据。

1:这是新对象实例的第一个属性的资源权限,指定了资源的读写权限。在这里,权限为1,可能表示该资源可读可写。

综上所述,这条命令的作用是向LwM2M设备添加一个Object ID为3301的新对象实例,该对象实例包含一个资源,资源ID为1,资源类型为float,且该资源可读可写。


AT+MIPLOPEN=0,30,120\r

AT+MIPLOPEN=:这是一条AT命令的前缀,用于与模块进行通信。在这个命令中,MIPLOPEN表示打开LwM2M客户端。

0:这是LwM2M客户端的实例ID,用于标识不同的LwM2M客户端实例。在这里,实例ID为0,表示是第一个实例。

30:这是连接的持续时间,以秒为单位。在这里,指定的持续时间为30秒,表示客户端将在30秒后关闭连接。

120:这是连接的空闲超时时间,以秒为单位。在这里,指定的空闲超时时间为120秒,表示如果在120秒内没有数据交换,连接将被关闭。

综上所述,这条命令的作用是打开LwM2M客户端,设置连接的持续时间为30秒,并设置空闲超时时间为120秒。


AT+MIPLDISCOVERRSP=0,3184,1,19,“5700;5601;5602;5603”\r

这个命令是针对LwM2M设备的,用于发送LwM2M服务器的发现响应。让我解释一下命令的各个部分:

AT+MIPLDISCOVERRSP=:这是一条AT命令的前缀,用于与模块进行通信。在这个命令中,MIPLDISCOVERRSP表示发送LwM2M服务器的发现响应。

0:这是LwM2M客户端实例的ID,用于标识客户端的不同实例。在这里,实例ID为0,表示第一个实例。

3184:这是发现请求的消息ID,用于标识发现请求的消息。在这里,消息ID为3184。

1:这是响应代码,指示了发现请求的结果。在这里,代码为1,可能表示成功。

19:这是所发现的对象实例的数量,表示在发现响应中包含的对象实例数量。在这里,数量为19。

“5700;5601;5602;5603”:这是所发现的对象实例的信息,每个实例的信息包括对象ID和对象实例ID。在这里,列出了4个对象ID,分别为5700、5601、5602和5603。

综上所述,这条命令的作用是向LwM2M服务器发送发现响应,回复客户端支持的对象实例,并提供这些对象实例的详细信息。

上面这个19是表示5700;5601;5602;5603,这个是19个字符,如果像我用到了6个属性5700;5601;5602;5603;5604;5701

AT+MIPLNOTIFY=0,68719,3301,0,5601,4,4,22.5,0,0,116\r

这个命令是用于发送LwM2M通知的,让我解释一下各个部分的含义:

AT+MIPLNOTIFY=:这是一条AT命令的前缀,用于与模块进行通信。在这个命令中,MIPLNOTIFY表示发送LwM2M通知。

0:这是LwM2M客户端实例的ID,用于标识客户端的不同实例。在这里,实例ID为0,表示第一个实例。

68719:这是通知的消息ID,用于标识通知消息。在这里,消息ID为68719。

3301:这是通知所涉及的Object ID,表示通知涉及的对象。

0:这是通知所涉及的Object Instance ID,表示通知涉及的对象实例。

5601:这是通知所涉及的资源ID,表示通知涉及的资源。

4:这是资源的数据类型,表示资源的数据类型为float。

4:这是资源的大小,表示资源的大小为4字节。

22.5:这是通知的值,表示资源的值为22.5。

0:这是资源的最小值,表示资源的最小值为0。

0:这是资源的最大值,表示资源的最大值为0。

116:这是资源的单位,表示资源的单位为116。

综上所述,这条命令的作用是向LwM2M服务器发送通知,通知服务器某个对象实例的某个资源的状态或值发生了变化,具体变化为资源ID为5601的资源的值变为22.5,资源的数据类型为float,大小为4字节,单位为116。

四、注意

这个NB模块上电之后,需要1-3秒的反应时间,这个时候,可以理解为还没上网

调了一个小时,搞定!

我的划分是,5700和5601放GPS的经纬度,5602,5603,5604放陀螺仪,5701就放字符串化后的超声波数据(在可视化界面进行文本显示吧)

发出信息后,等100ms,再查询缓冲区。

在下个命令来之前,把缓存区东西都读出来

相关文章
|
2月前
|
安全 Linux 网络安全
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(一)
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(一)
75 2
|
2月前
|
Python Windows 网络安全
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(二)
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(二)
82 2
|
6天前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的2FSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的2FSK调制解调系统,包含高斯信道、误码率统计模块及testbench。系统增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同SNR下的硬件测试,并提供操作视频指导。理论部分涵盖频移键控(FSK)原理,包括相位连续与不连续FSK信号的特点及功率谱密度特性。Verilog代码实现了FSK调制解调的核心功能,支持在不同开发板上移植。硬件测试结果展示了不同SNR下的性能表现。
31 6
|
2月前
|
安全 Java 数据库
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
这篇文章是关于Apache Shiro权限管理框架的详细学习指南,涵盖了Shiro的基本概念、认证与授权流程,并通过Spring Boot测试模块演示了Shiro在单应用环境下的使用,包括与IniRealm、JdbcRealm的集成以及自定义Realm的实现。
50 3
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
|
2月前
|
计算机视觉
目标检测笔记(二):测试YOLOv5各模块的推理速度
这篇文章是关于如何测试YOLOv5中不同模块(如SPP和SPPF)的推理速度,并通过代码示例展示了如何进行性能分析。
130 3
|
2月前
|
测试技术 PHP 开发工具
php性能监测模块XHProf安装与测试
【10月更文挑战第13天】php性能监测模块XHProf安装与测试
35 0
|
2月前
|
弹性计算 网络协议 Linux
云服务器评估迁移时间与测试传输速度
云服务器评估迁移时间与测试传输速度
|
2月前
|
安全 Linux 网络安全
Kali渗透测试:使用browser_autopwn2模块进行渗透攻击
Kali渗透测试:使用browser_autopwn2模块进行渗透攻击
77 0
|
2月前
|
安全 网络安全 Windows
Kali渗透测试:Metasploit 6.0 中的Evasion模块 原创
Kali渗透测试:Metasploit 6.0 中的Evasion模块 原创
56 0
|
4月前
|
NoSQL Linux Android开发
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
本文介绍了如何在QEMU中挂载虚拟分区、创建和编译简单的Linux内核模块,并在QEMU虚拟机中加载和测试这些内核模块,包括创建虚拟分区、编写内核模块代码、编译、部署以及在QEMU中的加载和测试过程。
246 0
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试