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

文章详细描述了如何通过Python代码操作串口助手,实现LwM2M协议中的功能,如对象创建、属性发现和通知,以及IPSO的AT命令应用,特别强调了波特率设置和延迟处理的重要性。
摘要由CSDN通过智能技术生成

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

在这里插入图片描述
在这里插入图片描述

二、代码

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,再查询缓冲区。
在下个命令来之前,把缓存区东西都读出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周末不下雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值