毕设(六)——通过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,再查询缓冲区。

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

相关文章
|
22天前
|
NoSQL Linux Android开发
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
本文介绍了如何在QEMU中挂载虚拟分区、创建和编译简单的Linux内核模块,并在QEMU虚拟机中加载和测试这些内核模块,包括创建虚拟分区、编写内核模块代码、编译、部署以及在QEMU中的加载和测试过程。
81 0
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
|
2月前
|
测试技术 开发者
单元测试问题之为什么单测覆盖率高的项目模块更易于迭代演进
单元测试问题之为什么单测覆盖率高的项目模块更易于迭代演进
|
3月前
|
测试技术 Python
Python教程:利用timeit模块对代码进行性能测试
在Python中,了解代码的性能是优化和改进的关键。timeit模块是Python标准库中的一个工具,用于测量代码片段的执行时间。本文将介绍timeit模块的各种接口、命令行使用方法以及如何对代码中的函数或类进行性能测试。
66 3
|
2月前
|
网络协议 物联网 定位技术
毕设(二)——NB-IOT通信模块(nb卡通信测试)+gps定位
毕设(二)——NB-IOT通信模块(nb卡通信测试)+gps定位
|
4月前
探讨AC/DC电源模块的可靠性设计和测试方法
探讨AC/DC电源模块的可靠性设计和测试方法
探讨AC/DC电源模块的可靠性设计和测试方法
|
4月前
|
数据采集 JSON 数据格式
2024年最新【python基础教程】常用内置模块(1),2024年最新头条测试面试
2024年最新【python基础教程】常用内置模块(1),2024年最新头条测试面试
|
7天前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
47 7
Jmeter实现WebSocket协议的接口测试方法
|
7天前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
32 3
快速上手|HTTP 接口功能自动化测试
|
7天前
|
JavaScript 前端开发 测试技术
ChatGPT与接口测试
ChatGPT与接口测试,测试通过
20 5
|
23天前
|
网络协议 测试技术 网络安全
Python进行Socket接口测试的实现
在现代软件开发中,网络通信是不可或缺的一部分。无论是传输数据、获取信息还是实现实时通讯,都离不开可靠的网络连接和有效的数据交换机制。而在网络编程的基础中,Socket(套接字)技术扮演了重要角色。 Socket 允许计算机上的程序通过网络进行通信,它是网络通信的基础。Python 提供了强大且易于使用的 socket 模块,使开发者能够轻松地创建客户端和服务器应用,实现数据传输和交互。 本文将深入探讨如何利用 Python 编程语言来进行 Socket 接口测试。我们将从基础概念开始介绍,逐步引导大家掌握创建、测试和优化 socket 接口的关键技能。希望本文可以给大家的工作带来一些帮助~