一、使用串口助手的情况如下
二、代码
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,再查询缓冲区。
在下个命令来之前,把缓存区东西都读出来