#打卡不停更# 手把手教你完成智慧路灯开发【华为云IoT端边云】 原创 精华
一、前言
近年来,物联网引领了继计算机、互联网之后世界信息产业的第三次发展浪潮,且逐步在各行各业得到更广泛的应用。物联网的定义是万物互联,表示任何设备都可以连在一起,进行数据交互。
那么物联网到底是什么?设备如何上云?云平台又是什么?很多不是物联网专业的,不是搞嵌入式的或者是刚学习物联网的都不太清楚,虽然概念性的东西百度一大堆,书上也是各种专业词汇,如果无法将这些概念性的东西实体化,最终还是理解不了整个流程,云里雾里。
那么接下来以华为云IOT平台为例,从最基础开始一步一步的完成一个智慧路灯
的项目开发,让大家对物联网有个详细的理解。
本次讲解的智慧路灯是一个真实产品模型,去年我在老家的庭院就安装了一个太阳能智慧路灯,使用了一年多了感觉非常不错。
先介绍下这个款太阳能智能路灯支持的功能:
(1)支持太阳能充电,也支持接市电。
(2)路灯本身支持独立联网,也支持连接WIFI(如果是家里庭院使用,一般可以接自己家里的WIFI,如果有的话)。
(3)路灯上有球形监控摄像头,能监控四周。
(4)在厂家提供的手机APP上可以远程查看路灯的电量,充电状态,充电强度,环境光强度,环境温度湿度,查看摄像头画面,远程开关灯、拍照等等。 通过湿度的检测,检测到下雨时手机上还会进行弹窗提示。
那么本篇文章的目的就很明确了:利用华为云IOT作为云平台,自己购买硬件实现这款路灯的所有功能(不能说完全一样,但是基本功能都要实现出来)。
需要使用的到华为云的产品如下:
(1)OBS数据存储(存储上传的数据)
(2) IoTDA设备接(设备上云)
(3)ECS云服务器(搭建流媒体服务器,接收摄像头的RTMP流)
(4)数字化大屏–数据可视化DLV
二、整体设计思路
在进行正式设计开发之前,先把整体的思路捋一捋。
2.1 开发流程
下面列出本次开发流程:
(1). 注册华为云账号,在物联网模块里,创建产品,创建物模型,创建设备。
(2). 采用MQTT客户端,以软件来模拟设备的方式登录华为云物联网平台,实现路灯数据的模拟上传。
(3). 开发底层硬件代码,完成设备上云的对接。
(4). 购买ECS云服务器,搭建NGINX服务器,作为流媒体服务器接收摄像头上传的数据流。
(5). 创建OBS数据存储桶,完成数据存储。
(6). 创建数据可视化DLV大屏,显示设备上报的数据。
2.2 硬件介绍
首先说明: 因为本项目并不是商业项目,目的是以智慧路灯产品的功能开发过程来演示一款物联网产品的开发流程。 所以在硬件选型上不考虑成本,能用模块就采用模块实现。
本次设计的智慧路灯硬件上分为3个部分:
(1)路灯的太阳能充电部分 : 直接采用现成的充电模块 + 锂电池 + 太阳能板。
(2)路灯的传感器数据采集部分 : 单片机采用STM32(小熊派) + NBIOT-BC20 + 温湿度传感器DHT11 + 光敏传感器BH1750
(3)摄像头监控部分: 采用树莓派4B + 一个USB摄像头来实现(联网就是直接将网线口插家里的路由器),功能上:利用ffmpeg采集声卡声音、摄像头数据编码RTMP格式后上传到华为云ECS服务器,NGINX接收到数据再转成为HLS格式(HTTP协议),再通过数据可视化DLV大屏的HLS播放器控件进行显示播放。
2.3 物理网知识点科普
在完成实际操作之前,先提前了解一些知识。本次完成的智慧路灯就是一个典型的物联网产品。 物联网主要体现就是万物互联。 这里面的万物
一般说的就是设备,比如:家里的冰箱,电风扇,窗帘,或者是外面马路上的行驶的汽车,商店前台的共享充电宝,工厂里运行的机器这些都是设备。互联
表示设备之间可以互相连接,进行数据交换。 设备互联之后,数据就能得到共享,不再是单机设备,可以进行联动操作,能发掘出设备的更多价值。
物联网里的设备是如何实现互联的?
在物联网里要完成设备连接的方式有很多种,比如:GSM(2-3-4-5G,)、NB-IoT,LORA、WIFI,Zigbee、蓝牙、有线方式(485,CAN,RS232,USB)都可以完成设备连接通信。
说到这个设备互联,就有人发言了,怎么没看到MQTT,COAP,HTTP这些协议呀? 从事物联网的人员一定有听过NB-IoT,wifi,蓝牙,zigbee,MQTT,COAP这些词。 那么这些协议直接的关系一定是要搞清楚。
上面提到的连接方式:WIFI,Zigbee、蓝牙 这些都是物理层的协议,这些都需要硬件芯片模组支持。 而刚才说的MQTT,COAP,HTTP都是应用层协议,也就是纯软件协议,一般是用来对接服务器,对接云平台的。 所以(MQTT,COAP,HTTP)是居于(NB-IoT,LORA,WIFI,蓝牙,zigbee,4G)的上层应用协议。
问题: 设备如何上云?
设备要上云就需要遵循云平台,云服务器的协议才能进行通信,比如:MQTT协议、HTTP协议等等。 如何才能支持MQTT协议,HTTP协议?可以采用WIFI,GSM、NBIOT模块进行协议转换,通过MQTT协议连接云平台。
问题:设备上云后有什么直观的体验?
这个可以从生活中的几个实际场景进行体验:
(1)智能摄像头:摄像头上云之后,可以在任何地方打开手机查看家里的监控,实时防盗监控,出远门也安心了。
(2)空调、窗户、窗帘设备上云:上云之后,在手机里远程控制家里的设备开关。 在炎热的夏天,下班时可以在手机上控制打开空调制冷、关闭窗户,拉上窗帘。 增强体验感。
(3)智能鱼缸上云: 可以远程给鱼儿投喂食物,了解鱼缸里水质情况,含氧量,换水等操作,还能通过摄像头查看鱼缸里的情况,出差都能了解家里的情况。
(4)智能花盆上云: 手机上随时了解土壤含水量、周围光照度,空间湿度情况,还能通过手机控制水泵进行浇水。
(5)智能井盖上云:城市的井盖下都是污水管道,在井盖上可以安装各种检测传感器,上云之后,城市环境管理局
可以详细了解到城市每个井盖的详细数据,在地图上可以看到每个井盖的位置。 通过井盖传感器检测可以了解井盖下的有害气体,易燃气体浓度。下暴雨之后,还可以了解那里管道拥堵,可以第一时间排险。
还有很多很多的案例…
三、云平台产品、设备、物模型创建
3.1 华为云IOT平台介绍
华为云物联网平台(IoT设备接入云服务)提供海量设备的接入和管理能力,可以将IoT设备联接到华为云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品。
使用物联网平台建造一个完整的物联网解决方案主要包括3部分:物联网平台,业务应用和设备。
1,物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户快速构建各种物联网业务应用。
2,设备可以通过固网,2G / 3G / 4G / 5G,NB-IoT,Wifi等多种网络接入物联网平台,并使用LWM2M / CoAP或MQTT协议将业务数据上报到平台,平台也可以将控制命令下发给设备。
3,业务应用通过调用物联网平台提供的API,实现设备数据采集,命令下发,设备管理等业务场景。
物联网平台支持终端设备直接连接,也可以通过工业网关或家庭网关连接;支持多网络接入,多协议接入,系列化代理连接,解决设备接入复杂的微小和碎片化难题;也提供了更丰富完备的设备管理能力,简化了海量设备管理复杂性,减少了人工操作,提升了管理效率。
设备+物联网平台+应用事是最为通用的场景,设备将数据上报到IoT平台,IoT平台对设备进行管理,同时针对不同的事件类型,转换数据推送到用户应用,同时应用可以将命令下发到IoT平台,平台可以缓存/实时下发命令给设备。
3.2 创建产品
从这里就开始手把手操作了,完成云平台产品创建,设备创建,物模型构建,设备上云测试等等。
(1) 登录华为云官网
没注册账号就先注册(注册了就忽略,直接登录
官网地址: 共建智能世界云底座-华为云 (huaweicloud.com)
在产品目录下,找到物联网,再找到IOTDA
(2)ioTDA页面
链接: 华为云物联网平台华为云IoT平台IoT_设备接入-华为云 (huaweicloud.com)
(3)查看平台服务器接入地址
这个信息对接下来连接华为云物联网平台很重要:
端口: 1883
域名: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
IP地址: 121.36.42.100
(4)创建产品
先云平台先创建一个自己的产品模型。
根据自己的产品名字,类型填充: 协议选择MQTT协议,数据格式选择JSON格式。
下面的设备类型选择自定义类型。
点击确认创建成功。
(5)创建自定义模型-添加服务ID
产品创建之后,在产品选项页面,点击自己的产品,进入产品详情页面。
产品模型用于描述设备具备的能力和特性,平台提供多种方式定义产品模型; 如果没有定义产品模型,设备上报数据时平台仅直接转发,不做解析。
点击下面的自定义模型按钮,开始创建模型。
设置服务ID:
(6)添加属性
每个设备都有自己的属性。通俗来讲: 属性字段存放设备上传的数据类型。 比如:根据 温度传感器、湿度传感器、光敏传感器采集的数据类型,在设备模型里就需要创建对应的属性字段来存放这些数据类型。
接下来就创建属性:
【1】温度字段
【2】湿度字段
【3】光照强度字段
【4】路灯的电量
【5】路灯的手动开关按钮
路灯除了自动模式下可以自动开关灯外,还能能支持云端手动开关控制。 这个按钮字段的访问权限也给成可读可写。(后续的应用侧开发,可能需要修改这个字段)
属性字段添加完毕:
(7)总结
到这里属性字段已经添加成功。 这创建自定义模型这一步里面设置的服务ID和属性字段的名字比较重要。接下来的设备向服务器上传数据时,规定的JSON格式中就需要填服务ID和对应的属性名称。这样服务器收到数据之后,才知道这个数据是给设备的哪一个字段赋值。
下面做个总结,方便后续直接拿来使用。
服务ID: LED
属性名称 数据类型 访问方式 描述
Button int(整型) 可读,可写 路灯的手动开关按钮
humidity int(整型) 可读 环境湿度
temperature int(整型) 可读 环境温度
light int(整型) 可读 环境光强度
Power int(整型) 可读 路灯剩余电量
3.3 创建设备
前面一步创建的产品模型是一个抽象的框架,在产品下面的设备才对应具体的硬件。 所以,一个产品下可以创建关联很多的设备。
(1)注册设备
在对应的产品模型下添加设备。
创建完成后,保存设备的ID和设备密匙。
我的设备密匙如下:
{
"device_id": "634e3e423ec34a6d03c84bfb_1126626497",
"secret": "1126626497"
}
这个密匙信息就是设备的身份信息,接下来的MQTT协议交互里,就需要通过这个设备身份信息生成MQTT登录参数,也就是MQTT三元组。
(2)设备创建成功
根据前面的操作,一个新设备就创建好了。目前还没有登录,这里就还是处于未激活状态。
(3)生成MQTT登录三元组
拿到设备的密匙信息,利用华为云提供的MQTT连接鉴权信息生成工具,生成MQTT鉴权三元组。
在线工具的地址:Huaweicloud IoTDA Mqtt ClientId Generator (myhuaweicloud.com)
根据界面提示,填入设备密匙,点击Generate,生成信息。
得到的信息如下:
ClientId 634e3e423ec34a6d03c84bfb_1126626497_0_0_2022101806
Username 634e3e423ec34a6d03c84bfb_1126626497
Password 67ffb4d7ddc66e6292276aefe5bcc3df0448a3883b0438aaa073113185d7ec20
接下来就可以利用这3个参数连接设备设备了。
(4)利用MQTT客户端模拟设备登录(激活设备)
下面使用的这个MQTT客户端是我自己开发的,主要是方便大家使用连接华为云进行测试。在文章最后会附上工具的下载地址。
打开MQTT客户端之后,根据界面提示,填入对应的参数: 这些参数都在前面介绍了的。填好之后,点击登录。
登录成功,软件会收到云平台的回应:
接下来打开云平台的设备页面,查看状态: 目前设备已经在线了 。
目前设备已经激活,还没有上传数据。
(5)MQTT主题格式说明
设备登录激活之后,接下来的步骤就是上传数据到云平台。
MQTT里要了解2个操作操作:订阅主题、发布主题。
在产品页面,可以看到主题的格式,以及对于主题的用途:
【1】订阅主题
对于设备而言,一般会订阅平台下发消息给设备
这个主题。
设备想接收平台下发的消息,就需要订阅平台下发消息给设备
的主题,订阅后,平台下发消息给设备,设备就会收到消息。
主题的格式如下:
$oc/devices/{device_id}/sys/messages/down
根据当前的路灯设备,最终的格式:
$oc/devices/634e3e423ec34a6d03c84bfb_1126626497/sys/messages/down
【2】发布主题
对于设备,发布主题,也就显示向云平台上传数据。
发布的主题格式如下:
$oc/devices/{device_id}/sys/properties/report
根据当前的路灯设备,最终的格式:
$oc/devices/634e3e423ec34a6d03c84bfb_1126626497/sys/properties/report
发布主题时,需要上传数据,这个数据格式是JSON格式。
上传的JSON数据格式如下:
{
"services": [
{
"service_id": <填服务ID>,
"properties": {
"<填属性名称1>": <填属性值>,
"<填属性名称2>": <填属性值>,
..........
}
}
]
}
根据JSON格式,一次可以上传多个属性字段。 这个JSON格式里的,服务ID,属性字段名称,属性值类型,在前面创建产品的时候就已经介绍了,不记得可以翻到前面去查看。
根据这个格式,组合一下智慧路灯一次上传的数据:
{"services": [{"service_id": "LED","properties":{"temperature":24,"humidity":60,"light":1200,"Power":80}}]}
(6)利用MQTT客户端上传数据到云平台
根据得到的主题格式,和数据格式,填入到MQTT客户端软件里发送。
发送成功后,打开云平台页面可以查看到上传的数据。
到此,一个物联网产品的模型已经完成。
四、构建数据可视化服务(DLV)
为了方便显示数据可视化服务器,可以利用华为云的数据可视化服务(DLV)来进行展示数据。
华为云物联网平台提供了数据转发服务,对于设备上报的数据,可以选择让平台将设备上报数据推送给应用服务器,由应用服务器进行保存;还可以选择让平台将设备上报数据转发给对象存储服务(OBS),由OBS进行存储,进行永久保存。 数据可视化服务(DLV)可以从OBS文件读取数据呈现为可视化报表,实现数据的可视化显示。
接下来要完成的任务是: 将路灯上报的数据转发到OBS存储桶里,然后可视化服务DLV再读取数据进行显示。
4.1 创建OSB存储桶
地址: 对象存储服务OBS官网海量安全高可靠数据云存储解决方案-华为云 (huaweicloud.com)
对象存储服务(Object Storage Service,OBS)是一个基于对象的存储服务,提供了海量、安全、高可靠、低成本的数据存储能力。
(1)选择管理控制台
(2)创建桶
填充桶信息: 我这里选择的是 华北-北京一
我这里因为要长期使用,这里选择1年的购买权。
(3)创建成功
4.2 配置数据转发规则
(1)创建规则
选择左侧导航栏的规则>数据转发
,单击右上角的创建规则
。
填充规则转发的信息:
参数名 | 参数说明 |
---|---|
规则名称 | 自定义,如: led_obs。 |
规则描述 | 自定义,如数据转发至OBS服务。 |
数据来源 | 选择“设备属性”。 |
触发事件 | 自动匹配“设备属性上报”。 |
资源空间 | 和上一步创建的产品所在的资源空间保持一致。 |
点击继续设置:
(2)设置转发目标
单击添加
,设置转发目标。
这里的区域选择–华北-北京一
。 因为前面的OBS桶创建的时候,设置区域设置的是北京一
,然后点击授权。
授权之后,选择刚才创建的OBS桶,设置存储数据的目录和文件名字。 文件类型选择CSV。
下面设置转发的字段: (如果提示没有授权,点击授权即可)
这个转发字段就是表示需要存放的数据是那些,对于路灯而言,肯定是需要存储上报的温度、湿度、电量、光照强度的属性的。 这些属性在创建产品的时候设置,设备上报的也是这些属性。
这是设备上传一次云平台的完整数据:
{
"resource": "device.property",
"event": "report",
"event_time": "20221018T131627Z",
"request_id": "5ee95a0c-262d-43c3-8d31-af453f9952ef",
"notify_data": {
"header": {
"app_id": "7211833377cf435c8c0580de390eedbe",
"device_id": "634e3e423ec34a6d03c84bfb_1126626497",
"node_id": "1126626497",
"product_id": "634e3e423ec34a6d03c84bfb",
"gateway_id": "634e3e423ec34a6d03c84bfb_1126626497"
},
"body": {
"services": [
{
"service_id": "LED",
"properties": {
"temperature": 28,
"humidity": 62,
"light": 1300,
"Power": 90
},
"event_time": "20221018T131627Z"
}
]
}
}
}
如果我的路灯属性里有一个温度属性字段temperature
,我想转发设备上传的这个温度字段,就可以这样写:
notify_data.body.services[0].properties.temperature
后面的存储目标字段,为了好区分,直接填temperature
即可。
如果要转发湿度字段humidity
,就按下面这样写:
notify_data.body.services[0].properties.humidity
剩下的按照自己的需要转发的填写即可。
如果存储数据时,想知道这个数据是那个产品,那个设备上传的,也可以将设备ID和产品ID转发存储起来:格式如下。
notify_data.header.app_id
notify_data.header.device_id
我这里只是转发了路灯的4个属性字段:
确定后,点击设置完成。
(3)启用规则
设置完成后,点击启用规则。
(4)规则修改
如果后续需要修改规则,可以点击设置转发目标页面,点击右下角的修改。
可以进行规则修改:
(5)数据上报测试
为了验证转发规则是否生效,接下来使用MQTT客户端多上报几次数据到云平台。
上传之后,打开OBS存储桶的控制台页面。打开转发规则存储的OBS桶。
找到存储数据的文件,点击下载。
下载下来,打开可以看到存储的数据:
到此,数据转发,存储已经成功了。
4.3 配置数据可视化服务
数据可视化服务(Data Lake Visualization)是一站式数据可视化平台,适配云上云下多种数据源,提供丰富多样的2D、3D可视化组件,采用拖拽式自由布局,可以快速定制和应用属于自己的数据大屏。
(1)购买服务套餐
新用户使用,有一个月基础版的使用权限。 可以点击体验试用获取。 已购买的,直接点击进入控制台。
如果体验期已过,就需要自己购买,我这里选择购买1年的基础版60块钱。
注意: 这个区域要选择与OBS存储桶一个区域。 否则到时候用不了。
购买成功:
(2)新建数据连接
使用OBS数据源,可以将大屏与OBS服务建立数据连接,在大屏上展示存储在OBS中的CSV文件的数据。
选择CSV文件:
这里需要填:访问密钥(AK和SK)。获取步骤如下:
1. 登录管理控制台(或者点击右上角自己的用户名)。
2. 将鼠标移到右上角的用户名上,在下拉列表中单击“我的凭证”。
3. 进入“我的凭证”后,在单击“访问密钥”。
4. 在“访问密钥”页面中,可以查看已有的访问密钥ID(即AK),如果要同时获取AK和SK,可以单击“新增访问密钥”创建并下载访问密钥,下载的密钥文件中包含AK和SK。
点击新增访问密匙:
创建后下载下来:
得到密匙之后,填充数据连接的配置:
数据连接创建成功:
(3)新建大屏
选择空白大屏,填好名字,创建大屏。
(4)新建数据转换器
在上方按钮里选择数据转换器。新建一个名称为data
的数据转换器。 代码为空,不处理。
(5)编辑大屏
界面的话,可以根据控件自行设计。我这里采用文本控件来显示路灯设备上传的数据。
选中文本控件之后,右边的数据源选择–CSV文件
,选择创建的数据连接
,再选择数据转换器
,然后下面选择文本里需要显示的字段。
说明: 由于基础版不能直接选择OBS源,当前的数据源选择的是CSV文件,默认DLV大屏只读取CSV文件的第一行数据。
下面是创建好的界面:
下面可以设置请求时间:
(6)预览界面
(7)发布界面
在界面可以看状态已经是发布状态了:
然后将链接分享给其他人,都可以通过浏览器打开访问查看效果。
这是手机上查看效果:
五、ECS云服务器部署流媒体服务器
智慧路灯上有一个监控摄像头,为了方便查看摄像头推送的视频流,这里购买华为云的ECS服务器,部署NGINX服务器,接收流媒体数据。
5.1 购买ECS服务器
官网地址: https://www.huaweicloud.com/
【1】选择弹性云服务器 ECS。
【2】区域选择华北北京一
。
【3】系统选择CentOS 7.4 。
【4】配置网络
【5】立即购买
5.2 登录ECRS服务器
在控制台选择云服务器,直接网页上登录终端即可。
5.3 部署NGINX服务器
(1) 先安装一些工具
yum install -y pcre pcre-devel openssl openssl-devel zlib zlib-devel gcc gcc-c++
yum install -y vim wget lsof git zip unzip
(2)获取Nginx二进制源码
rtmp模块暂时只支持Nginx13-15版本,当前就在官网下载Nginx14
wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar xvf nginx-1.14.2.tar.gz
(3)获取nginx-rtmp-module
wget https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v1.2.1.tar.gz
tar xvf v1.2.1.tar.gz
(4)编译nginx
cd nginx-1.14.2
./configure --add-module=../nginx-rtmp-module-1.2.1/ --with-http_ssl_module
make && make install
#建立软链接
ln -s /usr/local/nginx/sbin/nginx /usr/bin
特别说明:
如果在配置时报错,一般就是缺东西了,安装了再配置。
比如:报错 ./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the mo ....
解决:
yum -y install pcre-devel
yum -y install openssl openssl-devel
(5)修改Nginx的配置文件
打开/usr/local/nginx/conf/nginx.conf文件,在文件最后面加入下面的配置。
rtmp {
server {
listen 8888;
application live {
live on;
}
}
}
上面8888是rtmp推流和拉流的端口。
修改nginx.conf之后,重启nginx服务:
sudo service nginx restart
重启服务之后,使用netstat -ltn命令查看TCP监听的端口,确认下Nginx的监听端口是否正常。
正常情况,一个是我们自己设置的rtmp服务监听端口8888,还有一个80是Nginx默认的HTTP服务监听端口。
接下来可以在浏览器里输入本机IP地址:http://127.0.0.1/,查看Nginx服务开启状态。
(6)设置开机启动
wget http://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx
chmod +x /etc/init.d/nginx
update-rc.d nginx defaults
(7)控制nginx服务的3个命令: 启动、停止、重启
service nginx start
service nginx stop
service nginx restart 或者 nginx -s reload (运行中生效配置文件)
(8)进行rtmp推流
服务器搭建好之后,推流和拉流的地址就是: rtmp://<服务器IP地址>:8888/live/<推流存放的目录>
例如: rtmp://127.0.0.1:8888/live/xl
(9)nginx保存推流视频文件
如果需要让推流上来的文件保存下来后续进行查看历史文件,可以配置nginx进行保存。
在原来的/usr/local/nginx/conf/nginx.conf
配置文件里rtmp模块中增加新的配置:
record all;
record_unique on;
record_path "./video"; #视频缓存的路径
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
完整/usr/local/nginx/conf/nginx.conf
里的rtmp模块的配置如下:
#RTMP服务
rtmp {
server {
listen 8888;
application live {
live on; #开启实时
record all;
record_unique on;
record_path "./video"; #视频缓存的路径
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
}
}
}
配置之后执行命令nginx -s reload
重启服务器即可。
(10)rtmp直播流转为hls直播流
什么是HLS直播流?
HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议,用于实时音视频流的传输。目前HLS协议被广泛的应用于视频点播和直播领域。
原理介绍
HLS 跟 DASH 协议的原理非常类似。通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件,然后提供一个配套的媒体列表文件,提供给客户端,让客户端顺序地拉取这些媒体文件播放,来实现看上去是在播放一条流的效果。由于传输层协议只需要标准的 HTTP 协议,HLS 可以方便的透过防火墙或者代理服务器,而且可以很方便的利用 CDN 进行分发加速,并且客户端实现起来也很方便。
HLS 把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。HLS 协议由三部分组成:HTTP、M3U8、TS。这三部分中,HTTP 是传输协议,M3U8 是索引文件,TS 是音视频的媒体信息。
HLS协议编码格式要求:
视频的编码格式:H264
音频的编码格式:AAC、MP3、AC-3
视频的封装格式:ts
保存 ts 索引的 m3u8 文件
配置/usr/local/nginx/conf/nginx.conf
将RTMP流转为HLS流。
在http
模块的server
配置里增加新的配置:
location /live_hls{
types {
#m3u8 type设置
application/vnd.apple.mpegurl m3u8;
#ts分片文件设置
video/mp2t ts;
}
#指向访问m3u8文件目录
alias ./m3u8File; #和rtmp模块里的hls_path设置路径一样
add_header Cache-Control no-cache; #禁止缓存
}
在rtmp
模块的server
配置里增加新的配置:
hls on; #开启hls
hls_path ./m3u8File; #hls的ts切片存放路径 (这是个目录,会自动创建的)
hls_fragment 2s; #本地切片长度
hls_playlist_length 6s;#HLS播放列表长度
/usr/local/nginx/conf/nginx.conf文件的完整的配置如下:
worker_processes 1; #Nginx进程数,建议设置为等于CPU总核数
events {
worker_connections 1024; #工作模式与连接数上限
}
rtmp_auto_push on;
#RTMP服务
rtmp {
server {
listen 8888;
application live {
live on; #开启实时
record all;
record_unique on;
record_path "./video"; #视频缓存的路径
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
hls on; #开启hls
hls_path ./m3u8File; #hls的ts切片存放路径
hls_fragment 2s; #本地切片长度
hls_playlist_length 6s;#HLS播放列表长度
}
}
}
#HTTP服务
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8099;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /live_hls{
types{
#m3u8 type设置
application/vnd.apple.mpegurl m3u8;
#ts分片文件设置
video/mp2t ts;
}
#指向访问m3u8文件目录
alias ./m3u8File;
add_header Cache-Control no-cache; #禁止缓存
}
location /control{
rtmp_control all;
}
location /stat{
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl{
root ./nginx-rtmp-module-master;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
配置之后重启服务器即可。
5.4 视频推流测试
按照前面的配置,RTMP推流地址和HTTP访问地址如下: 接下来硬件上采集到摄像头数据,通过ffmpeg编码后,直接填写下面地址进行推流即可。
RTMP推流和拉流地址: rtmp://127.0.0.1:8888/live/video01
那么对应的HTTP的访问地址:http://127.0.0.1:8099/live_hls/video01.m3u8
说明: 转为HLS流之后,如果浏览器支持HLS流就可以直接输入地址播放。一般手机浏览器都支持的。比如:苹果手机的自带浏览器,QQ浏览器等浏览器都支持直接播放HLS流。PC机的谷歌浏览器默认是不支持的。
六、硬件设计
硬件上分为两个部分: (1)摄像头部分 (2)太阳能充电+传感器部分
5.1 摄像头监控实现
(1)硬件组成
摄像头远程监控部分采用:树莓派4B + USB摄像头实现。 视频压缩,编码,推流采用ffmpeg实现。
(2)编译FFMPEG
视频编码,推流需要用到ffmpeg的库,需要先下载ffmpeg源码进行编译,得到xxx.so。
由于编译ffmpeg需要一些其他的库,再编译ffmpeg之前先编译其他的一些库。
【1】编译安装NASM 下载NASM库: http://distfiles.macports.org/nasm/
pi@raspberrypi:/media/pi/DS小龙哥/work $ mv /home/pi/Downloads/nasm-2.14.02.tar.bz2 ./
pi@raspberrypi:/media/pi/DS小龙哥/work $ tar xvf nasm-2.14.02.tar.bz2
pi@raspberrypi:/media/pi/DS小龙哥/work $ cd nasm-2.14.02/
pi@raspberrypi:/media/pi/DS小龙哥/work/nasm-2.14.02 $ ./configure
pi@raspberrypi:/media/pi/DS小龙哥/work/nasm-2.14.02 $ make
pi@raspberrypi:/media/pi/DS小龙哥/work/nasm-2.14.02 $ sudo make install
【2】编译X264
下载地址: https://www.videolan.org/developers/x264.html
pi@raspberrypi:/media/pi/DS小龙哥/work $ mv /home/pi/Downloads/x264-master.tar.bz2 ./
pi@raspberrypi:/media/pi/DS小龙哥/work $ tar xvf x264-master.tar.bz2
pi@raspberrypi:/media/pi/DS小龙哥/work $ cd x264-master/
pi@raspberrypi:/media/pi/DS小龙哥/work/x264-maste $ ./configure --prefix=$PWD/_install --enable-shared
pi@raspberrypi:/media/pi/DS小龙哥/work/x264-master $ make && make install
pi@raspberrypi:/media/pi/DS小龙哥/work/x264-master $ sudo cp _install/include /usr/ -rf
pi@raspberrypi:/media/pi/DS小龙哥/work/x264-master $ sudo cp _install/lib /usr/ -rf
【3】编译ffmpeg
下载地址: http://www.ffmpeg.org/download.html
pi@raspberrypi:/media/pi/DS小龙哥/work $ mv /home/pi/Downloads/ffmpeg-4.2.2.tar.bz2 ./
pi@raspberrypi:/media/pi/DS小龙哥/work $ tar xvf ffmpeg-4.2.2.tar.bz2
pi@raspberrypi:/media/pi/DS小龙哥/work $ cd ffmpeg-4.2.2/
pi@raspberrypi:/media/pi/DS小龙哥/work/ffmpeg-4.2.2 $ sudo apt-get install libomxil-bellagio-dev
pi@raspberrypi:/media/pi/DS小龙哥/work/ffmpeg-4.2.2 $ ./configure --enable-shared --prefix=$PWD/_install --enable-gpl --enable-libx264 --enable-omx-rpi --enable-mmal --enable-hwaccel=h264_mmal --enable-decoder=h264_mmal --enable-encoder=h264_omx --enable-omx
pi@raspberrypi:/media/pi/DS小龙哥/work/ffmpeg-4.2.2 $ make && make install
pi@raspberrypi:/media/pi/DS小龙哥/work/ffmpeg-4.2.2 $ sudo cp _install/include /usr/ -rf
pi@raspberrypi:/media/pi/DS小龙哥/work/ffmpeg-4.2.2 $ sudo cp _install/lib /usr/ -rf
pi@raspberrypi:/media/pi/DS小龙哥/work/ffmpeg-4.2.2 $ sudo cp _install/bin /usr/ -rf
pi@raspberrypi:/media/pi/DS小龙哥/work/ffmpeg-4.2.2 $ ffmpeg -v
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 8 (Raspbian 8.3.0-6+rpi1) .. .....................
..........................
(3)推流代码
推流代码篇幅较长,这里就不贴出来了。
不过这个功能也可以采用命令行实现:
推流本地实时音频视频到流媒体服务器
示例:
[xl@DS_小龙哥 linux_c]$ ffmpeg -f video4linux2 -r 12 -s 640x480 -i /dev/video0 -f alsa -i default -ar 44100 -ac 1 -f mp3 -qscale 10 -f flv "rtmp://127.0.0.1:8086/live/123"
参数解析:
-f video4linux2 指定linux下的视频驱动框架
-s 640x480 指定视频尺寸
-i /dev/video0 摄像头节点
f alsa 声卡驱动框架
-i default 选择声卡,这里选择默认声卡
-ar 44100 声音采样频率
-ac 1 单声道
-f mp3 MP3音频
-qscale 10 设置画面质量,值越小画面质量越高
f flv 指定封装格式
"rtmp://127.0.0.1:8086/live/123" 流媒体服务器地址
由于华为云的DLV可视化服务组件里的rtmp播放器在基础版里无法使用,这里的推流就不用DLV进行演示了。 如果买了高版本的DLV可视化服务,将RTMP或者FLV播放控件拖到界面上,在属性里设置ECS服务器里的推流地址即可播放监控视频了。
5.2 智慧路灯部分
智慧路灯硬件: 太阳能充电板 + 锂电池 + 充电模块 + STM32F103系统板 + BH1750光强传感器 + DHT11温湿度传感器 + BC20-NBIOT模块。
(1)硬件组成
【1】太阳能板
【2】充电模块
【3】BC20 – NBIOT模块
【4】温湿度 + 光敏传感器
(2)BC20上云调试
BC20是一款高性能、低功耗、多频段、支持 GNSS 定位功能的 NB-IoT 无线通信模块。BC20 在设计上 兼容移远通信 GSM/GPRS/GNSS 系列的 MC20 模块,方便客户快速、灵活的进行产品设计和升级。 BC20 提供丰富的外部接口和协议栈,同时支持中国移动 OneNET 物联网云平台,为客户的应用提供极 大的便利。
【1】上电初始化操作
查询模块是否正常
AT
OK
获取卡号,查询卡是否插好
AT+CIMI
460041052911195
OK
激活网络
AT+CGATT=1
OK
获取网络激活状态
AT+CGATT?
+CGATT: 1
OK
查询网络质量
AT+CSQ
+CSQ: 26,0
OK
AT+CEREG=? //检查网络状态
+CEREG: 0,1 //找网成功
OK
【2】连接MQTT服务器
连接MQTT服务器
AT+QMTOPEN=0,"a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com",1883
OK
+QMTOPEN: 0,0
登录MQTT服务器
命令格式: AT+QMTCONN=<tcpconnectID>,<clientID>,<username>,<password>
AT+QMTCONN=0,"6210e8acde9933029be8facf_dev1_0_0_2022021913","6210e8acde9933029be8facf_dev1","6cea55404b463e666cd7a6060daba745bbaa17fe7078dfef45f8151cdf19673d"
OK
+QMTCONN: 0,0,0
订阅主题
命令格式: AT+QMTSUB=<tcpconnectID>,<msgID>,"<topic1>”,<qos1>[,"<topic2>”,<qos2>…]
AT+QMTSUB=0,1,"$oc/devices/6210e8acde9933029be8facf_dev1/sys/messages/down",2
OK
+QMTSUB: 0,1,0,2
发布主题
命令格式:AT+QMTPUB=<tcpconnectID>,<msgID>,<qos>,<retain>,"<topic>","<msg>"
先发送指令:
AT+QMTPUB=0,0,0,0,"$oc/devices/6210e8acde9933029be8facf_dev1/sys/properties/repor"
等待返回 ">"
接着发送数据.不需要加回车。
"{"services": [{"service_id": "gps","properties":{"longitude":12.345,"latitude":33.345}}]}"
数据发送完毕,再发送结束符。 十六进制的值--0x1a 。某些串口调试助手可以适应ctrl+z 快捷键输入0xA
等待模块返回"OK",到此数据发送完成。
OK
+QMTPUB: 0,0,0
(3)STM32硬件代码
这里的完整工程代码篇幅较多,这里就不贴出来了。
对于华为云iot平台而言,这里硬件实现的代码最终功能与上面的MQTT软件模拟效果是一样的。 采集硬件上的数据上传到云平台。
思路清晰,讲解硬核