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 许可协议。转载请注明来源 小游 !
赏
  目录