NB与华为云物联网平台连接


[success]好久没碰过硬件了,之前一直在学软件,昨天实验室给了我一个任务:把我们实验室的一个项目完善一下。然后就交给我一个开放版让我研究一下,所以我现在就只好把现在的任务给放一放了,准备开始研究硬件去[/success]

[dangerbox title=”注意”]本文章是随手写的,所以只是以展示为主,所以和stm32相关的知识我这里也不会多讲,后面也贴代码的地址,所以具体部分请自己看代码。[/dangerbox]

本来是想要我用小熊派来开发的,不过在研究了很久之后我才发现这个小熊派其实就是stm32芯片,而且这东西烧录的程序居然华为自己研发的一个系统,想短时间学会这个估计会非常难,所以在得知这个消息后无奈只好想办法转移到其他平台了。。。 (还好我们只是想使用小熊派的NB-IOT模块和华为云的物联网平台相连)

 

上面是这个系统的介绍

所以呢,本篇文章顺应了标题,先退坑吧(逃。。。)
当然,项目还是要继续,所以我就把精力转向了NB-IOT模块,想办法用stm32来实现NB向华为云的物联网平台发数据。

NB-IOT介绍

其实就是一个物联网的模块,大概长下面这个样子

后面是可以插手机卡的,没错就是手机卡,而且这个东西可以直接连接基站,然后直接向服务器发送数据。当然这个手机卡是专门的物联网卡。。。据说ofo好像就是用的NB,因为NB不仅可以联网,而且还可以定位。

为了避免推销的嫌疑,其他的请自行百度。

NB的指令

虽然这个东西听起来高大上,不过用起来还是很简单的,只需要会发AT指令就行了,所以下面我就用串口调试助手来连接NB,然后发送指令并测试(这里连接就只需要连VCC GND RXD TXD就行了)。
不同的NB模块可能在功能方面有所出入,请以实际的为准

下面是常用的AT指令(这些我差不多试了一下,有些直接发送就有效,有些需要在后面加上?也可以加上=?)

?一般是查询当前状态,=?一般是列出状态的范围

下面介绍常见的指令返回的数据

1.查询模块序列号

第一个非常常用,如果需要和华为云物联网平台相连,我们就必须输入AT+CGSN=1来获取当前设备的IMEI号才能绑定。

2.查询是否注册网络

AT+CEREG?一般会返回两个值如下

前面一个是是否开启了网络环境变化后是否通知,后面一个是当前状态,如果是1说明注册成功,反之。

3.查询信号连接状态

AT+CSCON?也是返回两个数据,后面那个为0的话是空闲,为1的话是连接,一般NB是不连接基站的,只有当需要发送数据时才会主动连接基站,这个也是NB神省电的原因之一。

4.查询信号质量

AT+CSQ 这里我们只看前面一个后面那个恒为99,前面一个如果为0说明信号质量在-113dBm或以下,信号质量非常差,在2-30之前对应的信号值为-109dBm~-53dBm。

5.获取Ip地址

AT+CGPADDR 这个返回的是IP地址,也叫PDP地址。

6.选择频段

AT+NBAND=?这里?可以填5或8,5是电信的频道。移动和联通共用8

7.配置和查询CDP服务器地址

这个主要用于和平台进行连接,不同的平台CDP地址是不一样的。

AT+NCDP?这个是查询

AT+NCDP=ip地址这个是设置CDP地址。

8.发送消息

AT+NMGS=length,data 前面是数据的长度,后面是数据(16进制)

开始实战

这里我直接以我这个项目老人手环为例,写一下具体的操作思路。

先新建一个项目和产品,这里可以任意填,只是要注意数据格式要选择coap(二进制码流)

第一步是定义Profile,就是定义数据格式,以便后面进行编解码插件开发。

这里手环基本的信息包括:心率,血氧溶度,定位信息。

 

这里我大概定义了一个服务一个属性和一个命令,属性是手环发给服务器的,包括一些基本的信息。命令是服务器发给手环的,主要是让手环主动返回数据(这里其实是可以让手环定时上报信息的)

 

下面是编解码插件开发,主要是用于把我们的数据编码成二进制信息流发送NB,NB发送过来的二进制解码成json文件用于应用调用。

这里就直接分成了3部分,心率和血氧溶度均发送在一个属性内。对应的二进制位000000前两位是地址,中间两位是心率,后面两位是血氧溶度。

因为我定义的是无符号的8位整型8位二进制对应两位16进制。

演示效果(这里是直接用模拟器发的)

比较麻烦的是发送位置信息,这里我选择发送字符串,位置信息的格式如下2436.60666表示24度36.606666分。所以我这里直接使用12个字符串来表示位置信息

加上地址位的话大概要发26位数据上面那个对应的16进制数据为010000323433362E3630363636

效果如下(上面那个是用asciall码来进行转换的)

下面是asciall码转换表

二进制 十进制 十六进制 缩写 可以显示的表示法 名称/意义
0000 0000 0 00 NUL 空字符(Null)
0000 0001 1 01 SOH 标题开始
0000 0010 2 02 STX 本文开始
0000 0011 3 03 ETX 本文结束
0000 0100 4 04 EOT 传输结束
0000 0101 5 05 ENQ 请求
0000 0110 6 06 ACK 确认回应
0000 0111 7 07 BEL 响铃
0000 1000 8 08 BS 退格
0000 1001 9 09 HT 水平定位符号
0000 1010 10 0A LF 换行键
0000 1011 11 0B VT 垂直定位符号
0000 1100 12 0C FF 换页键
0000 1101 13 0D CR 归位键
0000 1110 14 0E SO 取消变换(Shift out)
0000 1111 15 0F SI 启用变换(Shift in)
0001 0000 16 10 DLE 跳出数据通讯
0001 0001 17 11 DC1 设备控制一(XON 启用软件速度控制)
0001 0010 18 12 DC2 设备控制二
0001 0011 19 13 DC3 设备控制三(XOFF 停用软件速度控制)
0001 0100 20 14 DC4 设备控制四
0001 0101 21 15 NAK 确认失败回应
0001 0110 22 16 SYN 同步用暂停
0001 0111 23 17 ETB 区块传输结束
0001 1000 24 18 CAN 取消
0001 1001 25 19 EM 连接介质中断
0001 1010 26 1A SUB 替换
0001 1011 27 1B ESC 跳出
0001 1100 28 1C FS 文件分割符
0001 1101 29 1D GS 组群分隔符
0001 1110 30 1E RS 记录分隔符
0001 1111 31 1F US 单元分隔符
0111 1111 127 7F DEL 删除
二进制 十进制 十六进制 图形
0010 0000 32 20 (空格)(␠)
0010 0001 33 21 !
0010 0010 34 22 "
0010 0011 35 23 #
0010 0100 36 24 $
0010 0101 37 25  %
0010 0110 38 26 &
0010 0111 39 27 '
0010 1000 40 28 (
0010 1001 41 29 )
0010 1010 42 2A *
0010 1011 43 2B +
0010 1100 44 2C ,
0010 1101 45 2D -
0010 1110 46 2E .
0010 1111 47 2F /
0011 0000 48 30 0
0011 0001 49 31 1
0011 0010 50 32 2
0011 0011 51 33 3
0011 0100 52 34 4
0011 0101 53 35 5
0011 0110 54 36 6
0011 0111 55 37 7
0011 1000 56 38 8
0011 1001 57 39 9
0011 1010 58 3A :
0011 1011 59 3B ;
0011 1100 60 3C <
0011 1101 61 3D =
0011 1110 62 3E >
0011 1111 63 3F ?
二进制 十进制 十六进制 图形
0100 0000 64 40 @
0100 0001 65 41 A
0100 0010 66 42 B
0100 0011 67 43 C
0100 0100 68 44 D
0100 0101 69 45 E
0100 0110 70 46 F
0100 0111 71 47 G
0100 1000 72 48 H
0100 1001 73 49 I
0100 1010 74 4A J
0100 1011 75 4B K
0100 1100 76 4C L
0100 1101 77 4D M
0100 1110 78 4E N
0100 1111 79 4F O
0101 0000 80 50 P
0101 0001 81 51 Q
0101 0010 82 52 R
0101 0011 83 53 S
0101 0100 84 54 T
0101 0101 85 55 U
0101 0110 86 56 V
0101 0111 87 57 W
0101 1000 88 58 X
0101 1001 89 59 Y
0101 1010 90 5A Z
0101 1011 91 5B [
0101 1100 92 5C
0101 1101 93 5D ]
0101 1110 94 5E ^
0101 1111 95 5F _
二进制 十进制 十六进制 图形
0110 0000 96 60 `
0110 0001 97 61 a
0110 0010 98 62 b
0110 0011 99 63 c
0110 0100 100 64 d
0110 0101 101 65 e
0110 0110 102 66 f
0110 0111 103 67 g
0110 1000 104 68 h
0110 1001 105 69 i
0110 1010 106 6A j
0110 1011 107 6B k
0110 1100 108 6C l
0110 1101 109 6D m
0110 1110 110 6E n
0110 1111 111 6F o
0111 0000 112 70 p
0111 0001 113 71 q
0111 0010 114 72 r
0111 0011 115 73 s
0111 0100 116 74 t
0111 0101 117 75 u
0111 0110 118 76 v
0111 0111 119 77 w
0111 1000 120 78 x
0111 1001 121 79 y
0111 1010 122 7A z
0111 1011 123 7B {
0111 1100 124 7C |
0111 1101 125 7D }
0111 1110 126 7E ~
还有另一个就不多说,其实都差不多的,至于云端发送数据给手环发送的也是二进制码流,和上面那个差不多。

实物发送数据

上面用模拟器差不多调试完毕后就可以开始用实物来调试了,我们把NB模块和串口下载器连接起来然后打开串口调试助手调试数据
写到这里我突然发现NB好像是没有定位指令的,要定位可以直接调用api。。还有还要在加上陀螺仪来判断老人是否摔倒。
没办法,只能在修改数据了。。

[infobox title=”注意”]

因为NB没有定位的AT指令,所以上面的定位属性我删掉了,只留下了心率,血氧,是否摔倒。而且这些信息是一次性发送的。同时我服务器给手环发送数据命令我也不打算加了,所以现在只是单向通信,上面的东西我也懒的改了,这里请大家自行脑补。。。

[/infobox]

总之大概就是上面这功能,最后的测试结果

说实话这NB的延时有点高啊,发个东西需要2-3秒那边才能收到数据。。。

差不多调试完了,现在就是用STM32来进行开发了

STM32编程

好久没用过stm32了,感觉都有点生疏了。。还好我之前在博客上写过笔记,直接去看以前的笔记去了。

先调试好stm32的血氧模块

这里我打算在开一个串口和NB模块进行通信,stm32有5个串口,这里我就选PA2和PA 3.

串口相关的函数我之前也写过,所以这里我就直接展示结果

这个是传感器接受到了数据并通过串口2打印AT指令。

下面我需要定时发送数据,所以就用到了stm32的定时器的知识,还好之前做过笔记。。这里我每5秒发送一次数据

好了,现在就需要和NB模块相连了。

我这边是采用开发板来进行调试的,下面是实物图

这里我就搞了两个模块,一个是心率检测的,还有一个是NB模块。

然后现在可以正常的传数据到物联网平台了,下面这个是物联网平台上的效果。

以及NB模块通过串口发回的数据,通过另一个串口打印出来

ok表示发送成功。

所以,这里就差不多没了。下面就是把三维角度传感器(电子陀螺仪)整合到开发板上,实现老人的跌倒判断。

突然发现给的例程是51的?,好吧,只能想办法改成stm32的了。

不过之前那个程序已经有I2C的程序了,所以我可以直接拷过来,然后只需要修改一下管脚就可以了

这里我用PB10和PB11来作为陀螺仪的管脚,然后跑了一下,居然一次就成功了?

前3个是x,y,z的加速度

后3个是x,y,z的角速度

这里我就暂时研究到这里了,至于跌倒检测的,我就只提供参数,其他的就交给项目的其他成员了,我这边还有其他的任务。。

[infobox title=”写个小总结吧”]

1.NB向华为云的物联网平台不需要发送什么复杂的数据,只需要发送相对应的二进制码流就行了,认证应该是通过IEMI号来进行认证的。

2.NB本身没有定位的AT指令,应该是基站来定位的,不过华为云提供了定位的api接口,所以也不需要我们关心具体细节

3.NB发送数据需要2-3秒才能送达,这个算是它的一个缺点吧

4.stm32用起来还是挺简单的,只要你调用库函数就行(如果你用寄存器的话就挺难的),不过我也就是把几个例程拼凑起来而已,以后还要努力学习啊 

5.stm32功能很强大,有5个串口,而且还有很多个定时器(具体几个我也忘记了),所以大家最好不要只学51,学stm32对硬件将会有更深的理解。

6.小熊派用的是华为云的liteos系统,据说华为手机好像也是这个系统(小熊派的那个是精简的)。这个系统也是可以烧到我们的stm32开发板上的,因为小熊派的也是stm32芯片。

7.搞这个差不多搞了3天,搞硬件感觉比搞软件还要麻烦,而且硬件的程序普遍比软件的要复杂,什么指针,结构体,位操作,简直是家常菜,还有硬件的通信有串口和IIC都挺麻烦的。当然最重要的就是实际操作,焊接考手工,画PCB板考美工,调试就靠老天爷(硬件出问题没有什么提示,而且还可能出现生命威胁。。。)。

[/infobox]

还有最后的程序源码

[ypbtn]https://pan.xiaoyou66.com/s/bds29den[/ypbtn]


文章作者: 小游
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小游 !
  目录