写点什么

手把手完成智慧路灯的开发,完成设备上云【华为云 IoT】

作者:DS小龙哥
  • 2022-10-19
    重庆
  • 本文字数:14375 字

    阅读完需:约 1 分钟

一、前言

近年来,物联网引领了继计算机、互联网之后世界信息产业的第三次发展浪潮,且逐步在各行各业得到更广泛的应用。物联网的定义是万物互联,表示任何设备都可以连在一起,进行数据交互。


那么物联网到底是什么?设备如何上云?云平台又是什么?很多不是物联网专业的,不是搞嵌入式的或者是刚学习物联网的都不太清楚,虽然概念性的东西百度一大堆,书上也是各种专业词汇,如果无法将这些概念性的东西实体化,最终还是理解不了整个流程,云里雾里。


那么接下来以华为云 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.comIP地址: 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_2022101806Username    634e3e423ec34a6d03c84bfb_1126626497Password    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)创建规则

选择左侧导航栏的规则>数据转发,单击右上角的创建规则



填充规则转发的信息:




点击继续设置:


(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 可视化组件,采用拖拽式自由布局,可以快速定制和应用属于自己的数据大屏。


地址:Console (huaweicloud.com)

(1)购买服务套餐

新用户使用,有一个月基础版的使用权限。 可以点击体验试用获取。 已购买的,直接点击进入控制台。



如果体验期已过,就需要自己购买,我这里选择购买 1 年的基础版 60 块钱。


注意: 这个区域要选择与 OBS 存储桶一个区域。 否则到时候用不了。




购买成功:


(2)新建数据连接

使用 OBS 数据源,可以将大屏与 OBS 服务建立数据连接,在大屏上展示存储在 OBS 中的 CSV 文件的数据。



选择 CSV 文件:



这里需要填:访问密钥(AK 和 SK)。获取步骤如下:


1. 登录管理控制台(或者点击右上角自己的用户名)。2. 将鼠标移到右上角的用户名上,在下拉列表中单击“我的凭证”。3. 进入“我的凭证”后,在单击“访问密钥”。4. 在“访问密钥”页面中,可以查看已有的访问密钥ID(即AK),如果要同时获取AK和SK,可以单击“新增访问密钥”创建并下载访问密钥,下载的密钥文件中包含AK和SK。
复制代码



点击新增访问密匙:




创建后下载下来:



得到密匙之后,填充数据连接的配置:




数据连接创建成功:


(3)新建大屏


选择空白大屏,填好名字,创建大屏。



大屏创建成功:


(4)新建数据转换器

每个控件的数据源如果需要实时读取,需要新建数据转换器。


在上方按钮里选择数据转换器。新建一个名称为led_data的数据转换器。


关于数据转换器的使用说明,看这里新建CSV文件数据连接_数据可视化 DLV_用户指南_管理数据连接_新建数据连接_华为云 (huaweicloud.com)


本次新建转换器,不用改代码,直接默认即可。


【1】点击 + 号。



【2】输入led_data 按下回车。



【3】创建完成


(5)编辑大屏

界面的话,可以根据控件自行设计。我这里采用文本控件来显示路灯设备上传的数据。


选中文本控件之后,右边的数据源选择--CSV文件,选择创建的数据连接,再选择数据转换器,然后下面选择文本里需要显示的字段。


【1】 拖一个标题控件,用于显示大屏的名称



修改属性后:



【2】拖一个表格轮播控件,用来显示设备的数据。



然后将控件的尺寸合理的设置一下,点击控件,选择控件数据的来源为 CSV 文件,然后设置数据连接器,设置映射显示的字段。



然后将字段展开,设置每个数据对应的名称。



如果觉得字体小了,可以改变字号:



如果想改变轮播图的样式,也可以在这里设置:



下面是创建好的界面:



如果想显示设备上传的数据时间,可以在 规则转发里 ,将设备上报的时间也转发存放到 CSV 文件里,DLV 大屏就可以显示时间了。

(6)预览界面


(7)发布界面



分享链接:https://console.huaweicloud.com/dlv/vision/share/?id=a4b0adf1d0d94b29aafd53fda4a3d0cc&locale=zh-cn&region=cn-north-1


在界面可以看状态已经是发布状态了:



然后将链接分享给其他人,都可以通过浏览器打开访问查看效果。


这是手机上查看效果:



到此,DLV 大屏已经配置完毕。

五、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.gztar 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.gztar 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_modulemake && 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-develyum -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 startservice nginx stopservice 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;   #开启hlshls_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 $ ./configurepi@raspberrypi:/media/pi/DS小龙哥/work/nasm-2.14.02 $ makepi@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-sharedpi@raspberrypi:/media/pi/DS小龙哥/work/x264-master $ make && make installpi@raspberrypi:/media/pi/DS小龙哥/work/x264-master $ sudo cp _install/include /usr/ -rfpi@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.bz2pi@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-devpi@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-omxpi@raspberrypi:/media/pi/DS小龙哥/work/ffmpeg-4.2.2 $ make && make installpi@raspberrypi:/media/pi/DS小龙哥/work/ffmpeg-4.2.2 $ sudo cp _install/include /usr/ -rfpi@raspberrypi:/media/pi/DS小龙哥/work/ffmpeg-4.2.2 $ sudo cp _install/lib /usr/ -rfpi@raspberrypi:/media/pi/DS小龙哥/work/ffmpeg-4.2.2 $ sudo cp _install/bin /usr/ -rfpi@raspberrypi:/media/pi/DS小龙哥/work/ffmpeg-4.2.2 $ ffmpeg -vffmpeg 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" 流媒体服务器地址
复制代码

(4)DLV 可视化大屏显示监控视频

由于华为云的 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 软件模拟效果是一样的。 采集硬件上的数据上传到云平台。


七、总结

通过智慧路灯的项目,介绍了一个物联网设备如何上云,云平台如何配置,数据可视化大屏如何对接显示的整个流程。 如果手上没有智慧路灯的硬件,也可以通过文中介绍的 MQTT 客户端软件,模拟设备数据进行数据上传,一样可以完成云端的所有操作。 有了可视化大屏,就可以实时查看设备的状态,本次的例子里设计的界面比较简单,如果想设计酷炫,可以查看官方的模板,在新建大屏的时候可以选择模板进行创建。


发布于: 刚刚阅读数: 7
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022-01-06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
手把手完成智慧路灯的开发,完成设备上云【华为云IoT】_10月月更_DS小龙哥_InfoQ写作社区