树莓派pi3B串口配置见:

https://blog.csdn.net/qq_40025335/article/details/81152028

author@New

Time:20180801

Env:raspi、4G模块、4GSIM(本人用的移动、如用联通、电信按下文APN,修改接入点名称)

整体流程

  1. ZigBee从设备采集传感器数据

  2. 主设备通过ZigBee协无线网络接收从设备数据

  3. 树莓派3B串口连接主设备接受数据

  4. 树莓派3B保存数据到本地CC2530.txt

  5. 树莓派3B连接4G模块,wxdial拨号上网

  6. 树莓派3B通过python脚本(HTTP协议)将数据发给OneNet

  7. OneNet配置创建产品设备,保存并显示数据

一、配置

注意

  • 4G模块先把树莓派WIFI功能关闭(或拔掉插入的网线)
  • 4G模块,蓝色USB线供电,需要用USB转TTL连接4G模块和树莓派(调试了半天竟然忘记)

远程监测-树莓派pi3B处理数据发送到OneNet实例 - 图1

1、ZIgBee连接传感器并采集数据发给ZigBee协调器(fan)

2、树莓派串口ttyS0(GpIO14\15)接受ZigBee协调器发来数据(通过串口发送)

python脚本实现读取串口数据保存、wxdial拨号然后发送到OneNet

3、配置4G模块,实现树莓派连网功能

(1)minicon 安装 详情见 : http://www.cnblogs.com/emouse/

  1. sudo apt-get install minicom

(2)配置minicon-

  1. +-----[configuration]------+| File transfer protocols -|Serial port setup [Enter]+-------------------------------------------------------------+| A - Serial Device : /dev/ttyUSB0 || B - Lockfile Location : /var/lock || D - Callout Program -: || E - Bps/Par/Bits : 115200 8N1 || F - Hardware Flow Control : No || G - Software Flow Control : No || Change which setting? | Enter 退出并保存配置)

可查看4G模块连接成功的回显信息

1)组合键 Ctrl+a 进入设置状态;(先按Ctrl+a后再按Q)

2)按 z 打开帮助菜单,或者你用的熟练的话,直接输入菜单对应的字母即可;

  • (1)S键:发送文件到目标系统中;
  • (2)W键:自动卷屏。当显示的内容超过一行之後,自动将後面的内容换行。功能在查看内核的啓动信息时很有用。
  • (3)C键:清除屏幕的显示内容;
  • (4)B键:浏览minicom的历史显示;
  • (5)X键:退出mInicom,会提示确认退出。

3)安装拨号: wxdial

  1. sudo apt install wxdial

(4)lsusb 指令查看usb接口情况:树莓派USB无法直接识别4G模块,需要用USB转TTL—能识别PL232(对应ttyUSB0)

  1. 网络信息 :eth0/lo/wlan0/wwan0dmesg 查看usb串口。倒数几行显示:pl2303 converter now attached to ttyUSB0

(5)打开串口助手:sudo minicom

测试AT指令: 输入AT发 返回OK -即4G连接成功

及测试其他指令,检查SIM是否接入成功等

  1. AT+CPSI?

远程监测-树莓派pi3B处理数据发送到OneNet实例 - 图2

(6) https://blog.csdn.net/jiaojian8063868/article/details/79295570

linux 加载 wxdial \ sudo apt-get install wvdial

sudo vi /etc/wvdial.conf %需要熟悉vi操作、自己在记事本中写完命令后再copy过来

linux vi 操作:百度 vi三种模式常用操作的学习

如下配置:(配置完成注意保存,vi操作—先键盘ESC—Shift+:wq 然后Enter 退出)

  1. Init3 = AT+CGDCONT=1,"IP","cmnet" %移动设置、联通、电信见下文Modem Type = Analog Modem

拨号上网:

  1. sudo wvdial Defaults

需要等待一会儿

此时可以通过ifconfig看到多出了个ppp0的网卡设备,并且已经获得IP地址

远程监测-树莓派pi3B处理数据发送到OneNet实例 - 图3

————————————————————————————————

sudo route %查看路由状态

  1. Destination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 ppp010.64.64.64 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0——————————————————————————————————Destination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 eth010.64.64.64 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0——————————————————————————————————

修改后如图1即可

可以尝试ping内网和外网:(内外ping 通可能出现卡顿,没关系,直接关掉终端,ping 外网)

  1. pi@raspberrypi:~ $ ping 192.168.1.1PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.522 ms64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.470 ms64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.402 ms64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.449 ms
  2. pi@raspberrypi:~ $ ping www.baidu.comPING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.64 bytes from 61.135.169.125: icmp_seq=1 ttl=54 time=23.3 ms64 bytes from 61.135.169.125: icmp_seq=2 ttl=54 time=27.0 ms64 bytes from 61.135.169.125: icmp_seq=3 ttl=54 time=13.5 ms64 bytes from 61.135.169.125: icmp_seq=4 ttl=54 time=23.1 ms

ping 通说明已经具有联网功能

上述配置结束,关闭终端,4G拨号上网

重新打开 输入:sudo wvdial Defaults

远程监测-树莓派pi3B处理数据发送到OneNet实例 - 图4

出现如下图:(不要关闭终端,此时已经能够上网了)

远程监测-树莓派pi3B处理数据发送到OneNet实例 - 图5

APN设置

远程监测-树莓派pi3B处理数据发送到OneNet实例 - 图6

  1. 移动: at+cgdcont=1,"ip","cmnet"联通: at+cgdcont=1,"ip","3gnet"电信: at+cgdcont=1,"ip","ctnet"

4、打开另一终端,运行python脚本,将数据传至OneNet

二、发送数据到OneNet

1 数据接收

树莓派3B的GPIO 14、15引脚分别于ZigBee 终端Tx、Rx 相连接,Python编程,分别每个10秒读取串口数据。

2 数据分割

考虑到读取的一帧数据,需要分割出各个数据节点数据,帧格式为:

  1. ID:0001|BT: 34%|T:+23.6|ZD: 93%|PH: 2.1|DD:NoWater|ID:0001|BT: 34%|T:+23.6|ZD: 93%|PH: 2.1|DD:2.04E-4|

帧开头表示为ID0001表示设备标号;BT表示当前设备电池电量;T表示为当前水温度

ZD表示为水质的浊度;PH表示为水质PH值;DD表示为水质电导率

注:监测设备没有放入水中或者脱离水面,发送提醒信息NoWater

3 数据发送

将各个节点数据按数据流发送,数据流格式

  1. values = {'datastreams': [{"id": "temperature", "datapoints": [{"at": CurTime.isoformat(), "value": temperature}]}

对json格式进行编码并设置HTTP访问。

下面代码为调试代码,仅供参考:

  1. #Function:save achieve and savecc2530 data# wxdial online,and send data to OneNet#Environment:Raspi3B、cc2530、4G模块、USB转TTL、4GSIM# from multiprocessing import Process, QueueAPIKEY = 'xZcHvdq2gMptxrcWWxBXpRdg6RU=' # Project APIKEYdef read_serial(read_cc2530_data): parity = serial.PARITY_NONE, stopbits = serial.STOPBITS_ONE, bytesize = serial.EIGHTBITS, # fileObject = open('/home/pi/Desktop/BirdVision/cc2530.txt', 'w')#注意:数据保存顺序及读取发送数据顺序 cc2530_data = ser.read(42) read_cc2530_data.put(cc2530_data) #fileObject = open('/home/pi/Desktop/BirdVision/cc2530.txt', 'w') #将数据写入文件cc2530.txt or 或者数据不保证直接发送出去? # fileObject.write(cc2530_data)#把read_serial data 给save_cc2530 保存到本地def save_cc2530(read_cc2530_data): sensor_data = read_cc2530_data.get() fileObject = open('/home/pi/Desktop/BirdVision/cc2530.txt', 'w') # 注意:数据保存顺序及读取发送数据顺序 fileObject.write(sensor_data)#把read_serial data 给get_cc2530 做数据类型转换 # file = open("/sys/class/thermal/thermal_zone0/temp") # file = open("/home/pi/Desktop/BirdVision/cc2530.txt") temp = float(file.read()) / 1000 print"CPU温度值为: %.3f" % temp#将get_cc2530 换环后数据发送给OneNetdef http_put(read_cc2530_data): send_data = read_cc2530_data.get() # temp = float(file.read()) / 1000 send_data = float(send_data) / 1000 print("CPU温度值为: %.3f" % temp) temperature = get_cc2530() # 获取CPU温度 CurTime = datetime.datetime.now() url = 'http://api.heclouds.com/devices/36680738/datapoints' # 36680738 -devices id values = {'datastreams': [{"id": "temperature", "datapoints": [{"at": CurTime.isoformat(), "value": temperature}]}]} print("当前ISO时间为: %s" % (CurTime.isoformat())) print("上传的温度值为: %.3f" % temperature) jdata = json.dumps(values) # 对json格式进行编码 request = urllib2.Request(url, jdata) request.add_header('api-key', APIKEY) request.get_method = lambda: 'POST' # 设置HTTP访问 request = urllib2.urlopen(request)if __name__ == "__main__": read_cc2530_data = Queue(3) rs = Process(target=read_serial, args=(read_cc2530_data,)) sv = Process(target=save_cc2530, args=(read_cc2530_data,)) hp = Process(target=http_put, args=(read_cc2530_data,)) # pr进程里是个死循环,无法等待期结束,只能强行结束

三、OneNet APi 配置及功能

OneNet目前支持大部分物联网协议,包括公网协议HTTP,MQTT,EDP等,还提供私有协议支持,方便开发者个人定制。

1、 OneNet创建产品

OneNET3.1更新后,一个重要的新特性就是在公有协议中,增加了一个全新的参数:注册码

API中,使用注册码作为参数,HTTP内容为相关设备属性,包括鉴权信息等,返回值为设备的api-key和设备id

2、 返回的设备API-KEY只对该设备有效,不能对其他设备进行操作;

3、 调用当allow_dup为true时,使用同一鉴权信息重复调用该API,可作为查询功能使用;当allow_dup为false时,当使用同一鉴权信息重复调用该API时,回返回错误信息。

远程监测-树莓派pi3B处理数据发送到OneNet实例 - 图7